From 9780d82d70c39acaec0b92e3ed236097c7b9e0be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 13:15:37 +0200 Subject: [PATCH 01/36] Chore(deps): Bump psf/black from 22.3.0 to 26.3.0 in /.github/workflows (#2561) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/zblack.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/zblack.yml b/.github/workflows/zblack.yml index 3aff51c10..4c8f0f971 100644 --- a/.github/workflows/zblack.yml +++ b/.github/workflows/zblack.yml @@ -11,7 +11,7 @@ jobs: with: python-version: '3.12' # Pin Python to avoid 3.14 incompatibility with Black 22.3.0 # This version should match what you can find in .pre-commit-config.yaml - - uses: psf/black@22.3.0 # https://black.readthedocs.io/en/stable/integrations/github_actions.html + - uses: psf/black@26.3.0 # https://black.readthedocs.io/en/stable/integrations/github_actions.html with: options: "--check --verbose" src: "./src" From 496f3f5d79c31bbac28dabe2f565e9fb481de423 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 12 Apr 2026 10:31:54 +0200 Subject: [PATCH 02/36] docs(agents): refresh CI/release section post-GitLab migration (#2605) --- .gitignore | 7 +++ .worktreeinclude | 27 +++++++++ AGENTS.md | 143 +++++++++++++++++++---------------------------- 3 files changed, 92 insertions(+), 85 deletions(-) create mode 100644 .worktreeinclude diff --git a/.gitignore b/.gitignore index 2f909a404..ac6c04fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,10 @@ cypresstest-output.xml cypress/downloads pyinstaller/electron/output.css pyinstaller/electron/typography.css + +# BMad skill installation and generated artifacts — local only +_bmad/ +_bmad-output/ + +# Claude Code local workspace +.claude/ diff --git a/.worktreeinclude b/.worktreeinclude new file mode 100644 index 000000000..56eaf2a2e --- /dev/null +++ b/.worktreeinclude @@ -0,0 +1,27 @@ +# Copied into new worktrees created by `claude --worktree` / EnterWorktree. +# Format: .gitignore syntax. Only gitignored files matching these patterns +# are copied (never tracked files). + +# Generated version file — avoids re-running setuptools_scm in each worktree. +src/cryptoadvance/specter/_version.py + +# Compiled translation catalogs — regenerating requires pybabel and is slow. +src/cryptoadvance/specter/translations/**/messages.mo + +# BMad skill installation — copy so new worktrees have skills available without +# reinstalling. Gitignored (see .gitignore) so the main repo stays clean. +_bmad/ + +# Claude Code project skills + local settings — copy so new worktrees inherit them. +# NOTE: .claude/worktrees/ is deliberately NOT included (that's where worktrees +# themselves live; copying it would recurse). +.claude/skills/ +.claude/settings.local.json + +# NOT included on purpose (too big and/or not portable; recreate per worktree): +# .env/ — Python venv (402M, absolute paths in scripts) +# .buildenv/ — second Python venv (329M) +# pyinstaller/electron/node_modules/ — npm deps (483M, slow but portable; +# add if you run electron builds in worktrees) +# tests/bitcoin*, tests/elements* — cached regtest node binaries; CI repopulates +# _bmad-output/ — local BMad artifacts; regenerate per worktree diff --git a/AGENTS.md b/AGENTS.md index e87438525..944ac3898 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ Specter Desktop is a GUI for Bitcoin Core & Electrum optimized for airgapped har **License:** MIT **Stack:** Python 3.9-3.10, Flask, Jinja2 templates, plain JavaScript (no frameworks), JSON file persistence, PyInstaller for desktop builds -**Status:** Maintenance mode. Last release v2.1.1 (2025-01-03). ~259 open issues, CI partially broken. +**Status:** Reviving. Last release v2.1.1 (2025-01-03). Release pipeline recently migrated to GitHub Actions. See "Current State" section at the bottom. ## Architecture (Quick Reference) @@ -67,24 +67,27 @@ python3 -m cryptoadvance.specter server --config DevelopmentConfig --debug ## CI/CD -The project uses **three CI providers** for different purposes, plus private GitLab runners for releases. +The project uses **GitHub Actions** for linting, testing, Docker images, and **the full release pipeline**, plus **Cirrus CI** for the heavyweight test suite (pytest + Cypress). GitLab CI is retained in `.gitlab-ci.yml` but effectively dead — the release flow was migrated to GitHub Actions. ### Overview | Provider | Purpose | Config File | Trigger | |----------|---------|-------------|---------| -| **GitHub Actions** | Linting, Docker images, TOC generation | `.github/workflows/` | Push, PR | -| **Cirrus CI** | Full test suite (pytest + Cypress) | `.cirrus.yml` | PR | -| **GitLab CI** | Releasing (binaries, pip, Electron, signatures) | `.gitlab-ci.yml` | Tags only | +| **GitHub Actions** | Lint, smoke-build, Docker images, **releases** (pip + specterd + Electron for Linux/Win/macOS) | `.github/workflows/` | Push, PR, tags | +| **Cirrus CI** | Full test suite (pytest + Cypress + extension smoketest) | `.cirrus.yml` | PR | +| **GitLab CI** | **Dead** — config retained; `check` job only waits on GH master status. Release jobs no longer run. | `.gitlab-ci.yml` | (vestigial) | -### GitHub Actions (4 workflows) +### GitHub Actions (7 workflows) -1. **Black Python Linter** (`.github/workflows/zblack.yml`) — Runs on every push and PR. Checks `./src` with Black 22.3.0. **Currently failing on `master`.** -2. **TOC Generator** (`.github/workflows/toc.yml`) — Auto-generates table of contents for README.md, docs/faq.md, docs/development.md on push. -3. **Docker Push** (`.github/workflows/docker-push.yml`) — Builds multi-arch Docker image (amd64 + arm64) on every push to any branch. Pushes to `ghcr.io//:` (upstream: `ghcr.io/cryptoadvance/specter-desktop:`). -4. **Docker Tag** (`.github/workflows/docker-tag.yml`) — Builds multi-arch Docker image on version tags (`v*.*.*`). Pushes to `ghcr.io//:` (upstream: `ghcr.io/cryptoadvance/specter-desktop:`). +1. **Black Python Linter** (`zblack.yml`) — Runs on every push and PR. Uses `psf/black@26.3.0` action pinned to Black version `22.3.0`, on python-3.12 (pinned to avoid 3.14 incompatibility with Black 22.3.0). Checks `./src`. +2. **TOC Generator** (`toc.yml`) — Auto-generates TOCs for `README.md`, `docs/faq.md`, `docs/development.md` on push. +3. **Docker Push** (`docker-push.yml`) — Builds multi-arch (amd64 + arm64) image on every push. Pushes to `ghcr.io//:` (upstream: `ghcr.io/cryptoadvance/specter-desktop:`). +4. **Docker Tag** (`docker-tag.yml`) — Builds multi-arch image on version tags. Pushes to `ghcr.io//:`. +5. **Extension Compatibility Check** (`extension-compat.yml`) — On changes to `requirements.*` or `pyproject.toml`: installs the full lock file, imports every bundled extension (Swan, LiquidIssuer, DevHelp, Notifications, ExFund, Faucet, Electrum, Spectrum, StackTrack, TimelockRecovery), runs `pip check`, and best-effort runs extension test suites. Catches dep conflicts before they break downstream extensions. +6. **Test specterd build** (`test-specterd-build.yml`) — PR smoke test on changes to `pyinstaller/`, `requirements*`, `src/**`, or packaging files. Builds specterd on Linux and runs `--help` smoke test. +7. **Release** (`release.yml`) — **The release pipeline.** See next section. -GitHub Actions use standard public runners (`ubuntu-latest` / `ubuntu-24.04`). No private runners needed. +All GitHub Actions use public runners (`ubuntu-latest` / `ubuntu-24.04` / `windows-latest` / `macos-14`). **No private runners.** ### Cirrus CI (Testing) @@ -103,90 +106,59 @@ Both images are pre-built and hosted on the GitLab container registry. They incl **Caching:** bitcoind and elementsd binaries are cached by Cirrus based on the version pinned in `pyproject.toml`. The `tests/install_noded.sh` script handles downloading or compiling them. -### GitLab CI (Releasing) +### Release pipeline — `.github/workflows/release.yml` -GitLab CI handles the **entire release pipeline**. Config: `.gitlab-ci.yml`. It mirrors the GitHub repo and triggers on tags. +Triggers on tags matching `v[0-9]+.[0-9]+.[0-9]+` (and `-*` suffixes for pre-releases). Runs entirely on **GitHub-hosted runners** — no private hardware required. -**Important: GitLab uses private runners, not public shared runners.** +**Python version:** pinned to `3.10` via the `PYTHON_VERSION` env var at the top of `release.yml`. -**Base image:** `registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v22.0` — a custom image with Python and bitcoind pre-installed. +**Jobs (10 total):** -**Stages:** - -1. **`testing`** — `check` job: Verifies all GitHub Actions tests are green before proceeding (calls `utils/release.sh wait_on_master`). The actual test jobs (`.test`, `.test-cypress`) are hidden (disabled) since testing moved to Cirrus CI. - -2. **`releasing`** — Builds and uploads release artifacts: - - **`release_pip`** — Builds pip package, uploads to PyPI (or test.pypi.org for forks), signs SHA256SUMS - - **`release_binary_windows`** — Builds specterd Windows binary using a **Windows GitLab runner** (tag: `windows`). Uses PyInstaller via `pyinstaller/build-win-ci.bat` - - **`release_electron_linux_windows`** — Builds Electron desktop apps for Linux and Windows. Uses the Windows specterd from the previous job. Uploads `.exe`, `.tar.gz`, and `.zip` to GitHub Releases - -3. **`post_releasing`** — Final steps: - - **`release_signatures`** — Downloads all artifacts, verifies individual SHA256SUMS signatures, creates a combined `SHA256SUMS` file, signs it, uploads to GitHub Releases - - **`release_docker`** — Triggers Docker image build - - **`tag_specterext_dummy_repo`** — Tags the specterext-dummy repo with the same version - - **`update_github`** / **`update_webpage`** — Updates the GitHub release page and the static download page +1. **`release-pip`** — Builds the pip package and publishes to PyPI via **trusted publishing** (no `TWINE_PASSWORD` secret needed when configured on PyPI; falls back to token auth otherwise). Only publishes when `github.repository == 'cryptoadvance/specter-desktop'`. Version derived from tag with `-pre` → `rc` PEP 440 mapping. +2. **`build-specterd-linux`** — PyInstaller build on `ubuntu-latest`. Produces `specterd--x86_64-linux-gnu.zip`. +3. **`build-specterd-windows`** — PyInstaller build on `windows-latest`. Produces `specterd--win64.zip`. Installs `colorama` (Windows-only transitive dep of click that isn't in the lock file). +4. **`build-specterd-macos`** — PyInstaller build on `macos-14` (Apple Silicon). Produces `specterd--osx_arm64.zip`. **x86_64 macOS build is commented out** — requires a paid runner (`macos-15-large`); will be enabled when the org has a paid plan. +5. **`build-electron-linux`** — Needs `build-specterd-linux`. Downloads specterd artifact, wraps in Electron, produces `specter_desktop--x86_64-linux-gnu.tar.gz`. +6. **`build-electron-windows`** — Needs `build-specterd-windows`. Runs in `electronuserland/builder:wine` container on `ubuntu-latest`. Produces `Specter-Setup-.exe`. +7. **`build-electron-macos`** — Needs `build-specterd-macos`. Universal-ish build on `macos-14`. **Code signing is conditional**: if `APPLE_CERTIFICATE_BASE64` secret is set, imports cert into a temporary keychain and signs; otherwise builds unsigned. Removes hardcoded provisioning profile from `package.json` on the fly. +8. **`create-release`** — Gathers all artifacts, computes combined `SHA256SUMS`, creates the GitHub Release, uploads binaries. +9. **`trigger-docker`** — Triggers the `docker-tag.yml` workflow for the release tag (builds and pushes the Docker image). **Release artifacts per version:** -- `specterd--win64.zip` (Windows daemon) +- `cryptoadvance.specter-.tar.gz` (pip package, published to PyPI) - `specterd--x86_64-linux-gnu.zip` (Linux daemon) -- `Specter-Setup-.exe` (Windows Electron app) +- `specterd--win64.zip` (Windows daemon) +- `specterd--osx_arm64.zip` (macOS daemon, Apple Silicon) - `specter_desktop--x86_64-linux-gnu.tar.gz` (Linux Electron app) -- `cryptoadvance.specter-.tar.gz` (pip package) -- `SHA256SUMS` + `SHA256SUMS.asc` (signed checksums) -- macOS builds are **not yet automated** in CI +- `Specter-Setup-.exe` (Windows Electron app) +- macOS Electron app (produced by `build-electron-macos`) +- `SHA256SUMS` (combined checksums, created by `create-release`) -### Private Runner Setup +**macOS builds are now automated** (Apple Silicon free tier). x86_64 macOS requires a paid runner and is disabled. -Releases are built on private runners only (build-only-on-private-hardware policy). +### Release-related secrets (GitHub) -#### GitLab Runner (Linux) +| Secret | Purpose | Required? | +|----------|---------|---| +| `APPLE_CERTIFICATE_BASE64` | Base64-encoded `.p12` Apple signing certificate | Optional — unsigned build if missing | +| `APPLE_CERTIFICATE_PASSWORD` | Password for the `.p12` | With `APPLE_CERTIFICATE_BASE64` | +| `APPLE_PROVISIONING_PROFILE_BASE64` | Base64-encoded provisioning profile | Optional | +| PyPI trusted publisher | Configured on PyPI side, not a GH secret | Required for `release-pip` in upstream | -GitLab uses a `gitlab-docker-runner` — jobs run inside Docker containers, but also need access to the Docker socket to spin up bitcoind containers. +Historical GitLab secrets (`GH_BIN_UPLOAD_PW`, `TWINE_PASSWORD`, `GPG_PASSPHRASE`, `SSH_SPECTEREXT_DEPLOY_KEY`, `SSH_SPECTERSTATIC_DEPLOY_KEY`) are **no longer used**. `.gitlab-ci.yml` still references them but the pipeline is dead. -Setup follows the [Docker socket binding](https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-socket-binding) approach. Key implications for tests: -- bitcoind gets `-rpcallowip=` for the Docker network -- Tests use the Docker network IP (not localhost) to talk to bitcoind +### Testing a release on a fork -#### GitLab Runner (Windows) +1. Fork `cryptoadvance/specter-desktop` on GitHub. +2. Push a tag matching `v*.*.*` or `v*.*.*-*` on your fork → `release.yml` fires automatically. +3. The `release-pip` PyPI publish step is gated on `github.repository == 'cryptoadvance/specter-desktop'`, so forks build the pip package but don't publish. +4. Unsigned macOS builds work out of the box; signing requires you to add your own Apple secrets. -Required for building Windows binaries. Prerequisites: -- Windows 10+ with WSL2 and Docker Desktop -- Python 3.7+, Git, Docker -- [GitLab Runner for Windows](https://docs.gitlab.com/runner/install/windows.html) +### Dead config -Setup: -```powershell -mkdir \Gitlab-Runner -# Download gitlab-runner-windows-amd64.exe, rename to gitlab-runner.exe -cd \Gitlab-Runner -./gitlab-runner.exe register # Use registration token from GitLab CI/CD settings -./gitlab-runner.exe install # Install as system service -./gitlab-runner.exe start # Start the runner -``` - -Tag the runner with `windows` so release jobs can find it. Docker Desktop must be running (requires user login on the machine). - -#### CI/CD Dev Environment (for testing releases) - -To test the release pipeline on your own fork: - -1. Fork `cryptoadvance/specter-desktop` on GitHub -2. Create a GitLab project mirroring your GitHub fork ([new CI/CD project](https://gitlab.com/projects/new#cicd_for_external_repo)) — use the **same repo name**: `specter-desktop` -3. Activate private runners, deactivate public runners (contact maintainers for access) -4. Create tokens and set as GitLab CI/CD variables: - - `GH_BIN_UPLOAD_PW` — GitHub token for uploading release assets - - `TWINE_PASSWORD` — [test.pypi.org](https://test.pypi.org) API token for pip uploads -5. Create a tag on your GitHub fork → watch the test release pipeline run - -### GitLab CI Variables (Secrets) - -| Variable | Purpose | -|----------|---------| -| `GH_BIN_UPLOAD_PW` | GitHub token for uploading release binaries | -| `TWINE_PASSWORD` | PyPI/TestPyPI API token for pip package upload | -| `GPG_PASSPHRASE` | GPG key passphrase for signing SHA256SUMS | -| `SSH_SPECTEREXT_DEPLOY_KEY` | SSH key for tagging specterext-dummy repo | -| `SSH_SPECTERSTATIC_DEPLOY_KEY` | SSH key for updating specter-static download page | +- `.gitlab-ci.yml` — still in the repo but release jobs no longer run. Safe to remove in a cleanup pass. +- `pyinstaller/build-win-ci.bat` — former GitLab Windows runner entry point; no longer invoked. +- `utils/release.sh` / `utils/release_helper.py` / `utils/github.py` — may contain dead code paths now that GitLab isn't uploading artifacts. Audit before changes. ## Testing @@ -287,13 +259,14 @@ Extensions live in `specterext` namespace packages. Each extension: | Build scripts | `pyinstaller/`, `utils/`, `electron/` | | CI Docker images | `docker/` | -## Current State (as of 2026-02) +## Current State (as of 2026-04) -- **~259 open issues**, many from 2023 (potentially stale) -- **10 open PRs** (need assessment) -- **CI:** Black linter failing on GitHub Actions; Cirrus CI tests and GitLab release pipeline status unknown (need verification) -- **Last release:** v2.1.1 (2025-01-03) -- **Goal:** Revive with biweekly tested releases, triage issues, fix CI +- **Last release:** v2.1.1 (2025-01-03) — no release on the new GH Actions pipeline yet; first tagged run will exercise it end-to-end. +- **CI migration complete:** release pipeline moved from GitLab to `.github/workflows/release.yml`. `.gitlab-ci.yml` retained but dead. +- **macOS automation:** now covered on Apple Silicon free tier; x86_64 macOS gated on paid runner. +- **Black linter:** reconfigured to pin python-3.12 + `psf/black@26.3.0` action + black version 22.3.0 (worked around 3.14 incompatibility). Verify green state in CI before assuming. +- **Issue/PR backlog:** refreshed counts not captured here — use `gh issue list` / `gh pr list` for current state. +- **Goal:** Revive with biweekly tested releases, shake out the new release pipeline, triage issues. ## Contributing From 50d81434a8fd842722bfbb80180ed9336ab416e6 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 12 Apr 2026 14:42:52 +0200 Subject: [PATCH 03/36] Fix Electron stuck on splash in hwibridge mode (#2600) Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/electron-smoketest.yml | 91 ++++++++++++++++++++++++ pyinstaller/electron/main.js | 20 +++++- pyinstaller/electron/src/renderer.js | 21 ++++-- pyinstaller/electron/src/specterd.js | 8 ++- pyinstaller/electron/src/splash.html | 7 +- pyinstaller/electron/src/uiHelpers.js | 28 ++++++-- 6 files changed, 158 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/electron-smoketest.yml diff --git a/.github/workflows/electron-smoketest.yml b/.github/workflows/electron-smoketest.yml new file mode 100644 index 000000000..780212749 --- /dev/null +++ b/.github/workflows/electron-smoketest.yml @@ -0,0 +1,91 @@ +name: Electron smoketest + +on: + pull_request: + paths: + - 'pyinstaller/electron/**' + - '.github/workflows/electron-smoketest.yml' + push: + branches: [master] + paths: + - 'pyinstaller/electron/**' + - '.github/workflows/electron-smoketest.yml' + +jobs: + smoketest: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: pyinstaller/electron/package-lock.json + + - name: Install xvfb and electron runtime libs + run: | + sudo apt-get update + sudo apt-get install -y \ + xvfb \ + libgtk-3-0 \ + libnss3 \ + libasound2t64 \ + libgbm1 \ + libxss1 \ + libxtst6 + + - name: Install electron deps + working-directory: pyinstaller/electron + run: npm ci + + - name: Syntax check all electron JS + working-directory: pyinstaller/electron + run: | + for f in main.js src/*.js; do + echo "checking $f" + node --check "$f" + done + + - name: Seed dev data folder + run: | + mkdir -p "$RUNNER_TEMP/specter_dev" + echo '{"version":"","sha256":{"x64":"","arm64":""}}' \ + > "$RUNNER_TEMP/specter_dev/version-data.json" + + - name: Boot electron, assert splash reaches no-specterd branch + working-directory: pyinstaller/electron + env: + NODE_ENV: development + SPECTER_DATA_FOLDER: ${{ runner.temp }}/specter_dev + run: | + set -u + xvfb-run --auto-servernum --server-args='-screen 0 1280x960x24' \ + ./node_modules/.bin/electron . --no-sandbox > electron.log 2>&1 & + PID=$! + trap 'kill $PID 2>/dev/null || true; wait $PID 2>/dev/null || true' EXIT + + # Expected log line emitted by uiHelpers.js:updatingLoaderMsg when + # main.js reaches the "specterd missing + no version" branch. + # If main.js changes this message, update both sides together. + EXPECTED="Specterd was not found and no version is configured" + + for i in $(seq 1 30); do + if grep -qF "$EXPECTED" electron.log; then + echo "smoketest passed (splash reached no-specterd branch)" + exit 0 + fi + if ! kill -0 $PID 2>/dev/null; then + echo "electron exited before reaching expected state" + echo "--- electron.log ---" + cat electron.log + exit 1 + fi + sleep 1 + done + + echo "expected log line not seen within 30s" + echo "--- electron.log ---" + cat electron.log + exit 1 diff --git a/pyinstaller/electron/main.js b/pyinstaller/electron/main.js index 884d82e38..95cc1d4f6 100644 --- a/pyinstaller/electron/main.js +++ b/pyinstaller/electron/main.js @@ -160,7 +160,9 @@ app.whenReady().then(() => { downloadSpecterd(specterdPath) } else { updatingLoaderMsg( - 'Specterd file could not be validated and no version is configured in the settings
Please go to Preferences and set version to fetch or add an executable manually...' + 'Specterd file could not be validated and no version is configured in the settings
Please go to Preferences and set version to fetch or add an executable manually...', + false, + { isHtml: true } ) updateSpecterdStatus('Failed to locate specterd...') } @@ -169,8 +171,13 @@ app.whenReady().then(() => { if (appSettings.specterdVersion) { downloadSpecterd(specterdPath) } else { + // NB: smoketest workflow (.github/workflows/electron-smoketest.yml) greps + // for the leading "Specterd was not found and no version is configured" + // substring to assert splash reached this branch. Keep both in sync. updatingLoaderMsg( - 'Specterd was not found and no version is configured in the settings
Please go to Preferences and set version to fetch or add an executable manually...' + 'Specterd was not found and no version is configured in the settings
Please go to Preferences and set version to fetch or add an executable manually...', + false, + { isHtml: true } ) updateSpecterdStatus('Failed to locate specterd...') } @@ -200,6 +207,15 @@ app.on('before-quit', (event) => { } }) +ipcMain.on('open-settings', (event) => { + const senderUrl = event.senderFrame?.url || '' + if (!senderUrl.startsWith('file://') || !senderUrl.endsWith('/splash.html')) { + logger.warn(`Rejected open-settings IPC from untrusted sender: ${senderUrl}`) + return + } + openPreferences() +}) + ipcMain.on('request-mainprocess-action', (event, arg) => { switch (arg.message) { case 'save-preferences': diff --git a/pyinstaller/electron/src/renderer.js b/pyinstaller/electron/src/renderer.js index 47d051290..ca37ddb5b 100644 --- a/pyinstaller/electron/src/renderer.js +++ b/pyinstaller/electron/src/renderer.js @@ -8,8 +8,6 @@ // All of the Node.js APIs are available in the preload process. // It has the same sandbox as a Chrome extension. window.addEventListener('DOMContentLoaded', () => { - - const updateSpinner = (show) => { const spinnerElement = document.getElementById('spinner'); if (spinnerElement) { @@ -19,10 +17,23 @@ window.addEventListener('DOMContentLoaded', () => { window.api.receive('update-loader-message', (data) => { const launchTextElement = document.getElementById('launch-text'); if (launchTextElement) { - launchTextElement.textContent = data.msg; + if (data.isHtml) { + launchTextElement.innerHTML = data.msg; + } else { + launchTextElement.textContent = data.msg; + } updateSpinner(data.showSpinner); } + const settingsBtn = document.getElementById('open-settings-btn'); + if (settingsBtn) { + settingsBtn.classList.toggle('hidden', !data.showSettingsButton); + } }); - - }) \ No newline at end of file + const openSettingsBtn = document.getElementById('open-settings-btn'); + if (openSettingsBtn) { + openSettingsBtn.addEventListener('click', () => { + window.api.send('open-settings'); + }); + } +}) \ No newline at end of file diff --git a/pyinstaller/electron/src/specterd.js b/pyinstaller/electron/src/specterd.js index 7c2a4c316..83b799776 100644 --- a/pyinstaller/electron/src/specterd.js +++ b/pyinstaller/electron/src/specterd.js @@ -29,11 +29,13 @@ function checkSpecterd(logs, specterdStarted) { } let specterIsRunning = false +let currentSpecterURL = 'http://localhost:25441' function startSpecterd(specterdPath, automaticWalletImport = false) { if (platformName == 'win64') { specterdPath += '.exe' } let hwiBridgeMode = appSettings.mode == 'hwibridge' + currentSpecterURL = hwiBridgeMode ? appSettings.specterURL : 'http://localhost:25441' updatingLoaderMsg('Launching Specter ...', (showSpinner = 'true')) updateSpecterdStatus('Launching Specter ...') let specterdArgs = ['server'] @@ -85,7 +87,7 @@ function startSpecterd(specterdPath, automaticWalletImport = false) { }, 3000) } else { logger.info('Normal startup of Specter.') - createWindow(appSettings.specterURL) + createWindow(currentSpecterURL) } } else if (serverdStatus === 'timeout') { showError('Specter does not seem to start. Check the logs in the menu for more details.') @@ -113,7 +115,7 @@ function startSpecterd(specterdPath, automaticWalletImport = false) { app.on('activate', function () { // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow(appSettings.specterURL) + if (BrowserWindow.getAllWindows().length === 0) createWindow(currentSpecterURL) }) // since these are streams, you can pipe them elsewhere specterdProcess.on('close', (code) => { @@ -167,7 +169,7 @@ app.on('open-url', (_, url) => { // Only proceed with the import if the importFromWalletSoftwareBtn can be found. // If it is not, users are redirected by specterd to the configure connection screen. function importWallet(walletData) { - loadUrl(appSettings.specterURL + '/wallets/new_wallet/') + loadUrl(currentSpecterURL + '/wallets/new_wallet/') let code = ` const importFromWalletSoftwareBtn = document.getElementById('import-from-wallet-software-btn') if (importFromWalletSoftwareBtn) { diff --git a/pyinstaller/electron/src/splash.html b/pyinstaller/electron/src/splash.html index f56b4579b..090f7d466 100644 --- a/pyinstaller/electron/src/splash.html +++ b/pyinstaller/electron/src/splash.html @@ -2,9 +2,12 @@ -
+
+
-

Launching Specter Desktop...

+

Launching Specter Desktop...

+
+
diff --git a/pyinstaller/electron/src/uiHelpers.js b/pyinstaller/electron/src/uiHelpers.js index 7ec674502..e9de8fcdb 100644 --- a/pyinstaller/electron/src/uiHelpers.js +++ b/pyinstaller/electron/src/uiHelpers.js @@ -20,16 +20,27 @@ const executeJavaScript = (code) => { mainWindow.webContents.executeJavaScript(code) } +function escapeHtml(str) { + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') +} + function showError(error) { updatingLoaderMsg('Specter encountered an error:' + error.toString()) } -function updatingLoaderMsg(msg, showSpinner = false) { +function updatingLoaderMsg(msg, showSpinner = false, { isHtml = false, showSettingsButton = false } = {}) { if (mainWindow) { // see preload.js where this is setup mainWindow.webContents.send('update-loader-message', { msg, showSpinner, + isHtml, + showSettingsButton, }) } else { logger.error('mainWindow not initialized in updatingLoaderMsg') @@ -78,11 +89,18 @@ function initMainWindow(dimensions) { return { action: 'deny' } }) - mainWindow.webContents.on('did-fail-load', function () { + mainWindow.webContents.on('did-fail-load', function (event, errorCode, errorDescription, validatedURL) { mainWindow.loadURL(`file://${__dirname}/splash.html`) - updatingLoaderMsg( - `Failed to load: ${appSettings.specterURL}
Please make sure the URL is entered correctly in the settings and try again...` - ) + const failedUrl = escapeHtml(validatedURL || appSettings.specterURL || '') + let msg + if (appSettings.mode === 'hwibridge') { + msg = `Failed to load remote Specter at: ${failedUrl}

` + + `You are running in HWI Bridge mode, which requires a remote Specter server.
` + + `If you want to run Specter locally instead, open Settings (${isMac ? 'Cmd' : 'Ctrl'}+, or via the tray icon) and switch to "Run Specter locally".` + } else { + msg = `Failed to load: ${failedUrl}
Please make sure the URL is entered correctly in the settings and try again...` + } + updatingLoaderMsg(msg, false, { isHtml: true, showSettingsButton: true }) }) return mainWindow } From 3e277689ef288568b6fe55517149d764d00555f1 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:06:26 +0200 Subject: [PATCH 04/36] =?UTF-8?q?ci:=20upgrade=20Node.js=2012=E2=86=9218,?= =?UTF-8?q?=20migrate=20CI=20images=20to=20GHCR=20(#2602)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claude Opus 4.6 (1M context) --- .cirrus.yml | 15 +++++++++----- cypress/integration/spec_wallet_utxo.js | 10 +++++++-- docker/cirrus-jammy/README.md | 4 ++-- docker/cypress-base-ubuntu-jammy/Dockerfile | 23 ++++++++++++--------- docker/cypress-base-ubuntu-jammy/README.md | 4 ++-- docker/cypress-python-jammy/Dockerfile | 4 ++-- docker/cypress-python-jammy/Readme.md | 4 ++-- package.json | 5 ++++- utils/test-cypress.sh | 18 ++++++++-------- 9 files changed, 52 insertions(+), 35 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index b20136597..f0cdef991 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,7 +2,7 @@ container: # image: python:slim # image: ubuntu:jammy # image: python:3.10 - image: registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20230206 + image: ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 # We assume here that we're having a proper python3 system including virtualenv and pip prep_stuff_template: &PREP_STUFF_TEMPLATE @@ -70,11 +70,16 @@ test_task: cypress_test_task: + use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' skip: "false" - container: - image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:20230206 - cpu: 6 - memory: 6G + persistent_worker: + labels: + os: linux + isolation: + container: + image: ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411 + cpu: 6 + memory: 6G pre_prep_script: # The stupid old debian-package is not installing a proper binary but just the python-package - echo -e '#!/bin/bash\npython3 -m virtualenv "$@"' > /usr/local/bin/virtualenv diff --git a/cypress/integration/spec_wallet_utxo.js b/cypress/integration/spec_wallet_utxo.js index 7ad7d3eb4..b135ea1ed 100644 --- a/cypress/integration/spec_wallet_utxo.js +++ b/cypress/integration/spec_wallet_utxo.js @@ -67,11 +67,17 @@ describe('Test the actions in UTXO list', () => { cy.get('tx-table').find('tx-row').eq(0).find('.select-tx-img').click( {position: 'top'} ) cy.wait(100) cy.get('tx-table').find('.freeze-tx-btn').click() - cy.wait(200) + // freeze-tx-btn submits a form → full page nav. tx-table's render() + // awaits fetchWalletData() before attaching txRowSelected listeners, + // so on fast workers a click can land after tx-row creation but + // before the listener is live — select-tx-value toggles but the + // action box never reveals. Wait long enough for the async gap to close. + cy.wait(1000) // Select it cy.get('tx-table').find('tx-row').eq(0).find('.select-tx-img').click( {position: 'top'} ); cy.get('tx-table').find('tx-row').eq(0).find('.select-tx-value').invoke('attr', 'value').should('eq', 'true') // Check that the click flow is (still) in order - cy.wait(200) + // Wait for the tx-table listener to process the selection and reveal the action box. + cy.get('tx-table').find('.selected-rows-action-box').should('not.have.class', 'hidden') cy.get('tx-table').find('.compose-tx-btn').click() // Switch to coin selection, check that the right amount of coins are preselected in the coin selection cy.get('.coinselect-hidden').should('have.length', 1); diff --git a/docker/cirrus-jammy/README.md b/docker/cirrus-jammy/README.md index bcb3b73ac..5b8504f93 100644 --- a/docker/cirrus-jammy/README.md +++ b/docker/cirrus-jammy/README.md @@ -3,8 +3,8 @@ An image used to run the build on cirrus (tests only, not cypress-tests). Create it like this: ``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20230206 -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20230206 +docker buildx build --platform linux/amd64 -t ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 --load . +docker push ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 ``` Check the `.cirrus.yml` on how this is used and update the $current_date there. diff --git a/docker/cypress-base-ubuntu-jammy/Dockerfile b/docker/cypress-base-ubuntu-jammy/Dockerfile index 13224b2df..f59eb06da 100644 --- a/docker/cypress-base-ubuntu-jammy/Dockerfile +++ b/docker/cypress-base-ubuntu-jammy/Dockerfile @@ -1,15 +1,20 @@ FROM ubuntu:22.04 +# avoid any prompts +ENV DEBIAN_FRONTEND=noninteractive + +# Install Node.js 18.x from NodeSource (Ubuntu apt ships 12.x which lacks optional chaining) RUN apt-get update && \ - apt-get install -y apt-transport-https curl nodejs npm + apt-get install -y apt-transport-https curl ca-certificates gnupg && \ + curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ + apt-get install -y nodejs - -# Install latest NPM and Yarn -RUN npm install -g npm@latest +# Install latest Yarn RUN npm install -g yarn@latest # install additional native dependencies build tools -RUN apt install -y build-essential +# apt-get update needed again after NodeSource setup script modified sources +RUN apt-get update && apt-get install -y build-essential # install Git client RUN apt-get install -y git @@ -17,8 +22,6 @@ RUN apt-get install -y git # https://github.com/cypress-io/cypress/releases/tag/v3.8.0 RUN apt-get install -y unzip -# avoid any prompts -ENV DEBIAN_FRONTEND noninteractive #install tzdata package RUN apt-get install -y tzdata # set your timezone @@ -40,11 +43,11 @@ RUN apt-get install -y \ # a few environment variables to make NPM installs easier # good colors for most applications -ENV TERM xterm +ENV TERM=xterm # avoid million NPM install messages -ENV npm_config_loglevel warn +ENV npm_config_loglevel=warn # allow installing when the main user is root -ENV npm_config_unsafe_perm true +ENV npm_config_unsafe_perm=true # versions of local tools RUN echo " node version: $(node -v) \n" \ diff --git a/docker/cypress-base-ubuntu-jammy/README.md b/docker/cypress-base-ubuntu-jammy/README.md index d810031c8..637d7a0b5 100644 --- a/docker/cypress-base-ubuntu-jammy/README.md +++ b/docker/cypress-base-ubuntu-jammy/README.md @@ -3,8 +3,8 @@ A base-image used in cypress-python to use a newer ubuntu jammy rather than a bu Create it like this: ``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 +docker build . -t ghcr.io/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20260411 +docker push ghcr.io/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20260411 ``` used in cypress-python diff --git a/docker/cypress-python-jammy/Dockerfile b/docker/cypress-python-jammy/Dockerfile index 54fd442c3..fade071ec 100644 --- a/docker/cypress-python-jammy/Dockerfile +++ b/docker/cypress-python-jammy/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 +FROM ghcr.io/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20260411 RUN apt-get update && apt-get install -y \ python3-pip python3-virtualenv zip unzip file apt libusb-1.0-0-dev libudev-dev \ @@ -17,4 +17,4 @@ RUN DEBIAN_FRONTEND="noninteractive" apt-get install -y --no-install-recommends WORKDIR /test RUN rm -rf node_modules package-lock.json ~/.cache/Cypress RUN npm install --save-dev cypress@9.7.0 -RUN $(npm bin)/cypress verify +RUN npx --no-install cypress verify diff --git a/docker/cypress-python-jammy/Readme.md b/docker/cypress-python-jammy/Readme.md index f1b825654..623899ecc 100644 --- a/docker/cypress-python-jammy/Readme.md +++ b/docker/cypress-python-jammy/Readme.md @@ -3,8 +3,8 @@ An image, ready to be used with cypress but also provides all the dependencies w Use versions of cypress as the version part of the tag. So e.g.: ``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:20230206 -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:20230206 +docker build . -t ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411 +docker push ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411 ``` Search for `cypress-python` on where this is used in the project. diff --git a/package.json b/package.json index e6e88b9c1..e936c4660 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,8 @@ "bugs": { "url": "https://github.com/cryptoadvance/specter-desktop/issues" }, - "homepage": "https://github.com/cryptoadvance/specter-desktop#readme" + "homepage": "https://github.com/cryptoadvance/specter-desktop#readme", + "engines": { + "node": ">=18" + } } diff --git a/utils/test-cypress.sh b/utils/test-cypress.sh index f9dac8b72..309ed9e65 100755 --- a/utils/test-cypress.sh +++ b/utils/test-cypress.sh @@ -39,7 +39,7 @@ function check_consistency { fi done <<< "$GREP_OUTPUT" fi - $(npm bin)/cypress verify + npx cypress verify } check_consistency @@ -211,7 +211,7 @@ function start_specter { # Simulate slower machines with uncommenting this (-l 10 means using 10% cpu): #cpulimit -p $specter_pid -l 10 -b echo "--> Waiting for specter ..." - $(npm bin)/wait-on http://127.0.0.1:${PORT} && echo "--> Success" + npx wait-on http://127.0.0.1:${PORT} && echo "--> Success" } @@ -323,7 +323,7 @@ function sub_open { start_elementsd --reset start_specter --reset fi - $(npm bin)/cypress open + npx cypress open } function sub_run { @@ -334,14 +334,14 @@ function sub_run { start_elementsd start_specter # Run $spec_file and all of the others coming later! - #$(npm bin)/cypress run --spec $(./utils/calc_cypress_test_spec.py --run $spec_file) + #npx cypress run --spec $(./utils/calc_cypress_test_spec.py --run $spec_file) # Run $spec_file and only that spec-file! - $(npm bin)/cypress run --spec ./cypress/integration/${spec_file} + npx cypress run --spec ./cypress/integration/${spec_file} else start_bitcoind --reset start_elementsd --reset start_specter --reset - $(npm bin)/cypress run + npx cypress run fi } @@ -349,8 +349,8 @@ function sub_basics { start_bitcoind --reset start_elementsd --reset start_specter --reset - $(npm bin)/cypress run --spec $(./utils/cypress_basics.py) --config video=false - $(npm bin)/cypress open + npx cypress run --spec $(./utils/cypress_basics.py) --config video=false + npx cypress open } function sub_snapshot { @@ -364,7 +364,7 @@ function sub_snapshot { start_bitcoind --reset start_elementsd --reset start_specter --reset - $(npm bin)/cypress run --spec $(./utils/calc_cypress_test_spec.py $spec_file) + npx cypress run --spec $(./utils/calc_cypress_test_spec.py $spec_file) echo "--> stopping specter" stop_specter echo "--> stopping bitcoind gracefully ... won't take long ..." From a24df2eb5074c641ea343e90e74a81f17124021a Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Fri, 17 Apr 2026 20:50:12 +0200 Subject: [PATCH 05/36] ci: add GHA test workflow + GPG-verify bitcoind/elementsd downloads (#2606) Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/test.yml | 215 ++++++++++ .gitignore | 2 + cypress.json | 6 +- docker/cypress-python-jammy/Readme.md | 2 + docs/cirrus-replacement-spec.md | 561 ++++++++++++++++++++++++++ tests/bitcoin_SHA256SUMS | 35 ++ tests/elements_SHA256SUMS | 22 + tests/install_noded.sh | 233 ++++++++++- 8 files changed, 1070 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 docs/cirrus-replacement-spec.md create mode 100644 tests/bitcoin_SHA256SUMS create mode 100644 tests/elements_SHA256SUMS diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..58f6a44c5 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,215 @@ +name: Tests + +on: + pull_request: + push: + branches: [master] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-22.04 + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + cache: pip + cache-dependency-path: requirements.txt + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libusb-1.0-0-dev libudev-dev python3-virtualenv + + - name: Cache bitcoind and elementsd + uses: actions/cache@v4 + with: + path: | + ./tests/bitcoin + ./tests/bitcoin-* + ./tests/elements + ./tests/elements-* + key: ${{ runner.os }}-${{ runner.arch }}-noded-${{ hashFiles('pyproject.toml', 'tests/elements_gitrev_pinned', 'tests/install_noded.sh', 'tests/bitcoin_SHA256SUMS', 'tests/elements_SHA256SUMS') }}-binary + save-always: true + + - name: Install bitcoind + run: ./tests/install_noded.sh --debug --bitcoin binary + + - name: Install elementsd + run: ./tests/install_noded.sh --debug --elements binary + + - name: Install Python dependencies + run: | + pip install -r requirements.txt --require-hashes + pip install -e ".[test]" + + - name: Fetch version tag + run: git fetch origin refs/tags/v1.0.0 + + - name: Run pytest + run: > + pytest + --cov=cryptoadvance + --cov-report=term + --junitxml=./testresults.xml + -p no:cacheprovider + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: testresults + path: ./testresults.xml + + cypress: + runs-on: ubuntu-22.04 + timeout-minutes: 30 + container: + image: ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy@sha256:149f19f9534a3932972151d9f0084b386f8beef1b897ff739ad64a962af891dc + options: --shm-size=2g + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fix virtualenv shim + shell: bash + run: | + echo -e '#!/bin/bash\npython3 -m virtualenv "$@"' > /usr/local/bin/virtualenv + chmod +x /usr/local/bin/virtualenv + virtualenv --version + + - name: Cache bitcoind and elementsd + uses: actions/cache@v4 + with: + path: | + ./tests/bitcoin + ./tests/bitcoin-* + ./tests/elements + ./tests/elements-* + key: ${{ runner.os }}-${{ runner.arch }}-noded-${{ hashFiles('pyproject.toml', 'tests/elements_gitrev_pinned', 'tests/install_noded.sh', 'tests/bitcoin_SHA256SUMS', 'tests/elements_SHA256SUMS') }}-binary + save-always: true + + - name: Install bitcoind + run: ./tests/install_noded.sh --debug --bitcoin binary + + - name: Install elementsd + run: ./tests/install_noded.sh --debug --elements binary + + - name: Install Python dependencies + shell: bash + run: | + # Container uid differs from checkout owner — trust the repo dir so + # setuptools-scm/vcs_versioning can run `git describe` during pip -e. + git config --global --add safe.directory "$GITHUB_WORKSPACE" + virtualenv --python=python .env + source ./.env/bin/activate + pip3 install -r requirements.txt --require-hashes + pip3 install -e ".[test]" + + - name: Cache npm modules + uses: actions/cache@v4 + with: + path: ./node_modules + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + - name: Install npm deps + run: npm ci + + - name: Run Cypress + shell: bash + run: | + source ./.env/bin/activate + ./utils/test-cypress.sh --debug run + + - name: Upload Cypress test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-results + path: cypresstest-output.xml + + - name: Upload Cypress screenshots + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-screenshots + path: cypress/screenshots/** + if-no-files-found: ignore + + - name: Upload Cypress videos + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-videos + path: cypress/videos/** + if-no-files-found: ignore + + extension-smoketest: + runs-on: ubuntu-22.04 + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + cache: pip + cache-dependency-path: requirements.txt + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libusb-1.0-0-dev libudev-dev python3-virtualenv + + - name: Cache bitcoind and elementsd + uses: actions/cache@v4 + with: + path: | + ./tests/bitcoin + ./tests/bitcoin-* + ./tests/elements + ./tests/elements-* + key: ${{ runner.os }}-${{ runner.arch }}-noded-${{ hashFiles('pyproject.toml', 'tests/elements_gitrev_pinned', 'tests/install_noded.sh', 'tests/bitcoin_SHA256SUMS', 'tests/elements_SHA256SUMS') }}-binary + save-always: true + + - name: Install bitcoind + run: ./tests/install_noded.sh --debug --bitcoin binary + + - name: Install elementsd + run: ./tests/install_noded.sh --debug --elements binary + + - name: Install Python dependencies + run: | + virtualenv --python=python .env + source ./.env/bin/activate + pip3 install -r requirements.txt --require-hashes + pip3 install -e ".[test]" + + - name: Extension smoketest + run: | + git config --global user.name "CI CD" + git config --global user.email "cicd@example.com" + source ./.env/bin/activate + echo $PATH + mkdir tmp && cd tmp + mkdir testextension && cd testextension + pwd + python3 -m cryptoadvance.specter ext gen --ext-id cicdtest --org cryptoadvance --no-isolated-client --devicename cicddevice + pip3 install -e . + python3 -m cryptoadvance.specter server --config DevelopmentConfig --debug 2> specter.log & + sleep 15 + cat specter.log | grep "Found CicdtestService" # Discovery failed + cat specter.log | grep "Extension CicdtestService activated (alpha)" + sudo apt-get update && sudo apt-get -y install curl + curl http://127.0.0.1:25441/svc/cicdtest/ | grep "CicdtestService 4thewin." diff --git a/.gitignore b/.gitignore index ac6c04fb8..ba0a6ec05 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,9 @@ node_modules btcd-conn.json elmd-conn.json tests/bitcoin* +!tests/bitcoin_SHA256SUMS tests/elements* +!tests/elements_SHA256SUMS token.sh src/cryptoadvance/specter/translations/**/messages.mo src/cryptoadvance/specter/_version.py diff --git a/cypress.json b/cypress.json index 31c0282a6..da91d58f1 100644 --- a/cypress.json +++ b/cypress.json @@ -23,5 +23,9 @@ "mochaFile": "cypresstest-output.xml", "toConsole": true }, - "experimentalSessionAndOrigin": true + "experimentalSessionAndOrigin": true, + "retries": { + "runMode": 1, + "openMode": 0 + } } diff --git a/docker/cypress-python-jammy/Readme.md b/docker/cypress-python-jammy/Readme.md index 623899ecc..30e1a54db 100644 --- a/docker/cypress-python-jammy/Readme.md +++ b/docker/cypress-python-jammy/Readme.md @@ -8,3 +8,5 @@ docker push ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411 ``` Search for `cypress-python` on where this is used in the project. + +When editing this Dockerfile, rebuild and push to `ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy` with a new tag, then update the digest pin in `.github/workflows/test.yml`. diff --git a/docs/cirrus-replacement-spec.md b/docs/cirrus-replacement-spec.md new file mode 100644 index 000000000..2df008f66 --- /dev/null +++ b/docs/cirrus-replacement-spec.md @@ -0,0 +1,561 @@ +# Cirrus CI Replacement Spec + +> Incorporates review findings from Winston (architecture), Amelia (impl), +> Murat (test arch), Mary (requirements), and Ravi (red team) across two +> party-mode rounds plus a security pass. Key decisions: GHCR image +> migration is already complete (landed in `kn/update-node-ci`); cutover +> split across two PRs; acceptance gate is flake-rate based with 30-day +> steady-state budget; branch-protection rename has a runbook; committed +> evidence artifact required at gate-close; Codecov is out of scope. +> **CRITICAL security regression identified and fixed as PR #1 blocker:** +> unverified bitcoind downloads plus `save-always` cache turn a +> supply-chain attack into a persistent backdoor vector — PR #1 must +> update `tests/install_noded.sh` to GPG-verify releases. + +## Context + +Cirrus CI's free OSS tier shuts down **end of June 2026**. Specter-Desktop +depends on Cirrus for PR gating via `.cirrus.yml` (pytest + Cypress + +extension smoketest). We must migrate before the shutdown or lose PR gating. + +Today's CI split (see `AGENTS.md` §CI/CD): + +| System | Purpose | Status | +|----------------|-----------------------------------------------------|-----------------| +| GitHub Actions | Lint, smoke-build, Docker, **full release pipeline** | Active | +| Cirrus CI | pytest + Cypress + extension smoketest on PRs | **Sunsetting** | +| GitLab CI | `check` job only; release flow already migrated off | Vestigial, dead | + +**Reframe:** the real root cause is **3-system CI sprawl with no owner**. +Cirrus shutdown is the forcing function to consolidate on GH Actions. + +## Goals + +1. Preserve PR gating equivalent to Cirrus (pytest, Cypress, extension + smoketest) before Cirrus goes dark. +2. Zero new private-hardware requirements — stay on public runners. +3. Preserve cache hit rate so PR turnaround doesn't regress beyond SLO + (see §SLOs). +4. Leave the repo in a state where `.cirrus.yml`, `docker/cirrus-jammy/`, + `.gitlab-ci.yml`, and `pyinstaller/build-win-ci.bat` can be removed + cleanly in a follow-up PR. +5. Remove the cross-provider GitLab registry dependency entirely. + +## Non-goals + +- Re-architecting the test suite. +- Rebalancing the test pyramid (Cypress → pytest migration). Tracked + separately in §Deferred. +- Moving jobs back to GitLab CI (no PR model). +- Adding Cypress Dashboard or other paid observability SaaS. +- Coverage upload to Codecov or similar. Coverage stays terminal-only, + matching current Cirrus behavior. +- Introducing new test matrices (OS/python versions) beyond Cirrus parity. + +## Target: GitHub Actions + +GH Actions already hosts lint, Docker, and the release pipeline, all on +public runners. Consolidating reduces CI systems from three to one. + +## Image hosting — already on GHCR + +**Already done** by PR #2602 (merged 2026-04-12, commit `3e277689`). That +PR upgraded Node 12→18 and migrated **all three** CI images from GitLab +registry to GHCR: + +- `ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412` +- `ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411` +- `ghcr.io/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20260411` + +The cross-provider GitLab registry dependency is gone. No mirror workflow +needed. `.cirrus.yml` already references the GHCR paths, so Cirrus and the +new GHA workflow will pull from the same registry during the side-by-side +period. + +**Residual ownership gap (small):** the Dockerfiles are built by hand per +`docker/cypress-python-jammy/Readme.md`. When they change (historically +every ~18 months), whoever edits must remember to `docker build && docker push` +to GHCR and bump the tag in `test.yml`. Fix: add one sentence to +`docker/cypress-python-jammy/Readme.md` stating that Dockerfile edits +require re-push to GHCR and a matching tag/digest bump in +`.github/workflows/test.yml`. That's the full remediation — no scheduled +liveness check, no CODEOWNERS fight. The image is too static to justify more. + +Deeper hardening (cosign signing, automated build workflow) is tracked in +§Security HIGH as a 30-day follow-up. + +## What to port + +Three Cirrus tasks → three GH Actions jobs in a new +`.github/workflows/test.yml`. Trigger: `pull_request` + `push` to master. + +### Global workflow-level settings + +```yaml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +``` + +Every job must set: +- `timeout-minutes:` (budget below) +- `actions/checkout@v4` with **`fetch-depth: 0`** (NOT default `1`) — + `tests/test_util_version.py` needs tag history and `git describe` needs + annotated tags. No separate `git fetch refs/tags/v1.0.0` dance. +- `fail-fast: false` semantics where matrices are used. + +### 1. `test` (pytest) + +Cirrus today: `test_task` on +`ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412` +(post-PR-#2602 baseline), runs +`pytest --cov=cryptoadvance --junitxml=./testresults.xml` with cached +bitcoind and elementsd. + +GH Actions mapping: +- `runs-on: ubuntu-22.04` +- `timeout-minutes: 45` +- System deps installed inline: `libusb-1.0-0-dev libudev-dev + python3-virtualenv`. No custom image. +- `actions/setup-python@v5` pinned to `3.10`, `cache: pip`, `cache-dependency-path: requirements.txt`. +- **bitcoind/elementsd cache** (see §Caching). +- Install: + ``` + pip install -r requirements.txt --require-hashes + pip install -e ".[test]" # intentionally bypasses hashes, documented + ``` +- Run: `pytest --cov=cryptoadvance --cov-report=term --junitxml=./testresults.xml -p no:cacheprovider --reruns 0` + - `--reruns 0`: fail fast. Flakiness is debt, not a coping mechanism. + - Coverage is terminal-only, matching current Cirrus behavior. No upload. +- Artifacts: `testresults.xml`. + +### 2. `cypress` + +Cirrus today: `cypress_test_task` on +`ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411` +(post-PR-#2602 baseline), Cirrus-requested `cpu: 6, memory: 6G`, +runs `./utils/test-cypress.sh --debug run`. + +GH Actions mapping: +- `runs-on: ubuntu-22.04` (4 vCPU / 16 GB free). **Do not pre-escalate** to + `ubuntu-22.04-large`. Measure first (see §Cypress measurement). +- `timeout-minutes: 30` initially; adjust after measurement. +- Container: + ```yaml + container: + image: ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy@sha256: + options: --shm-size=2g # Cypress OOMs on default 64M /dev/shm + ``` + Digest captured from the `:20260411` tag at PR #1 time. Pinned by digest, + not tag, to make future Dockerfile edits visibly require a workflow bump. +- Same bitcoind/elements cache as `test`. +- npm cache via `actions/cache` keyed on `package-lock.json` (not + `setup-node`; node already ships in the container). +- Cypress retries: `{ runMode: 1, openMode: 0 }` in `cypress.json` — one + retry max, logged loudly so flakes are visible, not hidden. +- Run: `./utils/test-cypress.sh --debug run`. +- Artifacts: `cypresstest-output.xml`, `cypress/screenshots/**`, + `cypress/videos/**`. + +**Sharding decision:** deferred. If measured wall-clock > 15 min, split +specs across a 2-shard matrix. Don't split pre-emptively. + +### 3. `extension-smoketest` + +Straight port of Cirrus's `extension_smoketest_task`. Same runner/deps as +`test` job. Preserves the exact bash block: git identity, `ext gen`, server +boot, log-line grep, curl assertion. **Contract must stay byte-compatible** +— this job is the canary for downstream extension developers. + +## Images + +- **`docker/cirrus-jammy/`** — delete in PR #2. pytest job installs deps + inline on `ubuntu-22.04`; no custom image needed. The current GHCR tag + (`cirrus-jammy:20260412`) can stay in GHCR indefinitely as a harmless + artifact after the Dockerfile is deleted from the repo. +- **`cypress-python-jammy`** + **`cypress-base-ubuntu-jammy`** — already + on GHCR via PR #2602. Keep Dockerfiles in `docker/`. Add one sentence + to `docker/cypress-python-jammy/Readme.md`: *"When editing this + Dockerfile, rebuild and push to + `ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy` with a new + tag, then update the digest pin in `.github/workflows/test.yml`."* + +## Caching + +GH Actions `actions/cache@v4` keyed on: + +``` +${{ runner.os }}-${{ runner.arch }}-noded- + ${{ hashFiles('pyproject.toml', 'tests/elements_gitrev_pinned', 'tests/install_noded.sh', 'tests/bitcoin_SHA256SUMS', 'tests/elements_SHA256SUMS') }}- + binary +``` + +`tests/bitcoin_gitrev_pinned` is not in the repo today (bitcoin version +comes from `pyproject.toml`); the cache key hashes the committed +SHA256SUMS trust anchors instead, so a version bump invalidates the +cache through the trust-anchor files. + +`runner.arch` matters — future ARM runners must not poison x86 caches. + +Paths: `./tests/bitcoin`, `./tests/elements`. + +Populate step: `./tests/install_noded.sh --debug --bitcoin binary` and +`--elements binary` on cache miss (match Cirrus `populate_script`). + +Set **`save-always: true`** on the cache step so a mid-job timeout on a +cold cache still persists the partial binaries. Otherwise first-PR-after- +pin-bump on every branch re-pays the full install cost. + +**Security-critical:** see §Security. `save-always` + unverified +downloads was a persistent-backdoor vector. PR #1 must update +`install_noded.sh` to GPG-verify releases and re-verify on every cache +restore. This is non-negotiable. + +First run after cutover repopulates per branch — one-off ~few-minute cost, +accepted. + +## Concurrency, timeouts, retries + +| Setting | Value | +|-----------------------|----------------------------------------------| +| Concurrency group | `${{ github.workflow }}-${{ github.ref }}` | +| Cancel in progress | `true` | +| `test` timeout | 45 min | +| `cypress` timeout | 30 min (tune after measurement) | +| `extension-smoketest` | 15 min | +| pytest reruns | **0** (fail fast) | +| Cypress `runMode` retries | **1** (log loudly) | + +## Security + +Red-team pass (Ravi, 2026-04-12) surfaced one **CRITICAL** regression +introduced by this migration, plus two HIGH findings tracked as follow-ups. + +### CRITICAL — bitcoind/elementsd download verification (PR #1 blocker) + +**Attack chain:** `tests/install_noded.sh:244` does a bare +`wget https://bitcoincore.org/bin/bitcoin-core-${version}/${binary_file}` +with **no GPG signature verification and no SHA256SUMS check** (same for +Elements at line 241). Under Cirrus this was per-run ephemeral. Under GH +Actions with `actions/cache@v4 save-always: true` — and a cache key that +only hashes the pinned-rev files and the install script, **not** the +binary content — a single poisoned fetch (MITM, DNS/BGP hijack, upstream +compromise) writes a trojaned `bitcoind` into the cache. Every +subsequent run on master and PR branches restores it from cache. The +test runner executes it with the repo checkout mounted. + +**Impact:** persistent backdoor across all PR and master runs until the +cache key rotates. Blast radius includes the release pipeline +(`release.yml`), which shares the repo's `GITHUB_TOKEN` boundary and +runs on the same runner pool. + +**Regression status:** the `install_noded.sh` bare-wget predates this +migration. Cirrus's per-run ephemerality masked the weakness. Moving to +GHA with `save-always` caching **materially worsens** it from transient +to persistent. We do not inherit the risk silently — we fix it in PR #1. + +**Fix (must land in PR #1):** +1. Update `tests/install_noded.sh` to download `SHA256SUMS` and + `SHA256SUMS.asc` alongside the binary tarball. +2. Import the Bitcoin Core release signing keys (fanquake, achow101) + into a temporary `GNUPGHOME` and verify `SHA256SUMS.asc`. +3. Verify the tarball hash matches the entry in `SHA256SUMS`. Abort on + mismatch. +4. Same treatment for ElementsProject downloads (`install_noded.sh:241`) + using Elements release signing keys. +5. Run the verification step **on cache hit as well** (not only cache + miss), so a tampered cache entry fails closed instead of being + trusted on restore. +6. Commit the expected `SHA256SUMS` content (or its content hash) to the + repo so post-restore verification has a trusted reference. Bump it + alongside `tests/bitcoin_gitrev_pinned` / `tests/elements_gitrev_pinned`. + +### HIGH — Cypress image integrity chain (30-day follow-up) + +**Attack chain:** `cypress-python-jammy` is built and pushed by hand. +Maintainer-laptop compromise at push time → attacker uploads a trojaned +image under legitimate GHCR credentials. Next Dockerfile edit, a +maintainer computes the digest from the compromised local build and +pins it in `test.yml`. Cypress runs as root inside, with the repo +checkout mounted. + +**Not a PR #1 blocker.** Image has been untouched for 18 months; edit +frequency bounds exposure. Tracked as a separate hardening issue. + +**Fix (separate PR, target: within 30 days of cutover):** +1. Automate image build in a workflow triggered on `docker/**` path + filter, using default `GITHUB_TOKEN` with `packages: write`. +2. Cosign keyless-sign the pushed image via GitHub OIDC. +3. `test.yml` verifies the signature via `cosign verify` before + consuming the container. Removes maintainer laptops from the trust + path entirely. + +### HIGH (acknowledged) — Release pipeline shares token boundary + +`.github/workflows/release.yml` ships specterd, pip package, and +Electron artifacts to real users. It lives in the same repo as +`test.yml` and shares the same `GITHUB_TOKEN` boundary and runner pool. +Any RCE in a test workflow runs on a runner that can read `release.yml`. +This migration does not change that exposure — but **fixing CRITICAL #1 +above also de-risks the release pipeline**, since the same runner pool +consumes the same (now verified) binaries. + +No spec change beyond this acknowledgment. Full release pipeline +hardening is out of scope. + +### LOW findings (accepted / backlog) + +- **Branch protection cutover gap:** minutes-wide, runbook adequate, + accept. +- **`GITHUB_TOKEN` on fork PRs:** default read-only, no + `pull_request_target`, no third-party actions, no secrets exposed. + Clean. +- **First-party actions pinned to major (`@v4`/`@v5`) not SHA:** GitHub + org compromise is a tier-1 ecosystem event. Defense-in-depth backlog + item, not blocking. + +## Test quality — flake detection, quarantine, steady-state + +Not in Cirrus today. Adding now, at minimum viable. + +- **Flake signal:** parse JUnit XML for retry markers after each run; when + a Cypress spec retries-to-green, emit a GH Actions warning annotation + and append a line to a tracking gist (`flake-log.md`). No dashboard yet. +- **Quarantine policy:** any spec flagged flaky twice in 14 days gets + `@skip(reason="flaky", issue="#NNNN")` with a linked GH issue and a + **2-week SLA** to fix-or-delete. +- **Retry budget:** Cypress `runMode: 1`. Anything needing more is quarantined. +- **Steady-state flake SLO (post-cutover):** rolling 30-day rerun rate + must stay **≤ 1%** across all jobs. Same JUnit parser feeds a daily cron + job that computes the window and auto-opens a P2 issue on breach. This + turns flake detection from a one-shot cutover gate into a living quality + signal — without it we'll be right back here in six months. + +## Cypress performance — measurement protocol + +**Before** approving any runner upgrade: +1. Run the Cypress suite 5× on `ubuntu-22.04` free tier. +2. Record wall-clock p50 / p95 via `/usr/bin/time -v` wrapping the script. +3. Compare to last 5 Cirrus runs' wall-clock. +4. Ship it if p95 is within **Cirrus +20%**. +5. Only if p95 exceeds +20% or hits the 30-min timeout, evaluate in order: + (a) `--shm-size` bump, (b) spec sharding across 2 jobs, + (c) `ubuntu-22.04-large` (paid — requires approval). + +## Migration plan — two PRs + +### PR #1 — Add GH Actions workflow (side-by-side) + +1. **Security blocker:** update `tests/install_noded.sh` per §Security + CRITICAL fix (GPG-verify `SHA256SUMS.asc`, verify tarball hash, + re-verify on cache restore). Commit trusted reference hashes + alongside `tests/bitcoin_gitrev_pinned` / + `tests/elements_gitrev_pinned`. This must land in the same PR as the + workflow. +2. Capture the `cypress-python-jammy` image digest from the `:20260411` + GHCR tag. Write it into `test.yml`. +3. Add `.github/workflows/test.yml` with all three jobs. +4. Add the one-sentence rebuild-and-push note to + `docker/cypress-python-jammy/Readme.md`. +5. **Do not touch** `.cirrus.yml`, `.gitlab-ci.yml`, or branch protection. +6. Land the PR. Both CI systems now run on every PR. +7. Iterate on the workflow until the acceptance gate (§Acceptance) passes. +8. Commit the evidence artifact to `docs/ci-migration-evidence.md` once + the gate is met. + +### PR #2 — Cutover + cleanup + +Only merge when PR #1 meets the acceptance gate. + +1. Delete `.cirrus.yml` and `docker/cirrus-jammy/`. +2. Delete `.gitlab-ci.yml` and `pyinstaller/build-win-ci.bat`. +3. Audit and prune dead GitLab-only code paths in `utils/release.sh`, + `utils/release_helper.py`, `utils/github.py`. +4. Drop Cirrus + GitLab sections from `docs/continuous-integration.md`. +5. Update `AGENTS.md` CI/CD section. +6. **Rename required status checks** in GitHub branch protection (see + §Branch protection). This is a separate manual step, documented in the + PR body. + +Splitting the cleanup out of PR #1 preserves fast revertability: if +anything melts in week 1 of side-by-side, PR #1 is trivially revertable +because it touches only additive files. + +## Branch protection & required checks + +**Scariest silent-failure mode.** If the required-check name on master +branch protection still says `Cirrus CI / test_task` after cutover, +*nothing is gating PRs anymore* and no alert fires. + +Runbook (must execute as part of PR #2 merge): + +1. Before merging PR #2: list current required checks via + `gh api repos/cryptoadvance/specter-desktop/branches/master/protection`. +2. Record the Cirrus check names. +3. Merge PR #2. +4. Immediately update branch protection: remove the Cirrus check names, + then add the exact GitHub Actions required-check contexts in the form + ` / ` as reported by the GitHub UI or API. + For this migration the workflow `name:` is `Tests` (see + `.github/workflows/test.yml`), so the three contexts to require are: + - `Tests / test` + - `Tests / cypress` + - `Tests / extension-smoketest` + + Do NOT add bare `test` / `cypress` / `extension-smoketest` — those are + job ids, not emitted check contexts, and will silently fail to gate. +5. Open a throwaway test PR and verify those exact three contexts are + marked required and are actually gating merge. +6. Only then announce cutover complete. + +## Secrets inventory + +No new secrets required. The workflow only uses the default +auto-provided `GITHUB_TOKEN` (for `ghcr.io` push during the one-shot image +mirror and for any standard action plumbing). + +Historical GitLab secrets (`GH_BIN_UPLOAD_PW`, `TWINE_PASSWORD`, +`GPG_PASSPHRASE`, `SSH_SPECTEREXT_DEPLOY_KEY`, `SSH_SPECTERSTATIC_DEPLOY_KEY`) +are already unused per AGENTS.md. PR #2 should not touch them (release +pipeline lives elsewhere). + +## Stakeholder comms + +This is CI plumbing, not a release. Scope is narrow: + +- **Extension developers:** smoketest contract preserved byte-for-byte. + No comms needed unless the job fails post-cutover. +- **`docs/continuous-integration.md`:** updated in PR #2 to reflect the + new CI topology. That's the extent of external-facing docs. + +## SLOs / acceptance criteria + +### PR wall-clock SLO + +**Baseline captured 2026-04-12** from the Cirrus GraphQL API +(`https://api.cirrus-ci.com/graphql`), last 20 successful master-branch +builds. Cirrus runs all three tasks in parallel, so total build wall-clock +≈ longest task (cypress). + +| Task | n | median | p95 | min | max | GHA ceiling (+20%) | +|---------------------------|----|--------|--------|--------|--------|--------------------| +| `test_task` | 20 | 4m47s | 5m35s | 4m23s | 5m37s | **5m44s** | +| `cypress_test_task` | 20 | 6m02s | 6m55s | 5m27s | 8m15s | **7m14s** | +| `extension_smoketest_task`| 20 | 2m10s | 2m27s | 1m55s | 2m39s | **2m36s** | + +- **Tolerance:** per-job wall-clock on GH Actions must not exceed the + "GHA ceiling" column (Cirrus median + 20%). This threshold is used + uniformly by the Cypress measurement protocol and the acceptance gate + — one number, one decision. +- **Action on breach:** investigate before cutover; do not ship PR #2 until + resolved. + +**Implications for Cypress measurement protocol:** current Cirrus cypress +p95 is 6m55s — well under the 30-min timeout and not remotely at risk of +hitting paid-runner territory. The "4 vCPU vs 6" concern is almost +certainly a non-issue in practice. Measurement protocol stands, but expect +it to pass on free runners. + +### Flake rate ceiling + +- **Baseline:** measured during side-by-side (unknown today). +- **Ceiling:** post-cutover flake rate ≤ Cirrus baseline. Any regression + is a cutover blocker. + +### Cost ceiling + +- GH Actions minutes on public OSS runners are effectively free. No hard + cap needed unless we escalate to `-large` runners (then: $X/month ceiling + requires explicit approval from project lead). + +### Acceptance gate for cutover (PR #2 merge criteria) + +All four must hold: +1. **10 consecutive green runs** of the new workflow on master-branch + schedule (nightly) or via manual dispatch. +2. **At least 3 green PR runs**, including one that touches `src/cryptoadvance/specter/static/` or frontend templates. +3. **Zero new flakes** detected over at least 50 total runs (PR + master). +4. Cypress p95 wall-clock within **Cirrus +20%** per measurement protocol. + +"Green on 3 PRs" alone is insufficient — flake rate is the real KPI. + +### Evidence artifact (mandatory) + +Before merging PR #2, a committed **evidence artifact** must exist at +`docs/ci-migration-evidence.md` containing, at minimum: + +- Measured wall-clock median + p95 per job over the 10+ master runs +- Flake count over the 50+ runs window (expected: 0) +- URLs to 3+ sample PR runs including the frontend-touching one +- Date and commit SHA at measurement time + +This exists so that six months from now "did we actually hit SLO?" has a +grep-able answer instead of a hope. GH Actions logs are GC'd; the evidence +doc is not. Ten minutes to write, permanent value. + +## Rollback procedure + +If anything breaks post-cutover: + +1. **Workflow-level breakage in PR #1 phase:** disable the GH Actions + workflow via `workflow_dispatch` off-switch or delete the file; Cirrus + still gates PRs. Zero user impact. +2. **Post-cutover breakage (PR #2 merged):** revert PR #2. This restores + `.cirrus.yml` and `docker/cirrus-jammy/`. Re-add Cirrus checks to branch + protection. Cirrus is assumed still alive up to shutdown date. +3. **Post-Cirrus-shutdown breakage:** no Cirrus fallback exists. Forward + fix only. This is why PR #2 must merge **≥ 4 weeks before shutdown**. + +## Timeline + +| Date | Milestone | +|-------------|-------------------------------------------------| +| 2026-04-12 | Cirrus baseline captured (§SLOs); GHCR migration merged (PR #2602) | +| 2026-04-13 | Spec finalized post red-team pass | +| 2026-04-14 | Open PR #1 (security fix + workflow + cache) | +| 2026-04-21 | PR #1 green on first PR run | +| 2026-05-05 | Acceptance gate met (10 green + flake-clean) | +| 2026-05-12 | **PR #2 merged + branch protection updated** | +| 2026-05-19 | One full release cycle on new CI (if a tag cuts)| +| 2026-06-30 | Cirrus shutdown (~7 week buffer after cutover) | + +## Deferred (explicit non-goals for this migration) + +- **Test pyramid rebalance.** Cypress likely owns flows that belong in + pytest + a Flask test client. Q3 epic, not this PR. Logged here so it's + not lost. +- **Cypress Dashboard / paid observability.** Vendor lock, not worth the + cost at current scale. JUnit + artifacts cover 90% of the value. +- **Coverage upload / Codecov / coverage-delta gating.** Out of scope for + this migration. Matches current Cirrus (which also doesn't upload). If + we want trend data later, it's a standalone follow-up PR with its own + bus-factor discussion and token plumbing. +- **Local-contributor reproducibility of the Cypress image.** Nice to + have; separate runbook, post-cutover. +- **Cypress image cosign signing + build automation.** Tracked in + §Security HIGH. Separate PR within 30 days of cutover, not blocking. +- **Release pipeline hardening.** Out of scope; §Security HIGH + acknowledges shared token boundary. +- **First-party action SHA pinning.** Defense-in-depth backlog. + +## Risks (updated) + +1. **Supply-chain backdoor via unverified bitcoind (CRITICAL).** Resolved + by the PR #1 blocker fix in §Security. Without that fix, this spec is + unmergeable. +2. **Cypress perf on 4 vCPU.** Largely resolved by baseline data: Cirrus + cypress p95 is 6m55s, so the suite is not heavyweight. Residual risk is + that GH Actions 4-vCPU runners could push it past the +25% ceiling + (7m32s). Mitigation: measurement protocol in §Cypress measurement. + Escape hatch documented, not pre-purchased. +2. **Branch protection silent-ungate.** Scariest risk; has a runbook now + (§Branch protection). +3. **ghcr.io image rebuild drift.** Once mirrored, whoever edits + `docker/cypress-python-jammy/Dockerfile` must remember to rebuild and + re-push. Mitigation: README runbook + digest pinning makes staleness + visible (workflow won't auto-upgrade). +4. **First-run cache miss storm.** One-off few-minute cost. Accepted. + +## Unresolved questions + +None. All prior questions resolved or descoped. diff --git a/tests/bitcoin_SHA256SUMS b/tests/bitcoin_SHA256SUMS new file mode 100644 index 000000000..7649492d4 --- /dev/null +++ b/tests/bitcoin_SHA256SUMS @@ -0,0 +1,35 @@ +# Trusted reference: verbatim plaintext of https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS +# Provenance: +# Source URL: https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS +# Signature URL: https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS.asc +# Verified on: 2026-04-15 +# Verified by: Good signatures from: +# - fanquake (primary fingerprint E777299FC265DD04793070EB944D35F9AC3DB76A, +# signing subkey CFB16E21C950F67FA95E558F2EEB9F5CC09526C1) +# - achow101 (primary fingerprint 152812300785C96444D3334D17565732E08E5E41) +# Builder keys sourced from: https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys +# Do not edit the hash lines below — they are the on-disk trust anchor compared +# against downloaded tarballs by tests/install_noded.sh::verify_binary. +9547fa03574f8bde296f707c7d9f7d89827c75c5a28f84402578a4fa92a787ec bitcoin-22.0-aarch64-linux-gnu-debug.tar.gz +ac718fed08570a81b3587587872ad85a25173afa5f9fbbd0c03ba4d1714cfa3e bitcoin-22.0-aarch64-linux-gnu.tar.gz +80071e0ecd24edfec8a1972b495b9822c79a5d33c7123bff51688638aac97cab bitcoin-22.0-arm-linux-gnueabihf-debug.tar.gz +b8713c6c5f03f5258b54e9f436e2ed6d85449aa24c2c9972f91963d413e86311 bitcoin-22.0-arm-linux-gnueabihf.tar.gz +8f70852feb39078e02182563517d17bdfc4a12904cf1bdabbae95594d9a1e473 bitcoin-22.0-codesignatures-22.0.tar.gz +d0e9d089b57048b1555efa7cd5a63a7ed042482045f6f33402b1df425bf9613b bitcoin-22.0.tar.gz +bfc04a3c4e8b613bfd9359e54da6cc60f027860e9723f9a6bfd6f13873eb811f bitcoin-22.0-powerpc64-linux-gnu-debug.tar.gz +2cca5f99007d060aca9d8c7cbd035dfe2f040dd8200b210ce32cdf858479f70d bitcoin-22.0-powerpc64-linux-gnu.tar.gz +5f0bf1491bc8825ca1506f7cf586030f06bb17a563ccde92e8c75720022704e6 bitcoin-22.0-powerpc64le-linux-gnu-debug.tar.gz +91b1e012975c5a363b5b5fcc81b5b7495e86ff703ec8262d4b9afcfec633c30d bitcoin-22.0-powerpc64le-linux-gnu.tar.gz +59b16e63aa935f50fd2813efe7f137187fcf0fff84e3205a9c6cb462a8bb160c bitcoin-22.0-riscv64-linux-gnu-debug.tar.gz +9cc3a62c469fe57e11485fdd32c916f10ce7a2899299855a2e479256ff49ff3c bitcoin-22.0-riscv64-linux-gnu.tar.gz +3b3e2680f7d9304c13bfebaf6445ada40d72324b4b3e0a07de9db807389a6c5b bitcoin-22.0-osx-signed.dmg +52449aa894a6ce5653315e1260d0ce87c1d9f490afe3c92b44285710804b11ae bitcoin-22.0-osx-unsigned.dmg +f51156774c24c0ac5cc30237fa08aa17ed04a180dfd72c3e7d20fdc3f45806dc bitcoin-22.0-osx-unsigned.tar.gz +2744d199c3343b2d94faffdfb2c94d75a630ba27301a70e47b0ad30a7e0155e9 bitcoin-22.0-osx64.tar.gz +3a4f05657c048d3e9505bdb9c4fb3658e5e3d4233b0b93c1853e080620589765 bitcoin-22.0-x86_64-linux-gnu-debug.tar.gz +59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16 bitcoin-22.0-x86_64-linux-gnu.tar.gz +9169989d649937c0f9ebccd3ab088501328aa319fe9e91fc7ea8e8cf0fcccede bitcoin-22.0-win64-setup.exe +f890473d6d910d478f8ff08f9356d0305d19b46cf06e4fc3b5a49b0b684fd2a7 bitcoin-22.0-win-unsigned.tar.gz +0a97ebc8ae44913e3ef9c5b1ddd2af3a4ffb0ba25b6ab1ee8173e40e60499402 bitcoin-22.0-win64-debug.zip +ecc579d006230d6ffc5a5b7b53ce8c76477d37c1c7bad69694e9c2d69f00331d bitcoin-22.0-win64-setup-unsigned.exe +9485e4b52ed6cebfe474ab4d7d0c1be6d0bb879ba7246a8239326b2230a77eb1 bitcoin-22.0-win64.zip diff --git a/tests/elements_SHA256SUMS b/tests/elements_SHA256SUMS new file mode 100644 index 000000000..05ec0d0d6 --- /dev/null +++ b/tests/elements_SHA256SUMS @@ -0,0 +1,22 @@ +# Trusted reference: plaintext hashes extracted from the clearsigned +# SHA256SUMS.asc published with elements-0.21.0.2. +# Provenance: +# Source URL: https://github.com/ElementsProject/elements/releases/download/elements-0.21.0.2/SHA256SUMS.asc +# Clearsigned: yes (PGP-SIGNED-MESSAGE, Hash: SHA256) +# Verified on: 2026-04-15 +# Verified by: Good signature from Steven Roose +# primary fingerprint 8CC974D9CFD034DCEED213B02A57E0A610D7F19C +# signing subkey DE10E82629A8CAD55B700B972F2A88D7F8D68E87 +# Key sourced from: hkps://keyserver.ubuntu.com (search 0x2F2A88D7F8D68E87) +# Do not edit the hash lines below — they are the on-disk trust anchor compared +# against downloaded tarballs by tests/install_noded.sh::verify_binary. +06de6cd39f00a8b5604f2baa6203c08358762b99560bec6ad90a65bc22fadf6f elements-elements-0.21.0.2-aarch64-linux-gnu.tar.gz +d263ed2182f55d0d08013f005f8db3d8d16c5f2a8e954b93f7938ceadd3798e0 elements-elements-0.21.0.2-arm-linux-gnueabihf.tar.gz +bbeac447c8947cb6788cc5d3f8e8eade82d9d03b159992fa22f4a0198ebd8a60 elements-elements-0.21.0.2-osx64.tar.gz +f7774aba06a4b4a3708be96774cd9e993fc58998f91a1a8cf9b692a9f888f89f elements-elements-0.21.0.2-osx-unsigned.dmg +9cdc53b1f81a8c2f3e4b04d80de04ca1cc182d018c0c4fef1aaaf6dcc87f5b42 elements-elements-0.21.0.2-osx-unsigned.tar.gz +cf3e2d6fc0811a3dd1e1ace640a62319af35443c76a404caf4f26674197c8059 elements-elements-0.21.0.2-riscv64-linux-gnu.tar.gz +a3ec010bd10e8b5947030e6b846069084056418a7a1e111c0d2634a65662e53e elements-elements-0.21.0.2-win64-setup-unsigned.exe +7a8f427be448eaa89f87c31cce705069c2d9528cf54fdd838c104f1257f800d4 elements-elements-0.21.0.2-win64.zip +4863ee842d13bbb0255c2002ccc07f170b87717589a3493805944579a4af6745 elements-elements-0.21.0.2-win-unsigned.tar.gz +3018116794429b77ce0dd7436c2906f8be4eb5d6163b8451c5ce7e7bedad152b elements-elements-0.21.0.2-x86_64-linux-gnu.tar.gz diff --git a/tests/install_noded.sh b/tests/install_noded.sh index e942c39d1..99b909ffb 100755 --- a/tests/install_noded.sh +++ b/tests/install_noded.sh @@ -221,6 +221,184 @@ function sub_compile { echo " --> install_node.sh End $(date) took $DIFF" } +# ----------------------------------------------------------------------------- +# Release signing trust anchors for GPG defense-in-depth verification. +# +# These fingerprints (and the SHA256 trust anchors committed in +# tests/bitcoin_SHA256SUMS / tests/elements_SHA256SUMS) are the reason this +# script exists in its hardened form: CI uses `save-always: true` caches, so +# a single poisoned fetch would persist across every future run if the +# verification path were ever skipped. verify_binary() MUST be invoked on +# both cache miss (fresh download) AND cache hit (restore), and MUST abort +# non-zero on any mismatch. +# +# Builder keys for bitcoin-core releases are published at: +# https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys +# The elements signing key was fetched from: +# hkps://keyserver.ubuntu.com (search 0x2F2A88D7F8D68E87) +# ----------------------------------------------------------------------------- + +# Pinned release signing keys (fingerprints). The committed SHA256SUMS files +# in tests/ are the primary trust anchor; the GPG step below re-validates the +# upstream chain when the network is reachable. +BITCOIN_RELEASE_KEYS=( + "E777299FC265DD04793070EB944D35F9AC3DB76A" # fanquake + "152812300785C96444D3334D17565732E08E5E41" # achow101 / Ava Chow +) +ELEMENTS_RELEASE_KEYS=( + "8CC974D9CFD034DCEED213B02A57E0A610D7F19C" # Steven Roose +) + +# Compute the sha256 of a file in a cross-platform way. +# Usage: sha256_of +function sha256_of { + local f=$1 + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$f" | awk '{print $1}' + elif command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$f" | awk '{print $1}' + else + echo "ERROR: neither sha256sum nor shasum found" >&2 + return 127 + fi +} + +# Look up the expected sha256 for ${basename_of_artifact} from the committed +# trust anchor file tests/${node_impl}_SHA256SUMS. Comment lines (starting +# with '#') in the trust anchor are ignored so the provenance preamble does +# not interfere. +# Usage: expected_sha_for +function expected_sha_for { + local node_impl=$1 + local artifact=$2 + local trust_file="" + # tests/install_noded.sh cd's to its own dir at the top of the file, so + # the trust anchors live one directory up from the usual CWD + # (./${node_impl}) and sometimes in the CWD itself, depending on whether + # verify_binary is called before or after we cd into ./${node_impl}. + if [ -f "./${node_impl}_SHA256SUMS" ]; then + trust_file="./${node_impl}_SHA256SUMS" + elif [ -f "../${node_impl}_SHA256SUMS" ]; then + trust_file="../${node_impl}_SHA256SUMS" + else + echo "ERROR: trust anchor tests/${node_impl}_SHA256SUMS not found" >&2 + return 2 + fi + # Format: + grep -v '^[[:space:]]*#' "$trust_file" \ + | awk -v f="$artifact" '$2 == f {print $1; exit}' +} + +# Import release signing keys into a throw-away GNUPGHOME and GPG-verify +# ${sumsfile} against ${sigfile}. Returns 0 on good signature, non-zero on +# anything else (including no network, missing gpg, bad sig). Callers MUST +# still compare ${sumsfile} to the committed trust anchor — this GPG step is +# defense in depth, not the sole trust anchor. +# Usage: gpg_verify_sums +function gpg_verify_sums { + local node_impl=$1 + local sumsfile=$2 + local sigfile=$3 + if ! command -v gpg >/dev/null 2>&1; then + echo " --> WARNING: gpg not installed; skipping upstream GPG re-verify (committed SHA256SUMS trust anchor still enforced)" + return 0 + fi + local tmp_gnupg + tmp_gnupg=$(mktemp -d -t specter-gnupg-XXXXXX) || return 1 + # shellcheck disable=SC2064 + trap "rm -rf '$tmp_gnupg'" RETURN + export GNUPGHOME="$tmp_gnupg" + chmod 700 "$tmp_gnupg" + local keys=() + if [ "$node_impl" = "bitcoin" ]; then + keys=("${BITCOIN_RELEASE_KEYS[@]}") + elif [ "$node_impl" = "elements" ]; then + keys=("${ELEMENTS_RELEASE_KEYS[@]}") + fi + local imported=0 + for fpr in "${keys[@]}"; do + # Try keys.openpgp.org first, then keyserver.ubuntu.com. + if curl -fsSL "https://keys.openpgp.org/vks/v1/by-fingerprint/${fpr}" 2>/dev/null \ + | gpg --import 2>/dev/null; then + imported=$((imported + 1)) + continue + fi + if curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x${fpr}&options=mr" 2>/dev/null \ + | gpg --import 2>/dev/null; then + imported=$((imported + 1)) + fi + done + if [ "$imported" -eq 0 ]; then + echo " --> WARNING: could not fetch any ${node_impl} release signing keys; skipping upstream GPG re-verify" + unset GNUPGHOME + return 0 + fi + # Bitcoin Core SHA256SUMS.asc carries signatures from many maintainers. + # gpg --verify exits non-zero when ANY signature's key is missing, even + # if others verify successfully. We only import a subset of keys, so + # the raw exit code is unreliable. Instead, use --status-fd to check + # for at least one VALIDSIG whose primary-key fingerprint we trust. + # + # VALIDSIG format (last field is always the primary key fingerprint, + # even when the signature was made by a subkey): + # VALIDSIG ... + # GOODSIG uses the signing subkey ID, which may differ from the primary + # fingerprint we pin — so VALIDSIG is the correct field to match. + local status_out + if [ -n "$sigfile" ] && [ -f "$sigfile" ]; then + status_out=$(gpg --status-fd 1 --verify "$sigfile" "$sumsfile" 2>/dev/null) + else + # Clearsigned (elements case): verify in-place. + status_out=$(gpg --status-fd 1 --verify "$sumsfile" 2>/dev/null) + fi + local found_good=0 + for fpr in "${keys[@]}"; do + # Match VALIDSIG line whose last field (primary fingerprint) equals ours. + if echo "$status_out" | grep -q "VALIDSIG.*${fpr}"; then + found_good=1 + echo " --> GPG: valid signature traced to primary key ${fpr}" + break + fi + done + unset GNUPGHOME + if [ "$found_good" -eq 0 ]; then + echo " --> WARNING: no VALIDSIG from a trusted primary key found in GPG status output" + echo " --> Status output: $status_out" + return 1 + fi + return 0 +} + +# Verify a binary artifact (tarball) against the committed trust anchor. +# Aborts the script with exit 2 on any mismatch. +# Usage: verify_binary +function verify_binary { + local node_impl=$1 + local binary_path=$2 + if [[ ! -f "$binary_path" ]]; then + echo "ERROR: verify_binary: $binary_path does not exist" >&2 + exit 2 + fi + local artifact + artifact=$(basename "$binary_path") + local expected + expected=$(expected_sha_for "$node_impl" "$artifact") + if [ -z "$expected" ]; then + echo "ERROR: verify_binary: no trusted sha256 entry for '$artifact' in tests/${node_impl}_SHA256SUMS" >&2 + exit 2 + fi + local actual + actual=$(sha256_of "$binary_path") || exit 2 + if [ "$expected" != "$actual" ]; then + echo "ERROR: verify_binary: sha256 mismatch for $artifact" >&2 + echo " expected $expected" >&2 + echo " actual $actual" >&2 + echo " This is a trust violation. Aborting." >&2 + exit 2 + fi + echo " --> verify_binary: OK ($artifact sha256=$expected)" +} + function sub_binary { node_impl=$1 echo " --> install_noded.sh Start $(date) (binary) for node_impl $node_impl" @@ -236,16 +414,52 @@ function sub_binary { else binary_file=${node_impl}-${version}-x86_64-linux-gnu.tar.gz fi - if [[ ! -f $binary_file ]]; then + + # The tarball lives inside ./${node_impl}/ so that it is captured by the + # cache (which covers ./tests/${node_impl}/) and re-verified on every + # cache restore. This is the whole point of the hardened flow — see the + # "save-always backdoor" rationale at the top of the file. + # Clean up a broken symlink from a partial cache restore (the workflow + # caches ./tests/${node_impl}-* as well, but be defensive). + if [[ -L "./${node_impl}" && ! -e "./${node_impl}" ]]; then + echo " --> cleaning up dangling symlink ./${node_impl}" + rm -f "./${node_impl}" + fi + mkdir -p "./${node_impl}" + local cached_tarball="./${node_impl}/${binary_file}" + + if [[ -f "$cached_tarball" ]]; then + echo " --> cache hit: found existing ${cached_tarball}, re-verifying" + verify_binary "$node_impl" "$cached_tarball" + else + echo " --> cache miss: downloading ${binary_file}" if [ "$node_impl" = "elements" ]; then - wget https://github.com/ElementsProject/elements/releases/download/${version}/${binary_file} + # elements publishes a clearsigned SHA256SUMS.asc only + ( cd "./${node_impl}" && \ + wget -q "https://github.com/ElementsProject/elements/releases/download/${version}/${binary_file}" && \ + wget -q "https://github.com/ElementsProject/elements/releases/download/${version}/SHA256SUMS.asc" ) + gpg_verify_sums "$node_impl" "./${node_impl}/SHA256SUMS.asc" "" \ + || { echo "ERROR: upstream GPG verification failed for elements SHA256SUMS.asc" >&2; exit 2; } fi if [ "$node_impl" = "bitcoin" ]; then - wget https://bitcoincore.org/bin/bitcoin-core-${version}/${binary_file} + ( cd "./${node_impl}" && \ + wget -q "https://bitcoincore.org/bin/bitcoin-core-${version}/${binary_file}" && \ + wget -q "https://bitcoincore.org/bin/bitcoin-core-${version}/SHA256SUMS" && \ + wget -q "https://bitcoincore.org/bin/bitcoin-core-${version}/SHA256SUMS.asc" ) + gpg_verify_sums "$node_impl" "./${node_impl}/SHA256SUMS" "./${node_impl}/SHA256SUMS.asc" \ + || { echo "ERROR: upstream GPG verification failed for bitcoin SHA256SUMS.asc" >&2; exit 2; } fi + # Primary trust anchor: committed tests/${node_impl}_SHA256SUMS. + verify_binary "$node_impl" "$cached_tarball" fi - tar -xzf ${binary_file} + # Extract into ./${node_impl}-${version}/ (tarballs ship that layout). + # Leave the tarball in place inside ./${node_impl}/ to be reused on + # subsequent cache hits (that directory becomes a symlink below, so we + # copy the tarball out to a sibling and re-plant it after the symlink). + local tarball_basename="${binary_file}" + cp "$cached_tarball" "./${tarball_basename}.verified" + tar -xzf "$cached_tarball" if [[ -d ./"$node_impl" ]]; then if [[ -d ./"$node_impl"/src ]]; then mv ./"$node_impl" ./"$node_impl"-src @@ -253,8 +467,12 @@ function sub_binary { rm -rf ./"$node_impl" fi fi - rm "$node_impl" + rm -f "$node_impl" ln -s ./"$node_impl"-${version} "$node_impl" + # Re-plant the verified tarball inside the (now-symlinked) cached dir so + # the next cache restore can re-verify it. + mv "./${tarball_basename}.verified" "./${node_impl}/${binary_file}" + echo " --> Listing binaries" if [ $(uname) = "Darwin" ]; then find ./"$node_impl"/bin -maxdepth 1 -type f -perm +111 -exec ls -ld {} \; @@ -263,6 +481,11 @@ function sub_binary { fi echo " --> checking for ${node_impl}d" test -x ./${node_impl}/bin/${node_impl}d || exit 2 + + # Final defense-in-depth: re-verify the tarball one more time so that + # tampering between extract and exit is caught as well. + verify_binary "$node_impl" "./${node_impl}/${binary_file}" + echo " --> Finished installing ${node_impl}d binary" END=$(date +%s) DIFF=$(echo "$END - $START" | bc) From 62ea02657b3ca4b3053c56357afe9f9cd8245d12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 22:33:20 +0200 Subject: [PATCH 06/36] Chore(deps): Bump axios and wait-on (#2592) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 419 ++++++++++++++++++++++++++++------------------ package.json | 2 +- yarn.lock | 187 ++++++++++++--------- 3 files changed, 364 insertions(+), 244 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd7b28a2b..fec9c5d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,16 @@ "dependencies": { "gulp-livereload": "^4.0.2", "rimraf": "^3.0.2", - "wait-on": "^5.3.0" + "wait-on": "^9.0.5" }, "devDependencies": { "cypress": "^9.7.0", "cypress-wait-until": "^1.7.1", "gulp": "^4.0.2", "tailwindcss": "^3.2.4" + }, + "engines": { + "node": ">=18" } }, "node_modules/@colors/colors": { @@ -80,17 +83,46 @@ "ms": "^2.1.1" } }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==" + }, "node_modules/@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", + "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@hapi/hoek": "^11.0.2" } }, "node_modules/@nodelib/fs.scandir": { @@ -131,24 +163,10 @@ "node": ">= 8" } }, - "node_modules/@sideway/address": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz", - "integrity": "sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "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==", - "license": "BSD-3-Clause" - }, - "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/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" }, "node_modules/@types/node": { "version": "14.14.37", @@ -573,8 +591,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -613,11 +630,36 @@ "dev": true }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axios/node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" } }, "node_modules/bach": { @@ -1297,7 +1339,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1618,7 +1659,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -1796,6 +1836,20 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -2397,16 +2451,15 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -3004,6 +3057,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3493,15 +3560,20 @@ "dev": true }, "node_modules/joi": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz", - "integrity": "sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.1.2.tgz", + "integrity": "sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.1.0" + }, + "engines": { + "node": ">= 20" } }, "node_modules/jsbn": { @@ -3696,21 +3768,6 @@ } } }, - "node_modules/listr2/node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/listr2/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "node_modules/livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", @@ -4004,7 +4061,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -4013,7 +4069,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -4043,9 +4098,12 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "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/mixin-deep": { "version": "1.3.2", @@ -5390,14 +5448,11 @@ } }, "node_modules/rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { @@ -6568,9 +6623,9 @@ } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -6915,21 +6970,21 @@ } }, "node_modules/wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.5.tgz", + "integrity": "sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==", "dependencies": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" + "axios": "^1.15.0", + "joi": "^18.1.2", + "lodash": "^4.18.1", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" }, "bin": { "wait-on": "bin/wait-on" }, "engines": { - "node": ">=8.9.0" + "node": ">=20.0.0" } }, "node_modules/websocket-driver": { @@ -7171,17 +7226,40 @@ } } }, + "@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "requires": { + "@hapi/hoek": "^11.0.2" + } + }, + "@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==" + }, "@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==" + }, + "@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==" + }, + "@hapi/tlds": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", + "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==" }, "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "requires": { - "@hapi/hoek": "^9.0.0" + "@hapi/hoek": "^11.0.2" } }, "@nodelib/fs.scandir": { @@ -7210,23 +7288,10 @@ "fastq": "^1.6.0" } }, - "@sideway/address": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz", - "integrity": "sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@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==" + "@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" }, "@types/node": { "version": "14.14.37", @@ -7543,8 +7608,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "at-least-node": { "version": "1.0.0", @@ -7571,11 +7635,32 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + } + }, + "proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" + } } }, "bach": { @@ -8100,7 +8185,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -8346,8 +8430,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "detect-file": { "version": "1.0.0", @@ -8490,6 +8573,17 @@ "es-errors": "^1.3.0" } }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -8981,9 +9075,9 @@ } }, "follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" }, "for-in": { "version": "1.0.2", @@ -9436,6 +9530,14 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -9806,15 +9908,17 @@ "dev": true }, "joi": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz", - "integrity": "sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.1.2.tgz", + "integrity": "sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==", "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.1.0" } }, "jsbn": { @@ -9965,23 +10069,6 @@ "rxjs": "^7.5.1", "through": "^2.3.8", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - } } }, "livereload-js": { @@ -10216,14 +10303,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -10243,9 +10328,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mixin-deep": { "version": "1.3.2", @@ -11213,11 +11298,11 @@ } }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.1.0" } }, "safe-buffer": { @@ -12129,9 +12214,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tunnel-agent": { "version": "0.6.0", @@ -12410,15 +12495,15 @@ } }, "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.5.tgz", + "integrity": "sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==", "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" + "axios": "^1.15.0", + "joi": "^18.1.2", + "lodash": "^4.18.1", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" } }, "websocket-driver": { diff --git a/package.json b/package.json index e936c4660..2202683e6 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "dependencies": { "gulp-livereload": "^4.0.2", "rimraf": "^3.0.2", - "wait-on": "^5.3.0" + "wait-on": "^9.0.5" }, "devDependencies": { "cypress": "^9.7.0", diff --git a/yarn.lock b/yarn.lock index 0b586642b..854c9e8ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,17 +39,39 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@hapi/hoek@^9.0.0": - version "9.1.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz" - integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw== - -"@hapi/topo@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz" - integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== +"@hapi/address@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-5.1.1.tgz#e9925fc1b65f5cc3fbea821f2b980e4652e84cb6" + integrity sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA== dependencies: - "@hapi/hoek" "^9.0.0" + "@hapi/hoek" "^11.0.2" + +"@hapi/formula@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-3.0.2.tgz#81b538060ee079481c906f599906d163c4badeaf" + integrity sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw== + +"@hapi/hoek@^11.0.2", "@hapi/hoek@^11.0.7": + version "11.0.7" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.7.tgz#56a920793e0a42d10e530da9a64cc0d3919c4002" + integrity sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ== + +"@hapi/pinpoint@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.1.tgz#32077e715655fc00ab8df74b6b416114287d6513" + integrity sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q== + +"@hapi/tlds@^1.1.1": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@hapi/tlds/-/tlds-1.1.6.tgz#c98ed89ca76aa030352d6d7102d0f250aed89cfb" + integrity sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw== + +"@hapi/topo@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" + integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg== + dependencies: + "@hapi/hoek" "^11.0.2" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -72,22 +94,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sideway/address@^4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz" - integrity sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@standard-schema/spec@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== "@types/node@*", "@types/node@^14.14.31": version "14.14.37" @@ -373,12 +383,14 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.15.0.tgz#0fcee91ef03d386514474904b27863b2c683bf4f" + integrity sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.11" + form-data "^4.0.5" + proxy-from-env "^2.1.0" bach@^1.0.0: version "1.2.0" @@ -769,7 +781,7 @@ colorette@^2.0.16: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1113,6 +1125,16 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: version "0.10.64" resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" @@ -1405,10 +1427,10 @@ flush-write-stream@^1.0.2: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.14.0: - version "1.15.11" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== +follow-redirects@^1.15.11: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -1427,6 +1449,17 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" @@ -1489,7 +1522,7 @@ get-caller-file@^1.0.1: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -1722,6 +1755,13 @@ has-symbols@^1.0.3, has-symbols@^1.1.0: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-value@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" @@ -2089,16 +2129,18 @@ isstream@~0.1.2: resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -joi@^17.3.0: - version "17.3.0" - resolved "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz" - integrity sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg== +joi@^18.1.2: + version "18.1.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-18.1.2.tgz#4735a384d7721fcda7a551d128862cf816541924" + integrity sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.0" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" + "@hapi/address" "^5.1.1" + "@hapi/formula" "^3.0.2" + "@hapi/hoek" "^11.0.7" + "@hapi/pinpoint" "^2.0.1" + "@hapi/tlds" "^1.1.1" + "@hapi/topo" "^6.0.2" + "@standard-schema/spec" "^1.1.0" jsbn@~0.1.0: version "0.1.1" @@ -2261,7 +2303,7 @@ lodash.once@^4.1.1: resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash@^4.17.21: +lodash@^4.17.21, lodash@^4.18.1: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -2385,10 +2427,10 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.6, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mixin-deep@^1.2.0: version "1.3.2" @@ -2799,6 +2841,11 @@ proxy-from-env@1.0.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + psl@^1.1.33: version "1.15.0" resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" @@ -3077,17 +3124,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.3: - version "6.6.3" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.5.1: - version "7.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@^7.5.1, rxjs@^7.8.2: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" @@ -3588,11 +3628,6 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" @@ -3807,16 +3842,16 @@ vinyl@^2.0.0, vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -wait-on@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz" - integrity sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg== +wait-on@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-9.0.5.tgz#9569a31ee3669abb67b1284622fd1d5b1f0163fc" + integrity sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA== dependencies: - axios "^0.21.1" - joi "^17.3.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^6.6.3" + axios "^1.15.0" + joi "^18.1.2" + lodash "^4.18.1" + minimist "^1.2.8" + rxjs "^7.8.2" websocket-driver@>=0.5.1: version "0.7.4" From fdd1cd8f3cff3cdea3ae01d6d11a4aaff1bfc5e2 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:32:29 +0200 Subject: [PATCH 07/36] ci: retire Cirrus + GitLab, consolidate on GitHub Actions (#2610) Co-authored-by: Claude Opus 4.7 (1M context) --- .cirrus.yml | 125 ---- .gitlab-ci.yml | 281 --------- AGENTS.md | 81 +-- docker/bionic-build/Dockerfile | 7 - docker/bionic-build/Readme.md | 10 - docker/cirrus-jammy/Dockerfile | 13 - docker/cirrus-jammy/README.md | 10 - docker/electron-builder-master/README.md | 39 -- docker/electron-builder/Dockerfile | 188 ------ docker/electron-builder/README.md | 28 - docker/github-changelog/Dockerfile | 18 - docker/github-changelog/Readme.md | 25 - docs/build-instructions.md | 17 +- docs/ci-migration-evidence.md | 84 +++ docs/continuous-integration.md | 131 ++-- ...ous-integration_runner_windows_envvars.png | Bin 32855 -> 0 bytes docs/images/release-guide/github-token.png | Bin 162210 -> 0 bytes .../release-guide/overview-gitlab-pipline.png | Bin 81349 -> 0 bytes .../rerun-release-signatures.png | Bin 458611 -> 0 bytes docs/release-guide.md | 186 ++---- pyinstaller/README.md | 23 +- pyinstaller/build-ci.sh | 67 -- pyinstaller/build-win-ci.bat | 42 -- pyinstaller/build-win.bat | 31 - pyproject.toml | 1 - .../service_manager/service_manager.py | 2 +- utils/artifact_signer.sh | 81 --- utils/build-common.sh | 135 ----- utils/build-osx.sh | 404 ------------- utils/build-unix.sh | 169 ------ utils/create-gitlab-cli-cfg.sh | 16 - utils/github.py | 532 ---------------- utils/prepare_for_git_write.sh | 49 -- utils/release.sh | 232 ------- utils/release_helper.py | 571 ------------------ utils/tag_specterext_dummy.sh | 13 - utils/trigger_docker_build.sh | 11 - 37 files changed, 207 insertions(+), 3415 deletions(-) delete mode 100644 .cirrus.yml delete mode 100644 .gitlab-ci.yml delete mode 100644 docker/bionic-build/Dockerfile delete mode 100644 docker/bionic-build/Readme.md delete mode 100644 docker/cirrus-jammy/Dockerfile delete mode 100644 docker/cirrus-jammy/README.md delete mode 100644 docker/electron-builder-master/README.md delete mode 100644 docker/electron-builder/Dockerfile delete mode 100644 docker/electron-builder/README.md delete mode 100644 docker/github-changelog/Dockerfile delete mode 100644 docker/github-changelog/Readme.md create mode 100644 docs/ci-migration-evidence.md delete mode 100644 docs/images/continuous-integration_runner_windows_envvars.png delete mode 100644 docs/images/release-guide/github-token.png delete mode 100644 docs/images/release-guide/overview-gitlab-pipline.png delete mode 100644 docs/images/release-guide/rerun-release-signatures.png delete mode 100755 pyinstaller/build-ci.sh delete mode 100755 pyinstaller/build-win-ci.bat delete mode 100644 pyinstaller/build-win.bat delete mode 100755 utils/artifact_signer.sh delete mode 100644 utils/build-common.sh delete mode 100755 utils/build-osx.sh delete mode 100755 utils/build-unix.sh delete mode 100755 utils/create-gitlab-cli-cfg.sh delete mode 100644 utils/github.py delete mode 100755 utils/prepare_for_git_write.sh delete mode 100755 utils/release.sh delete mode 100644 utils/release_helper.py delete mode 100755 utils/tag_specterext_dummy.sh delete mode 100755 utils/trigger_docker_build.sh diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index f0cdef991..000000000 --- a/.cirrus.yml +++ /dev/null @@ -1,125 +0,0 @@ -container: -# image: python:slim -# image: ubuntu:jammy -# image: python:3.10 - image: ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 - -# We assume here that we're having a proper python3 system including virtualenv and pip -prep_stuff_template: &PREP_STUFF_TEMPLATE - bitcoind_installation_cache: - folder: ./tests/bitcoin - fingerprint_script: - - cat pyproject.toml | grep "addopts = " | cut -d'=' -f2 | sed 's/--/+/g' | tr '+' '\n' | grep bitcoin | cut -d' ' -f2 - - cat tests/bitcoin_gitrev_pinned 2> /dev/null || true - - cat /etc/os-release | grep VERSION - - cat ./tests/install_noded.sh - - echo "binary" # if the next line is --bitcoin binary, otherwise use echo "compile" - this ensures different caching keys. - populate_script: ./tests/install_noded.sh --debug --bitcoin binary - elementsd_installation_cache: - folder: ./tests/elements - fingerprint_script: - - cat pyproject.toml | grep "addopts = " | cut -d'=' -f2 | sed 's/--/+/g' | tr '+' '\n' | grep elements | cut -d' ' -f2 - - cat tests/elements_gitrev_pinned 2> /dev/null || true - - cat /etc/os-release | grep VERSION - - cat ./tests/install_noded.sh - - echo "binary" # if the next line is --elements binary, otherwise use echo "compile" - this ensures different caching keys. - populate_script: ./tests/install_noded.sh --debug --elements binary - verify_script: - - echo " --> Version of python, virtualenv and pip3" - - python3 --version && virtualenv --version && pip3 --version - - echo " --> Executables in tests/elements/src" - - find tests/elements/src -maxdepth 1 -type f -executable -exec ls -ld {} \; || true - - echo " --> Executables in tests/elements/bin" - - find tests/elements/bin -maxdepth 1 -type f -executable -exec ls -ld {} \; || true - - echo " --> Executables in tests/bitcoin/src" - - find tests/bitcoin/src -maxdepth 1 -type f -executable -exec ls -ld {} \; || true - - echo " --> Executables in tests/bitcoin/bin" - - find tests/bitcoin/bin -maxdepth 1 -type f -executable -exec ls -ld {} \; || true - - echo " --> bitcoind version" - - tests/bitcoin/src/bitcoind -version | head -1 || true - - tests/bitcoin/bin/bitcoind -version | head -1 || true - - echo " --> elements version" - - tests/elements/src/elementsd -version | head -1 || true - - tests/elements/bin/elementsd -version | head -1 || true - - pip_script: - #folder: /tmp/cirrus-ci-build/.env - #fingerprint_script: echo muh && cat requirements.txt - #populate_script: - - virtualenv --python=python .env - - source ./.env/bin/activate - - pip3 install -r requirements.txt --require-hashes && pip3 install -e ".[test]" - install_script: - - source ./.env/bin/activate - - pip3 install -e . - -test_task: - << : *PREP_STUFF_TEMPLATE - skip: "false" - test_script: - - source ./.env/bin/activate - - echo $PATH - # needed so that setuptools_scm has a t least one tag to guess the version properly - # and the tests/test_util_version.py doesn't fail - - git fetch origin refs/tags/v1.0.0 - - pytest --cov=cryptoadvance --junitxml=./testresults.xml - always: - junit_artifacts: - path: "./testresults.xml" - format: junit - - -cypress_test_task: - use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' - skip: "false" - persistent_worker: - labels: - os: linux - isolation: - container: - image: ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy:20260411 - cpu: 6 - memory: 6G - pre_prep_script: - # The stupid old debian-package is not installing a proper binary but just the python-package - - echo -e '#!/bin/bash\npython3 -m virtualenv "$@"' > /usr/local/bin/virtualenv - - chmod +x /usr/local/bin/virtualenv - - virtualenv --version - << : *PREP_STUFF_TEMPLATE - npm_cache: - folder: ./node_modules - fingerprint_script: cat package-lock.json - populate_script: npm ci - cypress_script: - - source ./.env/bin/activate - #- pip3 install -e . - - ./utils/test-cypress.sh --debug run - junit_artifacts: - path: "cypresstest-output.xml" - type: text/xml - format: junit - always: - cypress_screenshots_artifacts: - path: "./cypress/screenshots/**" - cypress_videos_artifacts: - path: "./cypress/videos/**" - -extension_smoketest_task: - << : *PREP_STUFF_TEMPLATE - test_script: - - git config --global user.name "CI CD" - - git config --global user.email "cicd@example.com" - - source ./.env/bin/activate - - echo $PATH - - mkdir tmp && cd tmp - - mkdir testextension && cd testextension - - pwd - - python3 -m cryptoadvance.specter ext gen --ext-id cicdtest --org cryptoadvance --no-isolated-client --devicename cicddevice - - pip3 install -e . - - python3 -m cryptoadvance.specter server --config DevelopmentConfig --debug 2> specter.log & - - sleep 15 - - cat specter.log | grep "Found CicdtestService" # Discovery failed - - cat specter.log | grep "Extension CicdtestService activated (alpha)" - - apt-get update && apt-get -y install curl - - curl http://127.0.0.1:25441/svc/cicdtest/ | grep "CicdtestService 4thewin." - diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index fda8705e5..000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,281 +0,0 @@ -# this image contains python, bitcoind and docker -# check docker/python-bitcoind on how it's built -image: registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v22.0 - -variables: - # Cache documentation: https://docs.gitlab.com/ee/ci/caching/ - PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" - -cache: - # enable per-job and per-branch caching - - key: - files: - - ./requirements.txt - prefix: "$CI_JOB_NAME" - paths: - - .cache/pip - - .env - -stages: - - testing - - releasing - - post_releasing - -before_script: - - docker info || echo "no docker-command found" # Print out docker version for debugging - - echo CI_PROJECT_NAMESPACE = $CI_PROJECT_NAMESPACE - - echo CI_PROJECT_ROOT_NAMESPACE = $CI_PROJECT_ROOT_NAMESPACE - - python -V # Print out python version for debugging - - apt update - - apt install -y libusb-1.0-0-dev libudev-dev # usb-support in hidapi - # https://github.com/python-babel/babel/issues/990#issuecomment-1760326334 - - rm -f /etc/localtime - - ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime - # This doesn't get cached in gitlab but we don't need it anyway for now: - # - ./tests/install_noded.sh --debug --elements compile - - pip3 install --upgrade virtualenv - - virtualenv --python=python3 .env - - source .env/bin/activate - -check: - stage: testing - # We simply check here whether all the tests on github are completed and green - script: - - ./utils/release.sh wait_on_master || exit 1 # that command will have a non-0 exit-value if not everything is green - -# jobs with a preceding . like .test are hidden jobs and are not executed. I leave them in here as -# we might want to reactivate them in the case that github explodes or something. -# So effectively, gitlab is currently only used for releasing. - -.test: - stage: testing - # We assume here that people who want to get code into the master-branch are - # relying on PRs and people who are working on gitlab-forks are working - # on CI which probably want fast feedback on the releasing-jobs - # and therefore skip the test-job - # tem deactivated as it did not work as expected - #only: - # - $CI_PROJECT_ROOT_NAMESPACE =~ "cryptoadvance" - script: - - pip3 install -r requirements.txt - - pip3 install -e . - - pip3 install -e ".[test]" - - python3 setup.py install # compiles babel stuff as well (might make pip install obsolete) - - py.test --cov-report term --cov cryptoadvance - -.test-cypress: - image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:v9.7.0 - stage: testing - script: - # start the server in the background - - pip3 install -e . - - pip3 install -e ".[test]" - - python3 setup.py install # compiles babel stuff as well (might make pip install obsolete) - - npm i - - ./utils/test-cypress.sh --docker --debug run - - docker ps || echo "probably no docker available anyway" - artifacts: - when: always - paths: - - cypress/videos/**/*.mp4 - - cypress/screenshots/**/*.png - expire_in: 1 day - -release_pip: - stage: releasing - only: - - tags - script: - - pip3 install -e . - - pip3 install -e ".[test]" - - pip3 install . - - pip3 install build==0.10.0 twine - - python3 -m build - - ls -l dist - # twine reads the password from the env-var TWINE_PASSWORD - # Either testing it or doing the real thing depending on which gitlab-project we're running: - - if ! [[ ${CI_PROJECT_ROOT_NAMESPACE} = "cryptoadvance" ]]; then python3 -m twine upload --verbose --user __token__ dist/* --repository-url https://test.pypi.org/legacy/ ; fi - - if [[ ${CI_PROJECT_ROOT_NAMESPACE} = "cryptoadvance" ]]; then python3 -m twine upload --verbose --user __token__ dist/* ; fi - - cd dist - - sha256sum cryptoadvance.specter-*.tar.gz > SHA256SUMS-pip - - ../utils/artifact_signer.sh sign --artifact ./SHA256SUMS-pip - - cd .. - - cat ./dist/SHA256SUMS-pip - #- python ./utils/github.py upload ./dist/SHA256SUMS-pip - #- python ./utils/github.py upload ./dist/SHA256SUMS-pip.asc - - python ./utils/github.py upload ./dist/cryptoadvance.specter-*.tar.gz - artifacts: - when: always - paths: - - dist/* - expire_in: 1 day - -release_binary_windows: - stage: releasing - only: - - tags - variables: - GIT_DEPTH: 0 # Disable shallow clone to get all Git history - tags: - - windows - before_script: - - whoami - - python -V - - pip3 --version - - pip install virtualenv - - virtualenv --python=python3 .env - - .\.env\Scripts\activate - - pip3 install -e ".[test]" - - script: - # This script won't execute if the script before that fails - # No need to check the version-scheme again - - - echo "Releasing for ${CI_PROJECT_ROOT_NAMESPACE}" - - .\pyinstaller\build-win-ci.bat $CI_COMMIT_TAG - - python ./utils/github.py upload ./pyinstaller/release/specterd-$CI_COMMIT_TAG-win64.zip - - cd ./pyinstaller/release - - python ..\..\utils\release_helper.py sha256sums specterd-$CI_COMMIT_TAG-win64.zip > SHA256SUMS-windows - - type SHA256SUMS-windows - - echo $GPG_PASSPHRASE | c:\Program` Files` `(x86`)\GnuPg\bin\gpg --detach-sign --armor --no-tty --batch --yes --passphrase-fd 0 --pinentry-mode loopback SHA256SUMS-windows - artifacts: - when: always - paths: - - pyinstaller/release/* - expire_in: 1 day - cache: - key: - files: - - ./pyinstaller/electron/package-lock.json - prefix: $CI_JOB_NAME - paths: - - ./pyinstaller/electron/node_modules - -release_electron_linux_windows: - image: registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest - stage: releasing - only: - - tags - needs: - - release_binary_windows - before_script: - - python3 -V # Print out python version for debugging - - apt update - - apt install -y unzip libusb-1.0-0-dev libudev-dev # usb-support in hidapi - - pip3 install virtualenv - # Only difference to default befor_script: (ToDo fix this) - - python3 -m virtualenv --python=python3 .env - - source .env/bin/activate - # https://github.com/python-babel/babel/issues/990#issuecomment-1760326334 - - rm -f /etc/localtime - - ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime - - pip3 install -e ".[test]" # TZ=UTC because https://github.com/nektos/act/issues/1853 - script: - - echo "Releasing for ${CI_PROJECT_ROOT_NAMESPACE}" - - export CI_PROJECT_ROOT_NAMESPACE # needed in the build-script to download the right windows-binary - - ./utils/build-unix.sh --version $CI_COMMIT_TAG make-hash specterd electron-linux electron-win - - ls -l release - - cd release - - sha256sum specterd-${CI_COMMIT_TAG}-x86_64-linux-gnu.zip specter_desktop-${CI_COMMIT_TAG}-x86_64-linux-gnu.tar.gz > ./SHA256SUMS-linux - - cat ./SHA256SUMS-linux - - sha256sum Specter-Setup-${CI_COMMIT_TAG}.exe > ./SHA256SUMS-win - - cat ./SHA256SUMS-win - - cd .. - - ./utils/artifact_signer.sh sign --artifact ./release/SHA256SUMS-win - - ./utils/artifact_signer.sh sign --artifact ./release/SHA256SUMS-linux - - python3 ./utils/github.py upload ./release/Specter-Setup-${CI_COMMIT_TAG}.exe - - python3 ./utils/github.py upload ./release/specterd-${CI_COMMIT_TAG}-x86_64-linux-gnu.zip - - python3 ./utils/github.py upload ./release/specter_desktop-${CI_COMMIT_TAG}-x86_64-linux-gnu.tar.gz - #- python3 ../utils/github.py upload ./release/SHA256SUMS-linux - #- python3 ../utils/github.py upload ./release/SHA256SUMS-linux.asc - #- python3 ../utils/github.py upload ./release/SHA256SUMS-win - #- python3 ../utils/github.py upload ./release/SHA256SUMS-win.asc - cache: - key: - files: - - ./pyinstaller/electron/package-lock.json - prefix: $CI_JOB_NAME - paths: - - ./pyinstaller/electron/node_modules - - artifacts: - when: always - paths: - - release/Specter-Setup-${CI_COMMIT_TAG}.exe - - release/specterd-${CI_COMMIT_TAG}-x86_64-linux-gnu.zip - - release/specter_desktop-${CI_COMMIT_TAG}-x86_64-linux-gnu.tar.gz - - release/SHA256SUMS-linux - - release/SHA256SUMS-linux.asc - - release/SHA256SUMS-win - - release/SHA256SUMS-win.asc - expire_in: 1 day - -release_signatures: - stage: post_releasing - only: - - tags - before_script: - - python -V # Print out python version for debugging - - pip3 install --upgrade virtualenv - - virtualenv --python=python3 .env - - source .env/bin/activate - - pip3 install -e ".[test]" - - ./utils/artifact_signer.sh init # prepare .gnupg - script: - - python3 -m utils.release_helper download # downloads the job-artifacts from gitlab - - python3 -m utils.release_helper downloadgithub # downloads additional artifacts from github (if not there and is they have SHA256SUMS-something) - - python3 -m utils.release_helper checksigs # checks the signatures of all SHA256SUMM*.asc files - - python3 -m utils.release_helper checkhashes # checks all SHA256SUM* files (might modify files on the fly due to windows line endings) - - python3 -m utils.release_helper create # creates a SHA256SUM - - ./utils/artifact_signer.sh sign --artifact ./signing_dir/SHA256SUMS # Signs the SHA256SUM - - python3 -m utils.release_helper upload_shasums # uploads SHA256SUMS to github - - python3 -m utils.release_helper upload_shasumssig # uploads SHA256SUMS.asc to github - -release_docker: - stage: post_releasing - only: - - tags - before_script: - - echo "Triggering Docker Release" - script: - - ./utils/trigger_docker_build.sh - -# Tagging the current master-branch of https://github.com/cryptoadvance/specterext-dummy -# with the same CI_COMMIT_TAG -tag_specterext_dummy_repo: - stage: post_releasing - only: - - tags - before_script: - # write access to git@github.com:cryptoadvance/specterext-dummy.git - - source ./utils/prepare_for_git_write.sh "$SSH_SPECTEREXT_DEPLOY_KEY" - script: - - echo "Now tagging ... git@github.com:${CI_PROJECT_ROOT_NAMESPACE}/specterext-dummy.git" - - ./utils/tag_specterext_dummy.sh - -update_github: - stage: post_releasing - only: - - tags - needs: - - release_signatures - before_script: - # write access to git@github.com:swan-bitcoin/specter-static.git - - source ./utils/prepare_for_git_write.sh "$SSH_SPECTERSTATIC_DEPLOY_KEY" - script: - - echo "Now updating https://github.com:${CI_PROJECT_ROOT_NAMESPACE}/specter-desktop/releases/tag/${CI_COMMIT_TAG:-v2.0.4-pre8}" - - ./utils/generate_downloadpage.sh --org_name ${CI_PROJECT_ROOT_NAMESPACE:-k9ert} --debug --version ${CI_COMMIT_TAG:-v2.0.4-pre8} generate github # default-value for testing - -update_webpage: - stage: post_releasing - only: - - tags - needs: - - release_signatures - before_script: - # write access to git@github.com:swan-bitcoin/specter-static.git - - source ./utils/prepare_for_git_write.sh "$SSH_SPECTERSTATIC_DEPLOY_KEY" - script: - - echo "Now updating https://github.com:${CI_PROJECT_ROOT_NAMESPACE}/specter-static.git" - - ./utils/generate_downloadpage.sh --org_name ${CI_PROJECT_ROOT_NAMESPACE:-k9ert} --debug --version ${CI_COMMIT_TAG:-v2.0.4-pre8} generate webpage # default-value for testing - diff --git a/AGENTS.md b/AGENTS.md index 944ac3898..d7a65b7be 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -67,44 +67,32 @@ python3 -m cryptoadvance.specter server --config DevelopmentConfig --debug ## CI/CD -The project uses **GitHub Actions** for linting, testing, Docker images, and **the full release pipeline**, plus **Cirrus CI** for the heavyweight test suite (pytest + Cypress). GitLab CI is retained in `.gitlab-ci.yml` but effectively dead — the release flow was migrated to GitHub Actions. +**GitHub Actions only.** Cirrus CI and GitLab CI were retired in 2026-Q2 — see `docs/ci-migration-evidence.md` for the cutover evidence and `docs/continuous-integration.md` for the active topology. -### Overview +### Workflows -| Provider | Purpose | Config File | Trigger | -|----------|---------|-------------|---------| -| **GitHub Actions** | Lint, smoke-build, Docker images, **releases** (pip + specterd + Electron for Linux/Win/macOS) | `.github/workflows/` | Push, PR, tags | -| **Cirrus CI** | Full test suite (pytest + Cypress + extension smoketest) | `.cirrus.yml` | PR | -| **GitLab CI** | **Dead** — config retained; `check` job only waits on GH master status. Release jobs no longer run. | `.gitlab-ci.yml` | (vestigial) | +| Workflow | File | Trigger | Purpose | +|----------|------|---------|---------| +| Tests | `test.yml` | PR, push | pytest + Cypress + extension smoketest (3 jobs) | +| Release | `release.yml` | Tag push `v*` | pip + specterd + Electron for Linux/Win/macOS + GPG-sign `SHA256SUMS` | +| Black Linter | `zblack.yml` | PR, push | `psf/black@26.3.0` action pinned to Black 22.3.0, python-3.12 | +| TOC Generator | `toc.yml` | Push | Auto-generates TOCs for `README.md`, `docs/faq.md`, `docs/development.md` | +| Docker Push | `docker-push.yml` | Push to any branch | Multi-arch image → `ghcr.io/cryptoadvance/specter-desktop:` | +| Docker Tag | `docker-tag.yml` | Tag push `v*` | Multi-arch image → `ghcr.io/cryptoadvance/specter-desktop:` | +| Extension Compat | `extension-compat.yml` | PR touching `requirements.*`/`pyproject.toml` | Installs full lock, imports every bundled extension, runs `pip check` | +| specterd Build Smoke | `test-specterd-build.yml` | PR touching `pyinstaller/`, `requirements*`, `src/**` | Builds specterd on Linux and runs `--help` | +| Electron Smoke | `electron-smoketest.yml` | PR touching `pyinstaller/electron/**` | Smoke test Electron packaging | -### GitHub Actions (7 workflows) +All workflows use public GitHub-hosted runners (`ubuntu-latest` / `ubuntu-22.04` / `windows-latest` / `macos-14`). **No private runners.** -1. **Black Python Linter** (`zblack.yml`) — Runs on every push and PR. Uses `psf/black@26.3.0` action pinned to Black version `22.3.0`, on python-3.12 (pinned to avoid 3.14 incompatibility with Black 22.3.0). Checks `./src`. -2. **TOC Generator** (`toc.yml`) — Auto-generates TOCs for `README.md`, `docs/faq.md`, `docs/development.md` on push. -3. **Docker Push** (`docker-push.yml`) — Builds multi-arch (amd64 + arm64) image on every push. Pushes to `ghcr.io//:` (upstream: `ghcr.io/cryptoadvance/specter-desktop:`). -4. **Docker Tag** (`docker-tag.yml`) — Builds multi-arch image on version tags. Pushes to `ghcr.io//:`. -5. **Extension Compatibility Check** (`extension-compat.yml`) — On changes to `requirements.*` or `pyproject.toml`: installs the full lock file, imports every bundled extension (Swan, LiquidIssuer, DevHelp, Notifications, ExFund, Faucet, Electrum, Spectrum, StackTrack, TimelockRecovery), runs `pip check`, and best-effort runs extension test suites. Catches dep conflicts before they break downstream extensions. -6. **Test specterd build** (`test-specterd-build.yml`) — PR smoke test on changes to `pyinstaller/`, `requirements*`, `src/**`, or packaging files. Builds specterd on Linux and runs `--help` smoke test. -7. **Release** (`release.yml`) — **The release pipeline.** See next section. +### Test workflow — `test.yml` -All GitHub Actions use public runners (`ubuntu-latest` / `ubuntu-24.04` / `windows-latest` / `macos-14`). **No private runners.** +Three jobs on `ubuntu-22.04`: +1. **`test`** — pytest with `--cov=cryptoadvance`, 45-min timeout. Installs system deps inline; no custom image. Caches bitcoind/elementsd via `actions/cache@v4` keyed on `runner.os × runner.arch × hash(pyproject.toml, install_noded.sh, bitcoin_SHA256SUMS, elements_SHA256SUMS)` with `save-always: true`. +2. **`cypress`** — `./utils/test-cypress.sh --debug run` inside `ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy@sha256:`, 30-min timeout, `--shm-size=2g`. +3. **`extension-smoketest`** — byte-compatible port of the old Cirrus smoketest, 15-min timeout. -### Cirrus CI (Testing) - -Cirrus CI runs the **full test suite** on PRs. Config: `.cirrus.yml`. - -**Three tasks:** -1. **`test_task`** — Full pytest suite with bitcoind + elementsd in regtest mode. Uses cached binary downloads. Produces JUnit XML results. -2. **`cypress_test_task`** — Frontend tests with Cypress. Requires 6 CPU, 6GB RAM. Produces screenshots and video artifacts. -3. **`extension_smoketest_task`** — Generates a test extension, starts the server, verifies the extension loads and responds. - -**Docker images used:** -- `registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20230206` (pytest) -- `registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:20230206` (Cypress) - -Both images are pre-built and hosted on the GitLab container registry. They include Python, virtualenv, and other dependencies. The `docker/` directory in the repo contains Dockerfiles for building them. - -**Caching:** bitcoind and elementsd binaries are cached by Cirrus based on the version pinned in `pyproject.toml`. The `tests/install_noded.sh` script handles downloading or compiling them. +`tests/install_noded.sh` GPG-verifies upstream `SHA256SUMS.asc` and checks tarball SHA256 against the committed trust anchors on every run (cold cache AND cache hit). ### Release pipeline — `.github/workflows/release.yml` @@ -140,12 +128,12 @@ Triggers on tags matching `v[0-9]+.[0-9]+.[0-9]+` (and `-*` suffixes for pre-rel | Secret | Purpose | Required? | |----------|---------|---| -| `APPLE_CERTIFICATE_BASE64` | Base64-encoded `.p12` Apple signing certificate | Optional — unsigned build if missing | -| `APPLE_CERTIFICATE_PASSWORD` | Password for the `.p12` | With `APPLE_CERTIFICATE_BASE64` | -| `APPLE_PROVISIONING_PROFILE_BASE64` | Base64-encoded provisioning profile | Optional | -| PyPI trusted publisher | Configured on PyPI side, not a GH secret | Required for `release-pip` in upstream | - -Historical GitLab secrets (`GH_BIN_UPLOAD_PW`, `TWINE_PASSWORD`, `GPG_PASSPHRASE`, `SSH_SPECTEREXT_DEPLOY_KEY`, `SSH_SPECTERSTATIC_DEPLOY_KEY`) are **no longer used**. `.gitlab-ci.yml` still references them but the pipeline is dead. +| `GPG_PRIVATE_KEY` + `GPG_PASSPHRASE` | Sign `SHA256SUMS` | Required for signed releases | +| `APPLE_CERTIFICATE_BASE64` + `APPLE_CERTIFICATE_PASSWORD` | macOS signing cert | Optional — unsigned build if missing | +| `APPLE_ID` + `APPLE_APP_SPECIFIC_PASSWORD` + `APPLE_TEAM_ID` | macOS notarization | Required with signing | +| `APPLE_PROVISIONING_PROFILE_BASE64` | Provisioning profile | Optional | +| `AARON_TRIGGER` | Trigger `lncm/docker-specter-desktop` build | Optional — skips Docker trigger if missing | +| PyPI trusted publisher | Configured on PyPI side, not a GH secret | Required for `release-pip` upstream | ### Testing a release on a fork @@ -154,12 +142,6 @@ Historical GitLab secrets (`GH_BIN_UPLOAD_PW`, `TWINE_PASSWORD`, `GPG_PASSPHRASE 3. The `release-pip` PyPI publish step is gated on `github.repository == 'cryptoadvance/specter-desktop'`, so forks build the pip package but don't publish. 4. Unsigned macOS builds work out of the box; signing requires you to add your own Apple secrets. -### Dead config - -- `.gitlab-ci.yml` — still in the repo but release jobs no longer run. Safe to remove in a cleanup pass. -- `pyinstaller/build-win-ci.bat` — former GitLab Windows runner entry point; no longer invoked. -- `utils/release.sh` / `utils/release_helper.py` / `utils/github.py` — may contain dead code paths now that GitLab isn't uploading artifacts. Audit before changes. - ## Testing Tests require a `bitcoind` binary (regtest mode). No tests run without it. @@ -217,10 +199,9 @@ Desktop builds use PyInstaller + Electron: 1. **specterd** (daemon binary): `pyinstaller specterd.spec` from `pyinstaller/` dir 2. **Electron app**: wraps specterd, downloads it on first launch with SHA256 + GPG verification -3. Platform scripts: `utils/build-osx.sh`, `utils/build-unix.sh`, `pyinstaller/build-win-ci.bat` -4. pip package: `python3 -m build` +3. pip package: `python3 -m build` -See `docs/build-instructions.md` for step-by-step manual build instructions. +Release builds live in `.github/workflows/release.yml` (triggered by tag push). See `docs/release-guide.md` for the release workflow and `docs/build-instructions.md` for step-by-step manual builds. ## Dependencies @@ -238,7 +219,7 @@ Extensions live in `specterext` namespace packages. Each extension: - Registers via entry points in setup.cfg - Can add UI pages, API endpoints, and background services - Generate a skeleton: `python3 -m cryptoadvance.specter ext gen --ext-id myext --org myorg` -- CI smoke-tests extension generation in `extension_smoketest_task` (Cirrus) +- CI smoke-tests extension generation in the `extension-smoketest` job (`test.yml`) - See `docs/extensions/` for the extension development guide ## Key Files for Navigation @@ -255,14 +236,14 @@ Extensions live in `specterext` namespace packages. Each extension: | All managers | `src/cryptoadvance/specter/managers/` | | Templates | `src/cryptoadvance/specter/templates/` | | Tests | `tests/` | -| CI config | `.github/workflows/`, `.cirrus.yml`, `.gitlab-ci.yml` | +| CI config | `.github/workflows/` | | Build scripts | `pyinstaller/`, `utils/`, `electron/` | | CI Docker images | `docker/` | ## Current State (as of 2026-04) - **Last release:** v2.1.1 (2025-01-03) — no release on the new GH Actions pipeline yet; first tagged run will exercise it end-to-end. -- **CI migration complete:** release pipeline moved from GitLab to `.github/workflows/release.yml`. `.gitlab-ci.yml` retained but dead. +- **CI migration complete:** Cirrus CI and GitLab CI retired; all workflows now on GitHub Actions. See `docs/ci-migration-evidence.md`. - **macOS automation:** now covered on Apple Silicon free tier; x86_64 macOS gated on paid runner. - **Black linter:** reconfigured to pin python-3.12 + `psf/black@26.3.0` action + black version 22.3.0 (worked around 3.14 incompatibility). Verify green state in CI before assuming. - **Issue/PR backlog:** refreshed counts not captured here — use `gh issue list` / `gh pr list` for current state. diff --git a/docker/bionic-build/Dockerfile b/docker/bionic-build/Dockerfile deleted file mode 100644 index 9336aaf11..000000000 --- a/docker/bionic-build/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM registry.gitlab.com/cryptoadvance/specter-desktop/python:3.8.5-bionic - -RUN apt-get update && apt-get install -y --no-install-recommends libusb-1.0-0-dev libudev-dev - -RUN apt-get install -y --no-install-recommends libgl1-mesa-dri gvfs gvfs-libs \ - libdrm-amdgpu1 libdrm-nouveau2 libdrm-radeon1 libedit2 libelf1 libllvm10 \ - libvulkan1 libzstd1 libtdb1 libcanberra-gtk3-0 virtualenv libcanberra-gtk3-module \ No newline at end of file diff --git a/docker/bionic-build/Readme.md b/docker/bionic-build/Readme.md deleted file mode 100644 index 723d7db9e..000000000 --- a/docker/bionic-build/Readme.md +++ /dev/null @@ -1,10 +0,0 @@ -This Dockerimage is manually created and uploaded: - -``` -docker build -t registry.gitlab.com/cryptoadvance/specter-desktop/bionic-build:latest . -docker push registry.gitlab.com/cryptoadvance/specter-desktop/bionic-build:latest -``` - -The reason for this image is explained in [#356](https://github.com/cryptoadvance/specter-desktop/issues/356) and introduced in https://github.com/cryptoadvance/specter-desktop/pull/396/files . - -It has been replaced with introducing the electron-build with `registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest` in https://github.com/cryptoadvance/specter-desktop/pull/473/files . \ No newline at end of file diff --git a/docker/cirrus-jammy/Dockerfile b/docker/cirrus-jammy/Dockerfile deleted file mode 100644 index dacaced79..000000000 --- a/docker/cirrus-jammy/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -from ubuntu:jammy - -# 1. python-stuff and HWI dependencies -# 2. capability to build bitcoind -# 3. cypress dependencies -RUN apt update && DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ - libusb-1.0-0-dev libudev-dev python3 python3-virtualenv python3-dev python3-pip \ - build-essential libtool autotools-dev automake autoconf pkg-config bsdmainutils libevent-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev bc \ - nodejs npm libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb \ - wget libzmq5-dev - -# Stuff needed for Elements (compilation) -RUN DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y libboost-thread-dev libsqlite3-dev git diff --git a/docker/cirrus-jammy/README.md b/docker/cirrus-jammy/README.md deleted file mode 100644 index 5b8504f93..000000000 --- a/docker/cirrus-jammy/README.md +++ /dev/null @@ -1,10 +0,0 @@ -An image used to run the build on cirrus (tests only, not cypress-tests). - -Create it like this: - -``` -docker buildx build --platform linux/amd64 -t ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 --load . -docker push ghcr.io/cryptoadvance/specter-desktop/cirrus-jammy:20260412 -``` - -Check the `.cirrus.yml` on how this is used and update the $current_date there. diff --git a/docker/electron-builder-master/README.md b/docker/electron-builder-master/README.md deleted file mode 100644 index dfa4822f2..000000000 --- a/docker/electron-builder-master/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Purpose - -Used for building the electron-app. In short it's the /pyinstaller/build-unix.sh script which is running in this image. - -By intention, this is using an older OS-version in order to avoid glibc-issues. For details, see: -* https://github.com/cryptoadvance/specter-desktop/pull/1688#issuecomment-1242796681 -* https://github.com/cryptoadvance/specter-desktop/issues/373#issuecomment-695068924 - - -# Usage - -If you want to run the image manually, do something like this (copied from [here](https://www.electron.build/multi-platform-build#build-electron-app-using-docker-on-a-local-machine)): - - -``` -docker run --rm -ti \ - --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS_TAG|TRAVIS|TRAVIS_REPO_|TRAVIS_BUILD_|TRAVIS_BRANCH|TRAVIS_PULL_REQUEST_|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_') \ - --env ELECTRON_CACHE="/root/.cache/electron" \ - --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \ - -v ${PWD}:/project \ - -v ${PWD##*/}-node-modules:/project/node_modules \ - -v ~/.cache/electron:/root/.cache/electron \ - -v ~/.cache/electron-builder:/root/.cache/electron-builder \ - electronuserland/builder:wine -``` - - -# Building - -build the image like: - -``` -docker build -t registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest . -docker push registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest -``` - -# Details - -This image is putting python3.10 on top of electronuserland/builder:wine. As we want to have stable build-targets the actual `FROM` clause is `electronuserland/builder:14-wine-10.22` as the project is adding the node version (14) and a timestamp (10.22) to the tagname. \ No newline at end of file diff --git a/docker/electron-builder/Dockerfile b/docker/electron-builder/Dockerfile deleted file mode 100644 index 1e0acc272..000000000 --- a/docker/electron-builder/Dockerfile +++ /dev/null @@ -1,188 +0,0 @@ -FROM electronuserland/builder:14-wine-10.22 -# 14-wine-10.22 is a stable tag which has been the same than the "wine" tag but more explicit -# It's based on node 14 and focal and therefore has glibc 2.31. -# It has been created on Oct 22 - -# Let's put python3.10 on top: -# * electronuserland/builder:14-wine-10.22 is same as wine which depends on "node" -# * which depends on "base" which builds on buildpack-deps:focal curl -# https://github.com/docker-library/buildpack-deps/blob/98a5ab81d47a106c458cdf90733df0ee8beea06c/ubuntu/focal/curl/Dockerfile -# * now the coe below to install python is copied from: -# https://github.com/docker-library/python/blob/master/3.10/bullseye/Dockerfile -# which builds ontop of buildpack-deps:bullseye-scm -# * So to make the python installation fully functional, we have to install some stuff ... -# * and then do the python installation - - -# Copying some stuff from https://github.com/docker-library/python/blob/master/3.10/bullseye/Dockerfile - -RUN set -ex; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ - autoconf \ - automake \ - bzip2 \ - dpkg-dev \ - file \ - g++ \ - gcc \ - imagemagick \ - libbz2-dev \ - libc6-dev \ - libcurl4-openssl-dev \ - libdb-dev \ - libevent-dev \ - libffi-dev \ - libgdbm-dev \ - libglib2.0-dev \ - libgmp-dev \ - libjpeg-dev \ - libkrb5-dev \ - liblzma-dev \ - libmagickcore-dev \ - libmagickwand-dev \ - libmaxminddb-dev \ - libncurses5-dev \ - libncursesw5-dev \ - libpng-dev \ - libpq-dev \ - libreadline-dev \ - libsqlite3-dev \ - libssl-dev \ - libtool \ - libwebp-dev \ - libxml2-dev \ - libxslt-dev \ - libyaml-dev \ - make \ - patch \ - unzip \ - zip \ - jq \ - xz-utils \ - zlib1g-dev - - -# This has been copied from: -# https://github.com/docker-library/python/blob/master/3.10/bullseye/Dockerfile - - -# ensure local python is preferred over distribution python -ENV PATH /usr/local/bin:$PATH - -# http://bugs.python.org/issue19846 -# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK. -ENV LANG C.UTF-8 - -# runtime dependencies -RUN set -eux; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ - libbluetooth-dev \ - tk-dev \ - uuid-dev \ - ; \ - rm -rf /var/lib/apt/lists/* - -ENV GPG_KEY A035C8C19219BA821ECEA86B64E628F8D684696D -ENV PYTHON_VERSION 3.10.9 - -RUN set -eux; \ - \ - savedAptMark="$(apt-mark showmanual)"; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ - patchelf \ - ; \ - \ - wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; \ - wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; \ - GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \ - gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; \ - gpg --batch --verify python.tar.xz.asc python.tar.xz; \ - command -v gpgconf > /dev/null && gpgconf --kill all || :; \ - rm -rf "$GNUPGHOME" python.tar.xz.asc; \ - mkdir -p /usr/src/python; \ - tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; \ - rm python.tar.xz; \ - \ - cd /usr/src/python; \ - gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \ - ./configure \ - --build="$gnuArch" \ - --enable-loadable-sqlite-extensions \ - --enable-optimizations \ - --enable-option-checking=fatal \ - --enable-shared \ - --with-lto \ - --with-system-expat \ - --without-ensurepip \ - ; \ - nproc="$(nproc)"; \ - make -j "$nproc" \ - ; \ - make install; \ - \ -# https://github.com/docker-library/python/issues/784 -# prevent accidental usage of a system installed libpython of the same version - bin="$(readlink -vf /usr/local/bin/python3)"; \ - patchelf --set-rpath '$ORIGIN/../lib' "$bin"; \ - \ -# enable GDB to load debugging data: https://github.com/docker-library/python/pull/701 - dir="$(dirname "$bin")"; \ - mkdir -p "/usr/share/gdb/auto-load/$dir"; \ - cp -vL Tools/gdb/libpython.py "/usr/share/gdb/auto-load/$bin-gdb.py"; \ - \ - cd /; \ - rm -rf /usr/src/python; \ - \ - find /usr/local -depth \ - \( \ - \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \ - -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \ - \) -exec rm -rf '{}' + \ - ; \ - \ - ldconfig; \ - \ - apt-mark auto '.*' > /dev/null; \ - apt-mark manual $savedAptMark; \ - apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ - rm -rf /var/lib/apt/lists/*; \ - \ - python3 --version - -# make some useful symlinks that are expected to exist ("/usr/local/bin/python" and friends) -RUN set -eux; \ - for src in idle3 pydoc3 python3 python3-config; do \ - dst="$(echo "$src" | tr -d 3)"; \ - [ -s "/usr/local/bin/$src" ]; \ - [ ! -e "/usr/local/bin/$dst" ]; \ - ln -svT "$src" "/usr/local/bin/$dst"; \ - done - -# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value ''" -ENV PYTHON_PIP_VERSION 22.3.1 -# https://github.com/docker-library/python/issues/365 -ENV PYTHON_SETUPTOOLS_VERSION 65.5.1 -# https://github.com/pypa/get-pip -ENV PYTHON_GET_PIP_URL https://github.com/pypa/get-pip/raw/1a96dc5acd0303c4700e02655aefd3bc68c78958/public/get-pip.py -ENV PYTHON_GET_PIP_SHA256 d1d09b0f9e745610657a528689ba3ea44a73bd19c60f4c954271b790c71c2653 - -RUN set -eux; \ - \ - wget -O get-pip.py "$PYTHON_GET_PIP_URL"; \ - echo "$PYTHON_GET_PIP_SHA256 *get-pip.py" | sha256sum -c -; \ - \ - export PYTHONDONTWRITEBYTECODE=1; \ - \ - python get-pip.py \ - --disable-pip-version-check \ - --no-cache-dir \ - --no-compile \ - "pip==$PYTHON_PIP_VERSION" \ - "setuptools==$PYTHON_SETUPTOOLS_VERSION" \ - ; \ - rm -f get-pip.py; \ - \ - pip --version \ No newline at end of file diff --git a/docker/electron-builder/README.md b/docker/electron-builder/README.md deleted file mode 100644 index 4e22a48a2..000000000 --- a/docker/electron-builder/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Used for building the electron-app. In short it's the /pyinstaller/build-unix.sh script which is running in this image. - -By intention, this is using an older OS-version in order to avoid glibc-issues. For details, see: -* https://github.com/cryptoadvance/specter-desktop/pull/1688#issuecomment-1242796681 -* https://github.com/cryptoadvance/specter-desktop/issues/373#issuecomment-695068924 - - -If you want to run the image manually, do something like this (copied from [here](https://www.electron.build/multi-platform-build#build-electron-app-using-docker-on-a-local-machine)): - - -``` -docker run --rm -ti \ - --env-file <(env | grep -iE 'DEBUG|NODE_|ELECTRON_|YARN_|NPM_|CI|CIRCLE|TRAVIS_TAG|TRAVIS|TRAVIS_REPO_|TRAVIS_BUILD_|TRAVIS_BRANCH|TRAVIS_PULL_REQUEST_|APPVEYOR_|CSC_|GH_|GITHUB_|BT_|AWS_|STRIP|BUILD_') \ - --env ELECTRON_CACHE="/root/.cache/electron" \ - --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \ - -v ${PWD}:/project \ - -v ${PWD##*/}-node-modules:/project/node_modules \ - -v ~/.cache/electron:/root/.cache/electron \ - -v ~/.cache/electron-builder:/root/.cache/electron-builder \ - electronuserland/builder:wine -``` - -build the image like: - -``` -docker build -t registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest . -docker push registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest -``` \ No newline at end of file diff --git a/docker/github-changelog/Dockerfile b/docker/github-changelog/Dockerfile deleted file mode 100644 index 135bb3195..000000000 --- a/docker/github-changelog/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM python:3.8 - -ARG REPO=https://github.com/cryptoadvance/github-changelog - -RUN apt update && apt install -y git - -WORKDIR / - -RUN git clone $REPO; - -WORKDIR /github-changelog -RUN git checkout master - -RUN python3 setup.py install - -ENV PYTHONUNBUFFERED="1" - -ENTRYPOINT ["changelog"] diff --git a/docker/github-changelog/Readme.md b/docker/github-changelog/Readme.md deleted file mode 100644 index 47de543a5..000000000 --- a/docker/github-changelog/Readme.md +++ /dev/null @@ -1,25 +0,0 @@ -An image used to create changelogs. - -Create it like this: - -``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/github-changelog:latest -docker push registry.gitlab.com/cryptoadvance/specter-desktop/github-changelog:latest -``` - -Use it like this: - -``` -latest_version=v0.8.1 -export GH_TOKEN=YourTokenHere -docker run 4a3dd375832d --github-token $GH_TOKEN --branch master cryptoadvance specter-desktop $latest_version > docs/new_release_notes.md -cp docs/release-notes.md docs/release-notes.md.orig -cat docs/new_release_notes.md docs/release-notes.md.orig > docs/release-notes.md -rm docs/release-notes.md.orig docs/new_release_notes.md - -``` -# This will print out links to all PRs in order to review better - -``` -docker run 4a3dd375832d -m --github-token $GH_TOKEN --branch master cryptoadvance specter-desktop $latest_version > docs/new_release_notes.md -``` diff --git a/docs/build-instructions.md b/docs/build-instructions.md index 2db57300d..4cc7a1e45 100644 --- a/docs/build-instructions.md +++ b/docs/build-instructions.md @@ -6,13 +6,9 @@ This document addresses the build-system part. For the continuous-integration-pa ## pip-packages ``` -# in the case of a release, the version needs to be adapted: -# sed -i "s/version=\".*/version=\"$CI_COMMIT_TAG\",/" setup.py - -python3 setup.py sdist bdist_wheel -cryptoadvance.specter-vx.y.z-get-replaced-by-release-script.tar.gz +python3 -m build ``` -This process is the same for all platforms. The result unfortunately is not stable in terms of identically sh256-hashes, though. +Produces an sdist + wheel under `dist/`. The release pipeline sets `SETUPTOOLS_SCM_PRETEND_VERSION` from the git tag; locally, setuptools-scm derives the version from your working tree. The result is not stable in terms of identical sha256-hashes across machines. ## Electron The electron build is assuming a node-installation. So make sure you have `node` and `npm` available. @@ -20,7 +16,7 @@ The electron build is assuming a node-installation. So make sure you have `node` The electron-app is built in a way that it's running the `specterd` (specter-demon) internally. It's not bundled with the electron-binary but downloaded with the first start (including sha256- and gpg-verification). If someone does not want the download, he can manually choose a specterd-binary from the `preferences/Advanced` menu. Nevertheless the Electron-App is tied, at buildtime, to a specific specterd-binary via a sha256-version. This probably doesn't make so much sense if you build outside of a release but we need it anyway. -So let's cover the build of the specterd-binary first. Below is a manual description of the build-process. There are acripts which are doing this but they are partially optimized for the CI-system. Check the `pyinstaller/build-*` scripts for details. +So let's cover the build of the specterd-binary first. Below is a manual description of the build-process. The canonical CI build lives in `.github/workflows/release.yml` (`build-specterd-*` and `build-electron-*` jobs). First set the virtualenv: @@ -31,11 +27,6 @@ source .buildenv/bin/activate ### specterd Linux and MacOS -Below doesn't seem to work properly, at least on MacOS, better use the build script. For MacOS, that would be: -```bash -./utils/build-osx.sh --version 0.0.0-pre1 specterd -``` - ```bash cd pyinstaller # prerequisites @@ -98,7 +89,7 @@ node ./set-version v1.3.1-custom ../dist/specterd npm i # We assume here that no Apple-developer-ID is used to sign the binary. -# Check `build-osx.sh` if you want to sign +# For signed+notarized builds, see .github/workflows/release.yml (build-electron-macos). echo "`jq '.build.mac.identity=null' package.json`" > package.json # finally build diff --git a/docs/ci-migration-evidence.md b/docs/ci-migration-evidence.md new file mode 100644 index 000000000..297d03945 --- /dev/null +++ b/docs/ci-migration-evidence.md @@ -0,0 +1,84 @@ +# CI Migration Evidence — Cirrus → GitHub Actions + +Evidence artifact per `docs/cirrus-replacement-spec.md` §Acceptance. Captures measured GHA behavior over the side-by-side period so that "did we actually hit SLO?" has a grep-able answer after GH Actions logs are GC'd. + +## Snapshot + +- **Measurement date:** 2026-04-19 +- **PR #1 (`test.yml` added):** merged 2026-04-17 as commit `a24df2eb` (PR [#2606](https://github.com/cryptoadvance/specter-desktop/pull/2606)) +- **Cirrus sunset deadline:** 2026-06-30 (~10 weeks remaining) +- **Side-by-side window so far:** ~2 days + +## Gate status + +Spec §Acceptance requires **all four** to hold before merging the cutover PR: + +| # | Criterion | Status | Notes | +|---|----------------------------------------------------------|------------|-----------------------------------------------------------------------| +| 1 | 10 consecutive green master runs | **Not met**| 2 master runs observed, both green | +| 2 | ≥ 3 green PR runs incl. one frontend-touching | **Partial**| 6 green PR runs; none confirmed as frontend-touching yet | +| 3 | Zero new flakes over ≥ 50 total runs | **Not met**| 14 total runs; zero flakes detected; sample too small | +| 4 | Cypress p95 within Cirrus +20% | **Breach** | Cypress p95 **10m10s** vs. Cirrus +20% ceiling **7m14s** — see below | + +**Merging PR #2 ahead of the nominal gate is a deliberate choice** driven by Cirrus's hard 2026-06-30 shutdown, preservation of revertability (PR #2 is a pure deletion of dead code + docs updates; revert is one click), and the empirical fact that no flakes have surfaced over the available sample. Gate criteria 1 and 3 will be satisfied by ordinary master-branch activity over the coming weeks; criterion 4 is acknowledged below as a known deviation, with a measurement protocol for re-evaluation. + +## Measured wall-clock + +n = 8 successful runs (2 master + 6 PR) between 2026-04-17 11:13 UTC and 2026-04-17 20:45 UTC. + +| Job | n | median | p95 | min | max | Cirrus median | Cirrus +20% ceiling | Result | +|-----------------------|---|---------|---------|---------|---------|---------------|---------------------|--------------------| +| `test` | 8 | 3m53s | 4m14s | 3m43s | 4m14s | 4m47s | 5m44s | **within ceiling** | +| `cypress` | 8 | 9m42s | 10m10s | 9m28s | 10m10s | 6m02s | 7m14s | **BREACH (+47%)** | +| `extension-smoketest` | 8 | 1m57s | 2m09s | 1m44s | 2m09s | 2m10s | 2m36s | **within ceiling** | + +Raw data pulled via `gh api repos/cryptoadvance/specter-desktop/actions/runs//jobs` for runs `24581485817`, `24585472647` (master), and `24580543016`, `24581562475`, `24582301901`, `24582337498`, `24585550944`, `24562219139` (PR). + +Cirrus baselines cited from `docs/cirrus-replacement-spec.md` §SLOs (20-sample baseline captured 2026-04-12). + +### Cypress breach — acknowledgement + +GHA Cypress p95 is **10m10s**, vs. the spec's Cirrus +20% ceiling of **7m14s** (Cirrus p95 6m55s × 1.20). Root cause not yet investigated. Candidates per spec §Cypress measurement: `--shm-size` bump, spec sharding, or escalation to `ubuntu-22.04-large`. + +**Decision:** accepted as a known deviation. Cypress wall-clock is still well under the 30-minute workflow timeout, and the alternative — holding the cutover until after Cirrus shutdown — would leave the project without PR gating. The breach is logged here rather than swept under the rug. + +**Follow-up:** re-run the measurement protocol (5× on `ubuntu-22.04` free tier) once 10+ master runs accumulate. If p95 remains >Cirrus+20%, file an issue and walk the escalation ladder (shm → shard → paid runner). + +## Flake signal + +Over 14 total `test.yml` runs (8 success, 5 failure, 1 action_required): + +- **Failures on `kn/cirrus-replacement-spec`** (4): iteration during PR #1 development. Each failure was followed by a targeted fix commit. Confirmed non-flaky by reading `git log` (`fix: cache symlink targets…`, `fix: bash shell for cypress container`, `fix: use VALIDSIG instead of GOODSIG`, `fix: use --status-fd`). +- **Failure on `kn/bump-bitcoind-test-v27.2`** (1): bitcoind version bump branch. Likely a real test failure from the version change, not a CI flake. +- **`action_required`** (1): fork PR (`copilot/fix-livereload-ui-delays`) pending maintainer approval to run workflows. Not a flake. + +**Flake count: 0** over this window. Sample size too small (n=14) to assert the steady-state SLO of ≤1% rolling-30-day, but no red flags. + +## Sample PR runs + +| URL | Branch | Conclusion | Frontend-touching? | +|---------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------|------------|--------------------| +| https://github.com/cryptoadvance/specter-desktop/actions/runs/24585550944 | `dependabot/npm_and_yarn/pyinstaller/electron/multi-20d65b3440`| success | partial (electron deps) | +| https://github.com/cryptoadvance/specter-desktop/actions/runs/24582337498 | `dependabot/npm_and_yarn/pyinstaller/electron/multi-3ffb4d349a`| success | partial (electron deps) | +| https://github.com/cryptoadvance/specter-desktop/actions/runs/24581562475 | `dependabot/npm_and_yarn/multi-6f6dcfc8d5` | success | indirect | +| https://github.com/cryptoadvance/specter-desktop/actions/runs/24562219139 | `kn/cirrus-replacement-spec` | success | no | + +Strict frontend-touching coverage (changes under `src/cryptoadvance/specter/static/` or `src/cryptoadvance/specter/templates/`) is **not yet confirmed** in the available sample. Criterion 2 will be rechecked at PR #2 merge time. + +## Sign-off + +| Field | Value | +|----------------------|------------------------------------------------------------| +| Evidence captured at | 2026-04-19 | +| Latest master commit | `62ea0265` (2026-04-17 20:33 UTC) | +| `test.yml` added at | `a24df2eb` (2026-04-17 18:50 UTC) | +| Author | @k9ert | + +## Rollback contract + +Per spec §Rollback, if post-cutover breakage emerges: +1. Revert the PR #2 merge commit → restores `.cirrus.yml` and `docker/cirrus-jammy/`. +2. Re-add the Cirrus required-check names to master branch protection. +3. Cirrus assumed operational through 2026-06-30. + +After 2026-06-30, no Cirrus fallback exists — forward fix only. Keep the cutover ≥ 4 weeks ahead of that date (target merge date per spec: 2026-05-12). diff --git a/docs/continuous-integration.md b/docs/continuous-integration.md index c2010629c..2803427ac 100644 --- a/docs/continuous-integration.md +++ b/docs/continuous-integration.md @@ -1,111 +1,60 @@ -# Introduction -Specter-Desktop is using GitLab, Cirrus and GitHub-Actions for continuous integration purposes but GitHub-actions only for Blackify so far. It might be more effort using more than one CI-approach but it makes us also more resilient. -GitLab and Cirrus have both advantages and disadvantages so ... let's use both! -GitLab: -* is completely open Source for server- and clients -* the gitlab-runner can run docker and is itself running on docker -* but does not support Pull-Requests -* needs to have bitcoind in a prepared docker-container which binds the build to that version +# Continuous Integration -Cirrus-CI: -* supports the PR-model -* quite easy to setup even though it's using docker +Specter-Desktop runs all CI on **GitHub Actions**. Cirrus CI and GitLab CI were retired in 2026-Q2 — see `docs/ci-migration-evidence.md` for the cutover evidence. -## Gitlab +## Workflows -Gitlab is a great CI/CD-platform and in the meantime it's quite easy to use it for GitHub-repositories. -https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/github_integration.html -The main file which specifies the jobs on GitLab is .gitlab-ci.yml -We're using a `gitlab-docker-runner` which means that all jobs are running in a container. -However at the same time we're using docker to spinup a bitcoind. +| Workflow | File | Trigger | +|--------------------------------|-------------------------------------------------|----------------------------------------------| +| Lint (black) | `.github/workflows/zblack.yml` | PR, push | +| Tests (pytest + Cypress + extension smoketest) | `.github/workflows/test.yml` | PR, push | +| Release | `.github/workflows/release.yml` | Tag push (`v*`) | +| Electron smoketest | `.github/workflows/electron-smoketest.yml` | PR and push to master on `pyinstaller/electron/**` | +| Extension compatibility | `.github/workflows/extension-compat.yml` | PR; push on `requirements.*` / `pyproject.toml`; `workflow_dispatch` | +| Specterd build smoke | `.github/workflows/test-specterd-build.yml` | PR | +| Docker image push | `.github/workflows/docker-push.yml` | Push to any branch | +| Docker image tag | `.github/workflows/docker-tag.yml` | Tag push (`v*`) | +| Docs table of contents | `.github/workflows/toc.yml` | Push | -The image is created manually (see /docker) and used for running the tests AND also for -spinning up bitcoind. +## Test workflow -For that reason we need to share the docker-socket from the host into the container and -create our own GitLab specific runner as described here: -https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-socket-binding +`test.yml` has three jobs, all on `ubuntu-22.04`: -Due to that setup there are some specifics which are mainly addressed in tests/conftest -start_bitcoind-function: -* adding -rpcallowip= (from a docker network) to bitcoind -* not use localhost but the docker-network-ip-address when talking to the bitcoind +- **`test`** — pytest with `--cov=cryptoadvance`. Runs in 45 min. Installs system deps inline; no custom image. Caches bitcoind/elementsd binaries via `actions/cache@v4` keyed on `runner.os × runner.arch × hash(pyproject.toml, tests/install_noded.sh, tests/bitcoin_SHA256SUMS, tests/elements_SHA256SUMS)`. +- **`cypress`** — runs `./utils/test-cypress.sh --debug run` inside `ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy@sha256:`. 30-minute timeout. `--shm-size=2g` to avoid Cypress OOMs on the default 64 MB `/dev/shm`. Shares the bitcoind/elements cache with `test`. +- **`extension-smoketest`** — byte-compatible port of the former Cirrus smoketest. 15 min. Smoke-tests `ext gen`, server boot, and log-line / curl assertion. Contract must stay stable — downstream extension developers depend on it. -## Travis-CI +All three jobs use `actions/checkout@v4` with `fetch-depth: 0` so `git describe` resolves annotated tags for `tests/test_util_version.py`. -We're no longer using travis-ci due to the abuse-detection-system going wild on us. +## Caching -## Cirrus-CI +`actions/cache@v4` with `save-always: true` on a key that includes `runner.arch` (prevents ARM/x86 cache poisoning). The key hashes the committed `tests/bitcoin_SHA256SUMS` and `tests/elements_SHA256SUMS` trust anchors — bumping a version in `pyproject.toml` rotates the cache via those files. -[Cirrus-CI](https://cirrus-ci.org) is used by Bitcoin-Core and HWI and is a quite good replacement for travis. We're using it only for PRs so far. The [../.cirrus.yml] file defines the build. We have two task, one for pytest and one for the [cypress-tests](./cypress-testing.md). +### Binary verification -## Releasing +`tests/install_noded.sh` GPG-verifies the upstream `SHA256SUMS.asc` against the Bitcoin Core and Elements release signing keys, and checks the tarball SHA256 against the committed trust anchors on every run (cold cache AND cache hit). A tampered cache entry fails closed on restore. See PR #2606 for the threat model. -### What gets released +## Cypress container -We're mostly releasing automatically. Currently the following artifacts are released: -* specterd (daemon) is a binary for kicking off the specter-desktop service on the command-line. We have binaries for windows, Linux and macOS -* We have an Electron-App which we're also releasing for Windows, Linux and MacOS. Unfortunately the macOS build is not yet automated -* We release a pip-package -* Usually some time after the release, the lncm is releasing [docker-images](https://hub.docker.com/r/lncm/specter-desktop). Very much appreciated, even though we can't guarantee for them, obviously. +`ghcr.io/cryptoadvance/specter-desktop/cypress-python-jammy` is pinned by digest (not tag) in `test.yml`. This makes Dockerfile edits visibly require a workflow bump. When editing `docker/cypress-python-jammy/Dockerfile`, rebuild and push to GHCR with a fresh tag, then update the digest pin. -### How we release -As we have a strict build-only-on-private-hardware build-policy, we're using GitLab private runners in order to build our releases. In order to test and develop the releasing automation, people can setup GitLab-projects which are syncing from their GitHub-forks. With such a setup it's possible to create test-releases and therefore test the whole procedure end-to-end. +## Release pipeline -The automation of that kicks in if someone creates a tag which is named like "vX.Y.Z". This is specified in the gitlab-ci.yml. The release-job will only be triggered in cases of tags. One step will also check that the tag follows the convention above. -The package upload will need a token. How to obtain the token is described in the packaging-tutorial. It's injected via GitLab-variables. ToDo: put the token on a trusted build-node. +See [`release-guide.md`](./release-guide.md). Pushing a tag matching `v[0-9]+.[0-9]+.[0-9]+[-*]?` triggers `release.yml`, which builds pip/specterd/Electron artifacts for Linux/Windows/macOS, signs `SHA256SUMS`, and creates a draft GitHub release. Docker images are built by `lncm/docker-specter-desktop` (triggered via `AARON_TRIGGER` secret). -### pyinstaller system-dependent binaries -The [pyinstaller directory](../pyinstaller) contains scripts to create the platform-specific binaries (plus electron) to use specter-desktop as a desktop-software. Some of them are created and uploaded to [GitHub-releases](https://github.com/cryptoadvance/specter-desktop/releases) via more or less special build-agents. -The [windows-build-agent](https://docs.gitlab.com/runner/install/windows.html) needs manual installation -of git, python and docker. Docker is used to build the innosetup-file. -As docker is available in windows only as a "desktop-edition", one need to also -log into the windows-machine to get docker started. -Clearly there is an opportunity to move all of the creation of the windows-binary to wine on docker, -similiar to the way the innosetup is running within docker. +## Flake policy -## CI/CD-dev-env setup +- Cypress: `retries: { runMode: 1, openMode: 0 }`. Specs retry-to-green emit a warning annotation. +- pytest: `--reruns 0` (fail fast). Flakes are debt, not a coping mechanism. +- Spec flagged flaky twice in 14 days gets `@skip(reason="flaky", issue="#NNNN")` with a 2-week SLA. -Here is a brief description on how to create a setup where the release-procedures can be tested: -* We assume you have a fork of cryptoadvance/specter-desktop. We also assume that your GitLab-user-handle is the exact same as on GitHub. -* Create a GitLab-account and then a mirroring project ([here](https://gitlab.com/projects/new#cicd_for_external_repo)) obviously with the exact same name: "specter-desktop" -* Activate the private runners and deactivate the public runners. Contact @k9ert for that. -* Create an account and an [API token](https://test.pypi.org/manage/account/) on there -* Create a token for GitHub in order to release to your GitHub-fork -* Configure both tokens on the GitLab-variables (GH_BIN_UPLOAD_PW and TWINE_PASSWORD) -* create a tag on your GitHub-fork -* watch the test-release unfolding, ready to hack +## Secrets -### GitLab-runner setup (Windows) +| Secret | Used by | Purpose | +|---------------------------|--------------------------|----------------------------------------------| +| `GITHUB_TOKEN` | (auto-provided) | Checkout, artifact upload, ghcr.io push | +| `GPG_PRIVATE_KEY` + `GPG_PASSPHRASE` | `release.yml` | Sign `SHA256SUMS` | +| `APPLE_*` (six) | `release.yml` macOS | Code signing + notarization (optional) | +| `AARON_TRIGGER` | `release.yml` | Trigger `lncm/docker-specter-desktop` build | -For Windows-releasing, we're using a windows GitLab-runner. Here is a short description on how to set one up. - -#### Prerequisites - -You need at least Windows Home 10 which is up-to-date. The most complex dependency is setting up docker. -Docker-Desktop needs a WSL2 which is a good idea to install on windows anyway. [Here](https://www.omgubuntu.co.uk/how-to-install-wsl2-on-windows-10) is a description on how to do that. - -While installing, make sure you know the locations of where that stuff is installed. We'll later need to verify/adjust the PATH. - -* Install Python, i took the [3.7.9 webinstaller](https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64-webinstall.exe) -* Install Git, e.g. [this](https://github.com/git-for-windows/git/releases/download/v2.29.2.windows.2/Git-2.29.2.2-64-bit.exe) (i had 2.28.2) -* Install [Docker-Desktop](https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe) - -Now open and check the "Environment-variables" and check that the following lines are in there: - -![](./images/continuous-integration_runner_windows_envvars.png) - -#### Runner - -The runner itself is easy to [setup](https://docs.gitlab.com/runner/install/windows.html). Follow the link or this very brief description: -* `mkdir \Gitlab-Runner` -* download [this binary](https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe) in that folder and rename to gitlab-runner.exe -* Search for "powershell" in windows an open AS ADMINISTRATOR -* `cd \Gitlab-Runner` -* Copy the Registration-token from [here](https://gitlab.com/k9ert/specter-desktop/-/settings/ci_cd) (unfold runners, see specific runners) -* `./gitlab-runner.exe register`and paste the token (the instance-url is the default) -* give a reasonable description. Make sure to tag this runner with "tag". If that's not possible here, you can do it in the page mentioned above -* `.\gitlab-runner.exe install` will install the runner as system-service -* `.\gitlab-runner.exe start` will start it - -Done +No GitLab secrets remain. diff --git a/docs/images/continuous-integration_runner_windows_envvars.png b/docs/images/continuous-integration_runner_windows_envvars.png deleted file mode 100644 index ea0e30f7e713e9a6d21694df51af486b8e2c23f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32855 zcmb5V1yoy6*DczXV#P{ni+hW^ySuw_X#c!(tXgzP|x&o&ob! zHbT1h%rk#j^oq=^1Tc*ntg-h(gyZ?-;J&g={t6)1HfwVYv-t{&!Nd)D6<+j7H$m{r z?|K{G`1!xyJHyM)yQ9l(HybOF-rxV8tPk-zo9zs9nd4dJEbi%8)2_ppQTaU+tKX0rcjvvz4zR1^rq|5mgkCERYx*NGG{ zaJ`XF;JozwO7p0Kl%`58=|b=8Msm$iF2yXVF8_sXph~m$YtLOZe^}>#%yvh!S_qHAS269Pr{6I@TuD`G|SsZjOe0%F1vW?Xe%3E zJ0;W;8pmGBhI zO_kHJt?*O0rmYZniLPD#Qy)3GS^o}Fdpl#d�ZtdG`*wW!Dt|nF9bna7Q`RM4)M( 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 diff --git a/docs/images/release-guide/overview-gitlab-pipline.png b/docs/images/release-guide/overview-gitlab-pipline.png deleted file mode 100644 index 88c33bee4c734d07234e988f6c9eedfeb964d3ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81349 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
    a?2Jj~NbZT2Qq1h`brtLt63W;9(OKE)si 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

    w*j!?tB*653JOVHbjt-8Gl9aXdI3Z&I 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�ajb^2ELw;+mSy9`JFdXa-P;nr7}MW=9w(f7 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 z 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 H0z$HiHNaje%FW%Laz1IPb<$&MsgKMkdtI1^+=o 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%0A;f8cFW^+u@v++-N5y|2UB8#< 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%0DNwiE z2>jdy0Ebuc1Ii6}NbC38mtLewyUI!Y+rCTMf%u!!&ggq{NqAQIC3WY5Aw4(Z|3&Yg zNIco{qHZ0$&PMW{j=1UBjGJIjYhGQEctQPBZkx*wtdKOwfKAI1%SH-NKY>&sGWYqd z{yT4fs*%mG39eJKv^Ea@&G<5NBJa-UB7w5Rht;FV_0LRrd^R6pNJ1z$=0F)4|JL%q z*hZD>K_=L)GPfxaKV)+Te)=PcxXjdLeP=IMSx$O3GGN&T$HlPF<+Ko$ZxTT)r)S7@ z0q$F=m#y*N3^XKq6^}j-H?u*LK*!1aQR<-m2P%XIx;TUM8ygp6AZF>OFfjlCj+=Y= zb8D-FPf$GvTuKor(fsL}n%!hwdw{xQQ#sD0TE0`5Gsd4$6=>+IlY#Ln+UMT4D-K60dKnoMac2Hpe cp}YBtAYdA#z9|#lD4*&oF diff --git a/docs/release-guide.md b/docs/release-guide.md index 2328e86c0..7f2675e34 100644 --- a/docs/release-guide.md +++ b/docs/release-guide.md @@ -1,160 +1,60 @@ # Release Guide -## Creating release notes +The release pipeline runs on GitHub Actions. Pushing a version tag to `upstream` triggers `.github/workflows/release.yml`, which builds every artifact, creates a draft GitHub release, and signs `SHA256SUMS` with the Specter Signer GPG key. -### Pre-requisites +## Prerequisites -- You need the correct upstream master. You should see +- `upstream` points at `git@github.com:cryptoadvance/specter-desktop.git` (`git remote -v` should show both fetch and push). +- You are on `master` with a clean workspace and `git pull upstream master` applied. +- Release-notes PR has already merged (see [Release notes](#release-notes) below). + +## Cut a release ```bash -git remote -v | grep upstream -upstream git@github.com:cryptoadvance/specter-desktop.git (fetch) -upstream git@github.com:cryptoadvance/specter-desktop.git (push) +git tag v1.13.1 +git push upstream v1.13.1 ``` -- You need a GitHub token: - If you don't have one, get one here https://github.com/settings/tokens and make sure to tick the boxes for repo and workflow as below: +That's it. The `Release` workflow on GitHub Actions takes it from here: -![](./images/release-guide/github-token.png) +- **`release-pip`** — builds the sdist/wheel and publishes to PyPI via trusted publishing. +- **`build-specterd-{linux,windows,macos}`** — builds the `specterd` binary on each platform (macOS arm64 on the free `macos-14` runner). +- **`build-electron-{linux,windows,macos}`** — builds the Electron apps using each platform's `specterd` artifact. Windows uses the public `electronuserland/builder:wine` image; macOS signs + notarizes if `APPLE_CERTIFICATE_BASE64` et al. are configured. +- **`create-release`** — collects all artifacts, generates `SHA256SUMS`, signs it with the GPG key from the `GPG_PRIVATE_KEY` secret, generates a release body (with auto-generated "What's Changed" via `gh api .../generate-notes`), and creates a **draft** GitHub release. +- **`trigger-docker`** — POSTs a repository-dispatch to `lncm/docker-specter-desktop` so Aaron's Docker build picks up the new tag (needs `AARON_TRIGGER` secret; skipped otherwise). -Using the new token, run +The release lands as a draft — review and publish it manually on GitHub. + +### Required secrets + +| Secret | Purpose | +|------------------------------------|--------------------------------------------------------------| +| `GPG_PRIVATE_KEY` | ASCII-armored private key for signing `SHA256SUMS` | +| `GPG_PASSPHRASE` | Passphrase for the above | +| `APPLE_CERTIFICATE_BASE64` | Developer ID cert for macOS signing (optional — unsigned fallback) | +| `APPLE_CERTIFICATE_PASSWORD` | p12 password | +| `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, `APPLE_TEAM_ID` | Apple notarization credentials | +| `APPLE_PROVISIONING_PROFILE_BASE64`| Optional provisioning profile | +| `AARON_TRIGGER` | PAT for triggering `lncm/docker-specter-desktop` | + +PyPI publishing uses trusted publishing (OIDC) — no secret required. + +## Release notes + +Update `docs/release-notes.md` via a normal PR before tagging. Use the GitHub API or `gh` to pull "What's Changed" between the previous tag and `master`, prepend a heading, and open a PR. The `create-release` workflow job also appends auto-generated notes to the release body. + +## GitHub pages download page + +`./utils/generate_downloadpage.sh` still generates the `specter-static` website's download page off `utils/templates/`. Clone `specter-static` alongside `specter-desktop` and run: ```bash -export GH_TOKEN=YOURTOKEN +./utils/generate_downloadpage.sh ``` -- You need Docker running -- Checkout the master branch and ensure a clean workspace. +The script installs the markdown prerequisite, regenerates the GH-page and download page, asks whether to replace/update the GitHub release page for the latest version, and offers to commit/push the static-site changes. -Now, you can run +## Troubleshooting -```bash -./utils/release.sh --release-notes -``` +If something fails mid-pipeline, re-running individual jobs is safe — they `actions/download-artifact` from prior jobs and overwrite existing release assets via `softprops/action-gh-release`. If the draft release already has assets from a stale run, delete the draft and re-run `create-release`. -Or, if you want to directly set the new version: - -```bash -./utils/release.sh --new-version v1.13.1 --release-notes -``` - -## Creating a new tag - -Update your master branch after the release notes PR ([example](https://github.com/cryptoadvance/specter-desktop/commit/65ff6959d7fd85cba745e4d454b30031839f857f/)) has been merged and then run: - -```bash -git tag v1.13.1 && git push upstream v1.13.1 -``` - -if you have a proper setup of github- AND gitlab forks (and the remote `origin` on git pointing to your github fork), you can push that tag to origin and this is useful to test the procedures. See "CI/CD-dev-env setup" in [continuous-integration](./continuous-integration.md). - -```bash -git tag v1.13.1 && git push origin v1.13.1 -``` - -## GitLab - releasing stage - -Creating a tag triggers the release process of the GitLab runners. -There exists a mirror of the GitHub repo on GitLab, but only when a tag is created on GitHub will the release part of the runners execute. You can check the status here: -https://gitlab.com/cryptoadvance/specter-desktop/-/pipelines - -There are three stages: -![](./images/release-guide/overview-gitlab-pipline.png) - -The first relevant stage is "releasing". Here, the Windows, Linux and pip release are created and uploaded to the Specter Desktop GitHub releases page. After this stage, the following artificats should be available: - -- cryptoadvance.specter-1.13.1.tar.gz -- Specter-Setup-v1.13.1.exe -- specterd-v1.13.1-win64.zip -- specterd-v1.13.1-x86_64-linux-gnu.zip -- specter_desktop-v1.13.1-x86_64-linux-gnu.tar.gz - -The three jobs in more detail: - -- release_binary_windows: is creating a binary for specterd and for Windows (Windows runner) -- release_electron_linux_windows: Creates a specterd for Linux, an AppImage for Linux and an executable for Windows (Linux runner). -- release_pip: Is releasing a pypi package on [pypi](https://pypi.org/project/cryptoadvance.specter/) and creates a tarball of the pip package for the GitHub release page (Linux runner). - -For details look at `.gitlab-ci.yml` - -## MacOS - -Ideally, directly after the tag is created, start with the MacOS release. As the binaries of x86/arm64 are not compatible with each other, we need to build on two MacOS architectures.This has to be done manually, for now. There is a script for this. Start with the build on x86: - -### MacOS x64 build - -```bash -./utils/build-osx.sh --version v2.0.5-pre4 specterd package upload -``` - -You can also test this procedure without messing the original project via changing the `orgName` to your `orgName` in `pyinstaller/electron/downloadloc.js`. - -This will create three artifacts on github: -* specterd-v2.0.5-pre4-osx_x64.zip -* SHA256SUMS-macos_x64 -* SHA256SUMS-macos_x64.asc - -### MacOS arm64 build - -The electron application will get built on the arm architecture. As it needs to store the sha256 hash in the electron-app, the make-hash target -will not only hash the specterd but also download the other specterd and hash it. - -```bash -./utils/build-osx.sh --version v2.0.5-pre4 --appleid "Satoshi Nakamoto (appleid)" --mail "satoshi@gmx.com" specterd make-hash electron sign package upload -``` - -This will create four artifacts on github: -* Specter-v2.0.5-pre4.dmg -* specterd-v2.0.5-pre4-osx_arm64.zip -* SHA256SUMS-macos_arm64 -* SHA256SUMS-macos_arm64.asc - - -## GitLab - post releasing - -Back to GitLab, the final stage is "post releasing". - -### release_signatures - -In this job, the individual SHA256-hashes and signatures are combined into two final files: - -- SHA256SUMS -- SHA256SUMS.asc - -Everything, apart from the MacOS files, are pulled from the GitLab environment, the MacOS files from GitHub. -Don't forget to delete the four MacOS files (`SHA256SUMS-macos_arm64` and `SHA256SUMS-macos_arm64.asc` and the two corresponding `_x64` files) on the GitHub release page in the end. - -This is difficult to automate as sometimes the manual steps has not succeeded while generating the SHASUM-files. As a result, those hashes are not included. So you might want to run this again. And you can, just delete the two generated files - `SHA256SUMS` and `SHA256SUMS.asc` and run the job again. - -### release_docker - -There are docker images created by the awesome [Chiang Mai LN dev](https://github.com/lncm/docker-specter-desktop). So the task of this job is to trigger their build-system which is done via `utils/trigger_docker_build.sh`. A prerequisite of this is a token in order to authenticate. That token is from Aaron, one of the maintainers of that repo, and can be found in the gitlab variables section of the CI/CD configuration. - -### tag_specterext_dummy_repo - -Sometimes there are changes on the plugin architecture. In order to create a plugin, it's quite important to know which version of the plugin system should be used. Because of that, we simply assume that the master of the [specterext-dummy](https://github.com/cryptoadvance/specterext-dummy) repo is compatible with the current master which was just tagged with the new version. -So this job will tag that repo with the same tag and the creation of a plugin will take the version into account. - -## Trouble shooting - -If the MacOS signatures are missing, it can happen that the following Exception will be raised: - -```bash - File "/builds/cryptoadvance/specter-desktop/utils/github.py", line 295, in download_artifact - raise Exception( - Exception: Status-cod04 for url ... ) -``` - -In any case, if the macOS binaries arrive on GitHub too late, you have to manually delete the already created `SHA256SUMS` and `SHA256SUMS.asc`, otherwise the upload to GitHub will fail if you rerun the release signatures job on GitLab - for details see ([this PR](https://github.com/cryptoadvance/specter-desktop/pull/689)). The green arrow in the screenshot is where you rerun the release signatures job on GitLab: - -![](./images/release-guide/rerun-release-signatures.png) - -## GitHub release page and download page - -This is handled by the script `./utils/generate_downloadpage.sh`. As a prerequisite, you need to clone the `specter-static` repo which contains the specter website. Clone it on the same level than specter-desktop. -Running that script will: - -- install the prerequisites (basically markdown, see pyproject.toml) -- generate the GH-page and the download-page based on the `utils/templates`. -- Asks whether it should replace/update/initialize the Github Release page for the latest version -- copies over the new download-pages and asks whether it should commit/push those +macOS builds are the most likely to fail due to Apple signing/notarization glitches. The workflow falls back to unsigned builds when `APPLE_CERTIFICATE_BASE64` is empty — useful for smoke-testing the pipeline on forks. diff --git a/pyinstaller/README.md b/pyinstaller/README.md index 2101072b6..22f24b288 100644 --- a/pyinstaller/README.md +++ b/pyinstaller/README.md @@ -1,14 +1,7 @@ -# Build scripts - -Run `build- ` file to build everything. - -For example, `build-osx.sh 1.2.3` will create `SpecterDesktop-1.2.3.dmg` and `specterd-1.2.3-osx.zip` in the `release` folder. - -If you're making a real release, you should append `"make hash"` at the end of your command calling the build script. -This will update the file hash and version name the Specter Desktop app expects to download from GitHub. - # Pyinstaller build +Releases are built by `.github/workflows/release.yml` (triggered by a version tag). The notes below are for local / manual builds. + Install requirements: ```bash @@ -52,17 +45,9 @@ If this is the first time you go through this process, you'll need to first set xcrun altool --store-password-in-keychain-item "AC_PASSWORD" -u "" -p "" ``` -After having these set up, you can use the automated script to sign by passing it 2 extra parameters: -- Your certificate name, which you can see on the Keychain app going to the sidebar -> `My Certificates` and copying the name of the certificate you've created in step 1. -- Your Apple ID. +Release builds sign and notarize via `.github/workflows/release.yml` (`build-electron-macos` job) using the `APPLE_CERTIFICATE_BASE64`, `APPLE_CERTIFICATE_PASSWORD`, `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, and `APPLE_TEAM_ID` secrets. See `docs/release-guide.md` for the full secret inventory. For manual local signing, use `electron-builder` directly (`npm run dist -- --mac` in `pyinstaller/electron/`, with the identity configured in `package.json`). -With these two, you can run the command like so: -```bash -./build-osx.sh "" "" "make-hash" -``` -*Note: "make-hash" is optional and will automatically calculate hash of specterd generated for the macOS app. Should be used only for real release.* - -This should take 10 minutes, during which you should receive an email from Apple notifying whatever the notarization was successful. +Notarization takes ~10 minutes, during which Apple emails notification of success/failure. If for some reason the notarization failed, you'll be able to get the reason by copying the `Request Identifier` (you should be able to find this in the email and in the logs). Then run the following command: ```bash diff --git a/pyinstaller/build-ci.sh b/pyinstaller/build-ci.sh deleted file mode 100755 index a4d63318d..000000000 --- a/pyinstaller/build-ci.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# pass version number as an argument - -echo " --> This build got triggered for version $1" - -echo " --> Assumed gitlab-project: ${CI_PROJECT_ROOT_NAMESPACE:+x}" - -[ -z "${CI_PROJECT_ROOT_NAMESPACE:+x}" ] && \ - echo "Redefining CI_PROJECT_ROOT_NAMESPACE=cryptoadvance " && \ - export CI_PROJECT_ROOT_NAMESPACE=cryptoadvance - -echo $1 > version.txt -echo " --> Installing (build)-requirements" -pip3 install -r requirements.txt --require-hashes -cd .. -python3 setup.py install -pip3 install -e . -cd pyinstaller - -echo " --> Cleaning up" -rm -rf build/ dist/ release/ electron/release/ electron/dist release-linux/ release-win/ - -echo " --> Building specterd" -pyinstaller specterd.spec - -echo " --> Making us ready for building electron-app for linux" -cd electron -npm ci -node ./set-version $1 ../dist/specterd - -echo " --> building electron-app" -npm i -npm run dist -- --linux - -cd .. - -echo " --> Making the release-zip" -mkdir release-linux -cd dist -cp -r ../../udev ./udev -echo "Don't forget to set up udev rules! Check out udev folder for instructions." > README.md -zip -r ../release-linux/specterd-"$1"-"$(uname -m)"-linux-gnu.zip specterd udev README.md - -cp ../electron/dist/Specter-* ./ -tar -czvf ../release-linux/specter_desktop-"$1"-"$(uname -m)"-linux-gnu.tar.gz Specter-* udev README.md - -echo " --> Cleaning up" -cd .. -rm -rf dist -mkdir dist -cd dist -echo " --> Downloading the windows-version of specterd for version $1" -wget --progress=dot -e dotbytes=10M https://github.com/${CI_PROJECT_ROOT_NAMESPACE}/specter-desktop/releases/download/$1/specterd-$1-win64.zip -O ./specterd.zip -unzip specterd.zip -cd ../electron -rm -rf dist/ -echo " --> Making us ready for building electron-app for windows" -npm ci -node ./set-version $1 ../dist/specterd.exe -npm run dist -- --win -cd .. - -mkdir release-win -cp electron/dist/Specter\ Setup\ *.exe release-win/Specter-Setup-$1.exe diff --git a/pyinstaller/build-win-ci.bat b/pyinstaller/build-win-ci.bat deleted file mode 100755 index 21820e408..000000000 --- a/pyinstaller/build-win-ci.bat +++ /dev/null @@ -1,42 +0,0 @@ -@ECHO OFF - -python -V -pip3 install virtualenv -echo " --> cleaning up" -rmdir /s /q .\release\ -rmdir /s /q .\dist -rmdir /s /q .buildenv -echo " --> Creating virtualenv" -virtualenv --python=python3 .buildenv -echo " --> Activating virtualenv" -call .\.buildenv\Scripts\activate - -echo " --> Installing test-requirement" -pip3 install -e ".[test]" - -echo " --> Building pypi package" -pip3 install build==0.10.0 -python -m build - -echo " --> Installing pypi package" -python .\utils\release_helper.py install_wheel %1% - -cd pyinstaller - -Rem This file gets further packaged up with the pyinstaller and will help specter to figure out which version it's running on -echo %1% > version.txt -echo " --> installing pyinstaller requirements" -pip3 install -r requirements.txt --require-hashes - -rmdir /s /q .\dist\ -rmdir /s /q .\build\ -rmdir /s /q .\release\ -rmdir /s /q .\electron\dist\ - -echo " --> Creating the pyinstaller binary" -pyinstaller.exe specterd.spec - -mkdir release - -echo " --> Creating the release-package" -powershell Compress-Archive -Path dist\specterd.exe release\specterd-%1%-win64.zip diff --git a/pyinstaller/build-win.bat b/pyinstaller/build-win.bat deleted file mode 100644 index 99b8410c6..000000000 --- a/pyinstaller/build-win.bat +++ /dev/null @@ -1,31 +0,0 @@ -@ECHO OFF -echo %1% > version.txt -pip3 install -r requirements.txt --require-hashes -cd .. -Rem Order is relevant here. If you flip the followng lines, the hiddenimports for services won't work anymore -python3 setup.py install -pip3 install -e . -cd pyinstaller -rmdir /s /q .\dist\ -rmdir /s /q .\build\ -rmdir /s /q .\release\ -rmdir /s /q .\electron\dist\ -pyinstaller.exe specterd.spec -cd electron -call npm ci -if "%2%"=="make-hash" ( - call node ./set-version "%1%" "../dist/specterd.exe" -) else ( - node ./set-version "%1%" -) -call npm i -call npm run dist -cd .. - - -mkdir release -SET EXE_PATH="electron\dist\Specter Setup *.exe" -SET EXE_RELEASE_PATH="release\Specter Setup %1%.exe" -echo f | xcopy /s/y %EXE_PATH% %EXE_RELEASE_PATH% - -powershell Compress-Archive -Path dist\specterd.exe release\specterd-%1%-win64.zip diff --git a/pyproject.toml b/pyproject.toml index 7059bfcd1..faf36f277 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,7 +82,6 @@ test = [ "PySocks==1.7.1", "pytest-cov==2.10.1", "mock==4.0.2", - "python-gitlab==2.10.1", # requirements for stuff in ./utils "requests==2.31.0", ] diff --git a/src/cryptoadvance/specter/managers/service_manager/service_manager.py b/src/cryptoadvance/specter/managers/service_manager/service_manager.py index 150e16758..9bb37006e 100644 --- a/src/cryptoadvance/specter/managers/service_manager/service_manager.py +++ b/src/cryptoadvance/specter/managers/service_manager/service_manager.py @@ -464,7 +464,7 @@ class ExtensionManager: site_package = Path(virtuelenv_path, *(Path(site_package).parts[-3:-1])) virtualenv_search_path = site_package - # ... and as the classes are in the .buildenv (see build-unix.sh) let's add .. + # ... and as the classes are in the .buildenv let's add .. arr = [Path(virtualenv_search_path, path) for path in arr] # Non internal-repo extensions sitting in org/specterext/... need to be added, too diff --git a/utils/artifact_signer.sh b/utils/artifact_signer.sh deleted file mode 100755 index 92b5589af..000000000 --- a/utils/artifact_signer.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash - -function sub_help { - echo "This script is to sign artifacts or to prepare the gpg-system to be able to verify artifacts." - echo "Do one of these:" - echo "$ ./utils/artifact_signer.sh init" - echo "This makes sense only on a gitlab-runner. It'll unpack a gpg-directory to be ready to sign and verify" - echo "$ ./utils/artifact_signer.sh sign --artifact ./release-win/SHA256SUMS-win" - echo "Signs a specific artifact. Will do the init on the fly. So no need to call it extra." -} - -while [[ $# -gt 0 ]] -do -key="$1" -command="main" -case $key in - --help) - sub_help - exit - shift - ;; - --artifact) - artifact=$2 - shift - shift - ;; - sign) - action=sign - shift - ;; - init) - action=init - shift - ;; - --debug) - set -x - shift # past argument - ;; - *) # unknown option - POSITIONAL="$1" # save it in an array for later - shift # past argument - ;; -esac -done - -# We want a detached signature in cleartext. Extension: .asc (as in bitcoin) -output_file=${artifact}.asc - -# lazy init: We're initializing Each thime script is called with these two things. -# So that action "init" is just to have a bit more semantics for the one calling this script - -function init { - if [[ -f /credentials/gnupg.tar.gz ]]; then - echo "Init: extracting gnupg.tar.gz" - tar -xzf /credentials/gnupg.tar.gz -C /root - chown -R root:root ~/.gnupg - else - echo "Init: Could not find any /credentials/gnupg.tar.gz" - fi - - if [[ -f /credentials/private.key ]]; then - echo "Init: Importing single private key" - gpg --import --no-tty --batch --yes /credentials/private.key - else - echo "Init: Could not find any /credentials/private.key" - fi -} - -if [ "$action" = "init" ]; then - init -fi - -if [ "$action" = "sign" ]; then - init - if [[ -z $artifact ]]; then - echo "no --artifact given " - exit 1 - fi - echo "signing ..." - echo $GPG_PASSPHRASE | gpg --detach-sign --armor --no-tty --batch --yes --passphrase-fd 0 --pinentry-mode loopback $artifact -fi \ No newline at end of file diff --git a/utils/build-common.sh b/utils/build-common.sh deleted file mode 100644 index 7b90d9f07..000000000 --- a/utils/build-common.sh +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env bash - -# All functions in here are responsible to change directory -# from the project root to wherever they want -# They need to change back to project-root when they finish - - -function create_virtualenv_for_pyinstaller { - echo " --> Creating new virtualsenv" - if [ -d .buildenv ]; then - echo " But first Delete it ..." - rm -rf .buildenv - fi - virtualenv --python=python3.10 .buildenv - source .buildenv/bin/activate - pip3 install -e ".[test]" -} - -function build_pypi_pckgs_and_install { - echo " --> Build pip3-package" - rm -rf dist - if ! git diff --quiet setup.py; then - echo "ERROR: setup.py is dirty, can't reasonably build" - exit 1 - fi - if [[ "$OSTYPE" == "darwin"* ]]; then - SML_ADD="\"\"" - fi - pip3 install build==0.10.0 - python3 -m build - pip3 install ./dist/cryptoadvance.specter-*.whl -} - -function configure { - echo " --> Configure some variables" - if [ -z "$app_name" ]; then - # activate virtualenv. This is e.g. not needed in CI - app_name=specter - specterd_filename=specterd - specterimg_filename=Specter - pkg_filename=specter_desktop - else - specterd_filename=${app_name}d # usually "specterd" - specterimg_filename=${app_name^} # usually "Specter" - pkg_filename=${app_name} - fi - - export ARCH=$(node -e "console.log(process.arch)") - export dist_mac_folder_name=mac-universal - export CI_COMMIT_TAG=$version - export CI_PROJECT_ROOT_NAMESPACE=$(node -e "const downloadloc = require('./pyinstaller/electron/downloadloc');console.log(downloadloc.orgName())") - - echo specterd_filename=${specterd_filename} - echo specterimg_filename=${specterimg_filename} - echo pkg_filename=${pkg_filename} - echo ARCH=$ARCH - echo dist_mac_folder_name=$dist_mac_folder_name - echo CI_COMMIT_TAG=$CI_COMMIT_TAG - echo CI_PROJECT_ROOT_NAMESPACE=$CI_PROJECT_ROOT_NAMESPACE - -} - - -function install_build_requirements { - - echo " --> Installing pyinstaller build-requirements" - cd pyinstaller - pip3 install -r requirements.txt --require-hashes > /dev/null - - cd .. -} - -function cleanup { - echo " --> Cleaning up" - cd pyinstaller - rm -rf build/ dist/ release/ electron/release/ electron/dist - rm *.dmg || true - cd .. -} - -function building_app { - echo " --> Building ${specterd_filename}" - cd pyinstaller - specterd_filename=${specterd_filename} pyinstaller specterd.spec > /dev/null - cd .. -} - -function prepare_npm { - cd pyinstaller/electron - echo " --> Making us ready for building electron-app" - npm ci - cd ../.. -} - -function make_hash_if_necessary { - cd pyinstaller/electron - echo " --> calculate the hash of the binary for download" - if [[ "$1" = "win" ]]; then - specterd_plt_filename=../dist/${specterd_filename}.exe - else - specterd_plt_filename=../dist/${specterd_filename} - fi - if [[ "$make_hash" == 'True' ]] - then - node ./set-version $version ${specterd_plt_filename} - else - node ./set-version $version - fi - echo " Hash in version -data.json $(cat ./version-data.json | jq -r '.sha256')" - echo " Hash of file $(sha256sum ${specterd_plt_filename} )" - cd ../.. -} - -function building_electron_app { - # https://www.electron.build/ - # Prerequisites: - # * A developer Certificate (in the System keychain) - # * private and public key in the login-keychain - # * The cert needs to be referenced in pyinstaller/electron/package.json -> build.mac.identity - - - platform="-- --${1}" # either linux or win (maxOS is empty) - cd pyinstaller/electron - echo " --> building electron-app" - echo " --> Copying over resources" - cp -R ../../src/cryptoadvance/specter/static/fonts ../../src/cryptoadvance/specter/static/output.css ../../src/cryptoadvance/specter/static/typography.css . - npm i - npm run dist ${platform} - cd ../.. -} - -function make_release_zip { - echo " --> Making the release-zip" - -} diff --git a/utils/build-osx.sh b/utils/build-osx.sh deleted file mode 100755 index fcf35856c..000000000 --- a/utils/build-osx.sh +++ /dev/null @@ -1,404 +0,0 @@ -#!/usr/bin/env bash -set -e - -# We start in the directory where this script is located -cd "$( dirname "${BASH_SOURCE[0]}" )/." -source build-common.sh -cd .. -# Now in project-root - -# Overriding this function -function create_virtualenv_for_pyinstaller { - # This currently assumes to be run with: Python 3.10.11 - # Important: pyinstaller needs a Python binary with shared library files - # With pyenv, for example, you get this like so: env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.10.4 - # Use pyenv if set as environment variable - if [ $USE_PYENV_FOR_SPECTER_BUILD = true ]; then - echo "Trying to use pyenv ..." - if ! command -v pyenv >/dev/null 2>&1; then - echo "Error: pyenv is not available. Please make sure pyenv is installed and configured properly." >&2 - exit 1 - fi - ### This is usually in .zshrc, putting it in .bashrc didn't work ### - export PYENV_ROOT="$HOME/.pyenv" - command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" - eval "$(pyenv init -)" - ### this needs the pyenv-virtualenv plugin. If you don't have it: - ### git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv - eval "$(pyenv virtualenv-init -)" - ### ------------------------------------------------------------ ### - PYTHON_VERSION=3.10.11 - export PYENV_VERSION=$PYTHON_VERSION - echo "Setting PYENV_VERSION to 3.10.11, using pyenv-virtualenv to create the buildenv..." - echo " --> Deleting .buildenv" - pyenv uninstall -f .buildenv - rm -rf "$HOME/.pyenv/versions/$PYTHON_VERSION/envs/.buildenv" - pyenv virtualenv 3.10.11 .buildenv - pyenv activate .buildenv - else - echo "pyenv is not available. Using system Python version." - if [ -d .buildenv ]; then - echo " --> Deleting .buildenv" - rm -rf .buildenv - fi - virtualenv .buildenv - source .buildenv/bin/activate - fi - pip3 install -e ".[test]" -} - -# Overriding this function to deal with the x86 special case -function make_hash_if_necessary { - cd pyinstaller/electron - echo " --> calculate the hash of the binary for download" - specterd_plt_filename=../dist/${specterd_filename} - # early exit - if [[ "$make_hash" != 'True' ]]; then - node ./set-version $version - return 0 - fi - - # We need to set-versions for two specterd, one arm and one intel. - # arm64 one - node ./set-version $version ${specterd_plt_filename} - # Download and check the intel one - # this needs some env-vars to be set - rm -rf signing_dir/* - PYTHONPATH=../.. python3 -m utils.release_helper downloadgithub - ret_code=$? - if [ $ret_code -ne 0 ]; then - echo "Downloading and verifying x64 specterd failed with exit code $ret_code" - exit $ret_code - fi - if [[ ! -f ./signing_dir/specterd-${version}-osx_x64.zip ]]; then - echo "Downloading and verifying x64 specterd failed as the file does not seem to be there" - exit 1 - fi - rm -f /tmp/specterd - unzip ./signing_dir/specterd-${version}-osx_x64.zip -d /tmp - node ./set-version $version /tmp/specterd x64 - echo " Hashes in version-data.json $(cat ./version-data.json | jq -r '.sha256')" - echo " Hash of file $(sha256sum ${specterd_plt_filename} )" - echo " Hash of x64 file $(sha256sum /tmp/specterd )" - cd ../.. -} - -function macos_code_sign { - # prerequisites for this: - # in short: - # * make sure you have a proper app-specific password on https://appleid.apple.com/account/manage - # * collect some information via scrun altool --list-providers -u "" - # * create profile via xcrun notarytool store-credentials --apple-id "" --password "app-specific-pw" --team-id "seeFromAbove" - # * Call the profile: SpecterProfile - # For details see: - # * https://www.youtube.com/watch?v=2xJcMzoi0EI - # * https://blog.dgunia.de/2022/09/01/switching-from-altool-to-notarytool/ - # * https://scriptingosx.com/2021/07/notarize-a-command-line-tool-with-notarytool/ - # This creates a ZIP archive from the app package (using the ditto command). - # This ZIP archive is then used to upload the app to the Apple notarization service via xcrun notarytool (formerly xcrun altool) - # After the app has been uploaded to the Apple servers and notarized, the ZIP archive is not used again. - # The function uses the xcrun stapler command to attach the notarization result to the app, and then exits. - - # docs: - # https://help.apple.com/itc/apploader/#/apdATD1E53-D1E1A1303-D1E53A1126 - # https://keith.github.io/xcode-man-pages/altool.1.html - cd pyinstaller/electron - echo ' --> Attempting to code sign...' - specterimg_filename_fqfn=dist/${dist_mac_folder_name}/${specterimg_filename}.app - echo " executing: ditto -c -k --keepParent "${specterimg_filename_fqfn}" dist/${specterimg_filename}.zip" - - ditto -c -k --keepParent "${specterimg_filename_fqfn}" dist/${specterimg_filename}.zip - # upload - echo ' uploading for notarisation ... ' - - output_json=$(xcrun notarytool submit dist/${specterimg_filename}.zip --apple-id "kneunert@gmail.com" --keychain-profile "SpecterProfile" --output-format json --wait ) - - - # parsing the requestuuid which we'll need to track progress - requestuuid=$(echo $output_json | jq -r '.id') - status=$(echo $output_json | jq -r '.status') - echo "Request ID: $requestuuid" - if [ "$status" = "Invalid" ]; then - mkdir -p signing_logs - echo "issues with notarisation" - xcrun notarytool log ${requestuuid} --keychain-profile SpecterProfile | tee ./signing_logs/${app_name}_${timestamp}_${requestuuid}.log - exit 1 - fi - - # The stapler somehow "staples" the result of the notarisation in to your app - # see e.g. https://stackoverflow.com/questions/58817903/how-to-download-notarized-files-from-apple - echo " --> Staple the file dist/${dist_mac_folder_name}/${specterimg_filename}.app" - xcrun stapler staple "dist/${dist_mac_folder_name}/${specterimg_filename}.app" - echo ' Successfully Stapled the file' - cd ../.. -} - - -function sub_help { - cat << EOF - -### Quick overview -: <<'END_COMMENT' - What do you need to sign the Specter app with Apple's notary service? - - An Apple Developer account - - You must create a signing certificate in your developer account, which will be used to sign your app. - - This certificate must be stored in your keychain on your Mac. - - When you create a signing certificate in your developer account, you will be asked to specify a password for the certificate. - - You can store this password in the keychain, too, so that it - and thus the certificate - can be accessed automatically during the signing process. Like so: - xcrun altool --store-password-in-keychain-item AC_PASSWORD -u '' -p apassword - - As seen above, you need the the xcrun command line tool: This tool is also used to upload your app to the notary service and check the status of the notarization process. - -In summary, to sign a macOS app with Apple's notary service, you need an Apple Developer account, a signing certificate, a password for your keychain, the app package to be signed, and the xcrun command line tool. -END_COMMENT - -### Prerequisites -# brew install gmp # to prevent module 'embit.util' has no attribute 'ctypes_secp256k1' -# brew install jq -# npm install --global create-dmg - -### Trouble shooting -# If you have the common issue "errSecInternalComponent" while signing the code: -# https://medium.com/@ceyhunkeklik/how-to-fix-ios-application-code-signing-error-4818bd331327 - -# create-dmg issue? Note that there are 2 create-dmg scripts out there. We use: -# https://github.com/sindresorhus/create-dmg - -The different "tasks" are now somehow separated from one another. -We have: -* make-hash is rather a flag for the electron-build to incorporate the hash of the specterd -* specterd will trigger the pyinstaller build of the specterd -* electron will build the electron-app -* sign will upload the electron-app to the Apple notary service and get it back notarized -* upload will upload all the binary artifacts to the github-release-page. This includes the creation of the hash-files - and the gnupg signing - -### Trouble shooting (Legacy) -# Currently, only MacOS Catalina is supported to build the dmg-file -# Therefore we expect xcode 12.1 (according to google) -# After installation of xcode: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer -# otherwise you get xcrun: error: unable to find utility "altool", not a developer tool or in PATH -# catalina might have a a too old version of bash. You need at least 4.0 or so -# 3.2 is too low definitely -# brew install bash - -# Example-call: -./utils/build-osx.sh --debug --version v1.10.0-pre23 --appleid "Kim Neunert (FWV59JHV83)" --mail "kim@specter.solutions" make-hash specterd electron sign upload -EOF -} - -appleid="" - -while [[ $# -gt 0 ]] - do - arg="$1" - case $arg in - "" | "-h" | "--help") - sub_help - exit 0 - shift - ;; - --debug) - set -x - DEBUG=true - shift - ;; - --version) - version=$2 - shift - shift - ;; - --appleid) - appleid=$2 - shift - shift - ;; - --mail) - mail=$2 - shift - shift - ;; - specterd) - build_specterd=True - shift - ;; - make-hash) - make_hash=True - shift - ;; - electron) - build_electron=True - shift - ;; - sign) - build_sign=True - shift - ;; - package) - build_package=True - shift - ;; - upload) - upload=True - shift - ;; - help) - sub_help - shift - ;; - *) - shift - sub_${arg} $@ && ret=0 || ret=$? - if [ "$ret" = 127 ]; then - echo "Error: '$arg' is not a known subcommand." >&2 - echo " Run '$progname --help' for a list of known subcommands." >&2 - exit 1 - else - exit $ret_value - fi - ;; - esac - done - -echo " --> This build got triggered for version $version" - -echo $version > pyinstaller/version.txt - -configure - -if [[ "$build_specterd" = "True" ]]; then - create_virtualenv_for_pyinstaller - build_pypi_pckgs_and_install - install_build_requirements - cleanup - building_app -fi - -if [[ "$make_hash" = "True" ]]; then - # Making the hash only makes sense on a arm arch - if [[ "$ARCH" != "arm64" ]]; then - echo "ERROR: make-hash target should be only called on an arm64 machine on a mac" - exit 1 - fi - make_hash_if_necessary -fi - -if [[ "$build_electron" = "True" ]]; then - # Making the hash only makes sense on a arm arch - if [[ "$ARCH" != "arm64" ]]; then - echo "ERROR: electron target should be only called on an arm64 machine on a mac" - exit 1 - fi - prepare_npm - npm i - if [[ "${appleid}" == '' ]] - then - echo "`jq '.build.mac.identity=null' package.json`" > package.json - else - echo "`jq '.build.mac.identity="'"${appleid}"'"' package.json`" > package.json - fi - building_electron_app -fi - -if [[ "$build_sign" = "True" ]]; then - # if [ "$(uname -m)" = "arm64" ]; then - # dist_mac_folder_name=${dist_mac_folder_name}-arm64 - # fi - if [[ "$appleid" != '' ]]; then - macos_code_sign - else - echo "WARNING: Forgot to add the appleid ?!" - exit 1 - fi -fi - -if [[ "$build_package" = "True" ]]; then - echo " --> Preparing the release" - mkdir -p release - rm -rf release/* - - # The specterd-zipfile from specterd - if [[ -f pyinstaller/dist/${specterd_filename} ]]; then - echo " --> Making the release-zip for specterd" - pushd pyinstaller/dist # to not preserve folder structure - zip ../../release/${specterd_filename}-${version}-osx_${ARCH}.zip ${specterd_filename} - popd - fi - - # The dmg image file from App - if [[ -d pyinstaller/electron/dist/${dist_mac_folder_name}/${specterimg_filename}.app ]]; then - rm -f pyinstaller/electron/dist/*.dmg - echo " --> Creating dmg" - create-dmg pyinstaller/electron/dist/${dist_mac_folder_name}/${specterimg_filename}.app --identity="Developer ID Application: ${appleid}" pyinstaller/electron/dist - # create-dmg doesn't create the prepending "v" to the version - node_comp_version=$(python3 -c "print('$version'[1:])") - mv "pyinstaller/electron/dist/${specterimg_filename} ${node_comp_version}.dmg" dist/${specterimg_filename}-${version}.dmg - echo " --> Copying img file dist/${specterimg_filename}-${version}.dmg" - cp dist/${specterimg_filename}-${version}.dmg release/${specterimg_filename}-${version}.dmg - else - echo "WARNING: Skipping packaging for electron App" - echo "No pyinstaller/electron/dist/${dist_mac_folder_name}/${specterimg_filename}.app has been found." - fi - - file=./release/${specterd_filename}-${version}-osx_${ARCH}.zip - if [[ -f $file ]]; then - echo -n " FYI : " - sha256sum $file - fi - file=./release/${specterimg_filename}-${version}.dmg - if [[ -f $file ]]; then - echo -n " FIY : " - sha256sum $file - fi -fi - -if [ "$app_name" != "specter" ]; then - # "early" exit - if [[ "$upload" = "True" ]]; then - echo "no upload for app_name $app_name" - exit 1 - fi - exit -fi - -if [[ "$upload" = "True" ]]; then - echo " --> gpg-signing the hashes and uploading" - . ../../specter_gh_upload.sh # A simple file looks like: export GH_BIN_UPLOAD_PW=...(GH token) - export CI_COMMIT_TAG=$version - if [[ -z "$CI_PROJECT_ROOT_NAMESPACE" ]]; then - echo "WARNING: Why is CI_PROJECT_ROOT_NAMESPACE not set? Setting to cryptoadvance" - export CI_PROJECT_ROOT_NAMESPACE=cryptoadvance - fi - echo " This build: version: $version gh-project: $CI_PROJECT_ROOT_NAMESPACE" - - specterd_zip_fqfn=./release/specterd-${version}-osx_${ARCH}.zip - echo " Checking for file $specterd_zip_fqfn" - if [[ -f $specterd_zip_fqfn ]]; then - python3 ./utils/github.py upload $specterd_zip_fqfn - else - echo " WARNING: not uploading as it does not exist: $specterd_zip_fqfn" - fi - - specter_dmg_fqfn=./release/Specter-${version}.dmg - echo " Checking for file $specter_dmg_fqfn" - if [[ -f $specter_dmg_fqfn ]]; then - python3 ./utils/github.py upload $specter_dmg_fqfn - else - echo " WARNING: not uploading as it does not exist: $specter_dmg_fqfn" - fi - - cd release - # Maybe we have some SHA256SUMS files from other runs lying around. We don't want to shasum them - rm -f SHA256SUMS* - sha256sum * > SHA256SUMS-macos_${ARCH} - python3 ../utils/github.py upload SHA256SUMS-macos_${ARCH} - # The GPG comman below has a timeout. If that's reached, the script will interrupt. So let's make some noise - say "Hello?! Your overlord is speaking! You're now allowed to sign the binary!" - echo "Just in case you missed the timeout, those three last commands are missing:" - echo "cd release" - echo "gpg --detach-sign --armor SHA256SUMS-macos_${ARCH}" - echo "python3 ../utils/github.py upload SHA256SUMS-macos_${ARCH}.asc" - - gpg --detach-sign --armor SHA256SUMS-macos_${ARCH} - python3 ../utils/github.py upload SHA256SUMS-macos_${ARCH}.asc -fi - diff --git a/utils/build-unix.sh b/utils/build-unix.sh deleted file mode 100755 index 1d3722387..000000000 --- a/utils/build-unix.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env bash -set -e - -# We start in the directory where this script is located -cd "$( dirname "${BASH_SOURCE[0]}" )/." -source build-common.sh -cd .. -# Now in project-root - -function sub_help { - cat << EOF - -Building various components of specter-desktop -Usage: $build-unix [options] - -Options: - --debug - will set -x - --version v1.2.3-pre4 - If you don't set the version, CI_COMMIT_TAG will determine the version - -Subcommands: - make-hash - will make the hash for the electron-app. This hash will get checked after download - - specterd - will build the pyinstaller's specterd binary (linux only) - - electron-linux - will build the linux binary of the electron-app - - electron-win - will build the win binary of the electron-app. The specterd.exe will get downloaded from - github.com/\$CI_PROJECT_ROOT_NAMESPACE/specter-desktop... - This need a wine-environment. See the docker-image electron-builder - -Example-call: -./build-unix.sh --debug --version v1.7.0-pre1 make-hash specterd electron-linux -EOF -} - -function create_release_zip_linux { - echo " --> Making the release-zip" - # consists of specterd and Specter-version.AppImage - mkdir -p release - # first the specterd - cd pyinstaller/dist - cp -r ../../udev ./udev - echo "Don't forget to set up udev rules! Check out udev folder for instructions." > README.md - zip -r ../../release/${specterd_filename}-"$version"-"$(uname -m)"-linux-gnu.zip ${specterd_filename} udev README.md - echo $app_name - # now the AppImage - cd ../electron/dist - cp -r ../../../udev ./udev - echo "Don't forget to set up udev rules! Check out udev folder for instructions." > README.md - tar -czvf ../../../release/${pkg_filename}-"$version"-"$(uname -m)"-linux-gnu.tar.gz ${app_name^}-* udev README.md - cd ../../.. -} - -function prepare_building_electron_app_win { - cd pyinstaller/dist - echo " --> Downloading the windows-version of specterd for version $version" - wget --progress=dot -e dotbytes=10M https://github.com/${CI_PROJECT_ROOT_NAMESPACE}/specter-desktop/releases/download/${version}/specterd-${version}-win64.zip -O ./specterd.zip - unzip specterd.zip - cd ../electron - rm -rf dist/ - cd ../.. -} - -version=$CI_COMMIT_TAG - -echo " --> Assume gitlab-project: ${CI_PROJECT_ROOT_NAMESPACE}" - -[ -z "${CI_PROJECT_ROOT_NAMESPACE:+x}" ] && \ - echo " Redefining CI_PROJECT_ROOT_NAMESPACE=cryptoadvance " && \ - export CI_PROJECT_ROOT_NAMESPACE=cryptoadvance - -while [[ $# -gt 0 ]] - do - arg="$1" - case $arg in - "" | "-h" | "--help") - sub_help - exit 0 - shift - ;; - --debug) - set -x - DEBUG=true - shift - ;; - --version) - version=$2 - shift - shift - if [ -n "$CI_COMMIT_TAG" ]; then - if [ "$version" != "$CI_COMMIT_TAG" ]; then - echo "ERROR: Cannot set version to something different than CI_COMMIT_TAG env-var if that var is set. " - exit 1 - fi - fi - ;; - specterd) - build_specterd=True - shift - ;; - make-hash) - make_hash=True - shift - ;; - electron-linux) - build_electron_linux=True - shift - ;; - electron-win) - build_electron_win=True - shift - ;; - help) - sub_help - shift - ;; - *) - shift - sub_${arg} $@ && ret=0 || ret=$? - if [ "$ret" = 127 ]; then - echo "Error: '$arg' is not a known subcommand." >&2 - echo " Run '$progname --help' for a list of known subcommands." >&2 - exit 1 - else - exit $ret_value - fi - ;; - esac - done - -if [[ "$version" = "" ]]; then - echo "ERROR: version could not be determined (--version or CI_COMMIT_TAG)" - exit 1 -fi -echo " --> This build got triggered for version $version" -# This file gets further packaged up with the pyinstaller and will help specter to figure out which version it's running on -echo $version > pyinstaller/version.txt - -configure - -if [[ "$build_specterd" = "True" ]]; then - create_virtualenv_for_pyinstaller - build_pypi_pckgs_and_install - install_build_requirements - cleanup - building_app -fi - -if [[ "$build_electron_linux" = "True" ]]; then - prepare_npm - make_hash_if_necessary - building_electron_app linux - create_release_zip_linux -fi - -if [ "$build_electron_win" = "True" ]; then - prepare_building_electron_app_win - make_hash_if_necessary win - building_electron_app win - cp pyinstaller/electron/dist/Specter\ Setup\ *.exe release/Specter-Setup-$version.exe -fi - - diff --git a/utils/create-gitlab-cli-cfg.sh b/utils/create-gitlab-cli-cfg.sh deleted file mode 100755 index 399b239d1..000000000 --- a/utils/create-gitlab-cli-cfg.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -cat > ~/.python-gitlab.cfg << EOF -[global] -default = specterdesktop -ssl_verify = true -timeout = 5 - -[specterdesktop] -url = https://gitlab.com -#private_token = ${CI_JOB_TOKEN} -job_token =${CI_JOB_TOKEN} -api_version = 4 - - -EOF diff --git a/utils/github.py b/utils/github.py deleted file mode 100644 index 181264acc..000000000 --- a/utils/github.py +++ /dev/null @@ -1,532 +0,0 @@ -""" We assume that this script is running on a gitlab-runner and therefore has some variables set. - Specifically: - CI_PROJECT_ROOT_NAMESPACE=k9ert - CI_COMMIT_TAG=v0.9.6-pre2 - - -""" - -import logging -import os -import sys -from pathlib import Path -import requests - -import argparse -import collections -import getpass -import json -import logging -import os -import re -import subprocess -import sys -from typing import ( - cast, - Any, - Callable, - List, - Optional, -) # noqa: F401 # pylint: disable=unused-import - -try: - # Allow an import of this module without `requests` and `yacl` being installed for meta data queries - # (e.g. version information) - import requests - from yacl import setup_colored_stderr_logging -except ImportError: - pass - - -logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) - - -github_api_root_url = f"https://api.github.com" - -github_username = "gitlab_upload_release_binaries" - - -def main(): - if sys.argv[1] != "upload": - # Maybe something more fancy in the future: - logger.error("Command {sys.argv[1]} not found! Only 'upload' right now") - exit(2) - - artifact = sys.argv[2] - if not Path(artifact).exists(): - logger.error(f"local artifact {artifact} does not exist.") - exit(2) - if not "CI_PROJECT_ROOT_NAMESPACE" in os.environ: - logger.error("CI_PROJECT_ROOT_NAMESPACE not found") - exit(2) - else: - project = f"{os.environ['CI_PROJECT_ROOT_NAMESPACE']}/specter-desktop" - if not "CI_COMMIT_TAG" in os.environ: - logger.error("CI_COMMIT_TAG not found") - exit(2) - else: - tag = os.environ["CI_COMMIT_TAG"] - if len(sys.argv) != 3: - logger.error("argument artifact not found.") - if artifact_exists(project, tag, Path(artifact).name): - logger.info("Github artifact existing. Skipping upload.") - exit(0) - else: - logger.info(f"Github artifact {artifact} does not exist. Let's upload!") - - if not "GH_BIN_UPLOAD_PW" in os.environ: - logger.error("GH_BIN_UPLOAD_PW not found.") - else: - password = os.environ["GH_BIN_UPLOAD_PW"] - - publish_release_from_tag( - project, - tag, - [artifact], - github_username, - password, - ) - - -def artifact_exists(project, tag, artifact): - artifact_url = f"https://github.com/{project}/releases/download/{tag}/{artifact}" - logger.debug(f"checking for artifact url {artifact_url}") - r = requests.head(artifact_url) - if r.status_code != 302: - return False - else: - return True - - -__copyright__ = "Copyright © 2019 Forschungszentrum Jülich GmbH. All rights reserved." -__license__ = "MIT" -__version_info__ = (0, 1, 5) -__version__ = ".".join(map(str, __version_info__)) - - -DEFAULT_GITHUB_ROOT = "github.com" - - -class MissingDependencyError(Exception): - pass - - -class FileCommandError(Exception): - pass - - -class InvalidFileCommandOutputError(Exception): - pass - - -class NoTagsAvailableError(Exception): - pass - - -class HTTPError(Exception): - pass - - -class JSONError(Exception): - pass - - -class InvalidUploadUrlError(Exception): - pass - - -class InvalidServerNameError(Exception): - pass - - -class MissingProjectError(Exception): - pass - - -class MissingTagError(Exception): - pass - - -class CredentialsReadError(Exception): - pass - - -class AttributeDict(dict): # type: ignore - def __getattr__(self, attr: str) -> Any: - return self[attr] - - def __setattr__(self, attr: str, value: Any) -> None: - self[attr] = value - - -Release = collections.namedtuple("Release", ["id", "asset_upload_url"]) -Asset = collections.namedtuple("Asset", ["id", "name"]) - - -def setup_stderr_logging() -> None: - logging.basicConfig(level=logging.INFO) - setup_colored_stderr_logging(format_string="[%(levelname)s] %(message)s") - - -def get_mimetype(filepath: str) -> str: - if not os.path.isfile(filepath): - raise FileNotFoundError( - 'The file "{}" does not exist or is not a regular file.'.format(filepath) - ) - if not os.access(filepath, os.R_OK): - raise PermissionError('The file "{}" is not readable.'.format(filepath)) - - if os.name == "nt": - try: - import mimetypes - - mime_type = mimetypes.types_map[f".{filepath.split('.')[-1]}"] - except ModuleNotFoundError: - raise Exception( - "mimetypes module not found. Do something like pip install mimetypes" - ) - else: - try: - file_command_output = subprocess.check_output( - ["file", "--mime", filepath], universal_newlines=True - ) # type: str - mime_type = file_command_output.split()[1][:-1] - except subprocess.CalledProcessError as e: - raise FileCommandError( - "The `file` command returned with exit code {:d}".format(e.returncode) - ) - except IndexError: - raise InvalidFileCommandOutputError( - 'The file command output "{}" could not be parsed.'.format( - file_command_output - ) - ) - return mime_type - - -def strip_asset_upload_url(asset_upload_url_with_get_params: str) -> str: - match_obj = re.match(r"([^{]+)(?:\{.*\})?", asset_upload_url_with_get_params) - if not match_obj: - raise InvalidUploadUrlError( - 'The upload url "{}" is not in the expected format.'.format( - asset_upload_url_with_get_params - ) - ) - asset_upload_url = match_obj.group(1) # type: str - return asset_upload_url - - -class GithubConnection: - def __init__(self, project): - self.github_api_root_url = github_api_root_url - self.project = project - self.username = github_username - self.password = os.environ["GH_BIN_UPLOAD_PW"] - - def fetch_existing_release(self, tag) -> Optional[Release]: - try: - release_query_url = "{}/repos/{}/releases/tags/{}".format( - self.github_api_root_url, self.project, tag - ) - response = requests.get( - release_query_url, - auth=(self.username, self.password), - headers={"Accept": "application/json"}, - ) - response.raise_for_status() - logger.info( - 'Fetched the existing release "%s" in the GitHub repository "%s"', - tag, - self.project, - ) - response_json = response.json() - asset_upload_url_with_get_params = response_json["upload_url"] - asset_upload_url = strip_asset_upload_url(asset_upload_url_with_get_params) - release = Release(response_json["id"], asset_upload_url) - return release - except requests.HTTPError as e: - if e.response.status_code == 404: - return None - raise HTTPError( - 'Could not fetch the release "{}" due to a severe HTTP error.'.format( - tag - ) - ) - - def list_assets(self, release: Release) -> List[Asset]: - try: - asset_list_url = "{}/repos/{}/releases/{}/assets".format( - self.github_api_root_url, self.project, release.id - ) - response = requests.get(asset_list_url, auth=(self.username, self.password)) - response.raise_for_status() - assets = [ - Asset(asset_dict["id"], asset_dict["name"]) - for asset_dict in response.json() - ] - return assets - except requests.HTTPError: - raise HTTPError( - 'Could not get a list of assets for project "{}".'.format(self.project) - ) - except json.decoder.JSONDecodeError: - raise JSONError("Got an invalid json string.") - except KeyError as e: - raise JSONError( - 'Got an unexpected json object missing the key "{}".'.format(e.args[0]) - ) - - def download_artifact(self, tag, artifact, target_dir="."): - artifact_url = ( - f"https://github.com/{self.project}/releases/download/{tag}/{artifact}" - ) - response = requests.get(artifact_url) - - # If the HTTP GET request can be served - if response.status_code == 200: - - # Write the file contents in the response to a file specified by local_file_path - with open(os.path.join(target_dir, artifact), "wb") as local_file: - for chunk in response.iter_content(chunk_size=128): - local_file.write(chunk) - else: - raise Exception( - f"Status-code {response.status_code} for url {artifact_url}" - ) - - -def publish_release_from_tag( - project: str, - tag: Optional[str], - asset_filepaths: List[str], - username: str, - password: str, - dry_run: bool = False, -) -> None: - if "requests" not in sys.modules: - raise MissingDependencyError( - 'The "requests" package is missing. Please install and run again.' - ) - - def fetch_latest_tag() -> str: - try: - tags_url = "{}/repos/{}/tags".format(github_api_root_url, project) - response = requests.get( - tags_url, - auth=(username, password), - headers={"Accept": "application/json"}, - ) - response.raise_for_status() - tags = response.json() - if not tags: - raise NoTagsAvailableError( - 'The given repository "{}" has no tags yet.'.format(project) - ) - latest_tag = tags[0]["name"] # type: str - logger.info( - 'Fetched the latest tag "%s" from the GitHub repository "%s"', - latest_tag, - project, - ) - return latest_tag - except requests.HTTPError: - raise HTTPError( - 'Could not query the latest tag of the repository "{}" due to a http error.'.format( - project - ) - ) - except (json.decoder.JSONDecodeError, IndexError): - raise JSONError("Got an invalid json string.") - except KeyError as e: - raise JSONError( - 'Got an unexpected json object missing the key "{}".'.format(e.args[0]) - ) - - def publish_release(tag: str) -> Release: - def fetch_existing_release() -> Optional[Release]: - try: - release_query_url = "{}/repos/{}/releases/tags/{}".format( - github_api_root_url, project, tag - ) - response = requests.get( - release_query_url, - auth=(username, password), - headers={"Accept": "application/json"}, - ) - response.raise_for_status() - logger.info( - 'Fetched the existing release "%s" in the GitHub repository "%s"', - tag, - project, - ) - response_json = response.json() - asset_upload_url_with_get_params = response_json["upload_url"] - asset_upload_url = strip_asset_upload_url( - asset_upload_url_with_get_params - ) - release = Release(response_json["id"], asset_upload_url) - return release - except requests.HTTPError as e: - if e.response.status_code == 404: - return None - raise HTTPError( - 'Could not fetch the release "{}" due to a severe HTTP error.'.format( - tag - ) - ) - - def create_release() -> Release: - try: - release_creation_url = "{}/repos/{}/releases".format( - github_api_root_url, project - ) - response = requests.post( - release_creation_url, - auth=(username, password), - json={ - "tag_name": tag, - "name": tag, - "body": "", - "draft": False, - "prerelease": False, - }, - ) - response.raise_for_status() - logger.info( - 'Created the release "%s" in the GitHub repository "%s"', - tag, - project, - ) - response_json = response.json() - asset_upload_url_with_get_params = response_json["upload_url"] - asset_upload_url = strip_asset_upload_url( - asset_upload_url_with_get_params - ) - release = Release(response_json["id"], asset_upload_url) - return release - except requests.HTTPError: - raise HTTPError('Could not create the release "{}".'.format(tag)) - except json.decoder.JSONDecodeError: - raise JSONError("Got an invalid json string.") - except KeyError as e: - raise JSONError( - 'Got an unexpected json object missing the key "{}".'.format( - e.args[0] - ) - ) - - release = fetch_existing_release() - if release is None: - release = create_release() - return release - - def list_assets(release: Release) -> List[Asset]: - try: - asset_list_url = "{}/repos/{}/releases/{}/assets".format( - github_api_root_url, project, release.id - ) - response = requests.get(asset_list_url, auth=(username, password)) - response.raise_for_status() - assets = [ - Asset(asset_dict["id"], asset_dict["name"]) - for asset_dict in response.json() - ] - return assets - except requests.HTTPError: - raise HTTPError( - 'Could not get a list of assets for project "{}".'.format(project) - ) - except json.decoder.JSONDecodeError: - raise JSONError("Got an invalid json string.") - except KeyError as e: - raise JSONError( - 'Got an unexpected json object missing the key "{}".'.format(e.args[0]) - ) - - def delete_asset(asset: Asset) -> None: - try: - asset_delete_url = "{}/repos/{}/releases/assets/{}".format( - github_api_root_url, project, asset.id - ) - response = requests.delete(asset_delete_url, auth=(username, password)) - response.raise_for_status() - logger.info( - 'Deleted the asset "%s" attached to release "%s" of the GitHub repository "%s"', - asset.name, - tag, - project, - ) - except requests.HTTPError: - raise HTTPError( - 'Could not get a list of assets for project "{}".'.format(project) - ) - except json.decoder.JSONDecodeError: - raise JSONError("Got an invalid json string.") - except KeyError as e: - raise JSONError( - 'Got an unexpected json object missing the key "{}".'.format(e.args[0]) - ) - - def upload_asset(release: Release, asset_filepath: str) -> None: - asset_filename = os.path.basename(asset_filepath) - try: - asset_mimetype = get_mimetype(asset_filepath) - with open(asset_filepath, "rb") as f: - response = requests.post( - "{}?name={}".format(release.asset_upload_url, asset_filename), - auth=(username, password), - data=f, - headers={"Content-Type": asset_mimetype}, - ) - response.raise_for_status() - logger.info( - 'Uploaded the asset "%s" attached to release "%s" of the GitHub repository "%s"', - asset_filename, - tag, - project, - ) - except requests.HTTPError: - raise HTTPError('Could not upload the asset "{}".'.format(asset_filename)) - - if tag is None: - logger.info( - 'No tag given, fetching the latest tag from the GitHub repository "%s"', - project, - ) - tag = fetch_latest_tag() - if dry_run: - logger.info( - 'Would create the release "%s" in the GitHub repository "%s"', tag, project - ) - assets = [] # type: List[Asset] - else: - release = publish_release(tag) - assets = list_assets(release) - for asset_filepath in asset_filepaths: - asset_matches = [ - asset for asset in assets if asset.name == os.path.basename(asset_filepath) - ] - if dry_run: - for asset_match in asset_matches: - logger.info( - 'Would delete the asset "%s" attached to release "%s" of the GitHub repository "%s"', - asset_match.name, - tag, - project, - ) - logger.info( - 'Would upload the asset "%s" attached to release "%s" of the GitHub repository "%s"', - os.path.basename(asset_filepath), - tag, - project, - ) - else: - for asset_match in asset_matches: - delete_asset(asset_match) - upload_asset(release, asset_filepath) - - -if __name__ == "__main__": - main() diff --git a/utils/prepare_for_git_write.sh b/utils/prepare_for_git_write.sh deleted file mode 100755 index f4c51184b..000000000 --- a/utils/prepare_for_git_write.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -# This script prepares the shell so that it can do git-pushes -# It's using the first param as the secret key and the env-var -# KNOWN_HOSTS. - - -## Install ssh-agent if not already installed, it is required by Docker. -## (change apt-get to yum if you use an RPM-based image) -## -which ssh-agent || ( apk update && apk add --no-cache bash git openssh ) -docker info - -## -## Run ssh-agent (inside the build environment) -## -eval $(ssh-agent -s) - -## -## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -## We're using tr to fix line endings which makes ed25519 keys work -## without extra base64 encoding. -## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -## -echo "$1" | tr -d '\r' | ssh-add - > /dev/null - -## -## Create the SSH directory and give it the right permissions -## -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Check if Git user email is not set -if [ -z "$(git config --global --get user.email)" ]; then - git config --global user.email "specter@secretvalues" -fi - -# Check if Git user name is not set -if [ -z "$(git config --global --get user.name)" ]; then - git config --global user.name "specter" -fi - -# Check if KNOWN_HOSTS is set and not empty -if [ -n "$KNOWN_HOSTS" ]; then - # Add KNOWN_HOSTS to known_hosts file - echo "$KNOWN_HOSTS" > ~/.ssh/known_hosts - # Ensure the file permissions are correct - chmod 644 ~/.ssh/known_hosts -fi diff --git a/utils/release.sh b/utils/release.sh deleted file mode 100755 index 65f97173c..000000000 --- a/utils/release.sh +++ /dev/null @@ -1,232 +0,0 @@ -#!/bin/bash - -# Replacing MacOS utilities with GNU core utilities to make script more robust -# See: https://apple.stackexchange.com/questions/69223/how-to-replace-mac-os-x-utilities-with-gnu-core-utilities -if [[ "$OSTYPE" == "darwin"* ]]; then - brew ls --versions coreutils > /dev/null; - exitCode=$? - if [[ $exitCode == 0 ]]; then - echo "Coreutils are installed via Homebrew, prepending PATH to use GNU core utilities over MacOS utilities." - export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" - else - echo "GNU core utilities not installed. Run brew install coreutils" - fi -fi - -ask_yn() { - while true; do - read -p "Is this correct [y/n]" yn - case $yn in - [Yy]* ) return 0 ;; - [Nn]* ) return 1;; - * ) echo "Please answer yes or no.";; - esac - done -} - -while [[ $# -gt 0 ]] -do -key="$1" -command="main" -case $key in - wait_on_master) - command=wait_on_master - shift - ;; - --help) - help - shift - exit 0 - ;; - --release-notes) - RELEASE_NOTES="yes" - shift # past value - ;; - --dev) - DEV="yes" - shift - ;; - --new-version) - new_version=$2 - shift - shift - ;; - --tag) - TAG="yes" - shift - ;; - --debug) - set -x - shift # past argument - ;; - *) # unknown option - POSITIONAL="$1" # save it in an array for later - shift # past argument - ;; -esac -done - -function help() { - # echo HERE_DOC - # ... - echo "not yet implemented" -} - -function main() { - # Sed is used as there can be whitespaces - if ! [ "$(git remote -v | grep upstream | grep 'git@github.com:cryptoadvance/specter-desktop.git' | wc -l | sed -e 's/[[:space:]]*//')" = "2" ]; then - echo " --> You don't have the correct upstream-remote. You need this to release. Please do this:" - echo "git remote add upstream git@github.com:cryptoadvance/specter-desktop.git " - exit 2 - fi - - if ! [ "$(git remote -v | grep origin | grep 'git@github.com:' | wc -l | sed -e 's/[[:space:]]*//')" = "2" ]; then - echo " --> You don't have a reasonable origin-remote. You need this to release (especially with --dev). Please add one!" - exit 2 - fi - - current_branch=$(git rev-parse --abbrev-ref HEAD) - if [ "$current_branch" != "master" ]; then - echo "You're currently not on the master-branch, exiting" - exit 2 - fi - - echo " --> Fetching all tags ..." - git fetch upstream --tags - echo " --> git pull upstream master" - git pull upstream master - - if [[ -z "$new_version" ]]; then - echo "What should be the new version? Type in please (e.g. v0.9.3 ):" - read new_version - fi - - if ! [[ $new_version =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+))?$ ]]; then - echo "version $new_version Does not match the pattern!" - exit 1; - fi - - if [[ -n "$RELEASE_NOTES" ]]; then - - - if [ -z $GH_TOKEN ]; then - echo "Your github-token is missing. Please export them like:" - echo "export GH_TOKEN=" - exit 2 - fi - - latest_version=$(git tag -l "v*" | grep -v 'pre' | grep -v 'dev' | sort -V | tail -1) - - echo " --> The latest version is $latest_version. " - if ! ask_yn ; then - echo "Ok, then you type in the latest_version:" - read latest_version - if ! [[ $new_version =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)(-([0-9A-Za-z-]+))?$ ]]; then - echo "Does not match the pattern!" - exit 1; - fi - fi - - echo "Here are the release-notes:" - echo "--------------------------------------------------" - echo "# Release Notes" > docs/new_release_notes.md - echo "" >> docs/new_release_notes.md - echo "## ${new_version} $(date +'%B %d, %Y')" >> docs/new_release_notes.md - docker run registry.gitlab.com/cryptoadvance/specter-desktop/github-changelog:latest --github-token $GH_TOKEN --branch master cryptoadvance specter-desktop $latest_version | sort >> docs/new_release_notes.md - echo "" >> docs/new_release_notes.md - - - cat docs/new_release_notes.md - echo "--------------------------------------------------" - - cp docs/release-notes.md docs/release-notes.md.orig - sed -i -e '1,2d' docs/release-notes.md.orig # Assuming the release-Notes start with # Release Notes\n - cat docs/new_release_notes.md docs/release-notes.md.orig > docs/release-notes.md - rm docs/release-notes.md.orig docs/new_release_notes.md - - echo "Please check your new File and modify as you find approriate!" - echo "We're waiting here ..." - echo " --> Should we create a PR-branch now? " - - if ! ask_yn ; then - echo "break" - #git checkout docs/release-notes.md - exit 2 - fi - - echo " --> Creating branch ${new_version}_release_notes " - git checkout -b ${new_version}_release_notes - git add docs/release-notes.md - git commit -m "adding release_notes for $new_version" - git push --set-upstream origin ${new_version}_release_notes - - echo "Now go ahead and make your PR:" - echo "https://github.com/cryptoadvance/specter-desktop/pulls" - exit 0 - fi - - - - if [[ -n "$TAG" ]]; then - - echo " --> Should i now create the tag and push the version $new_version ?" - if [ -z $DEV ]; then - echo " --> This will push to your origin-remote!" - else - echo " --> THIS WILL PUSH TO THE UPSTREAM-REMOTE!" - if ! ask_yn ; then - echo "break" - exit 2 - fi - fi - - git tag $new_version - if [ -z $DEV ]; then - git push origin $new_version - else - git push upstream $new_version - fi - fi - -} - -function wait_on_master() { - echo "# check status of masterbranch ..." - i=0 - # First, wait on the check-runs to be completed: - for i in {1..5} ; do - current_state=$(curl -s https://api.github.com/repos/cryptoadvance/specter-desktop/commits/master/check-runs) - different_states=$(echo $current_state | jq -r '.check_runs[] | select(.status == "completed") | .status' | uniq | wc -l) - status=$(echo $current_state | jq -r '.check_runs[] | select(.status == "completed") | .status' | uniq) - - if [[ "$different_states" == 1 ]] && [[ "$status" == "completed" ]] ; then - break - fi - echo "# Builds still running. Will check again in 5 seconds." - sleep 5 - done - - # Now check all the runs and make sure there are all green: - current_state=$(curl -s https://api.github.com/repos/cryptoadvance/specter-desktop/commits/master/check-runs) - different_conclusions=$(echo $current_state | jq -r '.check_runs[] | select(.conclusion == "success") | .conclusion' | uniq | wc -l) - conclusion=$(echo $current_state | jq -r '.check_runs[] | select(.conclusion == "success") | .conclusion' | uniq) - - # We only have one conclusion over all runs: - if [ $different_conclusions -gt 1 ] ; then - echo "# different_conclusions: $different_conclusions" - echo "# Seems that master is not green. Exiting 1" - exit 1 - fi - # ... and that conclusion is "success" - if [[ "$conclusion" == "success" ]]; then - echo "# Great, conclusion is success! Exiting 0" - exit 0 - fi - - echo "# ERROR: I'm confused. This should not happened, exiting 99" - echo "# conclusion = $conclusion" - #echo $current_state - exit 99 -} - -$command \ No newline at end of file diff --git a/utils/release_helper.py b/utils/release_helper.py deleted file mode 100644 index 3242b89d3..000000000 --- a/utils/release_helper.py +++ /dev/null @@ -1,571 +0,0 @@ -import hashlib -import logging -import os -import shutil -import subprocess -import sys -import zipfile -from pathlib import Path -from glob import glob - - -logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) - - -import os -import subprocess -import hashlib -import logging -import gitlab - -logger = logging.getLogger(__name__) - - -class Sha256sumFile: - """ - A class that provides functionality to manage SHA256 checksums for files within a - specified directory. - - Attributes: - name (str): The name of the file that contains the SHA256 checksums for other files. - target_dir (str): The path to the directory where the checksum file and other related - files are stored or will be downloaded to. Defaults to `./signing_dir`. - hashed_files (dict): A dictionary storing file names as keys and their corresponding - SHA256 hashes as values. - - The `hashed_files` dictionary data structure is used to map each file name (a string) - to its SHA256 hash (also a string). The SHA256 hash is computed for each corresponding - file present in the `target_dir`, allowing for verification of file integrity by comparing - computed hashes against stored hashes. - """ - - def __init__(self, name, target_dir="./signing_dir"): - """ - Initializes a Sha256sumFile instance with the provided checksum file name and target directory. - - Parameters: - name (str): The name of the checksum file. - target_dir (str): The directory path where the checksum file and other files are present or downloaded. - """ - self.name = name - self.target_dir = target_dir - self.hashed_files = {} - - def is_in_target_dir(self): - """ - Checks if the checksum file is present in the target directory. - - Returns: - bool: True if the checksum file is present; False otherwise. - """ - return os.path.isfile(os.path.join(self.target_dir, self.name)) - - def download_from_tag(self, tag, gc): - """ - Downloads the checksum file and its signature from a specific tag using a given client (gc). - - Parameters: - tag (str): The tag associated with the artifacts to be downloaded. - gc (object): The client object which provides the `download_artifact` method for downloading. - """ - gc.download_artifact(tag, self.name, target_dir=self.target_dir) - gc.download_artifact(tag, self.name + ".asc", target_dir=self.target_dir) - self.read() - - def download_hashed_files(self, tag, gc): - """ - Downloads all files listed in the hashed_files dictionary from a specific tag using a given client (gc). - - Parameters: - tag (str): The tag associated with the artifacts to be downloaded. - gc (object): The client object which provides the `download_artifact` method for downloading. - """ - for file in self.hashed_files.keys(): - logger.info(f"Downloading {file} from {tag}") - gc.download_artifact(tag, file, target_dir=self.target_dir) - - def read(self): - """ - Reads the checksum file and populates the hashed_files dictionary with file names and their corresponding hashes. - """ - with open(os.path.join(self.target_dir, self.name), "r") as file: - line = file.readline() - while line: - line = line.split(maxsplit=2) - self.hashed_files[line[1]] = line[0] - line = file.readline() - - def print(self): - """ - Prints each file's hash and name from the hashed_files dictionary to the standard output. - """ - for hashed_file, hash in self.hashed_files.items(): - print(f"{hash} {hashed_file}") - - def write(self): - """ - Writes the hashed_files dictionary entries to the checksum file in the target directory. - """ - with open(os.path.join(self.target_dir, self.name), "w") as file: - for hashed_file, hash in self.hashed_files.items(): - file.write(f"{hash} {hashed_file}\n") - - def add_file(self, file): - """ - Computes the SHA256 hash for a given file and adds the file and its hash to the hashed_files dictionary. - - Parameters: - file (str): The filename for which the SHA256 hash should be computed and added. - """ - self.hashed_files[file] = Sha256sumFile.sha256_checksum(file, self.target_dir) - - def check_hashes(self): - """ - Verifies the integrity of the files by checking their SHA256 hashes against the entries in the checksum file. - - Raises: - Exception: If the verification of any file fails, an exception is raised with - the subprocess output that caused the failure. - """ - try: - subprocess.run( - ["sha256sum", "-c", self.name], cwd=self.target_dir, check=True - ) - except subprocess.CalledProcessError as e: - raise Exception( - f"Could not validate hashes for file {self.name}: {e.output}" - ) - - def check_sig(self): - """ - Verifies the signature of the checksum file using gpg. - - Raises: - Exception: If the verification of the file signature fails, an exception is raised. - """ - returncode = subprocess.call( - ["gpg", "--verify", self.name + ".asc"], cwd=self.target_dir - ) - if returncode != 0: - raise Exception(f"Could not validate signature of file {self.name}") - - @classmethod - def sha256_checksum(cls, filename, folder, block_size=65536): - """ - Computes the SHA256 hash of a given file. - - Parameters: - filename (str): The name of the file for which to compute the SHA256 hash. - folder (str): The path to the directory containing the file. - block_size (int): The block size used for reading the file. Defaults to 65536. - - Returns: - str: The SHA256 hash of the file. - """ - sha256 = hashlib.sha256() - with open(os.path.join(folder, filename), "rb") as f: - for block in iter(lambda: f.read(block_size), b""): - sha256.update(block) - return sha256.hexdigest() - - -class ReleaseHelper: - """ - A class that manages software build artifacts for a CI/CD pipeline. - - This class is designed to perform operations such as downloading artifacts from CI - pipelines, verifying SHA256 checksums, verifying GPG signatures, and uploading - artifacts to GitHub releases. - - The class relies on a number of environment variables being present: - CI_COMMIT_TAG: The git tag to work with (format: export CI_COMMIT_TAG=). - CI_PIPELINE_ID: The pipeline ID for which artifacts are managed - (format: export CI_PIPELINE_ID=). - CI_PROJECT_ROOT_NAMESPACE: The root namespace of the CI project - (required for uploading to GitHub). - GH_BIN_UPLOAD_PW: gh_token or token for GitHub to authenticate uploads. - - Attributes: - target_dir (str): The directory path where artifacts are to be managed. - tag (str): The git tag associated with the artifacts being managed. - pipeline_id (str): The CI pipeline ID for artifact management operations. - pipeline (Pipeline): A pipeline object fetched from the CI server. - github_project (str): The GitHub repository in which the release should be created or updated. - gh_token (str): The password or token used to authenticate with GitHub. - - Methods: - download_and_unpack_all_artifacts(): Downloads and unpacks artifacts from a CI pipeline. - download_and_unpack_new_artifacts_from_github(): - Downloads and unpacks new artifacts from GitHub. - create_sha256sum_file(): Creates a SHA256SUMS file with checksums of all artifacts. - check_all_hashes(): Verifies checksums for all artifacts. - check_all_sigs(): Verifies GPG signatures for all artifacts. - calculate_publish_params(): Calculates and validates necessary parameters for publishing. - upload_sha256sum_file(): Uploads the SHA256SUMS file to a GitHub release. - upload_sha256sumsig_file(): Uploads the SHA256SUMS.asc signature file to a GitHub release. - - Note: The actual implementation of the methods and the use of additional classes - like `github.GithubConnection` or `Sha256sumFile` are assumed to exist and are - not defined in this documentation. - """ - - def __init__(self): - self.target_dir = "signing_dir" - Path(self.target_dir).mkdir(parents=True, exist_ok=True) - - @property - def gl(self): - """https://python-gitlab.readthedocs.io/en/stable/api-usage.html""" - if hasattr(self, "_gl"): - return self._gl - - if os.environ.get("GITLAB_PRIVATE_TOKEN"): - logger.info("Using GITLAB_PRIVATE_TOKEN") - self._gl = gitlab.Gitlab( - "http://gitlab.com", - private_token=os.environ.get("GITLAB_PRIVATE_TOKEN"), - ) - elif os.environ.get("CI_JOB_TOKEN"): - logger.info("Using CI_JOB_TOKEN") - self._gl = gitlab.Gitlab( - "http://gitlab.com", job_token=os.environ["CI_JOB_TOKEN"] - ) - else: - raise Exception( - "Can't authenticate against Gitlab ( export GITLAB_PRIVATE_TOKEN )" - ) - return self._gl - - @property - def gitlab_project(self): - if hasattr(self, "_gitlab_project"): - return self._gitlab_project - try: - from gitlab.v4.objects import Project - - self._gitlab_project: Project = self.gl.projects.get(self.ci_project_id) - except gitlab.exceptions.GitlabAuthenticationError as e: - logger.fatal(e) - logger.error("Your token might be expired or wrong. Get a new one here:") - logger.error(" https://gitlab.com/-/profile/personal_access_tokens") - exit(2) - - if ( - self._gitlab_project.attributes["namespace"]["path"] - != self.ci_project_root_namespace - ): - logger.fatal( - f"project_root_namespace ({ self.ci_project_root_namespace }) does not match namespace of Project ({self._gitlab_project.attributes['namespace']['path']}) " - ) - logger.error("You might want to: unset CI_PROJECT_ID") - exit(2) - return self._gitlab_project - - @property - def ci_project_id(self): - if hasattr(self, "_ci_project_id"): - return self._ci_project_id - if os.environ.get("CI_PROJECT_ID"): - self._ci_project_id = os.environ.get("CI_PROJECT_ID") - logger.info(f"Using ci_project_id: {self._ci_project_id} ") - else: - logger.error("No Project given. choose one:") - for project in self.gl.projects.list(search="specter-desktop"): - logger.info( - f" export CI_PROJECT_ID={project.id} # {project.name_with_namespace}" - ) - if project.name_with_namespace.startswith("cryptoadvance"): - self._ci_project_id = project.id - logger.warning( - f"{self._ci_project_id} has been chosen as self._ci_project_id" - ) - return self._ci_project_id - - @property - def github_project(self): - if hasattr(self, "_github_project"): - return self._github_project - self._github_project = f"{self.ci_project_root_namespace}/specter-desktop" - logger.info(f"Using github_project: {self._github_project}") - return self._github_project - - @property - def gh_token(self): - if hasattr(self, "_gh_token"): - return self._gh_token - if os.environ.get("GH_BIN_UPLOAD_PW"): - self._gh_token = os.environ.get("GH_BIN_UPLOAD_PW") - logger.info(f"Using gh_token: REDACTED") - else: - raise Exception( - "no Github token given ( export GH_BIN_UPLOAD_PW=v0.0.0.0-pre13 )" - ) - return self._gh_token - - @property - def ci_commit_tag(self): - if hasattr(self, "_ci_commit_tag"): - return self._ci_commit_tag - if os.environ.get("CI_COMMIT_TAG"): - self._ci_commit_tag = os.environ.get("CI_COMMIT_TAG") - else: - raise Exception("no tag given ( export CI_COMMIT_TAG=v0.0.0.0-pre13 )") - logger.info(f"Using tag: {self._ci_commit_tag}") - return self._ci_commit_tag - - @property - def ci_project_root_namespace(self): - if hasattr(self, "_ci_project_root_namespace"): - return self._ci_project_root_namespace - if os.environ.get("CI_PROJECT_ROOT_NAMESPACE"): - self._ci_project_root_namespace = os.environ.get( - "CI_PROJECT_ROOT_NAMESPACE" - ) - logger.info( - f"Using project_root_namespace: {self._ci_project_root_namespace} ( export CI_PROJECT_ROOT_NAMESPACE={self._ci_project_root_namespace} )" - ) - else: - self._ci_project_root_namespace = "cryptoadvance" - logger.warning( - f"Using project_root_namespace: {self._ci_project_root_namespace} ( export CI_PROJECT_ROOT_NAMESPACE={self._ci_project_root_namespace} )" - ) - return self._ci_project_root_namespace - - @property - def ci_pipeline_id(self): - if hasattr(self, "_ci_pipeline_id"): - return self._ci_pipeline_id - - if os.environ.get("CI_PIPELINE_ID"): - self._ci_pipeline_id = os.environ.get("CI_PIPELINE_ID") - else: - logger.info( - "no CI_PIPELINE_ID given, trying to find an appropriate one ..." - ) - pipelines = self.gitlab_project.pipelines.list() - for pipeline in pipelines: - if pipeline.ref == self.ci_commit_tag: - self._ci_pipeline_id = pipeline.id - self._ci_pipeline = pipeline - logger.info(f"Found matching pipeline: {pipeline}") - if not hasattr(self, "_ci_pipeline"): - logger.error( - f"Could not find tag {self.ci_commit_tag} in the pipeline-refs:" - ) - for pipeline in self.gitlab_project.pipelines.list(): - logger.error(pipeline.ref) - raise Exception( - "no CI_PIPELINE_ID given ( export CI_PIPELINE_ID= ) or maybe you're on the wrong project ( export CI_PROJECT_ROOT_NAMESPACE= )" - ) - - logger.info(f"Using pipeline_id: {self.ci_pipeline.id}") - return self._ci_pipeline_id - - @property - def ci_pipeline(self): - if hasattr(self, "_ci_pipeline"): - return self._ci_pipeline - self._ci_pipeline = self.gitlab_project.pipelines.get(self.ci_pipeline_id) - return self._ci_pipeline - - def download_and_unpack_all_artifacts(self): - if os.path.isdir(self.target_dir): - logger.info(f"First purging {self.target_dir}") - shutil.rmtree(self.target_dir) - for job in self.ci_pipeline.jobs.list(): - if job.name in [ - "release_electron_linux_windows", - "release_binary_windows", - "release_pip", - ]: - zipfn = f"/tmp/_artifacts_{job.name}.zip" - job_obj = self.gitlab_project.jobs.get(job.id, lazy=True) - - if not os.path.isfile(zipfn): - logger.info(f"Downloading artifacts for {job.name}") - with open(zipfn, "wb") as f: - job_obj.artifacts(streamed=True, action=f.write) - else: - logger.info(f"Skipping Download artifacts for {job.name}") - - logger.info(f"Unzipping {zipfn} in target-folder") - with zipfile.ZipFile(zipfn, "r") as zip: - for zip_info in zip.infolist(): - if zip_info.filename[-1] == "/": - continue - zip_info.filename = os.path.basename(zip_info.filename) - logger.info(f" Extracting {zip_info.filename}") - zip.extract(zip_info, self.target_dir) - - def download_and_unpack_new_artifacts_from_github(self): - - gc = github.GithubConnection(self.github_project) - release = gc.fetch_existing_release(self.ci_commit_tag) - assets = gc.list_assets(release) - for asset in assets: - if not asset.name.startswith("SHA256"): - continue - if asset.name == "SHA256SUMS" or asset.name == "SHA256SUMS.asc": - continue - if asset.name.endswith(".asc"): - continue - logger.info("iterating file " + asset.name) - shasumfile = Sha256sumFile(asset.name) - if not shasumfile.is_in_target_dir(): - shasumfile.download_from_tag(self.ci_commit_tag, gc) - shasumfile.download_hashed_files(self.ci_commit_tag, gc) - shasumfile.check_hashes() - shasumfile.check_sig() - logger.info("All files have valid signatures") - - def create_sha256sum_file(self): - with open(f"{self.target_dir}/SHA256SUMS", "w") as shafile: - for file in os.listdir(self.target_dir): - if file.startswith("SHA256SUMS-") and not file.endswith(".asc"): - logger.debug(f"Processing {file}") - sha_src = Sha256sumFile(file) - sha_src.read() - for hashed_file in sha_src.hashed_files.keys(): - print(f"{sha_src.hashed_files[hashed_file]} {hashed_file}\n") - shafile.write( - f"{sha_src.hashed_files[hashed_file]} {hashed_file}\n" - ) - returncode = subprocess.call( - ["sha256sum", "-c", "SHA256SUMS"], cwd=self.target_dir - ) - if returncode != 0: - raise Exception( - f"One of the hashes is not matching: {subprocess.run(['sha256sum', '-c', 'SHA256SUMS'], cwd=self.target_dir)}" - ) - - def check_all_hashes(self): - for file in os.listdir(self.target_dir): - if file.startswith("SHA256SUM") and not file.endswith(".asc"): - logger.info(f"Checking hashes in {file}") - if file.endswith("windows"): - logger.info(f"Converting dos2unix for {file}") - dos2unix(os.path.join("signing_dir", file)) - returncode = subprocess.call( - ["sha256sum", "-c", file], cwd=self.target_dir - ) - if returncode != 0: - raise Exception(f"Could not validate hashes for file {file}") - logger.info("All files SHA256SUM* (not .asc) has valid hashes") - - def check_all_sigs(self): - for file in os.listdir(self.target_dir): - if file.endswith(".asc"): - logger.info(f"Checking signature for {file}") - returncode = subprocess.call( - ["gpg", "--verify", file], cwd=self.target_dir - ) - if returncode != 0: - raise Exception( - f"Could not validate signature of file {file}: {subprocess.run(['gpg', '--verify', file], cwd=self.target_dir)}" - ) - logger.info("All files *.asc has valid signatures") - - def upload_sha256sum_file(self): - artifact = os.path.join("signing_dir", "SHA256SUMS") - - if github.artifact_exists( - self.github_project, self.ci_commit_tag, Path(artifact).name - ): - logger.info(f"Github artifact {artifact} existing. Skipping upload.") - exit(0) - else: - logger.info(f"Github artifact {artifact} does not exist. Let's upload!") - github.publish_release_from_tag( - self.github_project, - self.ci_commit_tag, - [artifact], - "gitlab_upload_release_binaries", - self.gh_token, - ) - - def upload_sha256sumsig_file(self): - artifact = os.path.join("signing_dir", "SHA256SUMS.asc") - - if github.artifact_exists( - self.github_project, self.ci_commit_tag, Path(artifact).name - ): - logger.info(f"Github artifact {artifact} existing. Skipping upload.") - exit(0) - else: - logger.info(f"Github artifact {artifact} does not exist. Let's upload!") - github.publish_release_from_tag( - self.github_project, - self.ci_commit_tag, - [artifact], - "gitlab_upload_release_binaries", - self.gh_token, - ) - - -def dos2unix(filename): - content = "" - outsize = 0 - with open(filename, "rb") as infile: - content = infile.read() - with open(filename, "wb") as output: - for line in content.splitlines(): - outsize += len(line) + 1 - output.write(line + b"\n") - - -def sha256sum(filenames): - sha_file = Sha256sumFile("SHA256SUMS", target_dir=".") - for filename in filenames: - logger.info(f"Adding {filename}") - sha_file.add_file(filename) - sha_file.print() - - -if __name__ == "__main__": - if "sha256sums" in sys.argv: - # Used by build-win.ci.bat - sha256sum(sys.argv[2:]) - exit(0) - if "install_wheel" in sys.argv: - # List all .whl files in the 'dist' directory - wheel_files = glob( - str(Path("dist", "cryptoadvance.specter-*-py3-none-any.whl")) - ) - print("found those wheel files: " + str(wheel_files)) - - # Loop through the wheel files and install them - for wheel_file in wheel_files: - cmd = f"pip3 install {wheel_file}" - res = os.system(cmd) - print(f"Result of command: {cmd}") - print(res) - # If the installation fails, exit with the error code - if res != 0: - exit(res) - # Exit with a success code if all installations were successful - exit(0) - - rh = ReleaseHelper() - try: - from utils import github - except Exception as e: - logger.fatal(e) - logger.error("You might have called this script wrong. Execute it like:") - logger.error("python3 -m utils.release_helper ...") - - if "download" in sys.argv: - rh.download_and_unpack_all_artifacts() - if "downloadgithub" in sys.argv: - rh.download_and_unpack_new_artifacts_from_github() - if "checkhashes" in sys.argv: - rh.check_all_hashes() - if "checksigs" in sys.argv: - rh.check_all_sigs() - if "create" in sys.argv: - rh.create_sha256sum_file() - if "upload_shasums" in sys.argv: - rh.upload_sha256sum_file() - if "upload_shasumssig" in sys.argv: - rh.upload_sha256sumsig_file() diff --git a/utils/tag_specterext_dummy.sh b/utils/tag_specterext_dummy.sh deleted file mode 100755 index 04c4aeccc..000000000 --- a/utils/tag_specterext_dummy.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -e - -echo "This script will checkout github.com:${CI_PROJECT_ROOT_NAMESPACE}/specterext-dummy.git" -echo "and tag it with ${CI_COMMIT_TAG}" - - -git clone git@github.com:${CI_PROJECT_ROOT_NAMESPACE}/specterext-dummy.git - -cd specterext-dummy -git checkout master -git tag ${CI_COMMIT_TAG} -#git push origin ${CI_COMMIT_TAG} diff --git a/utils/trigger_docker_build.sh b/utils/trigger_docker_build.sh deleted file mode 100755 index 83bc9e57d..000000000 --- a/utils/trigger_docker_build.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -payload="{\"ref\":\"master\", \"inputs\": {\"tag\": \"${CI_COMMIT_TAG}\"}}" -echo $payload -# This Token is controlled by https://github.com/AaronDewes - -curl -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ${AARON_TOKEN}" \ - https://api.github.com/repos/lncm/docker-specter-desktop/actions/workflows/dispatch.yml/dispatches -d @<(cat < Date: Sun, 19 Apr 2026 20:35:32 +0200 Subject: [PATCH 08/36] Chore(deps): Bump tar and electron-builder in /pyinstaller/electron (#2593) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyinstaller/electron/package-lock.json | 4893 ++++++++++++++---------- pyinstaller/electron/package.json | 2 +- pyinstaller/electron/yarn.lock | 911 +++-- 3 files changed, 3634 insertions(+), 2172 deletions(-) diff --git a/pyinstaller/electron/package-lock.json b/pyinstaller/electron/package-lock.json index 926d97821..63b8bbe14 100644 --- a/pyinstaller/electron/package-lock.json +++ b/pyinstaller/electron/package-lock.json @@ -20,7 +20,7 @@ }, "devDependencies": { "electron": "^39.8.5", - "electron-builder": "^24.13.3" + "electron-builder": "^26.8.1" } }, "node_modules/@colors/colors": { @@ -59,9 +59,9 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", "dev": true, "dependencies": { "commander": "^5.0.0", @@ -75,12 +75,17 @@ "node": ">=10.12.0" } }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -91,7 +96,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -99,6 +103,56 @@ "node": "*" } }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/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==", + "dev": true, + "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/@electron/fuses/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/fuses/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@electron/get": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", @@ -120,181 +174,6 @@ "global-agent": "^3.0.0" } }, - "node_modules/@electron/get/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "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/@electron/get/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==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@electron/get/node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "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/@electron/get/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==", - "dev": true - }, - "node_modules/@electron/get/node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/@electron/get/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@electron/get/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@electron/get/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/get/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -305,9 +184,9 @@ } }, "node_modules/@electron/notarize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", - "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -334,9 +213,9 @@ } }, "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -355,9 +234,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dev": true, "dependencies": { "compare-version": "^0.1.2", @@ -402,9 +281,9 @@ } }, "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -422,54 +301,84 @@ "node": ">= 10.0.0" } }, - "node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "node_modules/@electron/rebuild": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.3.tgz", + "integrity": "sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==", "dev": true, "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "got": "^11.7.0", + "graceful-fs": "^4.2.11", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^11.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^7.5.6", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" }, "engines": { - "node": ">=8.6" + "node": ">=22.12.0" } }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/@electron/universal/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==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -479,16 +388,18 @@ } }, "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@electron/universal/node_modules/universalify": { @@ -500,6 +411,68 @@ "node": ">= 10.0.0" } }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/windows-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -518,9 +491,9 @@ } }, "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==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "engines": { "node": ">=12" @@ -530,9 +503,9 @@ } }, "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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "engines": { "node": ">=12" @@ -565,12 +538,12 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -596,10 +569,22 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "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==", + "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": [ { @@ -615,7 +600,7 @@ "cross-spawn": "^7.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 12.13.0" } }, "node_modules/@malept/flatpak-bundler": { @@ -649,9 +634,9 @@ } }, "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -669,6 +654,40 @@ "node": ">= 10.0.0" } }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -679,13 +698,28 @@ "node": ">=14" } }, - "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==", + "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==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "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==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/@types/cacheable-request": { @@ -701,9 +735,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "dependencies": { "@types/ms": "*" @@ -734,9 +768,9 @@ } }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "node_modules/@types/node": { @@ -774,9 +808,9 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", "dev": true, "optional": true }, @@ -790,9 +824,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", - "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -804,16 +838,22 @@ "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "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==", + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "dev": true, - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" } }, "node_modules/ajv": { @@ -866,68 +906,119 @@ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "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==", + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", "dev": true }, "node_modules/app-builder-lib": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", - "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.2.1", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.5.1", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "24.13.1", - "form-data": "^4.0.0", + "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", + "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "24.13.3", - "electron-builder-squirrel-windows": "24.13.3" + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" } }, - "node_modules/app-builder-lib/node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, - "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "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": ">= 6" + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/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==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, "node_modules/app-builder-lib/node_modules/fs-extra": { @@ -944,10 +1035,10 @@ "node": ">=12" } }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -956,7 +1047,7 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/app-builder-lib/node_modules/universalify": { + "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", @@ -965,60 +1056,16 @@ "node": ">= 10.0.0" } }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "node": ">=10" } }, "node_modules/argparse": { @@ -1052,9 +1099,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/async-exit-hook": { "version": "2.0.1", @@ -1093,10 +1140,13 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -1131,43 +1181,12 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -1176,13 +1195,15 @@ "optional": true }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/buffer": { @@ -1217,18 +1238,6 @@ "node": "*" } }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1236,33 +1245,33 @@ "dev": true }, "node_modules/builder-util": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", - "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", "dev": true, "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.4", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" } }, "node_modules/builder-util-runtime": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", - "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -1287,9 +1296,9 @@ } }, "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -1307,6 +1316,86 @@ "node": ">= 10.0.0" } }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -1316,6 +1405,24 @@ "node": ">=10.6.0" } }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "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/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1352,12 +1459,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/chromium-pickle-js": { @@ -1367,9 +1474,9 @@ "dev": true }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -1381,6 +1488,30 @@ "node": ">=8" } }, + "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==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "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", @@ -1407,13 +1538,25 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "dependencies": { "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/color": { @@ -1501,101 +1644,12 @@ "node": ">=0.10.0" } }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1611,54 +1665,19 @@ "buffer": "^5.1.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1668,6 +1687,27 @@ "node": ">= 8" } }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1695,6 +1735,54 @@ } } }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -1720,6 +1808,15 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -1728,21 +1825,26 @@ "optional": true }, "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1753,7 +1855,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1762,14 +1863,13 @@ } }, "node_modules/dmg-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", - "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", "dev": true, "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -1793,9 +1893,9 @@ } }, "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -1840,19 +1940,31 @@ } }, "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "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 + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -1918,20 +2030,19 @@ } }, "node_modules/electron-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", - "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", "dev": true, "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "dmg-builder": "24.13.3", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, @@ -1944,54 +2055,15 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", - "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", "dev": true, "peer": true, "dependencies": { - "app-builder-lib": "24.13.3", - "archiver": "^5.3.1", - "builder-util": "24.13.1", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/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, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" } }, "node_modules/electron-builder/node_modules/fs-extra": { @@ -2080,20 +2152,37 @@ } }, "node_modules/electron-publish": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", - "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", + "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, + "node_modules/electron-publish/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "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", @@ -2109,9 +2198,9 @@ } }, "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -2129,6 +2218,42 @@ "node": ">= 10.0.0" } }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2139,6 +2264,16 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, + "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", @@ -2200,7 +2335,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -2248,6 +2382,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -2295,17 +2435,6 @@ "@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" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2332,32 +2461,76 @@ "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "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/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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "dependencies": { "minimatch": "^5.0.1" } }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "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/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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -2367,6 +2540,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "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", @@ -2388,13 +2573,6 @@ "node": ">= 0.12" } }, - "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==", - "dev": true, - "peer": true - }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2410,27 +2588,15 @@ } }, "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs.realpath": { @@ -2497,6 +2663,20 @@ "node": ">= 0.4" } }, + "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/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2509,6 +2689,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -2525,12 +2706,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2541,7 +2727,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2596,10 +2781,35 @@ "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==", + "dev": true, + "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.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/har-schema": { @@ -2662,7 +2872,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -2699,23 +2908,22 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, "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==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-signature": { @@ -2746,16 +2954,16 @@ } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/iconv-corefoundation": { @@ -2807,10 +3015,20 @@ } ] }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -2822,23 +3040,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "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/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-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2847,6 +3062,15 @@ "node": ">=8" } }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -2871,17 +3095,22 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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==", "dev": true, - "peer": true + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "dev": true, "engines": { "node": ">= 18.0.0" @@ -2891,10 +3120,13 @@ } }, "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "engines": { + "node": ">=18" + } }, "node_modules/isstream": { "version": "0.1.2", @@ -2902,16 +3134,13 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "node_modules/jackspeak": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -2920,15 +3149,14 @@ } }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "^3.2.6", "filelist": "^1.0.4", - "minimatch": "^3.1.2" + "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" @@ -2937,28 +3165,13 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-yaml": { @@ -2966,7 +3179,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2979,6 +3191,12 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "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==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -3031,6 +3249,15 @@ "node": ">=0.6.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -3042,59 +3269,27 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "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==", "dev": true, - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "peer": true + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/logform": { "version": "2.6.0", @@ -3112,6 +3307,15 @@ "node": ">= 12.0.0" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3124,6 +3328,28 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -3178,6 +3404,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -3188,16 +3423,18 @@ } }, "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -3210,28 +3447,56 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, - "node_modules/minizlib/node_modules/minipass": { + "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==", @@ -3243,16 +3508,77 @@ "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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, - "bin": { - "mkdirp": "bin/cmd.js" + "dependencies": { + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "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-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/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, "node_modules/modify-filename": { @@ -3278,6 +3604,39 @@ "thenify-all": "^1.0.0" } }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.28.0.tgz", + "integrity": "sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -3285,14 +3644,64 @@ "dev": true, "optional": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", "dev": true, - "peer": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/oauth-sign": { @@ -3337,12 +3746,85 @@ "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==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" + "dev": true }, "node_modules/path-exists": { "version": "4.0.0", @@ -3387,12 +3869,23 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, "node_modules/pend": { @@ -3405,6 +3898,24 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -3419,12 +3930,42 @@ "node": ">=10.4.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/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", "dev": true, - "peer": true + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/progress": { "version": "2.0.3", @@ -3448,6 +3989,17 @@ "node": ">=10" } }, + "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==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -3502,21 +4054,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" + "debug": "^4.3.4" }, - "engines": { - "node": ">=12.0.0" + "bin": { + "read-binary-file-arch": "cli.js" } }, "node_modules/read-last-lines": { @@ -3528,29 +4075,16 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "peer": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "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/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/request": { @@ -3592,12 +4126,54 @@ "node": ">=0.10.0" } }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "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==", "dev": true }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "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==", + "dev": true, + "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", @@ -3607,6 +4183,20 @@ "node": ">= 4" } }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -3644,19 +4234,22 @@ "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==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "engines": { + "node": ">=11.0.0" + } }, "node_modules/semver": { "version": "7.5.4", @@ -3718,16 +4311,10 @@ } }, "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-swizzle": { "version": "0.2.2", @@ -3767,12 +4354,39 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "optional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -3840,6 +4454,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -3942,52 +4568,42 @@ } }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "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==", + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "peer": 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" + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "node": ">=6.0.0" } }, "node_modules/temp-file": { @@ -4015,9 +4631,9 @@ } }, "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" @@ -4059,12 +4675,45 @@ "node": ">=0.8" } }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.14" } @@ -4136,25 +4785,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "devOptional": true }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -4216,19 +4876,28 @@ "extsprintf": "^1.2.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/winston": { @@ -4265,32 +4934,6 @@ "node": ">= 12.0.0" } }, - "node_modules/winston-transport/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/winston/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4391,56 +5034,16 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "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==", "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "node": ">=10" }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } }, @@ -4471,9 +5074,9 @@ } }, "@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", "dev": true, "requires": { "commander": "^5.0.0", @@ -4481,10 +5084,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -4502,6 +5111,47 @@ } } }, + "@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, "@electron/get": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", @@ -4518,127 +5168,6 @@ "sumchecker": "^3.0.1" }, "dependencies": { - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@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" - } - }, - "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==", - "dev": true - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "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==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4648,9 +5177,9 @@ } }, "@electron/notarize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", - "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "requires": { "debug": "^4.1.1", @@ -4671,9 +5200,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -4689,9 +5218,9 @@ } }, "@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dev": true, "requires": { "compare-version": "^0.1.2", @@ -4720,9 +5249,9 @@ "dev": true }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -4737,47 +5266,72 @@ } } }, - "@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "@electron/rebuild": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.3.tgz", + "integrity": "sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==", "dev": true, "requires": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "got": "^11.7.0", + "graceful-fs": "^4.2.11", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^11.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^7.5.6", + "yargs": "^17.0.1" + } + }, + "@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "requires": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" }, "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "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==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -4785,12 +5339,12 @@ } }, "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" } }, "universalify": { @@ -4801,6 +5355,56 @@ } } }, + "@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "dependencies": { + "fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4816,15 +5420,15 @@ }, "dependencies": { "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true }, "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true }, "emoji-regex": { @@ -4845,12 +5449,12 @@ } }, "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" } }, "wrap-ansi": { @@ -4866,10 +5470,19 @@ } } }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "requires": { + "minipass": "^7.0.4" + } + }, "@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==", + "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, "requires": { "cross-spawn": "^7.0.1" @@ -4900,9 +5513,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -4917,6 +5530,36 @@ } } }, + "@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, + "@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4924,12 +5567,21 @@ "dev": true, "optional": true }, - "@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==", + "@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==", "dev": true }, + "@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==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, "@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -4943,9 +5595,9 @@ } }, "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "requires": { "@types/ms": "*" @@ -4976,9 +5628,9 @@ } }, "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "@types/node": { @@ -5016,9 +5668,9 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", "dev": true, "optional": true }, @@ -5032,9 +5684,9 @@ } }, "@xmldom/xmldom": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", - "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "dev": true }, "7zip-bin": { @@ -5043,14 +5695,17 @@ "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true }, + "abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true + }, "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==", - "dev": true, - "requires": { - "debug": "4" - } + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true }, "ajv": { "version": "6.14.0", @@ -5089,59 +5744,96 @@ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "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==", + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", "dev": true }, "app-builder-lib": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", - "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.2.1", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.5.1", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "24.13.1", - "form-data": "^4.0.0", + "electron-publish": "26.8.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", + "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" }, "dependencies": { - "form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, + "ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -5151,75 +5843,34 @@ "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true } } }, - "archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "peer": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5245,9 +5896,9 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "async-exit-hook": { "version": "2.0.1", @@ -5277,9 +5928,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true }, "base64-js": { @@ -5301,40 +5952,10 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "peer": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "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, - "requires": { - "bluebird": "^3.5.5" } }, "boolean": { @@ -5345,12 +5966,12 @@ "optional": true }, "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" } }, "buffer": { @@ -5368,12 +5989,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5381,27 +5996,27 @@ "dev": true }, "builder-util": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", - "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", "dev": true, "requires": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.4", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" }, "dependencies": { "fs-extra": { @@ -5416,9 +6031,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -5434,21 +6049,102 @@ } }, "builder-util-runtime": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", - "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", "dev": true, "requires": { "debug": "^4.3.4", "sax": "^1.2.4" } }, + "cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.2" + } + } + } + }, "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==", "dev": true }, + "cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "requires": { + "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" + } + }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -5475,9 +6171,9 @@ } }, "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true }, "chromium-pickle-js": { @@ -5487,9 +6183,24 @@ "dev": true }, "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true }, "cli-truncate": { @@ -5512,10 +6223,16 @@ "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -5596,80 +6313,12 @@ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true }, - "compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "peer": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "requires": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - }, - "dependencies": { - "glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.2" - } - }, - "minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true - } - } - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -5685,38 +6334,14 @@ "buffer": "^5.1.0" } }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, + "optional": true, "peer": true }, - "crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "peer": true, - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -5726,6 +6351,23 @@ "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "dashdash": { @@ -5744,6 +6386,38 @@ "ms": "2.1.2" } }, + "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==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "dev": true + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -5760,6 +6434,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -5768,19 +6448,25 @@ "optional": true }, "dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "requires": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " }, "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -5799,14 +6485,13 @@ } }, "dmg-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", - "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", "dev": true, "requires": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", "dmg-license": "^1.0.11", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", @@ -5825,9 +6510,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -5860,16 +6545,19 @@ } }, "dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true }, "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 + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "requires": { + "dotenv": "^16.4.5" + } }, "dunder-proto": { "version": "1.0.1", @@ -5918,20 +6606,19 @@ } }, "electron-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", - "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", "dev": true, "requires": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", - "dmg-builder": "24.13.3", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, @@ -5966,48 +6653,15 @@ } }, "electron-builder-squirrel-windows": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", - "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", "dev": true, "peer": true, "requires": { - "app-builder-lib": "24.13.3", - "archiver": "^5.3.1", - "builder-util": "24.13.1", - "fs-extra": "^10.1.0" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true - } + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" } }, "electron-context-menu": { @@ -6049,20 +6703,34 @@ } }, "electron-publish": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", - "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", "dev": true, "requires": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", + "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" }, "dependencies": { + "form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + } + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -6075,9 +6743,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -6092,6 +6760,35 @@ } } }, + "electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "peer": true, + "requires": { + "@electron/asar": "^3.2.1", + "@electron/windows-sign": "^1.1.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6102,6 +6799,16 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, + "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, + "requires": { + "iconv-lite": "^0.6.2" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6180,6 +6887,12 @@ "dev": true, "optional": true }, + "exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true + }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -6211,16 +6924,6 @@ "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "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==", - "requires": { - "pump": "^3.0.0" - } - } } }, "extsprintf": { @@ -6246,18 +6949,51 @@ "pend": "~1.2.0" } }, + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, "fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "requires": { "minimatch": "^5.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "fn.name": { @@ -6266,13 +7002,21 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } } }, "forever-agent": { @@ -6290,13 +7034,6 @@ "mime-types": "^2.1.12" } }, - "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==", - "dev": true, - "peer": true - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -6309,23 +7046,12 @@ } }, "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } + "minipass": "^7.0.3" } }, "fs.realpath": { @@ -6374,6 +7100,14 @@ "es-object-atoms": "^1.0.0" } }, + "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==", + "requires": { + "pump": "^3.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -6396,10 +7130,16 @@ "path-is-absolute": "^1.0.0" }, "dependencies": { + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -6448,10 +7188,29 @@ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "requires": { + "@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" + } + }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "har-schema": { @@ -6518,20 +7277,19 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, "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==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" } }, "http-signature": { @@ -6555,12 +7313,12 @@ } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" } }, @@ -6590,6 +7348,12 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6605,25 +7369,28 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true + }, "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==" }, - "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, - "requires": { - "ci-info": "^3.2.0" - } - }, "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==" }, + "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==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -6639,23 +7406,22 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "peer": true + "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==", + "dev": true }, "isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "dev": true }, "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true }, "isstream": { @@ -6664,9 +7430,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jackspeak": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -6674,38 +7440,22 @@ } }, "jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "^3.2.6", "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "picocolors": "^1.1.1" } }, + "jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true + }, "js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -6720,6 +7470,12 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "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==", + "dev": true + }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -6761,6 +7517,15 @@ "verror": "1.10.0" } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -6772,56 +7537,21 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "peer": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, "lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "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==", "dev": true, - "peer": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "peer": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "peer": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "peer": true + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } }, "logform": { "version": "2.6.0", @@ -6836,6 +7566,12 @@ "triple-beam": "^1.3.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6845,6 +7581,25 @@ "yallist": "^4.0.0" } }, + "make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "requires": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + } + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -6880,6 +7635,12 @@ "mime-db": "1.44.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -6887,12 +7648,12 @@ "dev": true }, "minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" } }, "minimist": { @@ -6902,19 +7663,39 @@ "dev": true }, "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.0.3" + } + }, + "minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + } + }, + "minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" }, "dependencies": { "minipass": { @@ -6928,11 +7709,64 @@ } } }, + "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, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "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, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "requires": { + "minipass": "^7.1.2" + } + }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.6" + } }, "modify-filename": { "version": "1.1.0", @@ -6954,6 +7788,29 @@ "thenify-all": "^1.0.0" } }, + "negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true + }, + "node-abi": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.28.0.tgz", + "integrity": "sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==", + "dev": true, + "requires": { + "semver": "^7.6.3" + }, + "dependencies": { + "semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true + } + } + }, "node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -6961,12 +7818,47 @@ "dev": true, "optional": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", "dev": true, - "peer": true + "requires": { + "semver": "^7.3.5" + } + }, + "node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + } + }, + "nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "requires": { + "abbrev": "^3.0.0" + } + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true }, "oauth-sign": { "version": "0.9.0", @@ -7001,6 +7893,53 @@ "fn.name": "1.x.x" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "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" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true + }, "package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -7035,13 +7974,19 @@ }, "dependencies": { "lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true } } }, + "pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -7052,6 +7997,18 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true + }, "plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -7063,12 +8020,32 @@ "xmlbuilder": "^15.1.1" } }, - "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==", + "postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", "dev": true, - "peer": true + "optional": true, + "peer": true, + "requires": { + "commander": "^9.4.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true }, "progress": { "version": "2.0.3", @@ -7086,6 +8063,17 @@ "retry": "^0.12.0" } }, + "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==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -7124,18 +8112,13 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "requires": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" + "debug": "^4.3.4" } }, "read-last-lines": { @@ -7147,29 +8130,13 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "peer": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "request": { @@ -7205,18 +8172,56 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "requires": { + "pe-library": "^0.4.1" + } + }, "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==", "dev": true }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "peer": true, + "requires": { + "glob": "^7.1.3" + } + }, "roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -7248,18 +8253,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "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==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "requires": { "truncate-utf8-bytes": "^1.0.0" } }, "sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true }, "semver": { @@ -7304,9 +8309,9 @@ "dev": true }, "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "simple-swizzle": { @@ -7340,8 +8345,28 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, - "optional": true + "requires": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + } }, "sort-keys": { "version": "1.1.2", @@ -7398,6 +8423,15 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -7474,45 +8508,35 @@ } }, "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", "dev": true, "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "dependencies": { + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true + } } }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "peer": true, "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" } }, "temp-file": { @@ -7537,9 +8561,9 @@ } }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -7575,6 +8599,33 @@ "thenify": ">= 3.1.0 < 4" } }, + "tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "requires": { + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + } + }, "tmp": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", @@ -7633,18 +8684,30 @@ "dev": true, "optional": true }, - "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true - }, "undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "devOptional": true }, + "unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "requires": { + "unique-slug": "^5.0.0" + } + }, + "unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -7694,13 +8757,22 @@ "extsprintf": "^1.2.0" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "defaults": "^1.0.3" + } + }, + "which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "requires": { + "isexe": "^3.1.1" } }, "winston": { @@ -7719,18 +8791,6 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.7.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "winston-transport": { @@ -7741,18 +8801,6 @@ "logform": "^2.3.2", "readable-stream": "^3.6.0", "triple-beam": "^1.3.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "wrap-ansi": { @@ -7830,50 +8878,11 @@ "fd-slicer": "~1.1.0" } }, - "zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "peer": true, - "requires": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "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==", + "dev": true } } } diff --git a/pyinstaller/electron/package.json b/pyinstaller/electron/package.json index 4861159b7..d09b8f89a 100644 --- a/pyinstaller/electron/package.json +++ b/pyinstaller/electron/package.json @@ -21,7 +21,7 @@ "license": "MIT", "devDependencies": { "electron": "^39.8.5", - "electron-builder": "^24.13.3" + "electron-builder": "^26.8.1" }, "build": { "productName": "Specter", diff --git a/pyinstaller/electron/yarn.lock b/pyinstaller/electron/yarn.lock index 2e0c6bd40..53ebc5147 100644 --- a/pyinstaller/electron/yarn.lock +++ b/pyinstaller/electron/yarn.lock @@ -29,15 +29,24 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron/asar@^3.2.1": - version "3.2.10" - resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz" - integrity sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw== +"@electron/asar@3.4.1", "@electron/asar@^3.3.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.4.1.tgz#4e9196a4b54fba18c56cd8d5cac67c5bdc588065" + integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA== dependencies: commander "^5.0.0" glob "^7.1.6" minimatch "^3.0.4" +"@electron/fuses@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@electron/fuses/-/fuses-1.8.0.tgz#ad34d3cc4703b1258b83f6989917052cfc1490a0" + integrity sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw== + dependencies: + chalk "^4.1.1" + fs-extra "^9.0.1" + minimist "^1.2.5" + "@electron/get@^2.0.0": version "2.0.2" resolved "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz" @@ -53,19 +62,34 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz" - integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== +"@electron/get@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-3.1.0.tgz#22c5a0bd917ab201badeb77bc4ad18cba54cb4ec" + integrity sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ== + 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" + optionalDependencies: + global-agent "^3.0.0" + +"@electron/notarize@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.5.0.tgz#d4d25356adfa29df4a76bd64a8bd347237cd251e" + integrity sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A== dependencies: debug "^4.1.1" fs-extra "^9.0.1" promise-retry "^2.0.1" -"@electron/osx-sign@1.0.5": - version "1.0.5" - resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz" - integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== +"@electron/osx-sign@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.3.3.tgz#af751510488318d9f7663694af85819690d75583" + integrity sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -74,18 +98,37 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.5.1": - version "1.5.1" - resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz" - integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== +"@electron/rebuild@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-4.0.3.tgz#f022f7e66874920fd16a4d802b8605885cb549d3" + integrity sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA== dependencies: - "@electron/asar" "^3.2.1" - "@malept/cross-spawn-promise" "^1.1.0" + "@malept/cross-spawn-promise" "^2.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + got "^11.7.0" + graceful-fs "^4.2.11" + node-abi "^4.2.0" + node-api-version "^0.2.1" + node-gyp "^11.2.0" + ora "^5.1.0" + read-binary-file-arch "^1.0.6" + semver "^7.3.5" + tar "^7.5.6" + yargs "^17.0.1" + +"@electron/universal@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-2.0.3.tgz#1680df6ced8f128ca0ff24e29c2165d41d78b3ce" + integrity sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g== + dependencies: + "@electron/asar" "^3.3.1" + "@malept/cross-spawn-promise" "^2.0.0" debug "^4.3.1" - dir-compare "^3.0.0" - fs-extra "^9.0.1" - minimatch "^3.0.4" - plist "^3.0.4" + dir-compare "^4.2.0" + fs-extra "^11.1.1" + minimatch "^9.0.3" + plist "^3.1.0" "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -99,10 +142,17 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@malept/cross-spawn-promise@^1.1.0": - 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== +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== dependencies: cross-spawn "^7.0.1" @@ -116,6 +166,24 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@npmcli/agent@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-3.0.0.tgz#1685b1fbd4a1b7bb4f930cbb68ce801edfe7aa44" + integrity sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-4.0.0.tgz#a1eb1aeddefd2a4a347eca0fab30bc62c0e1c0f2" + integrity sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q== + dependencies: + semver "^7.3.5" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" @@ -133,11 +201,6 @@ dependencies: defer-to-connect "^2.0.0" -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - "@types/cacheable-request@^6.0.1": version "6.0.3" resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" @@ -223,12 +286,15 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.12.tgz#cf488a5435fa06c7374ad1449c69cea0f823624b" integrity sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg== -agent-base@6: - 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" +abbrev@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025" + integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== ajv-keywords@^3.4.1: version "3.5.2" @@ -272,43 +338,52 @@ any-promise@^1.0.0: resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= -app-builder-bin@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz" - integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== +app-builder-bin@5.0.0-alpha.12: + version "5.0.0-alpha.12" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80" + integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w== -app-builder-lib@24.13.3: - version "24.13.3" - resolved "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz" - integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== +app-builder-lib@26.8.1: + version "26.8.1" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.8.1.tgz#315c893bf1f5882cc6cd174cfcd00535dbb76786" + integrity sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw== dependencies: "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.2.1" - "@electron/osx-sign" "1.0.5" - "@electron/universal" "1.5.1" + "@electron/asar" "3.4.1" + "@electron/fuses" "^1.8.0" + "@electron/get" "^3.0.0" + "@electron/notarize" "2.5.0" + "@electron/osx-sign" "1.3.3" + "@electron/rebuild" "^4.0.3" + "@electron/universal" "2.0.3" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" - bluebird-lst "^1.0.9" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + builder-util "26.8.1" + builder-util-runtime "9.5.1" chromium-pickle-js "^0.2.0" + ci-info "4.3.1" debug "^4.3.4" + dotenv "^16.4.5" + dotenv-expand "^11.0.6" ejs "^3.1.8" - electron-publish "24.13.1" - form-data "^4.0.0" + electron-publish "26.8.1" fs-extra "^10.1.0" hosted-git-info "^4.1.0" - is-ci "^3.0.0" isbinaryfile "^5.0.0" + jiti "^2.4.2" js-yaml "^4.1.0" + json5 "^2.2.3" lazy-val "^1.0.5" - minimatch "^5.1.1" - read-config-file "6.3.2" - sanitize-filename "^1.6.3" - semver "^7.3.8" - tar "^6.1.12" + minimatch "^10.0.3" + plist "3.1.0" + proper-lockfile "^4.1.2" + resedit "^1.7.0" + semver "~7.7.3" + tar "^7.5.7" temp-file "^3.4.0" + tiny-async-pool "1.3.0" + which "^5.0.0" argparse@^2.0.1: version "2.0.1" @@ -367,6 +442,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" @@ -379,17 +459,14 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bluebird-lst@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz" - integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: - bluebird "^3.5.5" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" boolean@^3.0.1: version "3.2.0" @@ -411,22 +488,24 @@ brace-expansion@^2.0.1, brace-expansion@^2.0.2: dependencies: balanced-match "^1.0.0" +brace-expansion@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + dependencies: + balanced-match "^4.0.2" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz" - integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.1.0: +buffer@^5.1.0, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -434,35 +513,53 @@ buffer@^5.1.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.2.4: - version "9.2.4" - resolved "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz" - integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== +builder-util-runtime@9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz#74125fb374d1ecbf472ae1787485485ff7619702" + integrity sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@24.13.1: - version "24.13.1" - resolved "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz" - integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== +builder-util@26.8.1: + version "26.8.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.8.1.tgz#50fdfc2d4ffeb6f739af363b5bd60c49c95d4170" + integrity sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" - app-builder-bin "4.0.0" - bluebird-lst "^1.0.9" - builder-util-runtime "9.2.4" + app-builder-bin "5.0.0-alpha.12" + builder-util-runtime "9.5.1" chalk "^4.1.2" - cross-spawn "^7.0.3" + cross-spawn "^7.0.6" debug "^4.3.4" fs-extra "^10.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-ci "^3.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" js-yaml "^4.1.0" + sanitize-filename "^1.6.3" source-map-support "^0.5.19" stat-mode "^1.0.0" temp-file "^3.4.0" + tiny-async-pool "1.3.0" + +cacache@^19.0.1: + version "19.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-19.0.1.tgz#3370cc28a758434c85c2585008bd5bdcff17d6cd" + integrity sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== + dependencies: + "@npmcli/fs" "^4.0.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^7.0.2" + ssri "^12.0.0" + tar "^7.4.3" + unique-filename "^4.0.0" cacheable-lookup@^5.0.3: version "5.0.4" @@ -495,7 +592,7 @@ caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^4.0.2, chalk@^4.1.2: +chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -503,20 +600,37 @@ chalk@^4.0.2, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz" integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +ci-info@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa" + integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== + +ci-info@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" + integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-truncate@^2.1.0: version "2.1.0" @@ -542,6 +656,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^1.9.1: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -612,14 +731,6 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -config-file-ts@^0.2.4: - version "0.2.6" - resolved "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz" - integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== - dependencies: - glob "^10.3.10" - typescript "^5.3.3" - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" @@ -632,9 +743,9 @@ crc@^3.8.0: dependencies: buffer "^5.1.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -662,6 +773,13 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + defer-to-connect@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" @@ -680,27 +798,31 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +detect-libc@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -dir-compare@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz" - integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== +dir-compare@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-4.2.0.tgz#d1d4999c14fbf55281071fdae4293b3b9ce86f19" + integrity sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ== dependencies: - buffer-equal "^1.0.0" - minimatch "^3.0.4" + minimatch "^3.0.5" + p-limit "^3.1.0 " -dmg-builder@24.13.3: - version "24.13.3" - resolved "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz" - integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== +dmg-builder@26.8.1: + version "26.8.1" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.8.1.tgz#df99aa790676ac2a2ac0333bbadbef3b6076cb03" + integrity sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg== dependencies: - app-builder-lib "24.13.3" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + app-builder-lib "26.8.1" + builder-util "26.8.1" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -721,15 +843,17 @@ dmg-license@^1.0.11: smart-buffer "^4.0.2" verror "^1.10.0" -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv-expand@^11.0.6: + version "11.0.7" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" + integrity sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA== + dependencies: + dotenv "^16.4.5" -dotenv@^9.0.2: - version "9.0.2" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz" - integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== +dotenv@^16.4.5: + version "16.6.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== dunder-proto@^1.0.1: version "1.0.1" @@ -760,20 +884,19 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^24.13.3: - version "24.13.3" - resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz" - integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== +electron-builder@^26.8.1: + version "26.8.1" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.8.1.tgz#d49056b2fe5d37f0f94aa2eb0e1db38f261fc8c0" + integrity sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw== dependencies: - app-builder-lib "24.13.3" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + app-builder-lib "26.8.1" + builder-util "26.8.1" + builder-util-runtime "9.5.1" chalk "^4.1.2" - dmg-builder "24.13.3" + ci-info "^4.2.0" + dmg-builder "26.8.1" fs-extra "^10.1.0" - is-ci "^3.0.0" lazy-val "^1.0.5" - read-config-file "6.3.2" simple-update-notifier "2.0.0" yargs "^17.6.2" @@ -812,15 +935,16 @@ electron-progressbar@^2.2.1: dependencies: extend "^3.0.1" -electron-publish@24.13.1: - version "24.13.1" - resolved "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz" - integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== +electron-publish@26.8.1: + version "26.8.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.8.1.tgz#6a32fa8eed0d41971dda53072bea06b9932be583" + integrity sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + builder-util "26.8.1" + builder-util-runtime "9.5.1" chalk "^4.1.2" + form-data "^4.0.5" fs-extra "^10.1.0" lazy-val "^1.0.5" mime "^2.5.2" @@ -849,6 +973,13 @@ enabled@2.0.x: resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" @@ -913,6 +1044,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +exponential-backoff@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz#51cf92c1c0493c766053f9d3abee4434c244d2f6" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== + ext-list@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz" @@ -966,6 +1102,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + fecha@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" @@ -996,9 +1137,9 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^4.0.0: +form-data@^4.0.5: version "4.0.5" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" @@ -1025,6 +1166,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.3.4" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.4.tgz#ab6934eca8bcf6f7f6b82742e33591f86301d6fc" + integrity sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -1044,12 +1194,12 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - minipass "^3.0.0" + minipass "^7.0.3" fs.realpath@^1.0.0: version "1.0.0" @@ -1104,9 +1254,9 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@^10.3.10: +glob@^10.2.2: version "10.5.0" - resolved "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== dependencies: foreground-child "^3.1.0" @@ -1152,7 +1302,7 @@ gopd@^1.2.0: resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -got@^11.8.5: +got@^11.7.0, got@^11.8.5: version "11.8.6" resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== @@ -1174,6 +1324,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" @@ -1230,14 +1385,18 @@ http-cache-semantics@^4.0.0: resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-proxy-agent@^5.0.0: - 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== +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" + agent-base "^7.1.0" + debug "^4.3.4" http-signature@~1.2.0: version "1.2.0" @@ -1256,12 +1415,12 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.1: - 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== +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "6" + agent-base "^7.1.2" debug "4" iconv-corefoundation@^1.1.7: @@ -1284,6 +1443,11 @@ ieee754@^1.1.13: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -1292,28 +1456,31 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== + is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - is-fullwidth-code-point@^3.0.0: 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== +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" @@ -1329,6 +1496,11 @@ is-typedarray@~1.0.0: resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" @@ -1344,6 +1516,11 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.5.tgz#42e368f68d5e10dadfee4fda7b550bc2d8892dc9" + integrity sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" @@ -1368,6 +1545,11 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +jiti@^2.4.2: + version "2.6.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== + js-yaml@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" @@ -1400,9 +1582,9 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^2.2.0: +json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: @@ -1443,7 +1625,7 @@ kuler@^2.0.0: resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -lazy-val@^1.0.4, lazy-val@^1.0.5: +lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== @@ -1453,6 +1635,14 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + logform@^2.3.2, logform@^2.4.0: version "2.6.0" resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz" @@ -1470,6 +1660,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.0.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^10.2.0: version "10.2.2" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" @@ -1482,6 +1677,23 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-fetch-happen@^14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz#d74c3ecb0028f08ab604011e0bc6baed483fcdcd" + integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== + dependencies: + "@npmcli/agent" "^3.0.0" + cacache "^19.0.1" + http-cache-semantics "^4.1.1" + minipass "^7.0.2" + minipass-fetch "^4.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^1.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + ssri "^12.0.0" + matcher@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz" @@ -1511,6 +1723,11 @@ mime@^2.5.2: resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" @@ -1521,32 +1738,78 @@ mimic-response@^3.1.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^10.0.3: + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.1: +minimatch@^5.0.1: version "5.1.9" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz" integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: +minimatch@^9.0.3, minimatch@^9.0.4: version "9.0.9" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: brace-expansion "^2.0.2" -minimist@^1.2.6: +minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-4.0.1.tgz#f2d717d5a418ad0b1a7274f9b913515d3e78f9e5" + integrity sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^3.0.1" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.7.tgz#145c383d5ae294b36030aa80d4e872d08bebcb73" + integrity sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^3.0.0: version "3.3.6" resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" @@ -1554,28 +1817,22 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minipass@^5.0.0, "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "5.0.0" resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -minipass@^7.1.2: +minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2: version "7.1.3" resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== +minizlib@^3.0.1, minizlib@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c" + integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + minipass "^7.1.2" modify-filename@^1.1.0: version "1.1.0" @@ -1596,11 +1853,53 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +node-abi@^4.2.0: + version "4.28.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-4.28.0.tgz#2c93b89b6bc2208155b3c3ed5620211da8eb62a5" + integrity sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g== + dependencies: + semver "^7.6.3" + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== +node-api-version@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.1.tgz#19bad54f6d65628cbee4e607a325e4488ace2de9" + integrity sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q== + dependencies: + semver "^7.3.5" + +node-gyp@^11.2.0: + version "11.5.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.5.0.tgz#82661b5f40647a7361efe918e3cea76d297fcc56" + integrity sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + graceful-fs "^4.2.6" + make-fetch-happen "^14.0.3" + nopt "^8.0.0" + proc-log "^5.0.0" + semver "^7.3.5" + tar "^7.4.3" + tinyglobby "^0.2.12" + which "^5.0.0" + +nopt@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.1.0.tgz#b11d38caf0f8643ce885818518064127f602eae3" + integrity sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== + dependencies: + abbrev "^3.0.0" + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" @@ -1635,11 +1934,45 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + 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" + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +"p-limit@^3.1.0 ": + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-map@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.4.tgz#b81814255f542e252d5729dca4d66e5ec14935b8" + integrity sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ== + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" @@ -1668,6 +2001,11 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +pe-library@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-0.4.1.tgz#e269be0340dcb13aa6949d743da7d658c3e2fbea" + integrity sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" @@ -1678,7 +2016,12 @@ performance-now@^2.1.0: resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -plist@^3.0.4, plist@^3.0.5: +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +plist@3.1.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz" integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== @@ -1687,6 +2030,11 @@ plist@^3.0.4, plist@^3.0.5: base64-js "^1.5.1" xmlbuilder "^15.1.1" +proc-log@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-5.0.0.tgz#e6c93cf37aef33f835c53485f314f50ea906a9d8" + integrity sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== + progress@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" @@ -1700,6 +2048,15 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + psl@^1.1.28: version "1.8.0" resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" @@ -1735,17 +2092,12 @@ quick-lru@^5.1.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -read-config-file@6.3.2: - version "6.3.2" - resolved "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz" - integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== +read-binary-file-arch@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" + integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== dependencies: - config-file-ts "^0.2.4" - dotenv "^9.0.2" - dotenv-expand "^5.1.0" - js-yaml "^4.1.0" - json5 "^2.2.0" - lazy-val "^1.0.4" + debug "^4.3.4" read-last-lines@^1.8.0: version "1.8.0" @@ -1794,6 +2146,13 @@ require-directory@^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== +resedit@^1.7.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/resedit/-/resedit-1.7.2.tgz#b1041170b99811710c13f949c7d225871de4cc78" + integrity sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA== + dependencies: + pe-library "^0.4.1" + resolve-alpn@^1.0.0: version "1.2.1" resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" @@ -1806,6 +2165,14 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" @@ -1855,18 +2222,28 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.2.0: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.8, semver@^7.5.3: +semver@^7.3.2, semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@^7.3.5, semver@^7.6.3, semver@~7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz" @@ -1886,6 +2263,11 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" @@ -1914,11 +2296,28 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -smart-buffer@^4.0.2: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + dependencies: + ip-address "^10.0.1" + smart-buffer "^4.2.0" + sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz" @@ -1966,6 +2365,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-12.0.0.tgz#bcb4258417c702472f8191981d3c8a771fee6832" + integrity sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ== + dependencies: + minipass "^7.0.3" + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" @@ -2045,17 +2451,16 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -tar@^6.1.12: - version "6.2.1" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== +tar@^7.4.3, tar@^7.5.6, tar@^7.5.7: + version "7.5.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.13.tgz#0d214ed56781a26edc313581c0e2d929ceeb866d" + integrity sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng== 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" + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.1.0" + yallist "^5.0.0" temp-file@^3.4.0: version "3.4.0" @@ -2084,6 +2489,21 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +tiny-async-pool@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz#c013e1b369095e7005db5595f95e646cca6ef8a5" + integrity sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA== + dependencies: + semver "^5.5.0" + +tinyglobby@^0.2.12: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz" @@ -2133,16 +2553,25 @@ type-fest@^0.13.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -typescript@^5.3.3: - version "5.4.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - undici-types@~6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== +unique-filename@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-4.0.0.tgz#a06534d370e7c977a939cd1d11f7f0ab8f1fed13" + integrity sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ== + dependencies: + unique-slug "^5.0.0" + +unique-slug@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-5.0.0.tgz#ca72af03ad0dbab4dad8aa683f633878b1accda8" + integrity sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" @@ -2201,6 +2630,13 @@ verror@^1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -2208,6 +2644,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-5.0.0.tgz#d93f2d93f79834d4363c7d0c23e00d07c466c8d6" + integrity sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ== + dependencies: + isexe "^3.1.1" + winston-transport@^4.7.0: version "4.7.0" resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz" @@ -2281,15 +2724,20 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.6.2: - version "17.6.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== +yargs@^17.0.1, yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -2306,3 +2754,8 @@ yauzl@^2.10.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6b7013066d23189bafbcf7c9a596b1716994e1f0 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:01:56 +0200 Subject: [PATCH 09/36] =?UTF-8?q?Chore(deps):=20Security=20=E2=80=94=20bum?= =?UTF-8?q?p=20h11=20and=20form-data=20(#2613)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 29 +++--- package.json | 8 ++ pyinstaller/electron/package-lock.json | 126 +++++++++++++------------ pyinstaller/electron/package.json | 8 ++ pyinstaller/electron/yarn.lock | 42 ++++++--- requirements.txt | 6 +- yarn.lock | 31 +++--- 7 files changed, 152 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index fec9c5d49..af01d5049 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2500,14 +2500,18 @@ } }, "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==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" @@ -7191,7 +7195,7 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", + "form-data": "^2.5.4", "http-signature": "~1.3.6", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -9101,14 +9105,17 @@ "dev": true }, "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==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" } }, "fragment-cache": { diff --git a/package.json b/package.json index 2202683e6..ade00cb8c 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,14 @@ "gulp": "^4.0.2", "tailwindcss": "^3.2.4" }, + "overrides": { + "@cypress/request": { + "form-data": "^2.5.4" + } + }, + "resolutions": { + "**/@cypress/request/form-data": "^2.5.4" + }, "scripts": { "dev": "gulp", "tailwind": "npx tailwindcss -i ./src/cryptoadvance/specter/static/style.css -o ./src/cryptoadvance/specter/static/output.css --watch", diff --git a/pyinstaller/electron/package-lock.json b/pyinstaller/electron/package-lock.json index 63b8bbe14..c5840c0ec 100644 --- a/pyinstaller/electron/package-lock.json +++ b/pyinstaller/electron/package-lock.json @@ -1427,7 +1427,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1970,7 +1969,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2301,7 +2299,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2311,7 +2308,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2321,7 +2317,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2334,7 +2329,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -2561,18 +2555,42 @@ } }, "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==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" } }, + "node_modules/form-data/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" + } + ], + "license": "MIT" + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2609,7 +2627,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2628,7 +2645,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2653,7 +2669,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -2772,7 +2787,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2858,7 +2872,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2871,7 +2884,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -2886,7 +2898,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3367,7 +3378,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3386,19 +3396,21 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -6149,7 +6161,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -6563,7 +6574,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6832,20 +6842,17 @@ "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "requires": { "es-errors": "^1.3.0" } @@ -6854,7 +6861,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "requires": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -7025,13 +7031,23 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "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==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "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==" + } } }, "fs-extra": { @@ -7063,8 +7079,7 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-caller-file": { "version": "2.0.5", @@ -7076,7 +7091,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -7094,7 +7108,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "requires": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -7185,8 +7198,7 @@ "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "got": { "version": "11.8.6", @@ -7246,14 +7258,12 @@ "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "requires": { "has-symbols": "^1.0.3" } @@ -7262,7 +7272,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -7613,8 +7622,7 @@ "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "mime": { "version": "2.6.0", @@ -7623,16 +7631,16 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -8150,7 +8158,7 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", + "form-data": "^2.5.4", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", diff --git a/pyinstaller/electron/package.json b/pyinstaller/electron/package.json index d09b8f89a..a7f55e486 100644 --- a/pyinstaller/electron/package.json +++ b/pyinstaller/electron/package.json @@ -60,5 +60,13 @@ "read-last-lines": "^1.8.0", "request": "^2.88.2", "winston": "^3.13.0" + }, + "overrides": { + "request": { + "form-data": "^2.5.4" + } + }, + "resolutions": { + "**/request/form-data": "^2.5.4" } } \ No newline at end of file diff --git a/pyinstaller/electron/yarn.lock b/pyinstaller/electron/yarn.lock index 53ebc5147..0fb9bf104 100644 --- a/pyinstaller/electron/yarn.lock +++ b/pyinstaller/electron/yarn.lock @@ -709,7 +709,7 @@ colorspace@1.1.x: color "3.0.x" text-hex "1.0.x" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1137,6 +1137,18 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^2.5.4, form-data@~2.3.2: + version "2.5.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.5.tgz#a5f6364ad7e4e67e95b4a07e2d8c6f711c74f624" + integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.35" + safe-buffer "^5.2.1" + form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -1148,15 +1160,6 @@ form-data@^4.0.5: hasown "^2.0.2" mime-types "^2.1.12" -form-data@~2.3.2: - 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" - fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" @@ -1591,7 +1594,7 @@ jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - dependencies: + optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: @@ -1711,6 +1714,11 @@ mime-db@1.44.0, mime-db@^1.28.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.27" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz" @@ -1718,6 +1726,13 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.44.0" +mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@^2.5.2: version "2.6.0" resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" @@ -2195,6 +2210,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" diff --git a/requirements.txt b/requirements.txt index 913302284..b5a2e857e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -300,9 +300,9 @@ gunicorn==23.0.0 \ --hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \ --hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec # via -r requirements.in -h11==0.14.0 \ - --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ - --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 # via wsproto hidapi==0.14.0 \ --hash=sha256:01929fbbe206ebcb0bad9b8e925e16de0aa8f872bf80a263f599e519866d9900 \ diff --git a/yarn.lock b/yarn.lock index 854c9e8ac..f0d802d58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -781,7 +781,7 @@ colorette@^2.0.16: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1449,6 +1449,18 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^2.5.4, form-data@~2.3.2: + version "2.5.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.5.tgz#a5f6364ad7e4e67e95b4a07e2d8c6f711c74f624" + integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.35" + safe-buffer "^5.2.1" + form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -1460,15 +1472,6 @@ form-data@^4.0.5: hasown "^2.0.2" mime-types "^2.1.12" -form-data@~2.3.2: - 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" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" @@ -2408,9 +2411,9 @@ mime-db@1.52.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" @@ -3131,9 +3134,9 @@ rxjs@^7.5.1, rxjs@^7.8.2: dependencies: tslib "^2.1.0" -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: From a793e2dce8df1c3c451b35b8b8f3664bf58c357a Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:27:32 +0200 Subject: [PATCH 10/36] test: bump tested bitcoind to v27.2.0 (#2609) Co-authored-by: Claude Opus 4.7 (1M context) --- pyproject.toml | 2 +- .../specter/devices/bitcoin_core.py | 16 +++-- tests/bitcoin_SHA256SUMS | 58 ++++++++++--------- tests/test_ep_wallet_api.py | 6 +- tests/test_wallet_txlist.py | 5 +- 5 files changed, 51 insertions(+), 36 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index faf36f277..c822bb7db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ write_to = "src/cryptoadvance/specter/_version.py" norecursedirs = "tests/bitcoin* tests/elements* tests/xtestdata_testextensions" log_format = "[%(levelname)8s] %(message)s %(name)s (%(filename)s:%(lineno)s)" -addopts = "--bitcoind-version v22.0.0 --elementsd-version v0.21.0.2" +addopts = "--bitcoind-version v27.2.0 --elementsd-version v0.21.0.2" markers = [ "slow: mark test as slow.", "elm: mark test as elementsd dependent", diff --git a/src/cryptoadvance/specter/devices/bitcoin_core.py b/src/cryptoadvance/specter/devices/bitcoin_core.py index 1a6facff6..9937ba7ca 100644 --- a/src/cryptoadvance/specter/devices/bitcoin_core.py +++ b/src/cryptoadvance/specter/devices/bitcoin_core.py @@ -65,13 +65,17 @@ class BitcoinCore(Device): def taproot_available(self, rpc): try: - # currently only master branch supports tr() descriptors - # TODO: replace to 220000 core_version = rpc.getnetworkinfo().get("version", 0) - info = rpc.getblockchaininfo() - taproot_active = (core_version >= 219900) and ( - info.get("softforks", {}).get("taproot", {}).get("active", False) - ) + if core_version >= 240000: + # Core 24 moved softfork status from getblockchaininfo.softforks + # to the getdeploymentinfo RPC's deployments field. + deployments = rpc.getdeploymentinfo().get("deployments", {}) + taproot_active = deployments.get("taproot", {}).get("active", False) + else: + softforks = rpc.getblockchaininfo().get("softforks", {}) + taproot_active = (core_version >= 219900) and softforks.get( + "taproot", {} + ).get("active", False) taproot_support = self.use_descriptors(rpc) and taproot_active self.taproot_support = taproot_support return taproot_support diff --git a/tests/bitcoin_SHA256SUMS b/tests/bitcoin_SHA256SUMS index 7649492d4..d120b70cc 100644 --- a/tests/bitcoin_SHA256SUMS +++ b/tests/bitcoin_SHA256SUMS @@ -1,8 +1,8 @@ -# Trusted reference: verbatim plaintext of https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS +# Trusted reference: verbatim plaintext of https://bitcoincore.org/bin/bitcoin-core-27.2/SHA256SUMS # Provenance: -# Source URL: https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS -# Signature URL: https://bitcoincore.org/bin/bitcoin-core-22.0/SHA256SUMS.asc -# Verified on: 2026-04-15 +# Source URL: https://bitcoincore.org/bin/bitcoin-core-27.2/SHA256SUMS +# Signature URL: https://bitcoincore.org/bin/bitcoin-core-27.2/SHA256SUMS.asc +# Verified on: 2026-04-19 # Verified by: Good signatures from: # - fanquake (primary fingerprint E777299FC265DD04793070EB944D35F9AC3DB76A, # signing subkey CFB16E21C950F67FA95E558F2EEB9F5CC09526C1) @@ -10,26 +10,30 @@ # Builder keys sourced from: https://github.com/bitcoin-core/guix.sigs/tree/main/builder-keys # Do not edit the hash lines below — they are the on-disk trust anchor compared # against downloaded tarballs by tests/install_noded.sh::verify_binary. -9547fa03574f8bde296f707c7d9f7d89827c75c5a28f84402578a4fa92a787ec bitcoin-22.0-aarch64-linux-gnu-debug.tar.gz -ac718fed08570a81b3587587872ad85a25173afa5f9fbbd0c03ba4d1714cfa3e bitcoin-22.0-aarch64-linux-gnu.tar.gz -80071e0ecd24edfec8a1972b495b9822c79a5d33c7123bff51688638aac97cab bitcoin-22.0-arm-linux-gnueabihf-debug.tar.gz -b8713c6c5f03f5258b54e9f436e2ed6d85449aa24c2c9972f91963d413e86311 bitcoin-22.0-arm-linux-gnueabihf.tar.gz -8f70852feb39078e02182563517d17bdfc4a12904cf1bdabbae95594d9a1e473 bitcoin-22.0-codesignatures-22.0.tar.gz -d0e9d089b57048b1555efa7cd5a63a7ed042482045f6f33402b1df425bf9613b bitcoin-22.0.tar.gz -bfc04a3c4e8b613bfd9359e54da6cc60f027860e9723f9a6bfd6f13873eb811f bitcoin-22.0-powerpc64-linux-gnu-debug.tar.gz -2cca5f99007d060aca9d8c7cbd035dfe2f040dd8200b210ce32cdf858479f70d bitcoin-22.0-powerpc64-linux-gnu.tar.gz -5f0bf1491bc8825ca1506f7cf586030f06bb17a563ccde92e8c75720022704e6 bitcoin-22.0-powerpc64le-linux-gnu-debug.tar.gz -91b1e012975c5a363b5b5fcc81b5b7495e86ff703ec8262d4b9afcfec633c30d bitcoin-22.0-powerpc64le-linux-gnu.tar.gz -59b16e63aa935f50fd2813efe7f137187fcf0fff84e3205a9c6cb462a8bb160c bitcoin-22.0-riscv64-linux-gnu-debug.tar.gz -9cc3a62c469fe57e11485fdd32c916f10ce7a2899299855a2e479256ff49ff3c bitcoin-22.0-riscv64-linux-gnu.tar.gz -3b3e2680f7d9304c13bfebaf6445ada40d72324b4b3e0a07de9db807389a6c5b bitcoin-22.0-osx-signed.dmg -52449aa894a6ce5653315e1260d0ce87c1d9f490afe3c92b44285710804b11ae bitcoin-22.0-osx-unsigned.dmg -f51156774c24c0ac5cc30237fa08aa17ed04a180dfd72c3e7d20fdc3f45806dc bitcoin-22.0-osx-unsigned.tar.gz -2744d199c3343b2d94faffdfb2c94d75a630ba27301a70e47b0ad30a7e0155e9 bitcoin-22.0-osx64.tar.gz -3a4f05657c048d3e9505bdb9c4fb3658e5e3d4233b0b93c1853e080620589765 bitcoin-22.0-x86_64-linux-gnu-debug.tar.gz -59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16 bitcoin-22.0-x86_64-linux-gnu.tar.gz -9169989d649937c0f9ebccd3ab088501328aa319fe9e91fc7ea8e8cf0fcccede bitcoin-22.0-win64-setup.exe -f890473d6d910d478f8ff08f9356d0305d19b46cf06e4fc3b5a49b0b684fd2a7 bitcoin-22.0-win-unsigned.tar.gz -0a97ebc8ae44913e3ef9c5b1ddd2af3a4ffb0ba25b6ab1ee8173e40e60499402 bitcoin-22.0-win64-debug.zip -ecc579d006230d6ffc5a5b7b53ce8c76477d37c1c7bad69694e9c2d69f00331d bitcoin-22.0-win64-setup-unsigned.exe -9485e4b52ed6cebfe474ab4d7d0c1be6d0bb879ba7246a8239326b2230a77eb1 bitcoin-22.0-win64.zip +eb0c8518ad2e96d01208f589ecd827b5a951be6dfcac418d4b807842a6ebdf65 bitcoin-27.2-aarch64-linux-gnu-debug.tar.gz +154c9b9e6e17136edc8f20fda5d252fb339e727e4a85ef49e7d8facb9085f2d3 bitcoin-27.2-aarch64-linux-gnu.tar.gz +4a05d46dcb74d337f62b78b884df080534677897fd9e1a0ae41253547789cef8 bitcoin-27.2-arm-linux-gnueabihf-debug.tar.gz +fb00da13525b52a4aad091c6521f94a79879e5ca0956c2302289301f71e6303c bitcoin-27.2-arm-linux-gnueabihf.tar.gz +3a4795d591c0e506e88ce227b17048d347be37611ba98837a71a16c3a5f908c6 bitcoin-27.2-arm64-apple-darwin.zip +4e91003a95108f85e85f92c3af23aa6108175a1d0a0c60cb515c2d3daf8a20f4 bitcoin-27.2-arm64-apple-darwin-unsigned.tar.gz +48800ea29baca2e27f1544fc0c4d4cd096a908291c1e681bd9daa632645bce06 bitcoin-27.2-arm64-apple-darwin-unsigned.zip +8f2247f4786f3559d37189b58452c91623efc5fa6886c975fa9386f9ff3f1001 bitcoin-27.2-arm64-apple-darwin.tar.gz +33b59d57b1a3f11ca9c7993891a359fdc19e62284be3235d3951053cbbe81a60 bitcoin-27.2-codesignatures-27.2.tar.gz +5a8b0094b3c6bc7f63c7fd6e0ba2e733a3022f09c0064c96ccd6e331bd7b9f6a bitcoin-27.2.tar.gz +6a273a634a04123c48c4a4be9ddbeeba27d2acdbefecd1025cfca1f30b394759 bitcoin-27.2-powerpc64-linux-gnu-debug.tar.gz +566ed37e33ce529c75d9d0c72ff3894d0d5a311bd5f21be2de7495937348e454 bitcoin-27.2-powerpc64-linux-gnu.tar.gz +6f9824a833a0c9a2c11cabf302cf0b0f573471cf8a7f0f7ad8723db4094515d5 bitcoin-27.2-powerpc64le-linux-gnu-debug.tar.gz +efb66cc2648b3968f7186c990640589bd6fd72d93879b0cc1ff2adef9cd377b9 bitcoin-27.2-powerpc64le-linux-gnu.tar.gz +fdc90b4692a5aaf04f6626b71fe40368ec0bcf000d066b1efdab99318000a3a8 bitcoin-27.2-riscv64-linux-gnu-debug.tar.gz +0c272ec7b7bb6bdee410fb177ceaab0df0373de5aed2228ab9fb4e6128ccc793 bitcoin-27.2-riscv64-linux-gnu.tar.gz +d74feac2e7bbb7df84c8f67ca6216ef4f83eb7e9c2213a901896d7814bfafb90 bitcoin-27.2-x86_64-apple-darwin.zip +cbac742ce80dac1b57d455680b3accb8f75c20e782169185ef519b3e0534d498 bitcoin-27.2-x86_64-apple-darwin-unsigned.tar.gz +8630d96eba03ecb57066442947cc08d58367666f96d825c636015ff458f46c16 bitcoin-27.2-x86_64-apple-darwin-unsigned.zip +6ebc56ca1397615d5a6df2b5cf6727b768e3dcac320c2d5c2f321dcaabc7efa2 bitcoin-27.2-x86_64-apple-darwin.tar.gz +8eb4e52ab1b3a27640a2c1a00c526815ab8a740443f963f5e6dfc5fdb37bcc2c bitcoin-27.2-x86_64-linux-gnu-debug.tar.gz +acc223af46c178064c132b235392476f66d486453ddbd6bca6f1f8411547da78 bitcoin-27.2-x86_64-linux-gnu.tar.gz +30e9a0e4b3e1e32aceb4773615c0a9ed54443b037ef541ea3be07508377cf128 bitcoin-27.2-win64-setup.exe +723a70ca4c0f7d0cef028d6cf502f595e3684c9f30c6c3c6b88d05c26b638c35 bitcoin-27.2-win64-debug.zip +5f779dbf911e75c4ca4a57b04f972a52006ed49de3519c640fef99a596b22e0e bitcoin-27.2-win64-setup-unsigned.exe +e92e8531f50915a74790689e6143d8d712b471233c38231f60bfa40ffb820bca bitcoin-27.2-win64-unsigned.tar.gz +82e18f768aa5962b3c002d7f5d6ec9338896804f48406af4b5054c927575dbdf bitcoin-27.2-win64.zip diff --git a/tests/test_ep_wallet_api.py b/tests/test_ep_wallet_api.py index 34fafb9a1..30c95b70d 100644 --- a/tests/test_ep_wallet_api.py +++ b/tests/test_ep_wallet_api.py @@ -181,7 +181,11 @@ def test_addressinfo(caplog, client, funded_ghost_machine_wallet): assert res.data.decode().startswith( '{"error":"Request error for method getaddressinfo' ) - assert res.data.decode().endswith('Invalid address format"}\n') + # Core 22 says "Invalid address format"; Core 24+ says "Invalid checksum". + assert ( + 'Invalid address format"}\n' in res.data.decode() + or 'Invalid checksum"}\n' in res.data.decode() + ) # send post request with address, not belonging to wallet # this recreates an edge case, see https://github.com/cryptoadvance/specter-desktop/issues/2000 diff --git a/tests/test_wallet_txlist.py b/tests/test_wallet_txlist.py index cbf2b4fac..8f691785f 100644 --- a/tests/test_wallet_txlist.py +++ b/tests/test_wallet_txlist.py @@ -347,7 +347,10 @@ def test_WalletAwareTxItem(bitcoin_regtest, parent_mock, empty_data_folder): print("\n\nOutgoing-Transaction (0.2 btc)") print("=========================================") - txid_outgoing_addr = "n4MN27Lk7Yh3pwfjCiAbRXtRVjs4Uk67fG" + # bech32 destination so Core keeps change as wpkh (Core 24+ matches change + # type to destination type; legacy destinations produce legacy change that + # the wpkh-only watch descriptor in this test does not recognise). + txid_outgoing_addr = "bcrt1qvtdx75y4554ngrq6aff3xdqnvjhmct5wck95qs" print(f"address = {txid_outgoing_addr}") txid_outgoing = wrpc.sendtoaddress(txid_outgoing_addr, 0.2) print(f"balance: {wrpc.getbalances()['mine']['trusted']}") From 5a4f24295f22b5ee302cb3d776adeca94369d36c Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Mon, 20 Apr 2026 09:29:09 +0200 Subject: [PATCH 11/36] ci: cache electron binaries + retry downloads on 502 (#2612) Co-authored-by: Claude Opus 4.7 (1M context) --- .github/workflows/release.yml | 71 ++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cf5ffcb5..039b68d23 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -267,6 +267,15 @@ jobs: name: specterd-linux path: ./release-artifacts + - name: Cache Electron binaries + uses: actions/cache@v4 + with: + path: | + ~/.cache/electron + ~/.cache/electron-builder + key: electron-linux-${{ hashFiles('pyinstaller/electron/package-lock.json') }} + restore-keys: electron-linux- + - name: Prepare Electron build run: | VERSION=${GITHUB_REF#refs/tags/} @@ -286,7 +295,17 @@ jobs: cp -R ../../src/cryptoadvance/specter/static/fonts \ ../../src/cryptoadvance/specter/static/output.css \ ../../src/cryptoadvance/specter/static/typography.css . - npm run dist -- --linux + # Retry: electron-builder downloads from github.com occasionally 502 + # (see release run 24636274855). + attempt=0 + until npm run dist -- --linux; do + attempt=$((attempt + 1)) + if [ $attempt -ge 3 ]; then + echo "electron-builder failed after $attempt attempts"; exit 1 + fi + echo "Attempt $attempt failed; retrying in $((attempt * 15))s..." + sleep $((attempt * 15)) + done cd ../.. - name: Package release @@ -311,6 +330,10 @@ jobs: runs-on: ubuntu-latest container: image: electronuserland/builder:wine + env: + # Shared HOME so `npm ci` (electron postinstall) and electron-builder + # write to the same ~/.cache/electron path — kept cacheable across runs. + HOME: /tmp/electron-home steps: - uses: actions/checkout@v4 with: @@ -319,6 +342,7 @@ jobs: - name: Install system dependencies run: | apt-get update && apt-get install -y unzip + mkdir -p $HOME - name: Download specterd Windows artifact uses: actions/download-artifact@v4 @@ -326,6 +350,15 @@ jobs: name: specterd-windows path: ./release-artifacts + - name: Cache Electron binaries + uses: actions/cache@v4 + with: + path: | + /tmp/electron-home/.cache/electron + /tmp/electron-home/.cache/electron-builder + key: electron-win-${{ hashFiles('pyinstaller/electron/package-lock.json') }} + restore-keys: electron-win- + - name: Prepare Electron build run: | VERSION=${GITHUB_REF#refs/tags/} @@ -339,15 +372,22 @@ jobs: cd ../.. - name: Build Electron app - env: - HOME: /tmp/electron-home run: | - mkdir -p $HOME cd pyinstaller/electron cp -R ../../src/cryptoadvance/specter/static/fonts \ ../../src/cryptoadvance/specter/static/output.css \ ../../src/cryptoadvance/specter/static/typography.css . - npm run dist -- --win + # Retry: electron-builder downloads from github.com occasionally 502 + # (see release run 24636274855). + attempt=0 + until npm run dist -- --win; do + attempt=$((attempt + 1)) + if [ $attempt -ge 3 ]; then + echo "electron-builder failed after $attempt attempts"; exit 1 + fi + echo "Attempt $attempt failed; retrying in $((attempt * 15))s..." + sleep $((attempt * 15)) + done cd ../.. - name: Package release @@ -401,6 +441,15 @@ jobs: name: specterd-macos-arm64 path: ./release-artifacts + - name: Cache Electron binaries + uses: actions/cache@v4 + with: + path: | + ~/Library/Caches/electron + ~/Library/Caches/electron-builder + key: electron-mac-${{ hashFiles('pyinstaller/electron/package-lock.json') }} + restore-keys: electron-mac- + - name: Import code signing certificate if: env.HAVE_APPLE_CERT == 'true' env: @@ -466,7 +515,17 @@ jobs: cp -R ../../src/cryptoadvance/specter/static/fonts \ ../../src/cryptoadvance/specter/static/output.css \ ../../src/cryptoadvance/specter/static/typography.css . - npm run dist -- --mac + # Retry: electron-builder downloads from github.com occasionally 502 + # (see release run 24636274855). + attempt=0 + until npm run dist -- --mac; do + attempt=$((attempt + 1)) + if [ $attempt -ge 3 ]; then + echo "electron-builder failed after $attempt attempts"; exit 1 + fi + echo "Attempt $attempt failed; retrying in $((attempt * 15))s..." + sleep $((attempt * 15)) + done cd ../.. env: # electron-builder reads these for notarization From 9e43afbdd03a756132d619718b9331dc535f61c4 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:46:33 +0200 Subject: [PATCH 12/36] =?UTF-8?q?Chore(deps):=20Security=20=E2=80=94=20hig?= =?UTF-8?q?h-severity=20pip=20bumps=20(incremental)=20(#2614)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.in | 10 +- requirements.txt | 364 +++++++++++++++++++++++++++-------------------- 2 files changed, 217 insertions(+), 157 deletions(-) diff --git a/requirements.in b/requirements.in index 71c717ead..b598a3184 100644 --- a/requirements.in +++ b/requirements.in @@ -2,7 +2,7 @@ certifi==2024.6.2 Click==8.1.7 Flask==2.2.5 Flask-Babel==3.1.0 -Flask-Cors==3.0.10 +Flask-Cors==6.0.0 Flask-Login==0.6.3 Flask-RESTful==0.3.10 Flask-HTTPAuth==4.8.0 @@ -14,17 +14,17 @@ six==1.16.0 stem==1.8.0 embit==0.6.1 psutil==5.9.0 -pyopenssl==24.1.0 +pyopenssl==26.0.0 flask_wtf==1.2.1 pgpy==0.6.0 -cbor2==5.4.6 +cbor2==5.9.0 mnemonic==0.21 -cryptography==42.0.7 +cryptography==46.0.6 Flask-APScheduler==1.12.4 gunicorn==23.0.0 simple-websocket==0.8.1 protobuf==4.23.3 -PyJWT==2.4.0 +PyJWT==2.12.0 pytimeparse==1.1.8 psycopg2-binary==2.9.5 aioitertools==0.11.0 diff --git a/requirements.txt b/requirements.txt index b5a2e857e..00ab63955 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,43 +20,51 @@ babel==2.15.0 \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 # via flask-babel -cbor2==5.4.6 \ - --hash=sha256:0b956f19e93ba3180c336282cd1b6665631f2d3a196a9c19b29a833bf979e7a4 \ - --hash=sha256:0bd12c54a48949d11f5ffc2fa27f5df1b4754111f5207453e5fae3512ebb3cab \ - --hash=sha256:0d2b926b024d3a1549b819bc82fdc387062bbd977b0299dd5fa5e0ea3267b98b \ - --hash=sha256:1618d16e310f7ffed141762b0ff5d8bb6b53ad449406115cc465bf04213cefcf \ - --hash=sha256:181ac494091d1f9c5bb373cd85514ce1eb967a8cf3ec298e8dfa8878aa823956 \ - --hash=sha256:1835536e76ea16e88c934aac5e369ba9f93d495b01e5fa2d93f0b4986b89146d \ - --hash=sha256:1c12c0ab78f5bc290b08a79152a8621822415836a86f8f4b50dadba371736fda \ - --hash=sha256:24144822f8d2b0156f4cda9427f071f969c18683ffed39663dc86bc0a75ae4dd \ - --hash=sha256:309fffbb7f561d67f02095d4b9657b73c9220558701c997e9bfcfbca2696e927 \ - --hash=sha256:3316f09a77af85e7772ecfdd693b0f450678a60b1aee641bac319289757e3fa0 \ - --hash=sha256:3545b16f9f0d5f34d4c99052829c3726020a07be34c99c250d0df87418f02954 \ - --hash=sha256:39452c799453f5bf33281ffc0752c620b8bfa0b7c13070b87d370257a1311976 \ - --hash=sha256:3950be57a1698086cf26d8710b4e5a637b65133c5b1f9eec23967d4089d8cfed \ - --hash=sha256:456cdff668a50a52fdb8aa6d0742511e43ed46d6a5b463dba80a5a720fa0d320 \ - --hash=sha256:4b9f3924da0e460a93b3674c7e71020dd6c9e9f17400a34e52a88c0af2dcd2aa \ - --hash=sha256:4bbbdb2e3ef274865dc3f279aae109b5d94f4654aea3c72c479fb37e4a1e7ed7 \ - --hash=sha256:4ce1a2c272ba8523a55ea2f1d66e3464e89fa0e37c9a3d786a919fe64e68dbd7 \ - --hash=sha256:56dfa030cd3d67e5b6701d3067923f2f61536a8ffb1b45be14775d1e866b59ae \ - --hash=sha256:6709d97695205cd08255363b54afa035306d5302b7b5e38308c8ff5a47e60f2a \ - --hash=sha256:6e1b5aee920b6a2f737aa12e2b54de3826b09f885a7ce402db84216343368140 \ - --hash=sha256:6f9c702bee2954fffdfa3de95a5af1a6b1c5f155e39490353d5654d83bb05bb9 \ - --hash=sha256:78304df140b9e13b93bcbb2aecee64c9aaa9f1cadbd45f043b5e7b93cc2f21a2 \ - --hash=sha256:79e048e623846d60d735bb350263e8fdd36cb6195d7f1a2b57eacd573d9c0b33 \ - --hash=sha256:7bbd3470eb685325398023e335be896b74f61b014896604ed45049a7b7b6d8ac \ - --hash=sha256:80ac8ba450c7a41c5afe5f7e503d3092442ed75393e1de162b0bf0d97edf7c7f \ - --hash=sha256:9394ca49ecdf0957924e45d09a4026482d184a465a047f60c4044eb464c43de9 \ - --hash=sha256:94f844d0e232aca061a86dd6ff191e47ba0389ddd34acb784ad9a41594dc99a4 \ - --hash=sha256:96087fa5336ebfc94465c0768cd5de0fcf9af3840d2cf0ce32f5767855f1a293 \ - --hash=sha256:b893500db0fe033e570c3adc956af6eefc57e280026bd2d86fd53da9f1e594d7 \ - --hash=sha256:c285a2cb2c04004bfead93df89d92a0cef1874ad337d0cb5ea53c2c31e97bfdb \ - --hash=sha256:d2984a488f350aee1d54fa9cb8c6a3c1f1f5b268abbc91161e47185de4d829f3 \ - --hash=sha256:d54bd840b4fe34f097b8665fc0692c7dd175349e53976be6c5de4433b970daa4 \ - --hash=sha256:db9eb582fce972f0fa429d8159b7891ff8deccb7affc4995090afc61ce0d328a \ - --hash=sha256:e5094562dfe3e5583202b93ef7ca5082c2ba5571accb2c4412d27b7d0ba8a563 \ - --hash=sha256:e73ca40dd3c7210ff776acff9869ddc9ff67bae7c425b58e5715dcf55275163f \ - --hash=sha256:ff95b33e5482313a74648ca3620c9328e9f30ecfa034df040b828e476597d352 +cbor2==5.9.0 \ + --hash=sha256:0322296b9d52f55880e300ba8ba09ecf644303b99b51138bbb1c0fb644fa7c3e \ + --hash=sha256:0485d3372fc832c5e16d4eb45fa1a20fc53e806e6c29a1d2b0d3e176cedd52b9 \ + --hash=sha256:08388ea54195738602b4c4999966bcaef6f0b17d293c9658658409d9fff96f57 \ + --hash=sha256:1d02b65f070fd726bdc310d927228975bb655d155bf059b6eb7cacefb3dca86f \ + --hash=sha256:1da96ce5d852fe3d342c1eb2c202a52d1c97edfddc9230f1be7e02674662bf26 \ + --hash=sha256:1f223dffb1bcdd2764665f04c1152943d9daa4bc124a576cd8dee1cad4264313 \ + --hash=sha256:23606d31ba1368bd1b6602e3020ee88fe9523ca80e8630faf6b2fc904fd84560 \ + --hash=sha256:2372d357d403e7912f104ff085950ffc82a5854d6d717f1ca1ce16a40a0ef5a7 \ + --hash=sha256:25bec7beb2089465382b1be72e78667fe9090598800826559c3e3008cf0db743 \ + --hash=sha256:27695cbd70c90b8de5c4a284642c2836449b14e2c2e07e3ffe0744cb7669a01b \ + --hash=sha256:2a54fbb32cb828c214f7f333a707e4aec61182e7efdc06ea5d9596d3ecee624a \ + --hash=sha256:3095dc49e75572841a9534cbfdabc2a17487ea4ee33341436abc4a7ac7245a3a \ + --hash=sha256:34a6cb15e6ab6a8eae94ad2041731cd3ef786af43a8df99f847969af5b902ee7 \ + --hash=sha256:380e534482b843e43442b87d8777a7bf9bed20cb7526f89b780c3400f617304b \ + --hash=sha256:420d2490c7836c81151b4bd591c35cffc55391e33e7e333c50fda391bcea7d31 \ + --hash=sha256:422817286c1d0ce947fb2f7eca9212b39bddd7231e8b452e2d2cc52f15332dba \ + --hash=sha256:4753a6d1bc71054d9179557bc65740860f185095ccb401d46637fff028a5b3ec \ + --hash=sha256:4aa07b392cc3d76fb31c08a46a226b58c320d1c172ff3073e864409ced7bc50f \ + --hash=sha256:4cd43d8fc374b31643b2830910f28177a606a7bc84975a62675dd3f2e320fc7b \ + --hash=sha256:5326336f633cc89dfe543c78829c16c3a6449c2c03277d1ddba99086c3323363 \ + --hash=sha256:53cfa49e0df9c639beb871d480de098eedc81eb63ff29f2dc922720d7577b676 \ + --hash=sha256:55bea0dd9a7d354e35f4e5fe58ceab393e76962713749dc3a0a64a0e5d19545e \ + --hash=sha256:5e702b02d42a5ace45425b595ffe70fe35aebaf9a3cdfdc2c758b6189c744422 \ + --hash=sha256:65f8eac3268c608533f326f0fd9010ab1b2a8a917b05edaf3853116336821669 \ + --hash=sha256:7221483fad0c63afa4244624d552abf89d7dfdbc5f5edfc56fc1ff2b4b818975 \ + --hash=sha256:7d1ddc4541e7367ac58c2470cc0df847f7137167fe4f5729e2d3cc0b993d7da4 \ + --hash=sha256:837754ece9052b3f607047e1741e5f852a538aa2b0ee3db11c82a8fa11804aa4 \ + --hash=sha256:85c7a46279ac8f226e1059275221e6b3d0e370d2bb6bd0500f9780781615bcea \ + --hash=sha256:86baf870d4c0bfc6f79de3801f3860a84ab76d9c8b0abb7f081f2c14c38d79d3 \ + --hash=sha256:971d425b3a23b75953d8853d5f9911bdeefa09d759ee3b5e6b07b5ff3cbd9073 \ + --hash=sha256:9a4907e0c3035bb8836116854ed8e56d8aef23909d601fa59706320897ec2551 \ + --hash=sha256:a9d6e4e0f988b0e766509a8071975a8ee99f930e14a524620bf38083106158d2 \ + --hash=sha256:ac684fe195c39821fca70d18afbf748f728aefbfbf88456018d299e559b8cae0 \ + --hash=sha256:ae6c706ac1d85a0b3cb3395308fd0c4d55e3202b4760773675957e93cdff45fc \ + --hash=sha256:cc5efec69055c3c470997935d95762be7e4bfd1248d88fb1a33bb7e0f45712e9 \ + --hash=sha256:d1a21c006760f95acd9509cc5a7d15d6fc82e58f721f94fa9039b4e77189a6e5 \ + --hash=sha256:d8524a8c142c3cc228e635f8a97499a6c0b18ca91382e8276565658035cdcb6d \ + --hash=sha256:dcf0f695873e5c94bd072d6af8698e72b8fb7f7a18f37e0bced1041b7111a6cf \ + --hash=sha256:f29e5c3abcc91c1aeefecde0e057bf33f1655588d3065c6560c30ceb3be6f333 \ + --hash=sha256:f797532d13469f2193e5c16e827d8df7a8c33674b19be755790b54ab231e6a73 \ + --hash=sha256:f7c9751a9611601ab326d8f5837f01379195bbf06175fb4effeb552140e7c9e8 \ + --hash=sha256:fb7afe77f8d269e42d7c4b515c6fd14f1ccc0625379fb6829b269f493d16eddd \ + --hash=sha256:fbb06f34aa645b4deca66643bba3d400d20c15312d1fe88d429be60c1ab50f27 \ + --hash=sha256:fbdcf4d74acbeb7672e6413e81cd2c1ced1a4a8cf949484ac54e9af5265c3c72 # via # -r requirements.in # hwi @@ -66,59 +74,91 @@ certifi==2024.6.2 \ # via # -r requirements.in # requests -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 +cffi==2.0.0 \ + --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \ + --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \ + --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \ + --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \ + --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \ + --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \ + --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \ + --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \ + --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \ + --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ + --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \ + --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \ + --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \ + --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \ + --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ + --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \ + --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \ + --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \ + --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ + --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ + --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \ + --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ + --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \ + --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \ + --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \ + --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ + --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ + --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \ + --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \ + --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \ + --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \ + --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ + --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \ + --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \ + --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ + --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \ + --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \ + --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ + --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ + --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \ + --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \ + --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \ + --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \ + --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \ + --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ + --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ + --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \ + --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \ + --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ + --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \ + --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \ + --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \ + --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \ + --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ + --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ + --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \ + --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \ + --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \ + --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ + --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \ + --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \ + --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \ + --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \ + --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \ + --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \ + --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ + --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \ + --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \ + --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ + --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \ + --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ + --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \ + --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ + --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \ + --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \ + --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ + --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \ + --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \ + --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \ + --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \ + --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \ + --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \ + --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \ + --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf # via cryptography charset-normalizer==2.0.12 \ --hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \ @@ -138,47 +178,64 @@ cryptoadvance-spectrum==0.7.0 \ --hash=sha256:40b31d38ad40c85438bc44d9243edb9ddbaf331c4468a48ebc0f40a109b43a62 \ --hash=sha256:6cd8858fa07668536345ecab08b4143e28055d7524c9b27b8c885c5b98730879 # via -r requirements.in -cryptography==42.0.7 \ - --hash=sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55 \ - --hash=sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785 \ - --hash=sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b \ - --hash=sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886 \ - --hash=sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82 \ - --hash=sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1 \ - --hash=sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda \ - --hash=sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f \ - --hash=sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68 \ - --hash=sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60 \ - --hash=sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7 \ - --hash=sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd \ - --hash=sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582 \ - --hash=sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc \ - --hash=sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858 \ - --hash=sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b \ - --hash=sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2 \ - --hash=sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678 \ - --hash=sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13 \ - --hash=sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4 \ - --hash=sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8 \ - --hash=sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604 \ - --hash=sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477 \ - --hash=sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e \ - --hash=sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a \ - --hash=sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9 \ - --hash=sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14 \ - --hash=sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda \ - --hash=sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da \ - --hash=sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562 \ - --hash=sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2 \ - --hash=sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9 +cryptography==46.0.6 \ + --hash=sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70 \ + --hash=sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d \ + --hash=sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a \ + --hash=sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0 \ + --hash=sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97 \ + --hash=sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30 \ + --hash=sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759 \ + --hash=sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c \ + --hash=sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead \ + --hash=sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275 \ + --hash=sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58 \ + --hash=sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f \ + --hash=sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361 \ + --hash=sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507 \ + --hash=sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa \ + --hash=sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b \ + --hash=sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b \ + --hash=sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8 \ + --hash=sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8 \ + --hash=sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72 \ + --hash=sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175 \ + --hash=sha256:6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e \ + --hash=sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124 \ + --hash=sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a \ + --hash=sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c \ + --hash=sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f \ + --hash=sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d \ + --hash=sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4 \ + --hash=sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c \ + --hash=sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290 \ + --hash=sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca \ + --hash=sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d \ + --hash=sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a \ + --hash=sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed \ + --hash=sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a \ + --hash=sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb \ + --hash=sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8 \ + --hash=sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707 \ + --hash=sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410 \ + --hash=sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736 \ + --hash=sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2 \ + --hash=sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4 \ + --hash=sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013 \ + --hash=sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19 \ + --hash=sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b \ + --hash=sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738 \ + --hash=sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463 \ + --hash=sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77 \ + --hash=sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4 # via # -r requirements.in # noiseprotocol # pgpy # pyopenssl -ecdsa==0.19.0 \ - --hash=sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a \ - --hash=sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8 +ecdsa==0.19.2 \ + --hash=sha256:62635b0ac1ca2e027f82122b5b81cb706edc38cd91c63dda28e4f3455a2bf930 \ + --hash=sha256:840f5dc5e375c68f36c1a7a5b9caad28f95daa65185c9253c0c08dd952bb7399 # via hwi embit==0.6.1 \ --hash=sha256:16a84c6668dc9ffc907594457a46f7142cee379646bc009a5a9b77b0d2cb4e12 @@ -206,9 +263,9 @@ flask-babel==3.1.0 \ --hash=sha256:be015772c5d7f046f3b99c508dcf618636eb93d21b713b356db79f3e79f69f39 \ --hash=sha256:deb3ee272d5adf97f5974ed09ab501243d63e7fb4a047501a00de4bd4aca4830 # via -r requirements.in -flask-cors==3.0.10 \ - --hash=sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438 \ - --hash=sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de +flask-cors==6.0.0 \ + --hash=sha256:4592c1570246bf7beee96b74bc0adbbfcb1b0318f6ba05c412e8909eceec3393 \ + --hash=sha256:6332073356452343a8ccddbfec7befdc3fdd040141fe776ec9b94c262f058657 # via -r requirements.in flask-httpauth==4.8.0 \ --hash=sha256:66568a05bc73942c65f1e2201ae746295816dc009edd84b482c44c758d75097a \ @@ -514,6 +571,10 @@ numpy==1.26.4 \ --hash=sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 \ --hash=sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f # via pandas +packaging==26.0 \ + --hash=sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4 \ + --hash=sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529 + # via gunicorn pandas==2.2.2 \ --hash=sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863 \ --hash=sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2 \ @@ -569,10 +630,6 @@ protobuf==4.23.3 \ # via # -r requirements.in # hwi -packaging==26.0 \ - --hash=sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529 \ - --hash=sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4 - # via gunicorn psutil==5.9.0 \ --hash=sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5 \ --hash=sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a \ @@ -685,21 +742,21 @@ psycopg2-binary==2.9.5 \ pyaes==1.6.1 \ --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f # via hwi -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 +pyasn1==0.6.3 \ + --hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \ + --hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde # via pgpy pycparser==2.22 \ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc # via cffi -pyjwt==2.4.0 \ - --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ - --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba +pyjwt==2.12.0 \ + --hash=sha256:2f62390b667cd8257de560b850bb5a883102a388829274147f1d724453f8fb02 \ + --hash=sha256:9bb459d1bdd0387967d287f5656bf7ec2b9a26645d1961628cda1764e087fd6e # via -r requirements.in -pyopenssl==24.1.0 \ - --hash=sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad \ - --hash=sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f +pyopenssl==26.0.0 \ + --hash=sha256:df94d28498848b98cc1c0ffb8ef1e71e40210d3b0a8064c9d29571ed2904bf81 \ + --hash=sha256:f293934e52936f2e3413b89c6ce36df66a0b34ae1ea3a053b8c5020ff2f513fc # via -r requirements.in pyserial==3.5 \ --hash=sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb \ @@ -735,8 +792,8 @@ pytz==2024.1 \ # flask-restful # pandas requests==2.31.0 \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via # -r requirements.in # cryptoadvance-spectrum @@ -755,7 +812,6 @@ six==1.16.0 \ # -r requirements.in # apscheduler # ecdsa - # flask-cors # flask-restful # python-dateutil specterext-exfund==0.1.7 \ @@ -829,10 +885,13 @@ tenacity==8.3.0 \ --hash=sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185 \ --hash=sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2 # via plotly -typing-extensions==4.11.0 \ - --hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \ - --hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a - # via hwi +typing-extensions==4.15.0 \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via + # cryptography + # hwi + # pyopenssl tzdata==2024.1 \ --hash=sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd \ --hash=sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 @@ -841,15 +900,16 @@ tzlocal==5.2 \ --hash=sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8 \ --hash=sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e # via apscheduler -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 +urllib3==2.6.3 \ + --hash=sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed \ + --hash=sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 # via requests werkzeug==3.0.3 \ --hash=sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18 \ --hash=sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8 # via # flask + # flask-cors # flask-login wsproto==1.2.0 \ --hash=sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065 \ From 64139ebdb7368745fd8a907cf62bfdfa4ee3d1e3 Mon Sep 17 00:00:00 2001 From: al-munazzim Date: Mon, 11 May 2026 21:22:50 +0200 Subject: [PATCH 13/36] ci: harden elements GPG key import in install_noded.sh (#2621) Co-authored-by: Nazim --- tests/install_noded.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/install_noded.sh b/tests/install_noded.sh index 99b909ffb..3eb2dd37a 100755 --- a/tests/install_noded.sh +++ b/tests/install_noded.sh @@ -317,14 +317,18 @@ function gpg_verify_sums { fi local imported=0 for fpr in "${keys[@]}"; do - # Try keys.openpgp.org first, then keyserver.ubuntu.com. - if curl -fsSL "https://keys.openpgp.org/vks/v1/by-fingerprint/${fpr}" 2>/dev/null \ - | gpg --import 2>/dev/null; then - imported=$((imported + 1)) - continue - fi - if curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x${fpr}&options=mr" 2>/dev/null \ - | gpg --import 2>/dev/null; then + # Import from both sources. Some keyservers may return partial key + # material for old signatures (e.g. missing signing subkeys). + # Importing from both increases robustness while keeping the same + # pinned trust anchors for verification. + curl -fsSL "https://keys.openpgp.org/vks/v1/by-fingerprint/${fpr}" 2>/dev/null \ + | gpg --import 2>/dev/null || true + curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x${fpr}&options=mr" 2>/dev/null \ + | gpg --import 2>/dev/null || true + + # Count this key as imported if it exists in the keyring after the + # multi-source import attempts. + if gpg --list-keys --with-colons "$fpr" 2>/dev/null | grep -q '^pub:'; then imported=$((imported + 1)) fi done From a1a82082ddd3a42ff2e01a77479590fa66d5083b Mon Sep 17 00:00:00 2001 From: Oren <115847146+oren-z0@users.noreply.github.com> Date: Sun, 17 May 2026 22:15:57 +0300 Subject: [PATCH 14/36] Update specterext-timelockrecovery to v0.2.3 (#2620) --- requirements.in | 2 +- requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.in b/requirements.in index b598a3184..86990f404 100644 --- a/requirements.in +++ b/requirements.in @@ -35,7 +35,7 @@ specterext-exfund==0.1.7 specterext-faucet==0.1.2 cryptoadvance.spectrum==0.7.0 specterext-stacktrack==0.3.0 -specterext-timelockrecovery==0.2.1 +specterext-timelockrecovery==0.2.3 # workarounds diff --git a/requirements.txt b/requirements.txt index 00ab63955..704474bb5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -824,9 +824,9 @@ specterext-stacktrack==0.3.0 \ --hash=sha256:14f96f1f552f57ba017b8bc642f07343edbb1abafe09e03bbaae179d78d7ce23 \ --hash=sha256:9e2946185730aab377951e83a27d8791a34e0f031e44f15991212b6b85722ca0 # via -r requirements.in -specterext-timelockrecovery==0.2.1 \ - --hash=sha256:2fc2a3eec045377b54926ff41dab9c5f5a6f46074150aec1ff67cb1456fef911 \ - --hash=sha256:35e181971b5b69ca6706496169c4581f2fa20706c88ba24760e56e153ec51939 +specterext-timelockrecovery==0.2.3 \ + --hash=sha256:a0b22c4e010061055da4ea6ea4e08bbc38d1f7c2ec58327970caa0ce987cba95 \ + --hash=sha256:5df3deb6245a22d48f75bbb62fd87dc141a9f60407011ce9fbb0a7bcc40fe4cc # via -r requirements.in sqlalchemy==1.4.52 \ --hash=sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94 \ From 314a8579a09c097f8691056d3de452e55e5aea27 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Fri, 22 May 2026 09:08:28 +0200 Subject: [PATCH 15/36] deps: bump hwi 2.4.0 -> 3.1.0 (drops Python 3.7/3.8) (#2616) --- docs/development.md | 31 ++++++ pyproject.toml | 5 +- requirements.in | 2 +- requirements.txt | 9 +- tests/conftest.py | 15 +++ tests/fixtures/jade_hardware.psbt | 1 + tests/fixtures/jade_seedqr_abandon.png | Bin 0 -> 354 bytes tests/fixtures/jade_seedqr_abandon.txt | 15 +++ tests/test_jade_hardware.py | 140 +++++++++++++++++++++++++ 9 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 tests/fixtures/jade_hardware.psbt create mode 100644 tests/fixtures/jade_seedqr_abandon.png create mode 100644 tests/fixtures/jade_seedqr_abandon.txt create mode 100644 tests/test_jade_hardware.py diff --git a/docs/development.md b/docs/development.md index 251ee8f64..bb0fcc955 100644 --- a/docs/development.md +++ b/docs/development.md @@ -14,6 +14,7 @@ - [Set up virtualenv](#set-up-virtualenv) - [If `pip install` fails on `cryptography==3.4.x`](#if-pip-install-fails-on-cryptography34x) - [How to run the tests](#how-to-run-the-tests) + - [Hardware-attended Jade tests](#hardware-attended-jade-tests) - [Code-Style](#code-style) - [Developing on tests](#developing-on-tests) - [bitcoin-specific stuff](#bitcoin-specific-stuff) @@ -209,6 +210,36 @@ Print the logging output live to the terminal: pytest --capture=no --log-cli-level=DEBUG ``` +### Hardware-attended Jade tests + +`tests/test_jade_hardware.py` exercises Specter's HWI integration end-to-end against a physical Blockstream Jade. It is gated by `--run-jade-hardware` and skipped by default, so GitHub Actions ignore it without any workflow change. + +Run with `-s` so operator prompts reach the terminal: +``` +pytest --run-jade-hardware tests/test_jade_hardware.py -s +``` + +Three tests, increasing operator effort: + +| Test | What it does | Operator action | +|---|---|---| +| `test_jade_enumerate_via_specter` | `HWIBridge.enumerate()` finds the Jade and returns a fingerprint | Connect Jade, unlock | +| `test_jade_extract_xpub_via_specter` | Pulls xpub at `m/84h/0h/0h` (mainnet) | Confirm xpub export on device | +| `test_jade_sign_psbt_via_specter` | Signs a canned testnet PSBT through Specter's sign path | Boot Jade in Temporary Signer mode, scan SeedQR, confirm tx | + +The signing test uses the public **BIP-39 abandon vector** (`abandon abandon ... about`) so the PSBT fixture matches anyone's Jade once they load that seed. Setup procedure: + +1. Power-cycle the Jade so it shows the boot menu. +2. Choose **Temporary Signer** -> **Scan SeedQR**. +3. Display `tests/fixtures/jade_seedqr_abandon.png` (or `cat tests/fixtures/jade_seedqr_abandon.txt` for the ASCII version) and scan it with the Jade camera. +4. When Jade asks for the network, select **TESTNET**. +5. Press Enter at the test prompt. +6. Confirm the transaction on the Jade screen when it pops up (~99,500 sats to a testnet bech32 output, ~99,500 change auto-validated, 1,000 fee). + +Temporary Signer state is held in RAM only and wiped on power-cycle/USB-unplug — your real seed is not affected. Expected master fingerprint for the abandon vector is `73c5da0a`; the test fails fast with a clear hint if the loaded seed is wrong. + +The fixture PSBT (`tests/fixtures/jade_hardware.psbt`) was generated with embit against m/84'/1'/0'/0/0 of the abandon vector, including a synthetic `non_witness_utxo` so Jade can verify the input amount per the SegWit fee-spoof mitigation. + Get the log-output of bitcoind side by side with the test-output. For sure you will only see the logs if the test fails. ``` pytest --bitcoind-log-stdout diff --git a/pyproject.toml b/pyproject.toml index c822bb7db..df8c7953d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ readme = "README.md" license = {file = "LICENSE"} -requires-python = ">=3.7,<4.0" +requires-python = ">=3.9,<3.13" dynamic = ["dependencies", "version"] @@ -52,7 +52,8 @@ markers = [ "slow: mark test as slow.", "elm: mark test as elementsd dependent", "bottleneck: mark a test as so ressource intensive that it can create a bottleneck where the test just fails due to a lack of ressources", - "threading: test needs threading to work" + "threading: test needs threading to work", + "jade_hardware: requires a real Jade attached and an operator; opt-in only via --run-jade-hardware" ] filterwarnings = [ diff --git a/requirements.in b/requirements.in index 86990f404..35282fa9e 100644 --- a/requirements.in +++ b/requirements.in @@ -6,7 +6,7 @@ Flask-Cors==6.0.0 Flask-Login==0.6.3 Flask-RESTful==0.3.10 Flask-HTTPAuth==4.8.0 -hwi==2.4.0 +hwi==3.1.0 python-dotenv==0.21.1 requests==2.31.0 pysocks==1.7.1 diff --git a/requirements.txt b/requirements.txt index 704474bb5..3d622e9b6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -432,9 +432,9 @@ hidapi==0.14.0 \ --hash=sha256:fb4e94e45f6dddb20d59501187721e5d3b02e6cc8a59d261dd5cac739008582a \ --hash=sha256:fc9ec2321bf3b0b4953910aa87c0c8ab5f93b1f113a9d3d4f18845ce54708d13 # via hwi -hwi==2.4.0 \ - --hash=sha256:3eaa7593f1ab360569eacdd9507dab75532bb58e8cd991d8ad72f5c4fcb67997 \ - --hash=sha256:7cb7ef2a4db4bc434815374d9bad43c6425491f77828314a2d2898d3e86d3f04 +hwi==3.1.0 \ + --hash=sha256:21ba92bb06e2f805e2806c686f2c50d02db6826a363b01e44052415755504d6f \ + --hash=sha256:42e875cbb616a91638fb90679cad93edb5075bf375e92fc1709be9b2a3dfd59c # via -r requirements.in idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ @@ -921,5 +921,6 @@ wtforms==3.1.2 \ # via flask-wtf # WARNING: The following packages were not pinned, but pip requires them to be -# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. +# pinned when the requirements file includes hashes and the requirement is not +# satisfied by a package already installed. Consider using the --allow-unsafe flag. # setuptools diff --git a/tests/conftest.py b/tests/conftest.py index a7368138a..6be08fab0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -89,9 +89,24 @@ def pytest_addoption(parser): default="master", help="Version of elementsd (something which works with git checkout ...)", ) + parser.addoption( + "--run-jade-hardware", + action="store_true", + default=False, + help="Run tests marked jade_hardware (real Jade attached + operator).", + ) listen() +def pytest_collection_modifyitems(config, items): + if config.getoption("--run-jade-hardware"): + return + skip = pytest.mark.skip(reason="opt-in via --run-jade-hardware") + for item in items: + if item.get_closest_marker("jade_hardware") is not None: + item.add_marker(skip) + + def pytest_generate_tests(metafunc): # ToDo: use custom compiled version of bitcoind # E.g. test again bitcoind version [currentRelease] + master-branch diff --git a/tests/fixtures/jade_hardware.psbt b/tests/fixtures/jade_hardware.psbt new file mode 100644 index 000000000..3a68aa829 --- /dev/null +++ b/tests/fixtures/jade_hardware.psbt @@ -0,0 +1 @@ +cHNidP8BAHECAAAAAYz9aGwGnHSzsZXBuDlKg9hNl6KeLvo8czy6WHaPTGwGAAAAAAD/////AqyEAQAAAAAAFgAUb6AWUAo8anN+uyYOLdyni6kjRVishAEAAAAAABYAFC80qhzwClOwVaKRoDp9RfCmmItSAAAAAAABAFMCAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wFR/////wFADQMAAAAAABYAFNDEo+8J6Ze26Z45flGP4+QaEYyhAAAAAAEBH0ANAwAAAAAAFgAU0MSj7wnpl7bpnjl+UY/j5BoRjKEiBgLnqyU3tdSelwMJquBunknzbOHJ/rvUTsjg0cygtPnDGRhzxdoKVAAAgAEAAIAAAACAAAAAAAAAAAAAACICA11J7M1U0AmeQ2did8em1GJdYR2oil30m/lReneRp3elGHPF2gpUAACAAQAAgAAAAIABAAAAAAAAAAA= diff --git a/tests/fixtures/jade_seedqr_abandon.png b/tests/fixtures/jade_seedqr_abandon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec31d505b9853c4cfeee5ef2fa10a7b45f29fc0 GIT binary patch literal 354 zcmV-o0iFJdP)-v^hyX>cot}JQToH_Y=1x(Y$2F+JyGFN=RewZflNQxie{->TR=jh1c-XRMh} zO`FFC%5_@l3f=ttQkjY1Y%QRtbd|Mv?4ly12y8#UV$iN^^9HJ!eQEU-*Q{*wmR`vV zNq9whkgdLY#ZOhKEIK@}oARYEn9{ZAHjQV^N2e^@F`maE86ncq9sFxU*#Y~9rvBwu zeFaZUvGnzC44v*cbc6d1Dl|I#q^A8KgEKvdMGtJ&wRv2F%6w~;bF}?Mtok2HuPK|? z&%>7Njo=>6?5qCw8#t ``Scan SeedQR``. + 3. Scan ``tests/fixtures/jade_seedqr_abandon.png`` (or display + ``tests/fixtures/jade_seedqr_abandon.txt`` and scan from screen). + 4. Confirm the **testnet** network on Jade. + 5. The PSBT at ``tests/fixtures/jade_hardware.psbt`` is fabricated by + Coldcard's psbt_faker against this exact seed. + +Temporary Signer state lives in RAM only; it's wiped on power-cycle. Your +real seed is not affected. +""" + +from pathlib import Path + +import pytest + +from cryptoadvance.specter.hwi_rpc import HWIBridge + + +FIXTURE_DIR = Path(__file__).parent / "fixtures" +PSBT_FIXTURE = FIXTURE_DIR / "jade_hardware.psbt" +SEEDQR_PNG = FIXTURE_DIR / "jade_seedqr_abandon.png" +SEEDQR_TXT = FIXTURE_DIR / "jade_seedqr_abandon.txt" + +ABANDON_FINGERPRINT = "73c5da0a" + + +def _enumerate_jade(bridge: HWIBridge, chain: str = "main"): + # HWIBridge.enumerate defaults chain="" which Chain.argparse passes + # through unchanged; Jade's enumerate then fails with + # "Unhandled network: ". Pass an explicit chain. + devs = bridge.enumerate(chain=chain) + return [d for d in devs if d.get("type") == "jade"] + + +def _prompt(msg: str) -> None: + print(f"\n>>> {msg}") + try: + input(">>> Press Enter when ready... ") + except EOFError: + pass + + +@pytest.mark.jade_hardware +def test_jade_enumerate_via_specter(): + """Jade is detected by Specter's HWIBridge and reports a fingerprint.""" + _prompt("Connect and unlock the Jade.") + bridge = HWIBridge(skip_hwi_initialisation=True) + jades = _enumerate_jade(bridge) + assert jades, "no Jade detected — connect, unlock, and rerun" + jade = jades[0] + assert jade.get("fingerprint"), f"Jade enumerated without fingerprint: {jade}" + assert jade.get("path"), f"Jade enumerated without path: {jade}" + + +@pytest.mark.jade_hardware +def test_jade_extract_xpub_via_specter(): + """Specter can pull an xpub at a known derivation from Jade.""" + _prompt("Unlock the Jade. You may be asked to confirm the xpub export.") + bridge = HWIBridge(skip_hwi_initialisation=True) + jades = _enumerate_jade(bridge) + assert jades, "no Jade detected" + fingerprint = jades[0].get("fingerprint") + assert fingerprint, f"Jade enumerated without fingerprint: {jades[0]}" + + # chain must be passed explicitly: HWIBridge.extract_xpub default is + # chain="" which Specter's JadeClient.__init__ rejects via _network() + # before extract_xpub's post-init override can apply. + xpub_line = bridge.extract_xpub( + derivation="m/84h/0h/0h", + device_type="jade", + fingerprint=fingerprint, + chain="main", + ) + assert xpub_line, "extract_xpub returned empty" + assert xpub_line.startswith("["), f"unexpected format: {xpub_line!r}" + assert "]" in xpub_line, f"unexpected format: {xpub_line!r}" + body = xpub_line.split("]", 1)[1].strip() + assert body.startswith(("xpub", "zpub", "ypub")), f"unexpected xpub: {body[:8]}" + + +@pytest.mark.jade_hardware +def test_jade_sign_psbt_via_specter(): + """End-to-end: Specter signs the canned abandon-vector PSBT through Jade. + + Requires Jade in Temporary Signer mode with the abandon-vector seed + (see module docstring). The fixture PSBT was generated by Coldcard's + psbt_faker against m/84'/1'/0' on testnet; xfp is 73c5da0a. + """ + assert PSBT_FIXTURE.exists(), f"missing fixture: {PSBT_FIXTURE}" + + seedqr_hint = ( + f"\n PNG: {SEEDQR_PNG}\n" + f" ASCII: cat {SEEDQR_TXT}" + ) + _prompt( + "Put Jade in Temporary Signer mode -> Scan SeedQR -> select TESTNET." + f"\n SeedQR for the BIP-39 abandon-vector lives at:{seedqr_hint}\n" + " Then confirm the transaction on device when prompted." + ) + + psbt_b64 = PSBT_FIXTURE.read_text().strip() + + bridge = HWIBridge(skip_hwi_initialisation=True) + jades = _enumerate_jade(bridge, chain="test") + assert jades, "no Jade detected" + fingerprint = jades[0].get("fingerprint") + assert fingerprint, f"Jade enumerated without fingerprint: {jades[0]}" + assert fingerprint.lower() == ABANDON_FINGERPRINT, ( + f"connected Jade fingerprint is {fingerprint}; " + f"expected {ABANDON_FINGERPRINT} (abandon-vector). " + "Are you in Temporary Signer mode with the right SeedQR?" + ) + + signed = bridge.sign_tx( + psbt=psbt_b64, + device_type="jade", + fingerprint=fingerprint, + chain="test", + ) + assert signed, "sign_tx returned empty" + assert signed != psbt_b64, "PSBT was returned unsigned" From febcf619d98a6fd1d97c15050150fd77f80d7b8c Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:35:14 +0200 Subject: [PATCH 16/36] Bump Spectrum to 0.8.0 (#2641) --- requirements.in | 2 +- requirements.txt | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/requirements.in b/requirements.in index 35282fa9e..e4a6f7802 100644 --- a/requirements.in +++ b/requirements.in @@ -33,7 +33,7 @@ aioitertools==0.11.0 cryptoadvance-liquidissuer==0.2.4 specterext-exfund==0.1.7 specterext-faucet==0.1.2 -cryptoadvance.spectrum==0.7.0 +cryptoadvance.spectrum==0.8.0 specterext-stacktrack==0.3.0 specterext-timelockrecovery==0.2.3 diff --git a/requirements.txt b/requirements.txt index 3d622e9b6..1124d940f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --generate-hashes requirements.in +# pip-compile --cert=None --client-cert=None --generate-hashes --index-url=None --pip-args=None requirements.in # aioitertools==0.11.0 \ --hash=sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394 \ @@ -174,9 +174,9 @@ cryptoadvance-liquidissuer==0.2.4 \ --hash=sha256:5a2c531801854c5a4a46daf184877e22f731cdb42d2cfb840785bda7371ba6fb \ --hash=sha256:9e468f3e35ecc566b3f74a2263677cf26632548abb194521dba15ad37acd1e9b # via -r requirements.in -cryptoadvance-spectrum==0.7.0 \ - --hash=sha256:40b31d38ad40c85438bc44d9243edb9ddbaf331c4468a48ebc0f40a109b43a62 \ - --hash=sha256:6cd8858fa07668536345ecab08b4143e28055d7524c9b27b8c885c5b98730879 +cryptoadvance-spectrum==0.8.0 \ + --hash=sha256:cc91eef05f6417898e735b793b91135ddd989fe223ff51aeaa4bc278eb15c3ed \ + --hash=sha256:d3a53b21ca13d8e6a014ff2c0b0e68f8d4eef2c1efbe6383ae018c15409c67c1 # via -r requirements.in cryptography==46.0.6 \ --hash=sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70 \ @@ -825,8 +825,8 @@ specterext-stacktrack==0.3.0 \ --hash=sha256:9e2946185730aab377951e83a27d8791a34e0f031e44f15991212b6b85722ca0 # via -r requirements.in specterext-timelockrecovery==0.2.3 \ - --hash=sha256:a0b22c4e010061055da4ea6ea4e08bbc38d1f7c2ec58327970caa0ce987cba95 \ - --hash=sha256:5df3deb6245a22d48f75bbb62fd87dc141a9f60407011ce9fbb0a7bcc40fe4cc + --hash=sha256:5df3deb6245a22d48f75bbb62fd87dc141a9f60407011ce9fbb0a7bcc40fe4cc \ + --hash=sha256:a0b22c4e010061055da4ea6ea4e08bbc38d1f7c2ec58327970caa0ce987cba95 # via -r requirements.in sqlalchemy==1.4.52 \ --hash=sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94 \ @@ -921,6 +921,5 @@ wtforms==3.1.2 \ # via flask-wtf # WARNING: The following packages were not pinned, but pip requires them to be -# pinned when the requirements file includes hashes and the requirement is not -# satisfied by a package already installed. Consider using the --allow-unsafe flag. +# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. # setuptools From 44c5fdeaadf06b3bfe2d4b717bf688a94f953c01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 21:13:02 +0200 Subject: [PATCH 17/36] Chore(deps): Bump jinja2 from 3.1.4 to 3.1.6 (#2670) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1124d940f..0f6dbab6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -352,7 +352,9 @@ greenlet==2.0.2 \ --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 - # via -r requirements.in + # via + # -r requirements.in + # sqlalchemy gunicorn==23.0.0 \ --hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \ --hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec @@ -446,9 +448,9 @@ itsdangerous==2.2.0 \ # via # flask # flask-wtf -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # via # flask # flask-babel @@ -921,5 +923,6 @@ wtforms==3.1.2 \ # via flask-wtf # WARNING: The following packages were not pinned, but pip requires them to be -# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. +# pinned when the requirements file includes hashes and the requirement is not +# satisfied by a package already installed. Consider using the --allow-unsafe flag. # setuptools From 54b3616b405e6ddd5ccfb24f8437f0f4cef0ef20 Mon Sep 17 00:00:00 2001 From: al-munazzim Date: Tue, 4 Aug 2026 16:56:52 +0200 Subject: [PATCH 18/36] fix: restore Ledger udev hidraw fallback (#2633) Co-authored-by: Nazim Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com> --- udev/20-hw1.rules | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/udev/20-hw1.rules b/udev/20-hw1.rules index 02d630bd6..99f386b88 100644 --- a/udev/20-hw1.rules +++ b/udev/20-hw1.rules @@ -1,12 +1,8 @@ -# HW.1 / Nano +# HW.1, Nano SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="1b7c|2b7c|3b7c|4b7c", TAG+="uaccess", TAG+="udev-acl" -# Blue -SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0000|0000|0001|0002|0003|0004|0005|0006|0007|0008|0009|000a|000b|000c|000d|000e|000f|0010|0011|0012|0013|0014|0015|0016|0017|0018|0019|001a|001b|001c|001d|001e|001f", TAG+="uaccess", TAG+="udev-acl" -# Nano S -SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0001|1000|1001|1002|1003|1004|1005|1006|1007|1008|1009|100a|100b|100c|100d|100e|100f|1010|1011|1012|1013|1014|1015|1016|1017|1018|1019|101a|101b|101c|101d|101e|101f", TAG+="uaccess", TAG+="udev-acl" -# Aramis -SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0002|2000|2001|2002|2003|2004|2005|2006|2007|2008|2009|200a|200b|200c|200d|200e|200f|2010|2011|2012|2013|2014|2015|2016|2017|2018|2019|201a|201b|201c|201d|201e|201f", TAG+="uaccess", TAG+="udev-acl" -# HW2 -SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0003|3000|3001|3002|3003|3004|3005|3006|3007|3008|3009|300a|300b|300c|300d|300e|300f|3010|3011|3012|3013|3014|3015|3016|3017|3018|3019|301a|301b|301c|301d|301e|301f", TAG+="uaccess", TAG+="udev-acl" -# Nano X -SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0004|4000|4001|4002|4003|4004|4005|4006|4007|4008|4009|400a|400b|400c|400d|400e|400f|4010|4011|4012|4013|4014|4015|4016|4017|4018|4019|401a|401b|401c|401d|401e|401f", TAG+="uaccess", TAG+="udev-acl" \ No newline at end of file + +# Blue, NanoS, Aramis, HW.2, Nano X, NanoSP, Stax, Ledger Test, +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", TAG+="uaccess", TAG+="udev-acl" + +# Same, but with hidraw-based library (instead of libusb) +KERNEL=="hidraw*", ATTRS{idVendor}=="2c97", MODE="0666" From fe232048d42179c4eae405da01baa19c616870db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:57:20 +0200 Subject: [PATCH 19/36] Chore(deps-dev): Bump electron from 39.8.5 to 39.8.10 in /pyinstaller/electron (#2680) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyinstaller/electron/package-lock.json | 14 +++++++------- pyinstaller/electron/package.json | 2 +- pyinstaller/electron/yarn.lock | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pyinstaller/electron/package-lock.json b/pyinstaller/electron/package-lock.json index c5840c0ec..9bd574d00 100644 --- a/pyinstaller/electron/package-lock.json +++ b/pyinstaller/electron/package-lock.json @@ -19,7 +19,7 @@ "winston": "^3.13.0" }, "devDependencies": { - "electron": "^39.8.5", + "electron": "^39.8.10", "electron-builder": "^26.8.1" } }, @@ -2010,9 +2010,9 @@ } }, "node_modules/electron": { - "version": "39.8.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.5.tgz", - "integrity": "sha512-q6+LiQIcTadSyvtPgLDQkCtVA9jQJXQVMrQcctfOJILh6OFMN+UJJLRkuUTy8CZDYeCIBn1ZycqsL1dAXugxZA==", + "version": "39.8.10", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.10.tgz", + "integrity": "sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6605,9 +6605,9 @@ } }, "electron": { - "version": "39.8.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.5.tgz", - "integrity": "sha512-q6+LiQIcTadSyvtPgLDQkCtVA9jQJXQVMrQcctfOJILh6OFMN+UJJLRkuUTy8CZDYeCIBn1ZycqsL1dAXugxZA==", + "version": "39.8.10", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.8.10.tgz", + "integrity": "sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ==", "dev": true, "requires": { "@electron/get": "^2.0.0", diff --git a/pyinstaller/electron/package.json b/pyinstaller/electron/package.json index a7f55e486..8a1af0c7a 100644 --- a/pyinstaller/electron/package.json +++ b/pyinstaller/electron/package.json @@ -20,7 +20,7 @@ "author": "Specter", "license": "MIT", "devDependencies": { - "electron": "^39.8.5", + "electron": "^39.8.10", "electron-builder": "^26.8.1" }, "build": { diff --git a/pyinstaller/electron/yarn.lock b/pyinstaller/electron/yarn.lock index 0fb9bf104..915d63a2f 100644 --- a/pyinstaller/electron/yarn.lock +++ b/pyinstaller/electron/yarn.lock @@ -949,10 +949,10 @@ electron-publish@26.8.1: lazy-val "^1.0.5" mime "^2.5.2" -electron@^39.8.5: - version "39.8.5" - resolved "https://registry.yarnpkg.com/electron/-/electron-39.8.5.tgz#422d42318d993a77a960ea1a9b4bfb4822221388" - integrity sha512-q6+LiQIcTadSyvtPgLDQkCtVA9jQJXQVMrQcctfOJILh6OFMN+UJJLRkuUTy8CZDYeCIBn1ZycqsL1dAXugxZA== +electron@^39.8.10: + version "39.8.10" + resolved "https://registry.yarnpkg.com/electron/-/electron-39.8.10.tgz#998d9c5b9e7601debb70bd7355e8d4dfd6d70f43" + integrity sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ== dependencies: "@electron/get" "^2.0.0" "@types/node" "^22.7.7" From 0b027f49fdf7d649cf782bf585d5ff30610cd756 Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sat, 8 Aug 2026 14:12:46 +0200 Subject: [PATCH 20/36] fix: dev-server crash in the specter-desktop repo after the project-rename (#2686) Co-authored-by: Claude Opus 5 --- .github/workflows/test.yml | 25 ++++++++++ src/cryptoadvance/specter/util/reflection.py | 52 ++++++++++++-------- tests/test_util_reflection.py | 51 +++++++++++++++++-- tests/test_util_shell.py | 15 +++++- 4 files changed, 116 insertions(+), 27 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 58f6a44c5..6611f4827 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -196,6 +196,31 @@ jobs: pip3 install -r requirements.txt --require-hashes pip3 install -e ".[test]" + - name: Dev-server smoketest (from the repo-root) + # No job used to start the dev-server from the repo-root the way + # docs/development.md describes it. That's why #2526 (renaming the + # project to cryptoadvance_specter) could break it unnoticed. + run: | + source ./.env/bin/activate + export SPECTER_DATA_FOLDER=$(mktemp -d) + # --debug enables the werkzeug-reloader which forks a child-process, so + # start a new process-group we can kill as a whole further down + setsid python3 -m cryptoadvance.specter server --config DevelopmentConfig --debug > specterd.log 2>&1 & + specterd_pid=$! + started="" + for i in $(seq 1 30); do + if curl -sf http://127.0.0.1:25441/ > /dev/null; then started="yes"; break; fi + sleep 2 + done + kill -- -$specterd_pid || true + # the next step needs port 25441, so make sure it's free again + for i in $(seq 1 10); do + curl -sf http://127.0.0.1:25441/ > /dev/null || break + sleep 1 + done + cat specterd.log + if [ -z "$started" ]; then echo "The dev-server did not come up!"; exit 1; fi + - name: Extension smoketest run: | git config --global user.name "CI CD" diff --git a/src/cryptoadvance/specter/util/reflection.py b/src/cryptoadvance/specter/util/reflection.py index 708730c28..70cfca46f 100644 --- a/src/cryptoadvance/specter/util/reflection.py +++ b/src/cryptoadvance/specter/util/reflection.py @@ -5,11 +5,11 @@ import os from pathlib import Path import pkgutil from pkgutil import iter_modules +import re import sys from typing import List from .common import camelcase2snake_case from ..specter_error import SpecterError, SpecterInternalException -from .shell import grep from .reflection_fs import detect_extension_style_in_cwd, search_dirs_in_path @@ -130,6 +130,29 @@ def get_classlist_of_type_clazz_from_modulelist(clazz, modulelist, skip_missing= return class_list +def is_specter_desktop_project(cwd=".") -> bool: + """Whether cwd is the specter-desktop project itself rather than an + extension-project. Detected via the project-name in the pyproject.toml. + Hmm, a bit hackish but we don't want to depend on toml-parsing libs. + """ + try: + with open(Path(cwd, "pyproject.toml")) as pyproject_file: + for line in pyproject_file: + line = line.strip().replace(" ", "").replace("'", "").replace('"', "") + if not line.startswith("name="): + continue + # PEP 503: ".", "-" and "_" are equivalent in project-names, so + # "cryptoadvance.specter" and "cryptoadvance_specter" are the same + name = re.sub(r"[-_.]+", "-", line[len("name=") :]).lower() + if name == "cryptoadvance-specter": + return True + except FileNotFoundError: + # Expected for adhoc-style extension-projects: those have no + # pyproject.toml at all and are therefore not specter-desktop + pass + return False + + def get_subclasses_for_clazz_in_cwd(clazz, cwd=".") -> List[type]: """Returns all subclasses of class clazz located in the CWD if the cwd is not a specter-desktop dev-env-kind-of-dir or contains any .py-file @@ -140,37 +163,26 @@ def get_subclasses_for_clazz_in_cwd(clazz, cwd=".") -> List[type]: return [] # if not testing but in a folder which looks like specter-desktop/src --> No dynamic extensions - if "PYTEST_CURRENT_TEST" not in os.environ: - # Hmm, a bit hackish but if the pyproject.toml specifies cryptoadvance.specter as a name and - # we don't need to depend on toml-parsing libs, that should be ok. - try: - found, line = grep("./pyproject.toml", 'name = "cryptoadvance.specter"') - if found: - return [] - if line: - line = line.replace(" ", "").replace("'", "").replace('"', "") - if line == "name=cryptoadvance.specter": - return [] - except FileNotFoundError: - pass + if "PYTEST_CURRENT_TEST" not in os.environ and is_specter_desktop_project(cwd): + return [] - # Depending on the style we either add "." or "./src" to the searchpath + # Depending on the style we either add cwd or cwd/src to the searchpath - extension_style = detect_extension_style_in_cwd() + extension_style = detect_extension_style_in_cwd(cwd) # raise Exception(extension_style) if extension_style == "adhoc": - package_dirs.append(Path(".")) + package_dirs.append(Path(cwd)) elif extension_style == "publish-ready": - package_dirs.extend(search_dirs_in_path(Path("./src"))) + package_dirs.extend(search_dirs_in_path(Path(cwd, "src"))) elif extension_style == "specter-desktop": if "PYTEST_CURRENT_TEST" in os.environ: # I admit, ugly hack logger.info("We're in testing mode. Adding CWD to searchpath") - package_dirs.append(Path("./src")) + package_dirs.append(Path(cwd, "src")) else: raise Exception( f""" - We checked before that we're not in the specter-desktop home + We checked before that we're not in the specter-desktop home directory but now the extension-style is 'specter-desktop' ?! This should not happen! """ diff --git a/tests/test_util_reflection.py b/tests/test_util_reflection.py index 6890a6039..fb737515e 100644 --- a/tests/test_util_reflection.py +++ b/tests/test_util_reflection.py @@ -11,6 +11,7 @@ from cryptoadvance.specter.util.reflection import ( get_subclasses_for_clazz, get_subclasses_for_clazz_in_cwd, get_classlist_of_type_clazz_from_modulelist, + is_specter_desktop_project, _get_module_from_class, get_package_dir_for_subclasses_of, search_dirs_in_path, @@ -119,13 +120,53 @@ def test_get_classlist_raises_on_missing_module_by_default(): get_classlist_of_type_clazz_from_modulelist(Service, modulelist) +repo_root = Path(__file__).parent.parent +xtestdata = repo_root / "tests" / "xtestdata_testextensions" + + +def test_is_specter_desktop_project(): + """The specter-desktop project detects itself via the name in its own + pyproject.toml. If that name changes (PEP 503 allows "." "-" and "_" to be + used interchangeably), the dev-server dies on startup, see #2526.""" + assert is_specter_desktop_project(repo_root) + assert not is_specter_desktop_project(xtestdata / "ext_root_fully_qualified_1") + assert not is_specter_desktop_project(xtestdata) + + +def test_is_specter_desktop_project_pep503_names(tmp_path): + for name in [ + "cryptoadvance.specter", + "cryptoadvance_specter", + "Cryptoadvance-Specter", + ]: + (tmp_path / "pyproject.toml").write_text( + f'[project]\nname = "{name}"\nversion = "1.2.3"\n' + ) + assert is_specter_desktop_project(tmp_path), f"{name} should be detected" + + (tmp_path / "pyproject.toml").write_text( + '[project]\nname = "boatacccorp.tretboot"\n' + ) + assert not is_specter_desktop_project(tmp_path) + + +def test_get_subclasses_for_clazz_in_cwd_in_specter_desktop_project(monkeypatch): + """No dynamic extension-discovery in the specter-desktop project itself. + Regression test: this used to raise "This should not happen!" when the + project got renamed to cryptoadvance_specter, breaking + `python3 -m cryptoadvance.specter server --config DevelopmentConfig`""" + # the production code takes a shortcut for tests, so pretend we're not testing + monkeypatch.delenv("PYTEST_CURRENT_TEST", raising=False) + assert get_subclasses_for_clazz_in_cwd(Service, cwd=repo_root) == [] + + def test_get_subclasses_for_clazz_in_cwd(caplog): caplog.set_level(logging.DEBUG) - classlist: List[type] = get_subclasses_for_clazz_in_cwd( - Service, cwd="./tests/xtestdata_testextensions" - ) - # damn, this is difficult to test - # assert len(classlist) == 3 + classlist: List[type] = get_subclasses_for_clazz_in_cwd(Service, cwd=xtestdata) + # That folder is a container of extension-projects, not an extension-project + # itself, so there is nothing importable in there + assert classlist == [] + assert "Detected Extension-style: adhoc" in caplog.text def test_get_subclasses_for_class(caplog): diff --git a/tests/test_util_shell.py b/tests/test_util_shell.py index 9b08b078e..73a7d9c30 100644 --- a/tests/test_util_shell.py +++ b/tests/test_util_shell.py @@ -23,7 +23,18 @@ def test_last_lines(caplog): assert lines[-2].startswith("OUT OF OR IN CONNECTION WITH THE SOFTWARE ") -def test_grep(): +def test_grep(tmp_path): + """grep returns a (found, line)-tuple. Asserting on the tuple itself is + always truthy, so always assert on the first element!""" from cryptoadvance.specter.util.shell import grep - assert grep("./pyproject.toml", 'name = "cryptoadvance.specter"') + some_file = tmp_path / "some_file.txt" + some_file.write_text('name = "cryptoadvance_specter"\nversion = "1.2.3"\n') + + found, line = grep(str(some_file), 'name = "cryptoadvance_specter"') + assert found + assert line.strip() == 'name = "cryptoadvance_specter"' + + found, line = grep(str(some_file), "does not exist") + assert not found + assert line is None From 48fea77b8aa5ac166df0263675204f529595fa7b Mon Sep 17 00:00:00 2001 From: k9ert <117085+k9ert@users.noreply.github.com> Date: Sat, 8 Aug 2026 14:57:14 +0200 Subject: [PATCH 21/36] fix: validate active API tokens (#2685) --- .gitignore | 4 + src/cryptoadvance/specter/api/security.py | 18 +++- src/cryptoadvance/specter/user.py | 8 +- tests/test_jwt.py | 101 ++++++++++++++++++++++ tests/test_rest.py | 23 +++-- 5 files changed, 137 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index ba0a6ec05..321fc7c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,7 @@ _bmad-output/ # Claude Code local workspace .claude/ + +# Local agent workspaces +/.agents/ +/.history/ diff --git a/src/cryptoadvance/specter/api/security.py b/src/cryptoadvance/specter/api/security.py index ea03e1c00..92d297e26 100644 --- a/src/cryptoadvance/specter/api/security.py +++ b/src/cryptoadvance/specter/api/security.py @@ -40,11 +40,21 @@ def verify_token(jwt_token): return abort(401) try: payload = jwt.decode(jwt_token, app.config["SECRET_KEY"], algorithms=["HS256"]) - username = payload["username"] - the_user = app.specter.user_manager.get_user_by_username(username) - if not the_user: + username = payload.get("username") + jwt_token_id = payload.get("jwt_token_id") + if ( + not isinstance(username, str) + or not username + or not isinstance(jwt_token_id, str) + or not jwt_token_id + ): return abort(401) - g.user = app.specter.user_manager.get_user_by_username(username) + the_user = app.specter.user_manager.get_user_by_username(username) + if not the_user or not the_user.verify_jwt_token_id_and_jwt_token( + jwt_token_id, jwt_token + ): + return abort(401) + g.user = the_user logger.info({"payload": payload}) logger.info(f"Rest-Request for user {username} PASSED JWT-test") return username diff --git a/src/cryptoadvance/specter/user.py b/src/cryptoadvance/specter/user.py index 28aef4d76..5462fa807 100644 --- a/src/cryptoadvance/specter/user.py +++ b/src/cryptoadvance/specter/user.py @@ -463,10 +463,10 @@ class User(UserMixin): def verify_jwt_token_id_and_jwt_token(self, jwt_token_id, jwt_token): # Verifying the JWT token ID and JWT token - if jwt_token_id in self.jwt_tokens: - if self.jwt_tokens[jwt_token_id]["jwt_token"] == jwt_token: - return True - return False + if not isinstance(self.jwt_tokens, dict) or not isinstance(jwt_token_id, str): + return False + token_info = self.jwt_tokens.get(jwt_token_id) + return isinstance(token_info, dict) and token_info.get("jwt_token") == jwt_token def get_jwt_token(self, jwt_token_id): # Getting a JWT token from the hashmap by ID diff --git a/tests/test_jwt.py b/tests/test_jwt.py index f8349fd48..fd3e1c51d 100644 --- a/tests/test_jwt.py +++ b/tests/test_jwt.py @@ -82,6 +82,99 @@ def test_token_endpoints(client, empty_data_folder, caplog): assert data["jwt_token_life"] == 360 jwt_token_id = data["jwt_token_id"] + jwt_token = data["jwt_token"] + + # API-created tokens remain registered after the user store is reloaded. + client.application.specter.user_manager.update() + + # An active, registered token authenticates successfully. The missing wallet + # is rejected by authorization after authentication has completed. + token_headers = {"Authorization": "Bearer " + jwt_token} + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers=token_headers, + ) + assert response.status_code == 403 + + # A signed token must still be registered in the user's active token store. + unregistered_token = User.generate_jwt_token( + "someuser", User.generate_token_id(), "unregistered", 360 + ) + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers={"Authorization": "Bearer " + unregistered_token}, + ) + assert response.status_code == 401 + + # Missing and non-string token identifiers fail closed. + expiry = datetime.datetime.utcnow() + datetime.timedelta(seconds=360) + invalid_payloads = [ + {"username": "someuser", "exp": expiry}, + {"username": "someuser", "jwt_token_id": ["invalid"], "exp": expiry}, + ] + for invalid_payload in invalid_payloads: + invalid_token = jwt.encode( + invalid_payload, + client.application.config["SECRET_KEY"], + algorithm="HS256", + ) + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers={"Authorization": "Bearer " + invalid_token}, + ) + assert response.status_code == 401 + + # A different signed token cannot borrow an active token's identifier. + mismatched_token = User.generate_jwt_token( + "someuser", jwt_token_id, "mismatched", 360 + ) + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers={"Authorization": "Bearer " + mismatched_token}, + ) + assert response.status_code == 401 + + # Malformed persisted records fail closed instead of raising an error. + user_details = client.application.specter.user_manager.get_user_by_username( + "someuser" + ) + stored_token_info = user_details.jwt_tokens[jwt_token_id] + user_details.jwt_tokens[jwt_token_id] = {} + user_details.save_info() + client.application.specter.user_manager.update() + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers=token_headers, + ) + assert response.status_code == 401 + user_details = client.application.specter.user_manager.get_user_by_username( + "someuser" + ) + user_details.jwt_tokens[jwt_token_id] = stored_token_info + user_details.save_info() + + # A malformed persisted token container also fails closed after reload. + stored_tokens = user_details.jwt_tokens + user_details.jwt_tokens = [] + user_details.save_info() + client.application.specter.user_manager.update() + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers=token_headers, + ) + assert response.status_code == 401 + user_details = client.application.specter.user_manager.get_user_by_username( + "someuser" + ) + user_details.jwt_tokens = stored_tokens + user_details.save_info() + client.application.specter.user_manager.update() # testing GET request response = client.get("/api/v1alpha/token", follow_redirects=True, headers=headers) @@ -133,6 +226,14 @@ def test_token_endpoints(client, empty_data_folder, caplog): data = json.loads(response.data) assert data["message"] == "Token deleted" + # Deletion immediately revokes the bearer token. + response = client.get( + "/api/v1alpha/wallets/missing/psbt", + follow_redirects=True, + headers=token_headers, + ) + assert response.status_code == 401 + # retry accessing a deleted token response = client.get( "/api/v1alpha/token/" + jwt_token_id, follow_redirects=True, headers=headers diff --git a/tests/test_rest.py b/tests/test_rest.py index 1f2ba2792..9dfb3ae84 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -17,6 +17,17 @@ from cryptoadvance.specter.user import User logger = logging.getLogger(__name__) +def create_registered_jwt_token(specter, username): + user = specter.user_manager.get_user_by_username(username) + jwt_token_id = User.generate_token_id() + jwt_token_life = 3600 + jwt_token = User.generate_jwt_token( + username, jwt_token_id, "test token", jwt_token_life + ) + user.add_jwt_token(jwt_token_id, jwt_token, "test token", jwt_token_life) + return jwt_token + + def almost_equal(a: Number, b: Number, precision: float = 0.01) -> bool: """ Checks if a and b are not very different. @@ -58,9 +69,7 @@ def test_rr_psbt_get(client, specter_regtest_configured, bitcoin_regtest, caplog # Admin but not authorized (admin is NOT allowed to read everything) headers = { "Authorization": "Bearer " - + User.generate_jwt_token( - "admin", "tokenid", "tokendescription", random.randrange(100, 200) - ) + + create_registered_jwt_token(specter_regtest_configured, "admin") } result = client.get( "/api/v1alpha/wallets/a_simple_wallet/psbt", @@ -76,9 +85,7 @@ def test_rr_psbt_get(client, specter_regtest_configured, bitcoin_regtest, caplog # Proper authorized (the wallet is owned by someuser) headers = { "Authorization": "Bearer " - + User.generate_jwt_token( - "someuser", "tokenid", "tokendescription", random.randrange(100, 200) - ) + + create_registered_jwt_token(specter_regtest_configured, "someuser") } result = client.get( "/api/v1alpha/wallets/a_simple_wallet/psbt", @@ -97,9 +104,7 @@ def test_rr_psbt_post(specter_regtest_configured, bitcoin_regtest, client, caplo headers = { "Authorization": "Bearer " - + User.generate_jwt_token( - "someuser", "tokenid", "tokendescription", random.randrange(100, 200) - ), + + create_registered_jwt_token(specter_regtest_configured, "someuser"), "Content-type": "application/json", } From 3d554fbc2ed13d94f5069282f19c3651c6384ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Nagy?= Date: Sat, 8 Aug 2026 19:33:01 +0300 Subject: [PATCH 22/36] Warn on ColdCard Mk3 seed-entropy advisory at device setup (#2676) Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com> --- src/cryptoadvance/specter/static/output.css | 4 ++++ .../templates/device/new_device/new_device_keys.jinja | 10 ++++++++++ .../specter/templates/device/new_device_manual.jinja | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/cryptoadvance/specter/static/output.css b/src/cryptoadvance/specter/static/output.css index b669522b6..427873a33 100644 --- a/src/cryptoadvance/specter/static/output.css +++ b/src/cryptoadvance/specter/static/output.css @@ -1100,6 +1100,10 @@ input[type="number"]::-webkit-outer-spin-button, z-index: 50; } +.z-20 { + z-index: 20; +} + .z-30 { z-index: 30; } diff --git a/src/cryptoadvance/specter/templates/device/new_device/new_device_keys.jinja b/src/cryptoadvance/specter/templates/device/new_device/new_device_keys.jinja index 6b5f35a79..e0a0661db 100644 --- a/src/cryptoadvance/specter/templates/device/new_device/new_device_keys.jinja +++ b/src/cryptoadvance/specter/templates/device/new_device/new_device_keys.jinja @@ -30,6 +30,16 @@

{% endif %} + +

{{ _("Connect your ColdCard to the computer via USB and unlock it or upload a wallet export file from micro SD card.") }}

diff --git a/src/cryptoadvance/specter/templates/device/new_device_manual.jinja b/src/cryptoadvance/specter/templates/device/new_device_manual.jinja index f0357c52b..3eb1a1558 100644 --- a/src/cryptoadvance/specter/templates/device/new_device_manual.jinja +++ b/src/cryptoadvance/specter/templates/device/new_device_manual.jinja @@ -49,7 +49,7 @@

{{ _("Specify account number (advanced)") }}

-
+
{{ _("Scan QR Code") }} From 693338d3afd1afd11604e8178dedc8280e26bbd9 Mon Sep 17 00:00:00 2001 From: Bunlong Heng Date: Sat, 8 Aug 2026 13:13:31 -0400 Subject: [PATCH 23/36] fix(swan): add timeout to remote HTTP requests to prevent hang (#2687) Co-authored-by: k9ert <117085+k9ert@users.noreply.github.com> Co-authored-by: Claude Opus 5 --- .../specter/services/extension_gen.py | 4 +- src/cryptoadvance/specterext/swan/client.py | 61 +++++++++++++----- tests/test_specterext_swan_client.py | 62 +++++++++++++++++++ 3 files changed, 109 insertions(+), 18 deletions(-) diff --git a/src/cryptoadvance/specter/services/extension_gen.py b/src/cryptoadvance/specter/services/extension_gen.py index a0304d49d..e47a1a6aa 100644 --- a/src/cryptoadvance/specter/services/extension_gen.py +++ b/src/cryptoadvance/specter/services/extension_gen.py @@ -152,7 +152,7 @@ class ExtGen: shutil.copy(sourcepath, targetpath) print(f" --> Created {targetpath} (copied)") else: - r = requests.get(self.env.loader.url_for_template(sourcepath)) + r = requests.get(self.env.loader.url_for_template(sourcepath), timeout=30) open(targetpath, "wb").write(r.content) print(f" --> Created {targetpath} (via Github)") @@ -233,7 +233,7 @@ class GithubUrlLoader(BaseLoader): def get_source(self, environment, template): url = self.url_for_template(template) for attempt in range(3): - r = requests.get(url) + r = requests.get(url, timeout=30) if r.status_code == 200: return r.text, url, None if r.status_code == 429 and attempt < 2: diff --git a/src/cryptoadvance/specterext/swan/client.py b/src/cryptoadvance/specterext/swan/client.py index 70b44bbfd..c9695fbcc 100644 --- a/src/cryptoadvance/specterext/swan/client.py +++ b/src/cryptoadvance/specterext/swan/client.py @@ -137,12 +137,25 @@ class SwanClient: ).decode() auth_header["Authorization"] = f"Basic {auth_hash}" - response = requests.post( - f"{self.api_url}/oidc/token", - data=payload, - headers=auth_header, - ) - resp = json.loads(response.text) + try: + response = requests.post( + f"{self.api_url}/oidc/token", + data=payload, + headers=auth_header, + timeout=30, + ) + except requests.exceptions.RequestException as e: + logger.exception(e) + raise SwanApiException( + f"Could not reach the Swan API ({self.api_url}/oidc/token): {e}" + ) from e + try: + resp = json.loads(response.text) + except ValueError as e: + logger.error(f"{response.status_code}: {response.text}") + raise SwanApiException( + f"Swan API returned no valid json ({response.status_code}): {response.text}" + ) from e """ { "access_token": "***************", @@ -184,27 +197,43 @@ class SwanClient: "User-Agent": "Specter Desktop", "Authorization": f"Bearer {access_token}", } + request_context = f"endpoint: {self.api_url}{endpoint} | method: {method} | payload: {json.dumps(json_payload, indent=4)}" + try: if method == "GET": - response = requests.get(self.api_url + endpoint, headers=auth_header) + response = requests.get( + self.api_url + endpoint, headers=auth_header, timeout=30 + ) elif method in ["POST", "PATCH", "PUT", "DELETE"]: response = requests.request( method=method, url=self.api_url + endpoint, headers=auth_header, json=json_payload, + timeout=30, ) - if response.status_code != 200: - raise SwanApiException(f"{response.status_code}: {response.text}") - return response.json() - except Exception as e: - # TODO: tighten up expected Exceptions + else: + raise SwanApiException(f"Unsupported method: {method}") + except requests.exceptions.RequestException as e: + # Timeouts, connection errors, ... : no response to report about logger.exception(e) - logger.error( - f"endpoint: {self.api_url}{endpoint} | method: {method} | payload: {json.dumps(json_payload, indent=4)}" - ) + logger.error(request_context) + raise SwanApiException(f"Could not reach the Swan API: {e}") from e + + if response.status_code != 200: + logger.error(request_context) logger.error(f"{response.status_code}: {response.text}") - raise e + raise SwanApiException(f"{response.status_code}: {response.text}") + + try: + return response.json() + except ValueError as e: + logger.exception(e) + logger.error(request_context) + logger.error(f"{response.status_code}: {response.text}") + raise SwanApiException( + f"Swan API returned no valid json ({response.status_code}): {response.text}" + ) from e def get_autowithdrawal_addresses(self, swan_wallet_id: str) -> dict: """ diff --git a/tests/test_specterext_swan_client.py b/tests/test_specterext_swan_client.py index c4475773e..6b9a41fbb 100644 --- a/tests/test_specterext_swan_client.py +++ b/tests/test_specterext_swan_client.py @@ -6,7 +6,10 @@ from unittest.mock import MagicMock import pytest import mock from mock import Mock, patch +import requests + from cryptoadvance.specterext.swan.client import ( + SwanApiException, SwanApiRefreshTokenException, SwanClient, ) @@ -106,6 +109,65 @@ def test_expired_access_token(): sc._get_access_token() +def construct_client_with_valid_token(): + """A client which won't need to fetch an access_token first""" + return SwanClient( + "a_hostname", "forever_valid_access_token", 5000000000, "a_refresh_token" + ) + + +def test_authenticated_request_get_timeout(app_no_node): + """A timeout must surface as SwanApiException, not as an UnboundLocalError""" + sc = construct_client_with_valid_token() + with app_no_node.app_context(): + with mock.patch( + "requests.get", side_effect=requests.exceptions.Timeout("simulated timeout") + ): + with pytest.raises(SwanApiException) as exc_info: + sc.authenticated_request("/some/endpoint") + assert "simulated timeout" in str(exc_info.value) + assert isinstance(exc_info.value.__cause__, requests.exceptions.Timeout) + + +def test_authenticated_request_post_timeout(app_no_node): + """Same for the methods going through requests.request""" + sc = construct_client_with_valid_token() + with app_no_node.app_context(): + with mock.patch( + "requests.request", + side_effect=requests.exceptions.ConnectTimeout("simulated timeout"), + ): + with pytest.raises(SwanApiException) as exc_info: + sc.authenticated_request( + "/some/endpoint", method="POST", json_payload={"muuh": "meeh"} + ) + assert isinstance(exc_info.value.__cause__, requests.exceptions.ConnectTimeout) + + +def test_authenticated_request_error_status_code(app_no_node): + sc = construct_client_with_valid_token() + fake_response = Mock() + fake_response.status_code = 500 + fake_response.text = "Internal Server Error" + with app_no_node.app_context(): + with mock.patch("requests.get", return_value=fake_response): + with pytest.raises(SwanApiException, match="500: Internal Server Error"): + sc.authenticated_request("/some/endpoint") + + +def test_get_access_token_timeout(app_no_node): + """The token-endpoint is used before authenticated_request can even start""" + sc = SwanClient("a_hostname", "an_expired_access_token", 1000, "a_refresh_token") + with app_no_node.app_context(): + with mock.patch( + "requests.post", + side_effect=requests.exceptions.Timeout("simulated timeout"), + ): + with pytest.raises(SwanApiException) as exc_info: + sc.authenticated_request("/some/endpoint") + assert isinstance(exc_info.value.__cause__, requests.exceptions.Timeout) + + @patch("requests.delete") @patch("requests.request") @patch("requests.patch") From 426ed39aacf7b695a4d7be516329fb2dd3c45b6a Mon Sep 17 00:00:00 2001 From: al-munazzim Date: Sat, 8 Aug 2026 19:48:20 +0200 Subject: [PATCH 24/36] Warn that Specter auth does not encrypt data folder (#2683) Co-authored-by: Nazim --- docs/faq.md | 7 +++++++ .../specter/templates/settings/auth_settings.jinja | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/docs/faq.md b/docs/faq.md index 43211f3e9..819dce3e2 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -31,6 +31,7 @@ - [*Can this also work with external nodes like Casa, MyNode, and Raspilitz?*](#can-this-also-work-with-external-nodes-like-casa-mynode-and-raspilitz) - [*Can I use Tor?*](#can-i-use-tor) - [I forgot my password, how can I reset it?](#i-forgot-my-password-how-can-i-reset-it) + - [Does the Specter password encrypt my wallet data files?](#does-the-specter-password-encrypt-my-wallet-data-files) - [BACKING UP FUNDS](#backing-up-funds) - [*If something happens to the `~/.specter` folder, is it still possible to **restore** access to multisigs created there (assuming there is no backup of the `~/.specter` folder)?*](#if-something-happens-to-the-specter-folder-is-it-still-possible-to-restore-access-to-multisigs-created-there-assuming-there-is-no-backup-of-the-specter-folder) - [*To recover a multisig that was built on specter (eg: 2 of 3 with ColdCard), is having the seeds of all 3 signing wallets sufficient or do we need to backup more info?*](#to-recover-a-multisig-that-was-built-on-specter-eg-2-of-3-with-coldcard-is-having-the-seeds-of-all-3-signing-wallets-sufficient-or-do-we-need-to-backup-more-info) @@ -241,6 +242,12 @@ Depending on "what's written in `somethingInHere`: * If it's `usernamepassword`, you won't be able to recover the password but you can deactivate it by setting it to `none` and restart Specter. * If it's `none` (or you just set it to `none`) you can login without any password. So hurry up with setting it again within specter. +### Does the Specter password encrypt my wallet data files? + +No. Specter authentication protects access to the app/session, but it does not encrypt the whole Specter data folder at rest. The data folder contains wallet metadata files such as xpubs, addresses, wallet names, labels, and transaction metadata that may be readable by anyone or any process with filesystem access to that folder. + +If this is in your threat model, use OS-level disk encryption (for example FileVault on macOS), make sure backups and sync tools that include the Specter data folder are encrypted and access-controlled, and consider running Specter from a data folder located on an encrypted volume/container via `--specter-data-folder`. + ## BACKING UP FUNDS ### *If something happens to the `~/.specter` folder, is it still possible to **restore** access to multisigs created there (assuming there is no backup of the `~/.specter` folder)?* diff --git a/src/cryptoadvance/specter/templates/settings/auth_settings.jinja b/src/cryptoadvance/specter/templates/settings/auth_settings.jinja index 13b17784b..e9f5ffecb 100644 --- a/src/cryptoadvance/specter/templates/settings/auth_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/auth_settings.jinja @@ -22,6 +22,14 @@
{% endif %} + +