From 86b4dab63fc1b5a79edc20fded7bec83732e94c0 Mon Sep 17 00:00:00 2001 From: Raven Scott Date: Fri, 31 Jul 2026 02:05:43 -0400 Subject: [PATCH] Commit before major pivot --- .gitea/workflows/release-rolling.yml | 114 + README.md | 34 +- agent/ADRs/0014-pear-desktop-gui-primary.md | 71 + agent/README.md | 2 +- agent/RULES.md | 3 +- app.js | 2 +- developer_docs/ARCHITECTURE.md | 31 +- developer_docs/BUILD_AND_RELEASE.md | 68 +- developer_docs/DESKTOP.md | 88 + developer_docs/MODULES.md | 18 +- developer_docs/SETUP.md | 46 +- electron/backend.mjs | 61 + electron/main.cjs | 364 + electron/preload.cjs | 111 + forge.config.cjs | 182 + index.html | 222 + index.mjs | 90 + lib/gui-control.js | 376 + living_docs/ARCHITECTURE_OVERVIEW.md | 2 + living_docs/CHANGELOG.md | 11 + living_docs/CURRENT_STATUS.md | 49 +- living_docs/PROGRESS.md | 18 + living_docs/ROADMAP.md | 41 +- package-lock.json | 7541 +++++++++++++++++++ package.json | 45 +- pear.json | 2 - scripts/gitea-rolling-release.sh | 241 + test/gui-control.test.js | 89 + ui/app.js | 499 ++ ui/styles.css | 775 ++ user_docs/GETTING_STARTED.md | 64 +- 31 files changed, 11105 insertions(+), 155 deletions(-) create mode 100644 .gitea/workflows/release-rolling.yml create mode 100644 agent/ADRs/0014-pear-desktop-gui-primary.md create mode 100644 developer_docs/DESKTOP.md create mode 100644 electron/backend.mjs create mode 100644 electron/main.cjs create mode 100644 electron/preload.cjs create mode 100644 forge.config.cjs create mode 100644 index.html create mode 100644 index.mjs create mode 100644 lib/gui-control.js create mode 100755 scripts/gitea-rolling-release.sh create mode 100644 test/gui-control.test.js create mode 100644 ui/app.js create mode 100644 ui/styles.css diff --git a/.gitea/workflows/release-rolling.yml b/.gitea/workflows/release-rolling.yml new file mode 100644 index 0000000..d14a8cb --- /dev/null +++ b/.gitea/workflows/release-rolling.yml @@ -0,0 +1,114 @@ +# Flying Jib rolling release — Bare CLI standalones + Electron desktop package for the runner. +# Primary product is Electron desktop GUI (ADR-0014); CLI artifacts are secondary. +# +# Secrets: +# RELEASE_TOKEN — Gitea PAT with repo release write (required) +# GITEA_URL — optional forge base URL +# +# Env: +# FJ_MAKE_CLIENT — default 1; set 0 to skip electron-forge make +# Hosts: linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64, win32-arm64 +name: Release rolling + +on: + push: + branches: [main, master] + workflow_dispatch: + inputs: + hosts: + description: 'Comma-separated 64-bit hosts for CLI standalones' + required: false + default: 'linux-x64,linux-arm64,darwin-x64,darwin-arm64,win32-x64,win32-arm64' + +concurrency: + group: release-rolling + cancel-in-progress: true + +env: + DEFAULT_HOSTS: linux-x64,linux-arm64,darwin-x64,darwin-arm64,win32-x64,win32-arm64 + NODE_OPTIONS: '--dns-result-order=ipv4first' + +jobs: + release: + runs-on: ubuntu-latest + timeout-minutes: 180 + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 22 + uses: actions/setup-node@v4 + timeout-minutes: 5 + with: + node-version: '22' + + - name: Install system deps + timeout-minutes: 8 + env: + DEBIAN_FRONTEND: noninteractive + run: | + set -euo pipefail + APT_OPTS=( + -o Acquire::ForceIPv4=true + -o Acquire::Retries=3 + -o Acquire::http::Timeout=30 + -o Acquire::https::Timeout=30 + ) + sudo apt-get update -qq "${APT_OPTS[@]}" || true + sudo apt-get install -y -qq "${APT_OPTS[@]}" \ + ca-certificates \ + zip \ + unzip \ + libnss3 \ + libatk-bridge2.0-0 \ + libgtk-3-0 \ + libgbm1 \ + libasound2 + + - name: Install dependencies + timeout-minutes: 20 + env: + NODE_OPTIONS: '--dns-result-order=ipv4first' + GIT_TERMINAL_PROMPT: '0' + npm_config_fetch_retries: '3' + npm_config_fetch_retry_mintimeout: '10000' + npm_config_fetch_retry_maxtimeout: '60000' + npm_config_fetch_timeout: '120000' + npm_config_fund: 'false' + npm_config_audit: 'false' + run: | + set -euo pipefail + git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" + git config --global url."https://github.com/".insteadOf "git@github.com:" + git config --global url."https://github.com/".insteadOf "ssh://git@github.com:" + npm ci --no-audit --no-fund --loglevel=info + node -e "console.log('node', process.version)" + + - name: Build CLI hosts + publish rolling release + env: + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITEA_URL: ${{ secrets.GITEA_URL }} + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_SHA: ${{ github.sha }} + GITEA_SHA: ${{ github.sha }} + NODE_OPTIONS: '--dns-result-order=ipv4first' + FJ_CLI_HOSTS: ${{ github.event.inputs.hosts || 'linux-x64,linux-arm64,darwin-x64,darwin-arm64,win32-x64,win32-arm64' }} + FJ_MAKE_CLIENT: '1' + RELEASE_TAG: rolling + CI: 'true' + run: | + set -euo pipefail + if [ -z "${RELEASE_TOKEN:-}" ]; then + echo "ERROR: secret RELEASE_TOKEN is not set" + exit 1 + fi + if [ -n "${GITHUB_REPOSITORY:-}" ]; then + export GITEA_OWNER="${GITHUB_REPOSITORY%%/*}" + export GITEA_REPO="${GITHUB_REPOSITORY#*/}" + fi + if [ -z "${GITEA_URL:-}" ]; then + export GITEA_URL="${GITHUB_SERVER_URL:-}" + fi + echo "CLI hosts: $FJ_CLI_HOSTS" + chmod +x scripts/gitea-rolling-release.sh + bash scripts/gitea-rolling-release.sh diff --git a/README.md b/README.md index f55ccaf..87c6551 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,9 @@ Flying Jib is a **Bare/Pear** application that runs [Flying Squid](https://githu | **Version** | 0.1.0 | | **License** | [Apache-2.0](./LICENSE) | | **Runtime** | Bare / Pear only — **end users do not install Node.js** ([ADR-0013](./agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)) | +| **Product shell** | **Pear desktop GUI** primary ([ADR-0014](./agent/ADRs/0014-pear-desktop-gui-primary.md)); Bare CLI secondary | | **Default MC** | Flying Squid **1.21.1** (Java Edition) | -| **Status** | Phases 1–4 operational core; Phase 5 security / CI / release in progress | +| **Status** | Phases 1–5 core; Phase 6 Pear GUI in progress | > **Living truth:** [living_docs/CURRENT_STATUS.md](./living_docs/CURRENT_STATUS.md) · [living_docs/ROADMAP.md](./living_docs/ROADMAP.md) @@ -28,16 +29,17 @@ A flying jib is a sail that works **with** the main sail — not above it as a m | Area | Status | |------|--------| +| Pear desktop GUI (`npm start` / `pear run`) | Scaffolded (host / join / worlds MVP) | | Local Flying Squid on `127.0.0.1` | Working | | Private worlds (`host` / `join` HyperDHT tunnel + `fj1.` invites) | Working | | Invite TTL (default **7 days**), role hint, mint / rotate / revoke | Working | | Side-channel chat + presence (`/peers`) | Working | | Mesh registry (Autobase), border migrate, inventory handoff (anti-dupe) | Working | | Soft-reconnect banners / stable localhost port on migrate | Working | -| Standalone binary (~**151 MiB** default prune; ~**98 MiB** minimal) | Working | -| CI: multi-host standalone matrix + `pear:check` + `license:check` | Wired | +| Standalone CLI binary (~**151 MiB** default prune; ~**98 MiB** minimal) | Working | +| Gitea rolling release (`RELEASE_TOKEN`) + GitHub integrate CI | Wired | | Threat model + playtest runbook | Written | -| Automated tests | **47/47** (`npm test`) | +| Automated tests | `npm test` | **Not done yet:** live Pear seed with real multisig keys, full GUI, enforced viewer ACL, two-machine Java playtest sign-off. @@ -60,31 +62,27 @@ Deep dive: [living_docs/ARCHITECTURE_OVERVIEW.md](./living_docs/ARCHITECTURE_OVE ## Quick start (developers) -Dev machines need Node/npm for install and tooling. **Players** use the standalone binary (no Node). - ```sh git clone cd flying-jib -npm install # postinstall: Bare engine patches + Squid imports +npm install -# Preferred: Bare runtime from node_modules -BARE=./node_modules/bare-runtime/bin/bare +# Primary — Pear desktop GUI +npm start # pear run -d . -$BARE bin.mjs --storage /tmp/fj-a create home -$BARE bin.mjs --storage /tmp/fj-a host home --port 25565 --name Alice -# → prints fj1.… invite (secret; default TTL 7d) -# → Java Edition → 127.0.0.1:25565 +# Secondary — Bare CLI +npm run start:cli -- create home +npm run start:cli -- host home --port 25565 --name Alice +# → fj1.… invite; Java Edition → 127.0.0.1:25565 -# Friend / second storage dir -$BARE bin.mjs --storage /tmp/fj-b join 'fj1.…' --port 25565 --name Bob -# → Java Edition → 127.0.0.1:25565 on the guest machine +npm run start:cli -- --storage /tmp/fj-b join 'fj1.…' --name Bob ``` -Shorthand: `npm start -- --storage /tmp/fj-a list` - ### Mesh border (two regions) ```sh +BARE=./node_modules/bare-runtime/bin/bare + # Host A — create mesh + enroll bounds $BARE bin.mjs --storage /tmp/fj-a host west --mesh \ --min-x 0 --max-x 99 --min-z 0 --max-z 99 \ diff --git a/agent/ADRs/0014-pear-desktop-gui-primary.md b/agent/ADRs/0014-pear-desktop-gui-primary.md new file mode 100644 index 0000000..d276aa8 --- /dev/null +++ b/agent/ADRs/0014-pear-desktop-gui-primary.md @@ -0,0 +1,71 @@ +# ADR-0014: Pear desktop GUI as primary product shell + +- **Status:** Accepted +- **Date:** 2026-07-31 +- **Amends:** [ADR-0013](./0013-bare-pear-only-runtime-and-distribution.md) (product primary shell) +- **Supersedes:** ADR-0013’s “CLI/TUI first; Electron not default” product priority only + +## Context + +ADR-0013 locked Bare/Pear-only runtime and forbade Electron Forge as the default distribution shell. The CLI (`bin.mjs`) shipped first so Squid/tunnels could be proven under Bare. + +Operators now need a **desktop GUI** as the primary product. Peardock demonstrates the Holepunch pattern: + +- Bare entry + `pear-electron` + `pear-bridge` +- `package.json` `pear.gui` pointing at `index.html` +- Renderer talks to Bare over **loopback HTTP** (no natives in the UI) + +Peardock’s CI also ships Electron Forge clients; that path conflicts with ADR-0013 and is **not** adopted here. Flying Jib ships the Pear GUI as primary UX and Bare standalone CLI as secondary CI artifacts. + +## Decision + +### 1. Primary product = Pear desktop GUI + +- Entry: Bare `index.mjs` (or `main`) boots `pear-bridge` + `pear-electron` `Runtime.start({ bridge })`. +- `package.json` declares `pear.pre: pear-electron/pre` and `pear.gui.main: index.html`. +- Dev/start: `pear run -d .`. +- UI is vanilla HTML/CSS/JS (no React); brand-led first viewport. + +### 2. Squid and P2P stay on Bare (ADR-0013 unchanged) + +- Flying Squid, HyperDHT tunnels, Autobase mesh, invites remain Bare-only via existing `lib/*`. +- Renderer **must not** `require` native addons; it calls a **loopback-only** JSON control API (`lib/gui-control.js`). +- Control API binds `127.0.0.1` only (same invariant as Minecraft bind, ADR-0005). + +### 3. CLI is secondary + +- `bin.mjs` Bare CLI remains supported for headless/CI/scripting. +- Gitea rolling release publishes **Bare CLI standalones** as downloadable artifacts; Pear GUI is run via Pear (`pear run` / future seeded `upgrade` link). + +### 4. Explicit non-goals (this ADR) + +- Electron Forge as primary GUI packaging +- AGPL holesail (or any AGPL hard dep) for local control +- Requiring end users to install Node.js + +## Consequences + +### Positive + +- One Holepunch-native desktop UX matching peardock’s Pear shape +- Squid remains Bare-safe; UI isolation via loopback API +- CLI retained for automation + +### Negative / tradeoffs + +- Pear stage/seed with real multisig keys still required for P2P OTA of the GUI drive +- Operators need Pear runtime installed to run the GUI until a future pear-packaged distributable is ready +- CI rolling release packages CLI binaries first; GUI distribution leans on Pear until OTA keys exist + +### Follow-ups + +- [x] Scaffold `index.mjs`, `index.html`, `ui/`, `lib/gui-control.js` +- [x] Gitea `.gitea/workflows/release-rolling.yml` + `scripts/gitea-rolling-release.sh` +- [ ] Live pear stage/seed with real keys +- [ ] Expand GUI beyond host/join/worlds/invites MVP + +## References + +- peardock `index.js`, `pear.gui`, `.gitea/workflows/release-rolling.yml` +- ADR-0013 Bare/Pear-only runtime +- ADR-0005 local-only bind diff --git a/agent/README.md b/agent/README.md index 5a634ee..388daad 100644 --- a/agent/README.md +++ b/agent/README.md @@ -6,7 +6,7 @@ This directory is the **source of truth for how humans and AI agents** work on F 1. **Documentation is code** — living docs stay accurate every session. 2. **Mesh-native** — no central servers, no master coordinators. -3. **Bare/Pear-only** — no app-level Node.js; single standalone executables ([ADR-0013](./ADRs/0013-bare-pear-only-runtime-and-distribution.md)). +3. **Bare/Pear-only** — no app-level Node.js; Pear GUI primary + Bare CLI standalones ([ADR-0013](./ADRs/0013-bare-pear-only-runtime-and-distribution.md), [ADR-0014](./ADRs/0014-pear-desktop-gui-primary.md)). 4. **ADR before architecture change** — decide in writing, then implement. 5. **Security invariants are absolute** — local-only bind, encrypted P2P, secret hygiene. 6. **Prefer Holepunch patterns** — hello-pear-bare, bare-build, not parallel stacks. diff --git a/agent/RULES.md b/agent/RULES.md index d5fa331..6b6a5a6 100644 --- a/agent/RULES.md +++ b/agent/RULES.md @@ -20,9 +20,10 @@ These rules apply to **every** contributor (human or AI). Violations block merge - **Do not** spawn `node` / system Node.js for Squid or any core component. - **Do not** require end users to install Node.js. - CI releases: **single standalone executables** via `bare-build --standalone` (+ Pear stage/seed OTA). -- Scaffold from **`hello-pear-bare`**, not hello-pear-electron, unless a superseding ADR reintroduces a GUI shell that still keeps Squid on Bare. +- Scaffold from **`hello-pear-bare`** for Bare/CLI; **Pear desktop GUI** uses `pear-electron` + `pear-bridge` as the primary product shell ([ADR-0014](./ADRs/0014-pear-desktop-gui-primary.md)) while Squid/P2P stay on Bare. - Flying Squid loads via **`bare-node-runtime`** (or equivalent Bare-compatible path) — never “shell out to Node.” - Node may be used only as **dev/CI host tooling** (e.g. npm), not as the product runtime. +- Electron Forge is **not** the primary GUI packaging path. ## 3. Documentation is mandatory diff --git a/app.js b/app.js index bcef9eb..87c0117 100644 --- a/app.js +++ b/app.js @@ -2,7 +2,6 @@ const path = require('path') const FramedStream = require('framed-stream') -const PearRuntime = require('pear-runtime') const ReadyResource = require('ready-resource') const { SquidManager } = require('./lib/squid-manager') const { createWorld, listWorlds, getWorld, resolveWorldPaths } = require('./lib/worlds') @@ -76,6 +75,7 @@ module.exports = class App extends ReadyResource { if (enableWorker) { try { + const PearRuntime = require('pear-runtime') this.IPC = PearRuntime.run(require.resolve('./workers/main.js'), [ String(this.updates), this.version, diff --git a/developer_docs/ARCHITECTURE.md b/developer_docs/ARCHITECTURE.md index 0469f3e..e187798 100644 --- a/developer_docs/ARCHITECTURE.md +++ b/developer_docs/ARCHITECTURE.md @@ -1,32 +1,39 @@ # Technical Architecture **Last updated:** 2026-07-31 -**ADRs:** 0002–0009, **0013** (runtime) +**ADRs:** 0002–0009, **0013** (Bare runtime), **0014** (Pear GUI primary) ## Design summary -Flying Jib implements **Local Authority + Capability Tunnel + Federated Regions** on a **Bare/Pear-only** runtime ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)): +Flying Jib implements **Local Authority + Capability Tunnel + Federated Regions** on a **Bare/Pear-only** runtime ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)) with a **Pear desktop GUI** as the primary product shell ([ADR-0014](../agent/ADRs/0014-pear-desktop-gui-primary.md)): 1. Each peer runs Flying Squid as the **sole authority** for its world/region — **inside Bare**. 2. Remote play uses an **encrypted HyperDHT TCP pipe** to that peer’s loopback Squid. 3. A mesh is a **registry of regions** (Autobase), not one shared simulation. -4. Borders use **session migration** (reconnect to neighbor), not global CRDTs — with inventory handoff and **offline-neighbor UX** (timeout, restore previous tunnel, no master failover). -5. **No system Node.js**, no `node` child process, no Electron-as-default shell. +4. Borders use **session migration** (reconnect to neighbor), not global CRDTs — with inventory handoff and **offline-neighbor UX**. +5. **No system Node.js**, no `node` child process, no Electron Forge as primary packaging. +6. Pear GUI talks to Bare over a **127.0.0.1 JSON control API** (`lib/gui-control.js`). -## Process model (Bare only) +## Process model ```mermaid flowchart TB - Main["Main Bare
CLI / optional UI host
Squid lifecycle"] - Worker["Worker Bare
pear-runtime
Hyperswarm / HyperDHT
Autobase / Protomux / OTA"] - Squid["Flying Squid in Bare
Anvil on disk
clients only from 127.0.0.1"] + GUI["Pear GUI
index.html + ui/"] + Main["Bare main index.mjs
pear-electron + bridge"] + Ctrl["gui-control
127.0.0.1 HTTP"] + App["App lib/*
Squid tunnels mesh"] + CLI["bin.mjs Bare CLI
secondary"] + Squid["Flying Squid
127.0.0.1 only"] - Main <-->|"framed-stream IPC"| Worker - Main -->|"createMCServer
bare-node-runtime"| Squid - Local["Java / tunnel clients
127.0.0.1 only"] --> Squid + Main --> GUI + Main --> Ctrl + Ctrl --> App + CLI --> App + App --> Squid + Local["Java Edition"] --> Squid ``` -Template: **`hello-pear-bare`** (not hello-pear-electron). +Template: **peardock-style Pear GUI** + **hello-pear-bare** CLI packing. ### Why Bare for Squid (not a Node child) diff --git a/developer_docs/BUILD_AND_RELEASE.md b/developer_docs/BUILD_AND_RELEASE.md index cfca348..38a6461 100644 --- a/developer_docs/BUILD_AND_RELEASE.md +++ b/developer_docs/BUILD_AND_RELEASE.md @@ -1,41 +1,57 @@ # Build and Release -**Last updated:** 2026-07-30 -**Status:** Standalone pack + multi-host CI matrix; Pear OTA **config check** scripted; live seed still needs real keys. -**ADR:** [0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md) (primary) -**Historical:** [0011](../agent/ADRs/0011-build-release-hello-pear-electron.md) superseded for Electron Forge primary path +**Last updated:** 2026-07-31 +**Status:** Electron desktop GUI primary (ADR-0014); Bare CLI standalones + Electron Forge installers; Gitea rolling release. +**ADR:** [0014](../agent/ADRs/0014-pear-desktop-gui-primary.md) (GUI), [0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md) (Bare runtime) +**Desktop guide:** [DESKTOP.md](./DESKTOP.md) ## Goals -1. **Single distributable executables** per platform/arch — users do **not** install Node.js -2. **Bare/Pear only** production runtime -3. Pear application drive staging and **P2P OTA** (`pear-runtime`) -4. Stage → Provision → Multisig trust layers - -## Template - -Primary: **`hello-pear-bare`** - -- `bare bin.mjs --no-updates` for local run -- `bare-build --standalone --host ` for binaries -- Worker via `pear-runtime` / hello-pear-worker patterns -- Node may appear only as **build-time** tooling if scripts invoke it; **runtime is Bare** - -Secondary reference: peardock `bare-standalone` packing (`bare-pack` + `bare-node-runtime` imports) for loading Node-authored graphs (Flying Squid). +1. **Electron desktop GUI** as the primary operator experience (`npm start` / Forge installers) +2. **Bare CLI standalones** as secondary downloadable artifacts (no Node.js at runtime) +3. **Gitea rolling release** packaging CLI host matrix + desktop ZIP for the CI runner +4. Pear application drive staging and **P2P OTA** when real keys exist (optional `start:pear`) ## Development ```sh -# After Phase 1 scaffold (hello-pear-bare style) -npm install # fetch deps (dev machine) -npm start # e.g. bare bin.mjs --no-updates -# or: -bare bin.mjs --no-updates --storage /tmp/fj-a +npm install +npm start # Electron desktop GUI (primary) +npm run start:cli # Bare CLI secondary ``` -**Do not** document `node server.js` or `electron .` as the supported production entry. +## Desktop installers -## Standalone executables (CI product) +```sh +npm run package:client # unpacked app under out/ +npm run make:client # zip / dmg / squirrel under out/make/ +``` + +Platform-specific: `make:client:darwin-arm64`, `make:client:linux-x64`, `make:client:win32-x64`, … + +Full notes: [DESKTOP.md](./DESKTOP.md). + +## Gitea rolling release + +Workflow: [`.gitea/workflows/release-rolling.yml`](../.gitea/workflows/release-rolling.yml) +Script: [`scripts/gitea-rolling-release.sh`](../scripts/gitea-rolling-release.sh) + +| Item | Value | +|------|--------| +| Trigger | push `main`/`master`, `workflow_dispatch` | +| Secret | **`RELEASE_TOKEN`** (required) — Gitea PAT with release write | +| Optional secret | `GITEA_URL` (defaults to `github.server_url`) | +| Tag | mutable **`rolling`** (delete + recreate each run) | +| Artifacts | CLI `flying-jib-cli-*.tar.gz` + desktop ZIP/DMG/Setup when `FJ_MAKE_CLIENT=1` | +| Hosts (CLI) | `linux-x64`, `linux-arm64`, `darwin-x64`, `darwin-arm64`, `win32-x64`, `win32-arm64` | + +Local dry-run: + +```sh +FJ_CLI_HOSTS=darwin-arm64 FJ_MAKE_CLIENT=1 DRY_RUN=1 bash scripts/gitea-rolling-release.sh +``` + +## Standalone executables (CLI product) ```sh # Examples from hello-pear-bare diff --git a/developer_docs/DESKTOP.md b/developer_docs/DESKTOP.md new file mode 100644 index 0000000..11c44c4 --- /dev/null +++ b/developer_docs/DESKTOP.md @@ -0,0 +1,88 @@ +# Flying Jib — Desktop app (Electron) + +## What you get + +Flying Jib’s primary UI is an **Electron desktop app**: + +- Window chrome with `pear-ctrl` (traffic lights on macOS; min/max/close on Windows/Linux) +- Session status pill in the titlebar +- Workspace: **Worlds**, **Host**, **Join**, **Status**, **Logs**, **Settings** +- Bare backend (Flying Squid + tunnels) on loopback HTTP control API + +CLI remains available via `npm run start:cli` or standalone binaries from the rolling release. + +## Develop + +```bash +npm install +npm start +``` + +Requires unsetting `ELECTRON_RUN_AS_NODE` (npm scripts already do this). Pear’s environment often sets that flag and breaks Electron’s `ipcMain`. + +Optional legacy entry (usually broken on current Pear CLI): + +```bash +npm run start:pear +``` + +## Features + +| Area | Behavior | +|------|----------| +| Worlds | Create local Anvil worlds; host shortcut per row | +| Host | Start Squid + HyperDHT tunnel; mint invite; copy button | +| Join | Paste `fj1.` invite; localhost Minecraft hint | +| Status | Phase cards + raw JSON; Stop session | +| Logs | Live ring buffer from backend messages/errors | +| Settings | Display name, default port/version, invite TTL (persisted under app storage) | + +Storage lives in the OS app data dir (`Flying Jib/storage`), including `gui-settings.json` and `gui-control.json`. + +## Package / installers + +Build installable artifacts on the **matching OS** (Forge cannot cross-compile Electron well): + +```bash +# Package only (unpacked app) +npm run package:client + +# Installers / archives +npm run make:client + +# Or target explicitly: +npm run make:client:darwin-arm64 # .dmg + .zip +npm run make:client:linux-x64 # .zip +npm run make:client:win32-x64 # Squirrel + .zip +``` + +Outputs land under `out/make/`. + +| Platform | Artifact | +|----------|----------| +| macOS | DMG + ZIP | +| Linux | ZIP (extract and run `flying-jib`) | +| Windows | Squirrel Setup + ZIP | + +Code signing is **not** enabled by default (`osxSign: false`). Gatekeeper may warn on unsigned macOS builds — right-click → Open, or sign with your Apple identity before distribution. + +## Architecture (desktop) + +``` +Electron main (electron/main.cjs) + ├─ static HTTP → index.html / ui/* + ├─ preload → Pear polyfill + pear-ctrl + └─ spawn bare-runtime → electron/backend.mjs + └─ App + lib/gui-control.js (127.0.0.1 JSON API) +``` + +Renderer never loads natives; it uses `fetch` + `/api/control-meta`. + +## CI + +Gitea workflow `.gitea/workflows/release-rolling.yml` publishes: + +1. Bare **CLI** standalones for all 64-bit hosts +2. Desktop **ZIP** for the runner’s platform when `FJ_MAKE_CLIENT=1` (default on) + +See [BUILD_AND_RELEASE.md](./BUILD_AND_RELEASE.md). diff --git a/developer_docs/MODULES.md b/developer_docs/MODULES.md index d4fce71..a68f15b 100644 --- a/developer_docs/MODULES.md +++ b/developer_docs/MODULES.md @@ -14,6 +14,7 @@ Versions below are **initial pins** from investigation. Lock exact versions in t | `worlds.js` / `paths.js` | World folders under app storage | | `squid-manager.js` | Flying Squid lifecycle (loopback, mesh border plugins) | | `load-squid.js` | Bare-aware flying-squid load | +| `gui-control.js` | Loopback HTTP JSON API for desktop GUI — worlds/host/join/status/logs/settings (ADR-0014) | | `world-tunnel.js` | HyperDHT host/client TCP pipe + cap header | | `tunnel-keys.js` | Per-world tunnel seed/cap on disk (`writeTunnelKeys`, mode 0600) | | `cap-store.js` | Cap rotate + revoke ledger (`revocations.json`) | @@ -30,7 +31,8 @@ Versions below are **initial pins** from investigation. Lock exact versions in t | Script | Role | |--------|------| -| `bare-standalone.cjs` | Pack standalone (+ minecraft-data prune) | +| `bare-standalone.cjs` | Pack CLI standalone (+ minecraft-data prune) | +| `gitea-rolling-release.sh` | Build CLI matrix + publish Gitea `rolling` | | `generate-squid-imports.js` | `build/squid-imports.json` + events/readline/crypto/constants shims | | `smoke-bare-login.js` | Bare Squid + offline protocol client login smoke | | `prune-minecraft-data.js` | Drop bedrock; limit PC versions for pack | @@ -44,11 +46,13 @@ Versions below are **initial pins** from investigation. Lock exact versions in t | Package | Version (investigated) | Rationale | |---------|------------------------|-----------| -| `bare` / `bare-runtime` | latest align hello-pear-bare | JS runtime for production | +| `electron` + Forge makers | **Primary GUI shell** (`npm start` / `make:client`) | +| `pear-electron` / `pear-bridge` | Optional `start:pear` (legacy; CLI often broken) | +| `bare-runtime` | CLI + Electron Bare backend child | +| `bare` / `bare-runtime` | latest align hello-pear-bare | JS runtime for CLI / Squid | | `pear-runtime` | ^1.2–1.3 | OTA + worker embedding | -| `bare-build` | ^1.0.2 | **Standalone single executables** per host | +| `bare-build` | ^1.0.2 | **Standalone CLI executables** per host | | `bare-pack` | ^2.2.x | Bundle module graphs for Bare | -| `bare-pack-drive` | ^2.1.x | Pack from Hyperdrive when needed | | `bare-node-runtime` | ^1.5.0 | **Load Flying Squid / Node-shaped pkgs on Bare** | | `bare-storage` | ^1.x | App storage paths | | `bare-process` / `bare-os` / `bare-path` / `bare-fs` / `bare-net` | as required | Bare platform APIs | @@ -69,9 +73,9 @@ Versions below are **initial pins** from investigation. Lock exact versions in t | Package | Status | |---------|--------| -| `electron` / Electron Forge makers | **Not default.** Only with superseding ADR if a GUI experiment is approved — must not reintroduce Node Squid | -| `pear-electron` | Optional later UI host only if backend remains Bare-only | -| `hello-pear-electron` | Historical Phase 0 reference; **superseded for scaffold** | +| `electron` / Electron Forge | **Primary desktop packaging** (`forge.config.cjs`, zip/dmg/squirrel) | +| `hello-pear-electron` | Historical template reference | +| `holesail` | AGPL — banned (ADR-0012) | --- diff --git a/developer_docs/SETUP.md b/developer_docs/SETUP.md index 14c9d33..6d31b46 100644 --- a/developer_docs/SETUP.md +++ b/developer_docs/SETUP.md @@ -1,8 +1,8 @@ # Development Setup -**Last updated:** 2026-07-30 -**Status:** Phase 0 docs; Phase 1 will scaffold **hello-pear-bare**. -**Runtime:** Bare/Pear only — end users never need Node.js ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)). +**Last updated:** 2026-07-31 +**Status:** Pear GUI primary (ADR-0014); Bare CLI secondary. +**Runtime:** Bare/Pear only — end users never need Node.js for Squid ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)). ## Requirements @@ -12,18 +12,18 @@ |------|---------|-------| | Node.js | ≥ 20 | **Dev/CI tooling only** (npm install, some scripts). Not the app runtime. | | npm | Ships with Node | | -| Bare runtime | Align hello-pear-bare (`bare-runtime`) | Run/test the app | -| Pear CLI | Latest | `npx pear` — stage/seed later | +| Pear CLI | Latest | Optional (`npm run start:pear`) | +| Electron | via npm `electron` | Desktop GUI (`npm start`) | +| Bare runtime | `bare-runtime` | CLI / GUI backend / tests | | Git | Any recent | | | Java Edition Minecraft | Client matching Squid version | Manual playtests | -| macOS / Linux / Windows | Desktop | bare-build host matrix | ### End users (production) | Tool | Required? | |------|-----------| -| Flying Jib standalone / Pear app | Yes | -| System Node.js | **No** | +| Pear app **or** desktop installer **or** Bare CLI standalone | Yes | +| System Node.js | **No** (CLI binary / Pear) | | Java Edition client | Yes (separate game install) | ## Clone @@ -33,30 +33,24 @@ git clone flying-jib cd flying-jib ``` -## Install (Phase 1+) +## Install ```sh npm install +# postinstall: patches + generate-squid-imports.json ``` -Expected major dependencies (see [MODULES.md](./MODULES.md)): - -- Bare/Pear: `pear-runtime`, `bare-build`, `bare-node-runtime`, bare-* modules -- P2P: `hyperswarm`, `hyperdht`, `corestore`, `autobase`, `protomux`, … -- Minecraft: `flying-squid` loaded **through bare-node-runtime** - -## Run (Phase 1 — Bare) +## Run ```sh -npm install -# postinstall: patches engines for Bare + generates build/squid-imports.json +# Primary — Pear desktop GUI +npm start +# or: pear run -d . -# Preferred (uses packaged bare-runtime ≥1.29) -BARE=./node_modules/bare-runtime/bin/bare - -$BARE bin.mjs --storage /tmp/fj-a create demo -$BARE bin.mjs --storage /tmp/fj-a list -$BARE bin.mjs --storage /tmp/fj-a start demo --port 25565 # local only +# Secondary — Bare CLI +npm run start:cli -- create demo +npm run start:cli -- host demo +``` # Private world share (Phase 2) $BARE bin.mjs --storage /tmp/fj-host host demo --port 25565 @@ -114,8 +108,10 @@ Tests: prefer Bare (`brittle-bare` / `npm test` as configured). |-------|-----| | Squid fails under Bare | Check bare-node-runtime imports + `build/shims/node-crypto.cjs`; see Q15 | | `createPublicKey is not a function` on join | Run `node scripts/generate-squid-imports.js` (or postinstall); crypto must map to the RSA shim, not raw `bare-crypto` | +| GUI cannot reach control API | Ensure `pear run` started `index.mjs`; check `gui-control.json` under Pear storage | | Port in use | Change local MC port in settings | -| Two instances share state | Use distinct `--storage` paths | +| Two instances share state | Use distinct `--storage` / Pear storage paths | | Binary needs Node | Bug — packaging must be standalone Bare | +| Gitea release fails auth | Set repo secret `RELEASE_TOKEN` with release write | More: [../user_docs/TROUBLESHOOTING.md](../user_docs/TROUBLESHOOTING.md) diff --git a/electron/backend.mjs b/electron/backend.mjs new file mode 100644 index 0000000..8ab083e --- /dev/null +++ b/electron/backend.mjs @@ -0,0 +1,61 @@ +/** + * Bare/Node backend for the Electron desktop shell. + * Starts App + loopback gui-control; writes gui-control.json under FJ_STORAGE. + * + * Spawned by electron/main.cjs via bare-runtime (not Electron's Node ABI). + */ +import process from 'process' +import path from 'path' +import pkg from '../package.json' with { type: 'json' } +import App from '../app.js' +import { start as startGuiControl } from '../lib/gui-control.js' + +const storage = process.env.FJ_STORAGE +if (!storage) { + console.error('[flying-jib] FJ_STORAGE is required') + process.exit(1) +} + +const appName = pkg.productName || pkg.name +const app = new App({ + dir: storage, + appPath: null, + updates: false, + version: pkg.version, + upgrade: pkg.upgrade, + name: appName, + displayName: 'player' +}) + +app.on('error', (err) => console.error('[flying-jib]', err)) +app.on('message', (m) => console.log('[flying-jib]', m)) + +await app.ready() + +const sep = storage.includes('\\') ? '\\' : '/' +const statePath = storage.endsWith(sep) + ? `${storage}gui-control.json` + : `${storage}${sep}gui-control.json` + +const control = await startGuiControl({ app, statePath }) +console.log(`[flying-jib] GUI control at ${control.baseUrl}`) + +async function shutdown() { + try { + await control.close?.() + } catch { + // ignore + } + try { + await app.exit(0) + } catch { + // ignore + } + process.exit(0) +} + +process.on('SIGINT', shutdown) +process.on('SIGTERM', shutdown) +if (typeof Bare !== 'undefined') { + Bare.on('exit', shutdown) +} diff --git a/electron/main.cjs b/electron/main.cjs new file mode 100644 index 0000000..56e8cfe --- /dev/null +++ b/electron/main.cjs @@ -0,0 +1,364 @@ +/** + * Flying Jib desktop client — Electron shell (peardock pattern). + * + * pear run is deprecated / broken for UI on current Pear CLI; this owns the window. + * Bare App + gui-control run in a bare-runtime child; renderer talks over loopback HTTP. + * + * Dev: npm start + */ +'use strict' + +// Pear / pear-electron often leave this set; it turns Electron into Node and breaks ipcMain. +if (process.env.ELECTRON_RUN_AS_NODE) { + delete process.env.ELECTRON_RUN_AS_NODE +} + +const { app, BrowserWindow, ipcMain, Menu } = require('electron') +const path = require('path') +const fs = require('fs') +const http = require('http') +const { spawn } = require('child_process') + +const pkg = require('../package.json') +const appName = pkg.productName || pkg.name || 'Flying Jib' + +function resolveRootDir() { + if (!app.isPackaged) return path.resolve(__dirname, '..') + const appPath = app.getAppPath() + // Prefer unpacked tree for Bare spawn (asarUnpack in forge.config.cjs). + const unpacked = appPath.replace(/app\.asar$/i, 'app.asar.unpacked') + if (unpacked !== appPath && fs.existsSync(unpacked)) return unpacked + return appPath +} + +/** Static UI can be served from asar; Bare backend needs the unpacked root. */ +function resolveStaticRoot() { + if (!app.isPackaged) return path.resolve(__dirname, '..') + return app.getAppPath() +} + +let rootDir = resolveRootDir() + +// Unpackaged Electron defaults userData to "Electron" — keep storage under our name. +app.setName(appName) +app.setPath('userData', path.join(app.getPath('appData'), appName)) + +let staticServer = null +let staticPort = 0 +/** @type {import('child_process').ChildProcess|null} */ +let backend = null +/** @type {import('electron').BrowserWindow|null} */ +let mainWindow = null + +function ensureDir(p) { + fs.mkdirSync(p, { recursive: true }) +} + +function storageDir() { + return path.join(app.getPath('userData'), 'storage') +} + +function statePath() { + return path.join(storageDir(), 'gui-control.json') +} + +function readControlMeta() { + try { + const p = statePath() + if (!fs.existsSync(p)) return null + const meta = JSON.parse(fs.readFileSync(p, 'utf8')) + if (meta?.baseUrl && meta?.token) return meta + } catch { + // ignore + } + return null +} + +function startStaticServer() { + const staticRoot = resolveStaticRoot() + const mime = { + '.html': 'text/html; charset=utf-8', + '.js': 'text/javascript; charset=utf-8', + '.mjs': 'text/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json', + '.svg': 'image/svg+xml', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2' + } + + return new Promise((resolve, reject) => { + const server = http.createServer((req, res) => { + try { + const u = new URL(req.url || '/', 'http://127.0.0.1') + if (u.pathname === '/api/control-meta') { + const meta = readControlMeta() + const body = JSON.stringify(meta || { pending: true }) + res.writeHead(200, { + 'Content-Type': 'application/json; charset=utf-8', + 'Cache-Control': 'no-cache', + 'Access-Control-Allow-Origin': '*' + }) + res.end(body) + return + } + + let rel = decodeURIComponent(u.pathname) + if (rel === '/') rel = '/index.html' + const filePath = path.normalize(path.join(staticRoot, rel)) + if (!filePath.startsWith(staticRoot)) { + res.writeHead(403) + res.end('Forbidden') + return + } + if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) { + res.writeHead(404) + res.end('Not found') + return + } + + const ext = path.extname(filePath).toLowerCase() + res.writeHead(200, { + 'Content-Type': mime[ext] || 'application/octet-stream', + 'Cache-Control': 'no-cache' + }) + fs.createReadStream(filePath).pipe(res) + } catch (err) { + res.writeHead(500) + res.end(String(err && err.message ? err.message : err)) + } + }) + + server.listen(0, '127.0.0.1', () => { + const addr = server.address() + staticPort = typeof addr === 'object' && addr ? addr.port : 0 + staticServer = server + resolve(staticPort) + }) + server.on('error', reject) + }) +} + +function resolveBareBin() { + rootDir = resolveRootDir() + const candidates = [ + path.join(rootDir, 'node_modules', 'bare-runtime', 'bin', 'bare'), + path.join(process.resourcesPath || '', 'bare-runtime', 'bin', 'bare'), + path.join(process.resourcesPath || '', 'bare') + ] + for (const bare of candidates) { + if (process.platform === 'win32') { + const cmd = bare + '.cmd' + if (fs.existsSync(cmd)) return cmd + const exe = bare + '.exe' + if (fs.existsSync(exe)) return exe + } + if (bare && fs.existsSync(bare)) return bare + } + return null +} + +function startBackend() { + ensureDir(storageDir()) + // Clear stale control file so UI waits for this session + try { + fs.unlinkSync(statePath()) + } catch { + // ignore + } + + const bareBin = resolveBareBin() + const entry = path.join(rootDir, 'electron', 'backend.mjs') + const env = { + ...process.env, + FJ_STORAGE: storageDir() + } + + if (bareBin) { + backend = spawn(bareBin, [entry], { + cwd: rootDir, + env, + stdio: ['ignore', 'pipe', 'pipe'] + }) + } else { + console.warn('[flying-jib] bare-runtime missing; falling back to node for backend') + const nodeBin = process.platform === 'win32' ? 'node.exe' : 'node' + backend = spawn(nodeBin, [entry], { + cwd: rootDir, + env, + stdio: ['ignore', 'pipe', 'pipe'], + shell: process.platform === 'win32' + }) + } + + backend.stdout?.on('data', (d) => process.stdout.write(d)) + backend.stderr?.on('data', (d) => process.stderr.write(d)) + backend.on('exit', (code, signal) => { + console.error(`[flying-jib] backend exited code=${code} signal=${signal}`) + backend = null + }) + return backend +} + +function windowChromeOpts() { + const isDarwin = process.platform === 'darwin' + return isDarwin + ? { + titleBarStyle: 'hiddenInset', + trafficLightPosition: { x: 16, y: 13 } + } + : { frame: false } +} + +function waitForControl(timeoutMs = 15000) { + const start = Date.now() + return new Promise((resolve, reject) => { + const tick = () => { + const meta = readControlMeta() + if (meta?.baseUrl) { + resolve(meta) + return + } + if (Date.now() - start > timeoutMs) { + reject(new Error('Timed out waiting for gui-control.json (Bare backend)')) + return + } + setTimeout(tick, 100) + } + tick() + }) +} + +function createWindow() { + const win = new BrowserWindow({ + width: pkg.pear?.gui?.width || 1180, + height: pkg.pear?.gui?.height || 820, + backgroundColor: pkg.pear?.gui?.backgroundColor || '#0c1a22', + title: appName, + autoHideMenuBar: process.platform !== 'darwin', + ...windowChromeOpts(), + webPreferences: { + preload: path.join(__dirname, 'preload.cjs'), + // Preload defines pear-ctrl + Pear.config on the page (peardock-style). + // UI discovery uses /api/control-meta — no Node in renderer. + nodeIntegration: false, + contextIsolation: false, + sandbox: false, + spellcheck: false + }, + show: false + }) + + win.once('ready-to-show', () => win.show()) + + const url = `http://127.0.0.1:${staticPort}/index.html` + console.log(`[flying-jib] loading UI ${url}`) + win.loadURL(url).catch((err) => { + console.error('[flying-jib] failed to load UI:', err) + }) + win.webContents.on('did-fail-load', (_e, code, desc, validatedURL, isMainFrame) => { + if (!isMainFrame) return + console.error('[flying-jib] did-fail-load', code, desc) + setTimeout(() => { + if (!win.isDestroyed()) win.loadURL(url).catch(() => {}) + }, 500) + }) + + mainWindow = win + return win +} + +function stopBackend() { + if (!backend || backend.killed) return + try { + backend.kill('SIGTERM') + } catch { + // ignore + } + backend = null +} + +ipcMain.on('fj:get-pear-config', (event) => { + event.returnValue = { + storage: storageDir(), + name: appName, + version: pkg.version, + platform: process.platform + } +}) + +ipcMain.handle('fj:exit', (_e, code) => { + app.exit(code | 0) +}) + +function windowFromEvent(evt) { + try { + return BrowserWindow.fromWebContents(evt.sender) + } catch { + return null + } +} + +function focusedWindow() { + return BrowserWindow.getFocusedWindow() || mainWindow || BrowserWindow.getAllWindows()[0] || null +} + +ipcMain.handle('fj:window-minimize', (evt) => { + ;(windowFromEvent(evt) || focusedWindow())?.minimize() +}) + +ipcMain.handle('fj:window-maximize', (evt) => { + const win = windowFromEvent(evt) || focusedWindow() + if (!win) return + if (win.isMaximized()) win.unmaximize() + else win.maximize() +}) + +ipcMain.handle('fj:window-close', (evt) => { + ;(windowFromEvent(evt) || focusedWindow())?.close() +}) + +ipcMain.handle('fj:window-is-maximized', (evt) => { + return Boolean((windowFromEvent(evt) || focusedWindow())?.isMaximized()) +}) + +app.whenReady().then(async () => { + if (process.platform !== 'darwin') { + Menu.setApplicationMenu(null) + } + + ensureDir(storageDir()) + startBackend() + const port = await startStaticServer() + console.log(`[flying-jib] static UI at http://127.0.0.1:${port}`) + try { + const meta = await waitForControl() + console.log(`[flying-jib] control ready at ${meta.baseUrl}`) + } catch (err) { + console.error('[flying-jib]', err.message || err) + } + createWindow() + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow() + }) +}) + +app.on('window-all-closed', () => { + stopBackend() + if (staticServer) { + try { + staticServer.close() + } catch { + // ignore + } + } + if (process.platform !== 'darwin') app.quit() +}) + +app.on('before-quit', () => { + stopBackend() +}) diff --git a/electron/preload.cjs b/electron/preload.cjs new file mode 100644 index 0000000..ed8dfde --- /dev/null +++ b/electron/preload.cjs @@ -0,0 +1,111 @@ +/** + * Preload + Pear polyfill for Flying Jib under Electron (peardock pattern). + * pear-ctrl: darwin = traffic-light spacer; win32/linux = frameless window buttons. + */ +'use strict' + +const { ipcRenderer } = require('electron') + +const cfg = ipcRenderer.sendSync('fj:get-pear-config') || {} +const storage = cfg.storage || '' + +const teardownHooks = [] + +const Pear = { + config: { + storage, + name: cfg.name || 'Flying Jib', + version: cfg.version || '0.0.0' + }, + app: { + storage, + name: cfg.name || 'Flying Jib' + }, + exit(code = 0) { + try { + ipcRenderer.invoke('fj:exit', code | 0) + } catch { + // ignore + } + }, + teardown(fn) { + if (typeof fn === 'function') teardownHooks.push(fn) + } +} + +globalThis.Pear = Pear +try { + window.Pear = Pear +} catch { + // ignore +} + +// pear-ctrl: under Pear this is platform chrome. Under Electron we polyfill it: +// - darwin: invisible spacer so brand sits clear of OS traffic lights (hiddenInset) +// - win32/linux: min / max / close buttons (frameless BrowserWindow) +try { + if (typeof customElements !== 'undefined' && !customElements.get('pear-ctrl')) { + const platform = + (cfg && cfg.platform) || + (typeof process !== 'undefined' && process.platform) || + 'darwin' + + class PearCtrl extends HTMLElement { + connectedCallback() { + this.setAttribute('data-platform', platform) + this.setAttribute('role', 'group') + this.setAttribute('aria-label', 'Window controls') + + if (platform === 'darwin') { + // Layout spacer only — traffic lights come from titleBarStyle: hiddenInset + this.replaceChildren() + return + } + + this.replaceChildren() + this.classList.add('fj-electron-ctrl') + const mkBtn = (action, label, pathD) => { + const btn = document.createElement('button') + btn.type = 'button' + btn.className = `fj-win-btn fj-win-btn--${action}` + btn.title = label + btn.setAttribute('aria-label', label) + btn.innerHTML = `` + btn.addEventListener('click', (e) => { + e.preventDefault() + e.stopPropagation() + try { + ipcRenderer.invoke(`fj:window-${action}`) + } catch { + // ignore + } + }) + return btn + } + this.append( + mkBtn('minimize', 'Minimize', 'M0 5h10v1H0z'), + mkBtn('maximize', 'Maximize', 'M1 1h8v8H1V1zm1 1v6h6V2H2z'), + mkBtn( + 'close', + 'Close', + 'M1.2 0.5L5 4.3 8.8.5l.7.7L5.7 5l3.8 3.8-.7.7L5 5.7 1.2 9.5l-.7-.7L4.3 5 .5 1.2l.7-.7z' + ) + ) + } + } + customElements.define('pear-ctrl', PearCtrl) + } +} catch { + // ignore +} + +window.addEventListener('beforeunload', () => { + for (const fn of teardownHooks) { + try { + const r = fn() + if (r && typeof r.then === 'function') r.catch(() => {}) + } catch { + // ignore + } + } +}) diff --git a/forge.config.cjs b/forge.config.cjs new file mode 100644 index 0000000..81388e4 --- /dev/null +++ b/forge.config.cjs @@ -0,0 +1,182 @@ +/** + * Electron Forge config for Flying Jib desktop client. + * Packages Electron shell + Bare backend deps; CLI standalones remain separate. + */ +'use strict' + +const path = require('path') +const fs = require('fs') + +const pkg = require('./package.json') +const appName = pkg.productName || pkg.name || 'Flying Jib' + +function resolvePackageTarget() { + const argv = process.argv + const flag = (name) => { + const i = argv.indexOf(name) + return i >= 0 && argv[i + 1] ? argv[i + 1] : null + } + const platform = process.env.FJ_PACKAGE_PLATFORM || flag('--platform') || process.platform + const arch = process.env.FJ_PACKAGE_ARCH || flag('--arch') || process.arch + return { platform, arch } +} + +const packageTarget = resolvePackageTarget() +const packageHost = `${packageTarget.platform}-${packageTarget.arch}` + +const IGNORE_PREFIXES = [ + '/.git', + '/.gitea', + '/.github', + '/.cursor', + '/out', + '/dist', + '/deploy', + '/test', + '/agent', + '/living_docs', + '/developer_docs', + '/user_docs', + '/scripts', + '/.cache', + '/node_modules/electron', + '/node_modules/electron-', + '/node_modules/@electron', + '/node_modules/@electron-forge', + '/node_modules/bare-build', + '/node_modules/brittle', + '/node_modules/typescript', + '/node_modules/prettier', + '/node_modules/esbuild', + '/node_modules/@esbuild', + '/node_modules/webpack', + '/node_modules/@types' +] + +const IGNORE_REGEX = [ + /^\/node_modules\/bare-build-/, + /^\/node_modules\/@esbuild\//, + /\.md$/i, + /\.map$/, + /\.d\.ts$/, + /^\/\.env/, + /^\/package-lock\.json$/, + /^\/node_modules\/[^/]+\/test\//, + /^\/node_modules\/[^/]+\/tests\//, + /^\/node_modules\/[^/]+\/docs\//, + /^\/node_modules\/[^/]+\/example\//, + /^\/node_modules\/[^/]+\/examples\// +] + +function isForeignPrebuild(file) { + const marker = '/prebuilds/' + const idx = file.indexOf(marker) + if (idx === -1) return false + const host = file.slice(idx + marker.length).split('/')[0] + if (!host) return false + if (host.startsWith('android') || host.startsWith('ios') || host.includes('simulator')) return true + return host !== packageHost +} + +function shouldIgnore(file) { + if (!file) return false + if (file === '/package.json') return false + for (const p of IGNORE_PREFIXES) { + if (file === p || file.startsWith(p + '/') || file.startsWith(p)) return true + } + for (const re of IGNORE_REGEX) { + if (re.test(file)) return true + } + if (isForeignPrebuild(file)) return true + return false +} + +function stripBuildPath(buildPath) { + const drop = ['agent', 'living_docs', 'developer_docs', 'user_docs', 'test', 'scripts', '.gitea'] + for (const rel of drop) { + const p = path.join(buildPath, rel) + try { + if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true }) + } catch { + // ignore + } + } +} + +module.exports = { + packagerConfig: { + name: appName, + executableName: 'flying-jib', + appBundleId: 'app.flyingjib.desktop', + asar: true, + // Bare child cannot execute from inside asar — keep runtime + app graph on disk. + asarUnpack: [ + 'electron/backend.mjs', + 'app.js', + 'lib/**/*', + 'build/**/*', + 'node_modules/bare-runtime/**/*', + 'node_modules/bare-runtime-*/**/*', + 'node_modules/**/*.node', + 'node_modules/**/prebuilds/**/*' + ], + prune: false, + ignore: shouldIgnore, + osxSign: false, + afterCopy: [ + (buildPath, _electronVersion, _platform, _arch, callback) => { + try { + stripBuildPath(buildPath) + callback() + } catch (err) { + callback(err) + } + } + ] + }, + rebuildConfig: { + onlyModules: [] + }, + makers: [ + { + name: '@electron-forge/maker-zip', + platforms: ['darwin', 'linux', 'win32'] + }, + { + name: '@electron-forge/maker-dmg', + platforms: ['darwin'], + config: { + name: `${appName}`, + format: 'ULFO' + } + }, + { + name: '@electron-forge/maker-squirrel', + platforms: ['win32'], + config: { + name: 'FlyingJib', + authors: 'Flying Jib', + exe: 'flying-jib.exe' + } + } + ], + hooks: { + packageAfterCopy: async (_forgeConfig, buildPath) => { + const pkgPath = path.join(buildPath, 'package.json') + const appPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) + appPkg.main = 'electron/main.cjs' + delete appPkg.devDependencies + delete appPkg.scripts + if (appPkg.dependencies) { + for (const name of ['bare-build', 'pear-electron', 'pear-bridge', '@electron-forge/cli']) { + delete appPkg.dependencies[name] + } + } + fs.writeFileSync(pkgPath, JSON.stringify(appPkg, null, 2) + '\n') + stripBuildPath(buildPath) + }, + preMake: async () => { + fs.rmSync(path.join(__dirname, 'out', 'make'), { recursive: true, force: true }) + } + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..a0dbd75 --- /dev/null +++ b/index.html @@ -0,0 +1,222 @@ + + + + + + Flying Jib + + + + + + + + + +
+ +
+
+ +
+

Flying Jib

+

Private worlds. Peer tunnels.

+

Host or join on localhost — Squid stays on your machine; friends arrive through HyperDHT.

+
+ + + +
+
+
+ + + + +
+ + + + diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..c8b6f5f --- /dev/null +++ b/index.mjs @@ -0,0 +1,90 @@ +/** + * Flying Jib — Pear desktop entry (ADR-0014). + * Boots pear-electron UI + pear-bridge; Bare-side App + loopback control API. + * + * Boot order matches peardock: bridge → Bare control → Electron runtime. + * Use static ESM imports (not createRequire): under pear://, createRequire + * cannot resolve local CJS modules. + * + * @typedef {import('pear-interface')} + */ +/* global Pear */ +import Runtime from 'pear-electron' +import Bridge from 'pear-bridge' +import path from 'path' +import process from 'process' +import pkg from './package.json' with { type: 'json' } +import App from './app.js' +import { start as startGuiControl } from './lib/gui-control.js' + +const appName = pkg.productName || pkg.name + +function resolveStorage() { + const fromPear = Pear?.config?.storage + if (fromPear) return fromPear + const tmp = process.env.TMPDIR || process.env.TEMP || '/tmp' + return path.join(tmp, 'pear', appName) +} + +const bridge = new Bridge() +await bridge.ready() + +const storage = resolveStorage() +const app = new App({ + dir: storage, + appPath: null, + updates: false, + version: pkg.version, + upgrade: pkg.upgrade, + name: appName, + displayName: 'player' +}) + +app.on('error', (err) => console.error('[flying-jib]', err)) +app.on('message', (m) => console.log('[flying-jib]', m)) + +await app.ready() + +const sep = storage.includes('\\') ? '\\' : '/' +const statePath = storage.endsWith(sep) + ? `${storage}gui-control.json` + : `${storage}${sep}gui-control.json` + +let control = null +try { + control = await startGuiControl({ app, statePath }) + if (typeof globalThis !== 'undefined') { + globalThis.__FJ_GUI_CONTROL__ = { + baseUrl: control.baseUrl, + token: control.token, + port: control.port + } + } + console.log(`[flying-jib] GUI control at ${control.baseUrl}`) +} catch (err) { + console.error('[flying-jib] Failed to start GUI control:', err) +} + +const runtime = new Runtime() +const pipe = await runtime.start({ bridge }) + +async function shutdown() { + try { + await control?.close?.() + } catch { + // ignore + } + try { + await app.exit(0) + } catch { + // ignore + } + try { + pipe?.destroy?.() + } catch { + // ignore + } +} + +Pear?.teardown?.(shutdown) +pipe?.on?.('close', shutdown) diff --git a/lib/gui-control.js b/lib/gui-control.js new file mode 100644 index 0000000..71ec787 --- /dev/null +++ b/lib/gui-control.js @@ -0,0 +1,376 @@ +'use strict' + +/** + * Loopback-only HTTP JSON control API for the desktop GUI (ADR-0014). + * Renderer must not load natives — it talks to this server on 127.0.0.1. + */ + +const isBare = typeof globalThis.Bare !== 'undefined' +const http = isBare ? require('bare-http1') : require('http') +const fs = isBare ? require('bare-fs') : require('fs') +const path = isBare ? require('bare-path') : require('path') +const crypto = isBare ? require('bare-crypto') : require('crypto') +const { forceLoopbackHost } = require('./bind-guard') +const { redactInvite } = require('./secrets') + +const LOG_LIMIT = 200 +const DEFAULT_SETTINGS = { + displayName: 'player', + defaultPort: 25565, + defaultVersion: '1.21.1', + inviteTtlHours: 168 +} + +function randomToken() { + return crypto.randomBytes(24).toString('hex') +} + +function sendJson(res, status, body) { + const payload = JSON.stringify(body) + res.statusCode = status + res.setHeader('Content-Type', 'application/json; charset=utf-8') + res.setHeader('Access-Control-Allow-Origin', '*') + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-Flying-Jib-Token') + res.setHeader('Content-Length', Buffer.byteLength(payload)) + res.end(payload) +} + +function readJson(req) { + return new Promise((resolve, reject) => { + const chunks = [] + req.on('data', (c) => chunks.push(c)) + req.on('end', () => { + if (!chunks.length) { + resolve({}) + return + } + try { + const buf = Buffer.concat(chunks) + resolve(JSON.parse(buf.toString('utf8') || '{}')) + } catch (err) { + reject(err) + } + }) + req.on('error', reject) + }) +} + +function createLogBuffer(limit = LOG_LIMIT) { + /** @type {{ id: number, at: string, level: string, message: string }[]} */ + const entries = [] + let seq = 0 + return { + push(level, message) { + const entry = { + id: ++seq, + at: new Date().toISOString(), + level: level || 'info', + message: String(message == null ? '' : message) + } + entries.push(entry) + while (entries.length > limit) entries.shift() + return entry + }, + list(sinceId = 0) { + if (!sinceId) return entries.slice() + return entries.filter((e) => e.id > sinceId) + }, + clear() { + entries.length = 0 + } + } +} + +function settingsPath(dir) { + return path.join(dir, 'gui-settings.json') +} + +function loadSettings(dir) { + try { + const raw = fs.readFileSync(settingsPath(dir), 'utf8') + const parsed = JSON.parse(raw) + return { ...DEFAULT_SETTINGS, ...parsed } + } catch { + return { ...DEFAULT_SETTINGS } + } +} + +function saveSettings(dir, next) { + const merged = { ...DEFAULT_SETTINGS, ...next } + fs.mkdirSync(dir, { recursive: true }) + fs.writeFileSync(settingsPath(dir), JSON.stringify(merged, null, 2), { mode: 0o600 }) + return merged +} + +function sessionPhase(status) { + if (status?.squid?.running && status?.tunnelHost) return 'hosting' + if (status?.tunnelClient) return 'joined' + if (status?.squid?.running) return 'local' + if (status?.world) return 'world-selected' + return 'idle' +} + +/** + * @param {object} opts + * @param {import('../app')} opts.app Flying Jib App instance + * @param {string} [opts.host='127.0.0.1'] + * @param {number} [opts.port=0] + * @param {string} [opts.statePath] write {baseUrl,token,port} for the UI + * @param {string} [opts.token] + */ +async function start(opts = {}) { + if (!opts.app) throw new Error('gui-control requires app') + + const host = forceLoopbackHost(opts.host || '127.0.0.1') + const token = opts.token || randomToken() + const app = opts.app + const logs = createLogBuffer() + let settings = loadSettings(app.dir) + + const onMessage = (m) => logs.push('info', typeof m === 'string' ? m : JSON.stringify(m)) + const onError = (err) => logs.push('error', err && err.message ? err.message : String(err)) + app.on('message', onMessage) + app.on('error', onError) + logs.push('info', 'GUI control started') + + if (settings.displayName && settings.displayName !== app.displayName) { + app.displayName = settings.displayName + } + + const server = http.createServer(async (req, res) => { + if (req.method === 'OPTIONS') { + res.statusCode = 204 + res.setHeader('Access-Control-Allow-Origin', '*') + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-Flying-Jib-Token') + res.end() + return + } + + try { + const url = new URL(req.url || '/', `http://${host}`) + const pathname = url.pathname + + if (pathname === '/health' && req.method === 'GET') { + const status = app.getStatus() + sendJson(res, 200, { + ok: true, + service: 'flying-jib-gui', + bare: isBare, + phase: sessionPhase(status), + squidRunning: Boolean(status?.squid?.running) + }) + return + } + + const hdr = req.headers['x-flying-jib-token'] + const q = url.searchParams.get('token') + if (hdr !== token && q !== token) { + sendJson(res, 401, { ok: false, error: 'Unauthorized' }) + return + } + + if (pathname === '/status' && req.method === 'GET') { + const status = app.getStatus() + sendJson(res, 200, { + ok: true, + result: { + ...status, + phase: sessionPhase(status), + settings, + logCount: logs.list().length + } + }) + return + } + + if (pathname === '/logs' && req.method === 'GET') { + const since = Number(url.searchParams.get('since') || 0) || 0 + sendJson(res, 200, { ok: true, result: logs.list(since) }) + return + } + + if (pathname === '/logs/clear' && req.method === 'POST') { + logs.clear() + logs.push('info', 'Log cleared') + sendJson(res, 200, { ok: true, result: true }) + return + } + + if (pathname === '/settings' && req.method === 'GET') { + sendJson(res, 200, { ok: true, result: settings }) + return + } + + if (pathname === '/settings' && req.method === 'POST') { + const body = await readJson(req) + const next = { + displayName: + body.displayName != null ? String(body.displayName).trim() || DEFAULT_SETTINGS.displayName : settings.displayName, + defaultPort: body.defaultPort != null ? Number(body.defaultPort) || DEFAULT_SETTINGS.defaultPort : settings.defaultPort, + defaultVersion: + body.defaultVersion != null + ? String(body.defaultVersion).trim() || DEFAULT_SETTINGS.defaultVersion + : settings.defaultVersion, + inviteTtlHours: + body.inviteTtlHours != null ? Number(body.inviteTtlHours) : settings.inviteTtlHours + } + settings = saveSettings(app.dir, next) + app.displayName = settings.displayName + logs.push('info', `Settings saved (name=${settings.displayName}, port=${settings.defaultPort})`) + sendJson(res, 200, { ok: true, result: settings }) + return + } + + if (pathname === '/worlds' && req.method === 'GET') { + sendJson(res, 200, { ok: true, result: app.listWorlds() }) + return + } + + if (pathname === '/worlds' && req.method === 'POST') { + const body = await readJson(req) + const meta = app.createWorld({ + name: body.name, + version: body.version || settings.defaultVersion, + motd: body.motd + }) + logs.push('info', `World created: ${meta.name || meta.id}`) + sendJson(res, 200, { ok: true, result: meta }) + return + } + + if (pathname === '/start' && req.method === 'POST') { + const body = await readJson(req) + const result = await app.startWorld({ + world: body.world, + port: body.port != null ? body.port : settings.defaultPort, + version: body.version || settings.defaultVersion + }) + logs.push('info', `World started on port ${result.port || body.port || settings.defaultPort}`) + sendJson(res, 200, { ok: true, result }) + return + } + + if (pathname === '/host' && req.method === 'POST') { + const body = await readJson(req) + const ttlHours = body.ttl != null ? body.ttl : settings.inviteTtlHours + const result = await app.hostWorld({ + world: body.world, + port: body.port != null ? body.port : settings.defaultPort, + version: body.version || settings.defaultVersion, + displayName: body.displayName || settings.displayName, + ttl: body.noExpire ? undefined : ttlHours * 3600, + noExpire: body.noExpire, + role: body.role + }) + logs.push( + 'info', + `Hosting ${body.world} — Squid :${result.squid?.port || body.port || settings.defaultPort}` + ) + sendJson(res, 200, { + ok: true, + result: { + ...result, + inviteRedacted: result.invite ? redactInvite(result.invite) : null + } + }) + return + } + + if (pathname === '/join' && req.method === 'POST') { + const body = await readJson(req) + const result = await app.joinWorld({ + invite: body.invite, + localPort: body.port != null ? Number(body.port) : body.localPort != null ? body.localPort : settings.defaultPort, + displayName: body.displayName || settings.displayName + }) + const localPort = + (result.tunnel && result.tunnel.localPort) || + body.port || + body.localPort || + settings.defaultPort || + null + logs.push('info', `Joined — connect Minecraft to 127.0.0.1:${localPort}`) + sendJson(res, 200, { ok: true, result: { ...result, localPort } }) + return + } + + if (pathname === '/stop' && req.method === 'POST') { + await app.stopWorld() + logs.push('info', 'Session stopped') + sendJson(res, 200, { ok: true, result: app.getStatus() }) + return + } + + if (pathname === '/invite' && req.method === 'POST') { + const body = await readJson(req) + const ttlHours = body.ttl != null ? body.ttl : settings.inviteTtlHours + const invite = app.mintInvite({ + world: body.world, + ttl: body.noExpire ? undefined : ttlHours * 3600, + noExpire: body.noExpire, + role: body.role, + portHint: body.portHint + }) + logs.push('info', 'Invite minted') + sendJson(res, 200, { + ok: true, + result: { invite, inviteRedacted: redactInvite(invite) } + }) + return + } + + sendJson(res, 404, { ok: false, error: 'Not found' }) + } catch (err) { + const msg = err && err.message ? err.message : String(err) + logs.push('error', msg) + sendJson(res, 500, { ok: false, error: msg }) + } + }) + + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(opts.port || 0, host, resolve) + }) + + const addr = server.address() + const port = typeof addr === 'object' && addr ? addr.port : 0 + const baseUrl = `http://${host}:${port}` + const meta = { port, host, token, baseUrl, bare: isBare } + + if (opts.statePath) { + try { + fs.mkdirSync(path.dirname(opts.statePath), { recursive: true }) + fs.writeFileSync(opts.statePath, JSON.stringify(meta, null, 2), { mode: 0o600 }) + } catch (err) { + console.error('[gui-control] failed to write state file', err) + } + } + + console.log(`[gui-control] listening on ${baseUrl} (bare=${isBare})`) + + return { + ...meta, + server, + logs, + async close() { + try { + app.removeListener('message', onMessage) + app.removeListener('error', onError) + } catch { + // ignore + } + await new Promise((resolve) => server.close(() => resolve())) + if (opts.statePath) { + try { + fs.unlinkSync(opts.statePath) + } catch { + // ignore + } + } + } + } +} + +module.exports = { start, DEFAULT_SETTINGS, sessionPhase } diff --git a/living_docs/ARCHITECTURE_OVERVIEW.md b/living_docs/ARCHITECTURE_OVERVIEW.md index ac3bbf9..2987546 100644 --- a/living_docs/ARCHITECTURE_OVERVIEW.md +++ b/living_docs/ARCHITECTURE_OVERVIEW.md @@ -6,6 +6,7 @@ **Last updated:** 2026-07-31 **Design name:** Local Authority + Capability Tunnel + Federated Regions **Runtime:** **Bare / Pear only** ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)) +**Product shell:** Pear desktop GUI primary ([ADR-0014](../agent/ADRs/0014-pear-desktop-gui-primary.md)); Bare CLI secondary **Mesh status:** Registry + border migrate + inventory handoff + dual-Squid e2e + offline UX **Security:** Invite TTL (default 7d), role hint, cap rotate + revoke ledger, log redaction @@ -162,6 +163,7 @@ flowchart TB ## Related ADRs - [0013 Bare/Pear only](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md) ← **runtime & release** +- [0014 Pear GUI primary](../agent/ADRs/0014-pear-desktop-gui-primary.md) ← **product shell** - [0002 Flying Squid on Bare](../agent/ADRs/0002-choose-flying-squid-as-server-core.md) - [0003 P2P stack](../agent/ADRs/0003-choose-holepunch-p2p-stack.md) - [0004](../agent/ADRs/0004-process-model-electron-bare-squid.md) — **superseded** by 0013 diff --git a/living_docs/CHANGELOG.md b/living_docs/CHANGELOG.md index 16a644a..e0a8d94 100644 --- a/living_docs/CHANGELOG.md +++ b/living_docs/CHANGELOG.md @@ -9,12 +9,23 @@ and this project aims to follow [Semantic Versioning](https://semver.org/). ## [Unreleased] +### Added + +- **Desktop GUI** as primary product (ADR-0014): Electron shell (`electron/main.cjs`) + Bare backend + loopback `lib/gui-control.js`; polished `index.html` / `ui/` (status pill, logs, settings, toasts) +- Electron Forge packaging (`forge.config.cjs`): `npm run make:client` → ZIP / DMG / Squirrel +- Docs: `developer_docs/DESKTOP.md` +- Legacy `pear run` entry kept as `npm run start:pear` +- Gitea rolling release: `.gitea/workflows/release-rolling.yml` + `scripts/gitea-rolling-release.sh` (secret `RELEASE_TOKEN`; stages CLI + desktop when `FJ_MAKE_CLIENT=1`) + ### Fixed - Bare join crash: `crypto.createPublicKey is not a function` — `bare-crypto` lacks Node KeyObject/RSA APIs that `minecraft-protocol` login calls on every connection; added `build/shims/node-crypto.cjs` (+ `node-constants.cjs`) wired through package/`squid-imports` +- Pear GUI never opened a window: `pear run` + pear-electron UI asset broken on current Pear CLI (`Cannot find module …/run`); `npm start` now launches Electron directly ### Changed +- `npm start` / `npm run dev` → Electron desktop client; CLI via `npm run start:cli`; optional `npm run start:pear` +- GUI control API: `/logs`, `/settings`, richer `/health` + `/status` phase - Root `README.md` rewritten for current product (CLI, mesh, standalone sizes, docs map) — no longer Phase 0 “not started” copy - Docs diagrams converted to **Gitea-compatible Mermaid** (architecture, tunnels, migrate, CI, workflow, invites) diff --git a/living_docs/CURRENT_STATUS.md b/living_docs/CURRENT_STATUS.md index 9cfaa7b..b4fb536 100644 --- a/living_docs/CURRENT_STATUS.md +++ b/living_docs/CURRENT_STATUS.md @@ -1,14 +1,14 @@ # Flying Jib — Current Status **Snapshot date:** 2026-07-31 -**Phase:** 1–4 operational core; Phase 5 security + CI + OTA check + handoff + binary prune -**Product:** Flying Jib — Bare/Pear P2P Minecraft mesh +**Phase:** 1–5 core; **Phase 6 Pear GUI primary** in progress +**Product:** Flying Jib — Pear desktop GUI + Bare CLI (P2P Minecraft mesh) --- ## One-line summary -Private worlds with **TTL invites + cap rotate**, mesh border migrate with **anti-dupe handoff**, soft-reconnect UX, multi-host CI + license gate, Pear OTA config check, standalone **~151 MiB** — Bare/Pear only, no system Node.js. +**Pear GUI primary** (ADR-0014) via Electron shell + Bare control API; Bare CLI secondary; private worlds, TTL invites, mesh border migrate, Gitea rolling CLI release, standalone **~151 MiB** — no system Node.js for Squid. --- @@ -16,23 +16,20 @@ Private worlds with **TTL invites + cap rotate**, mesh border migrate with **ant | Area | Status | |------|--------| +| Pear desktop GUI (`npm start` Electron shell) | **Working** — status/logs/settings + host/join | +| Desktop installers (`npm run make:client`) | **Wired** (Forge zip/dmg/squirrel) | +| Loopback GUI control API | Working (tested) | | Local Squid on `127.0.0.1` / host+join tunnels | Working | -| Bare offline protocol client login | Working (crypto shim; was `createPublicKey` crash) | +| Bare offline protocol client login | Working (crypto shim) | | Chat + presence | Working | -| Standalone binary | Working (**~151 MiB** default prune; ~98 MiB minimal) | -| Invite TTL (default 7d) + role hint + mint CLI | Working | -| Cap rotate / revoke ledger | Working | -| Secret redaction helpers | Working | -| Mesh Autobase registry | Working | -| Border migrate + tunnel switch + offline UX | Working | -| Inventory handoff (id + strip + single-apply + ack) | Working | -| Dual-Squid / two-region e2e | **Tested** | -| Soft-reconnect banners / stable port | Working | -| Multi-host CI standalone matrix | **Wired** | -| Pear OTA structure check + license check in CI | Working | -| Binary size report + minecraft-data prune | Working | +| Bare CLI standalone | Working (**~151 MiB** default prune) | +| Invite TTL + cap rotate / revoke | Working | +| Mesh Autobase + border migrate + handoff | Working | +| Soft-reconnect UX | Working | +| Gitea rolling release workflow | **Wired** (`.gitea/workflows/release-rolling.yml`) | +| Multi-host CI / license / pear check | Working | | Threat model | Written | -| Tests | **48/48 pass** | +| Tests | **50/50 pass** | --- @@ -40,18 +37,18 @@ Private worlds with **TTL invites + cap rotate**, mesh border migrate with **ant | Area | Status | |------|--------| -| Vanilla Java must reconnect after border | Softened | | Live Pear seed with real multisig keys | Not done | -| Role ACL enforcement (viewer vs player) | Hint only | -| Binary size further (runtime / prismarine) | ~98–151 MiB remaining | -| Crash-safe distributed 2PC for handoff | Partial | -| GUI | Not started | +| Manual `pear run` host/join playtest sign-off | Open | +| Role ACL enforcement | Hint only | +| Vanilla Java must reconnect after border | Softened | +| GUI polish beyond MVP | Open | +| Electron Forge packaging | Explicitly out of scope (ADR-0014) | --- ## Next -1. Fill real Pear keys and run live stage/seed once -2. Two-machine Java playtest (`developer_docs/PLAYTEST.md`) -3. Optional minimal release line (`FJ_MC_DATA_MINIMAL=1`) in CI -4. GUI / soft-reconnect further polish +1. Manual Pear GUI playtest (`npm start`) +2. Fill real Pear keys and stage/seed once +3. Two-machine Java playtest +4. Expand GUI (mesh enroll, chat panel) diff --git a/living_docs/PROGRESS.md b/living_docs/PROGRESS.md index 1228f49..00e8c25 100644 --- a/living_docs/PROGRESS.md +++ b/living_docs/PROGRESS.md @@ -5,6 +5,24 @@ --- +## 2026-07-31 — Pear GUI primary + Gitea rolling CI + +### Wins + +- **ADR-0014**: Pear desktop GUI is the primary product shell; Bare CLI secondary; Squid stays Bare-only +- Scaffold: `index.mjs` (pear-electron + pear-bridge), `index.html`, `ui/`, `lib/gui-control.js` (127.0.0.1 JSON API) +- MVP panels: worlds create/list, host+invite, join, status/stop +- Gitea CI: `.gitea/workflows/release-rolling.yml` + `scripts/gitea-rolling-release.sh` (RELEASE_TOKEN, tag `rolling`, CLI tarballs) +- RULES/ROADMAP Phase 6; deps `pear-electron`, `pear-bridge` +- `test/gui-control.test.js` pass + +### Gaps + +- Live pear stage/seed keys still placeholders +- Full manual `pear run` playtest not signed off in this session + +--- + ## 2026-07-31 — Fix Bare `createPublicKey` login crash ### Wins diff --git a/living_docs/ROADMAP.md b/living_docs/ROADMAP.md index f8ffa44..89ad683 100644 --- a/living_docs/ROADMAP.md +++ b/living_docs/ROADMAP.md @@ -4,7 +4,8 @@ > Update this file whenever phase status changes. **Last updated:** 2026-07-31 -**Runtime constraint:** Bare/Pear only — no app-level Node.js ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)) +**Runtime constraint:** Bare/Pear only — no app-level Node.js ([ADR-0013](../agent/ADRs/0013-bare-pear-only-runtime-and-distribution.md)) +**Product shell:** Pear desktop GUI primary ([ADR-0014](../agent/ADRs/0014-pear-desktop-gui-primary.md)); Bare CLI secondary --- @@ -226,6 +227,40 @@ flowchart LR --- +## Phase 6 — Pear desktop GUI (primary product) + +| Field | Value | +|-------|-------| +| **Status** | In Progress | +| **Owner** | TBD | +| **Target** | TBD | +| **ADRs** | **0014**, 0013, 0005 | + +### Goals + +- Pear desktop GUI is the **primary** product (`pear-electron` + `pear-bridge` + `index.html`) +- Bare CLI (`bin.mjs` / standalone) remains **secondary** for headless/CI +- Loopback HTTP control API so UI never loads natives +- Gitea rolling release CI (`RELEASE_TOKEN`) packaging Bare CLI host matrix +- MVP screens: create/list worlds, host, join, mint invite, status + +### Acceptance + +- [x] `index.mjs` + `pear.gui` + `ui/` scaffold; loopback control API (`lib/gui-control.js`) +- [x] Control API refuses non-loopback binds (bind-guard + tests) +- [x] CLI still works (`npm run start:cli` / Bare bin) +- [x] `.gitea/workflows/release-rolling.yml` + `scripts/gitea-rolling-release.sh` (RELEASE_TOKEN) +- [~] `pear run -d .` host/join playtest — scaffold ready; full manual verify open +- [~] User docs describe GUI-first install path (updated; Pear OTA keys still placeholder) + +### Documentation required to complete + +- ADR-0014, ROADMAP, CURRENT_STATUS, PROGRESS, CHANGELOG +- `BUILD_AND_RELEASE.md` Gitea secrets + rolling flow +- `GETTING_STARTED.md` GUI-first + +--- + ## Later / Backlog - Chunk interest & border entity forwarding without full migration @@ -233,6 +268,7 @@ flowchart LR - Shared seed worldgen continuity across region offsets - Performance: congestion control on tunnels - Mobile spectator (non-goal for Squid authority) +- Live Pear stage/seed with real multisig keys (GUI OTA) --- @@ -246,6 +282,7 @@ flowchart LR P2 --> P4[Phase 4
Mesh / border] P3 -.->|benefits| P4 P4 --> P5[Phase 5
Security / release] + P5 --> P6[Phase 6
Pear GUI primary] ``` -Phases 3 and 4 may partially overlap after Phase 2, but border migration depends on tunnels (Phase 2) and benefits from presence (Phase 3). +Phases 3 and 4 may partially overlap after Phase 2, but border migration depends on tunnels (Phase 2) and benefits from presence (Phase 3). Phase 6 builds on Phases 1–5 core. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e7fb5d8..d2d7414 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,8 @@ "hyperswarm": "^4.17.0", "node-rsa": "^0.4.2", "paparam": "^1.10.1", + "pear-bridge": "^1.2.5", + "pear-electron": "^1.7.28", "pear-runtime": "^1.2.0", "protomux": "^3.11.0", "ready-resource": "^1.2.0", @@ -59,12 +61,18 @@ "flying-jib": "bin.mjs" }, "devDependencies": { + "@electron-forge/cli": "^7.11.2", + "@electron-forge/maker-dmg": "^7.11.2", + "@electron-forge/maker-squirrel": "^7.11.2", + "@electron-forge/maker-zip": "^7.11.2", "bare-build": "^1.0.2", "bare-bundle-id": "^1.0.0", "bare-module-traverse": "^1.0.0", "bare-pack": "^2.2.1", "bare-runtime": "1.29.4", "brittle": "^3.19.0", + "electron": "^33.4.11", + "pear-interface": "^1.1.0", "prettier": "^3.6.2", "prettier-config-holepunch": "^2.0.0" }, @@ -95,6 +103,1462 @@ "node": ">=16" } }, + "node_modules/@electron-forge/cli": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.11.2.tgz", + "integrity": "sha512-c+C4ndLfHbxwZuCn9G8iT9wD/woLdaVkoSVjAIbj+0nJhi8UmiVsz/+Gxlj4cvhMRTzBMBxudstLU7RocMikfg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/electron" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core": "7.11.2", + "@electron-forge/core-utils": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "@electron/get": "^3.0.0", + "@inquirer/prompts": "^6.0.1", + "@listr2/prompt-adapter-inquirer": "^2.0.22", + "chalk": "^4.0.0", + "commander": "^11.1.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^7.0.2", + "log-symbols": "^4.0.0", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/cli/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": { + "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": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron-forge/cli/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron-forge/cli/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron-forge/cli/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@electron-forge/cli/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/cli/node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/cli/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/core": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.11.2.tgz", + "integrity": "sha512-RbOvlCahSlYBkY1XFgD5QuoifZltEY3ezYGqJYnV1z6RiUK1DfUXwdidmclBLI9d6u8NNr9xWPv79LHVc9ZA3Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/electron" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core-utils": "7.11.2", + "@electron-forge/maker-base": "7.11.2", + "@electron-forge/plugin-base": "7.11.2", + "@electron-forge/publisher-base": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "@electron-forge/template-base": "7.11.2", + "@electron-forge/template-vite": "7.11.2", + "@electron-forge/template-vite-typescript": "7.11.2", + "@electron-forge/template-webpack": "7.11.2", + "@electron-forge/template-webpack-typescript": "7.11.2", + "@electron-forge/tracer": "7.11.2", + "@electron/get": "^3.0.0", + "@electron/packager": "^18.3.5", + "@electron/rebuild": "^3.7.0", + "@malept/cross-spawn-promise": "^2.0.0", + "@vscode/sudo-prompt": "^9.3.1", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "eta": "^3.5.0", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "global-dirs": "^3.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "jiti": "^2.4.2", + "listr2": "^7.0.2", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "rechoir": "^0.8.0", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/core-utils": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.11.2.tgz", + "integrity": "sha512-/Fpwo44an6ulUdq94co5OOcbRCohgYNci/E6eoZZuTO9f72X+PqJkMkghqkMX3iQ8Aq2QRLkGKFwrKWJNTjL7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "@electron/rebuild": "^3.7.0", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "parse-author": "^2.0.0", + "semver": "^7.2.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/core-utils/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/core-utils/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/core-utils/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/core/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": { + "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": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron-forge/core/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron-forge/core/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron-forge/core/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/core/node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/core/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/maker-base": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.11.2.tgz", + "integrity": "sha512-9934zYu9WVdgCYQXvtS+eL1oyLagsY8JlWhZmoK8yWTYftSAydH7jb3seVpfy6n85SYmY/yjcAy2lvOTy5dUwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/maker-base/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-base/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/maker-base/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/maker-dmg": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.11.2.tgz", + "integrity": "sha512-vh8/mnu3xyMbRcz3S0TV1rB7ZyGhMK60Yz2f2R+Zmj1EbAivLEq5UAvzHdB+kLttr0Dpjp2FIX4TcZ9neD4Y9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^5.0.1" + } + }, + "node_modules/@electron-forge/maker-dmg/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-dmg/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/maker-dmg/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/maker-squirrel": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.11.2.tgz", + "integrity": "sha512-4CILo57ZDEQH1mJxjhYCSXuv+WaU7oPq67KqiTLEUOEzmiPg9u9/z7FXE34H/Tn5aKWN3dy+ngAETzv6iERCGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-winstaller": "^5.3.0" + } + }, + "node_modules/@electron-forge/maker-squirrel/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-squirrel/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/maker-squirrel/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/maker-zip": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.11.2.tgz", + "integrity": "sha512-FWnOm2MORX/nt8psnEtID3Vnt8Blby1NkzjU3KjXBPF9kave71C3lI8KbBbCeKKyTQ/S00i2FiglKdRWQ1WNTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/maker-zip/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-zip/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/maker-zip/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/plugin-base": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.11.2.tgz", + "integrity": "sha512-tIFzEE2+D9NnCAn/rLwSkh8H59IqN+G973JNl7xmCzquO6qa7/veitZOQFGO79Zmmgkc8R/fmiCbh7LIdLS9Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/publisher-base": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.11.2.tgz", + "integrity": "sha512-YwK4ZF3+uW7PBEV/ho59NVTriP3fCahskORrztUaFIdG0QP3hqMsfmo01euv98FDsBEW9UXo7/EW8t5jpmYZ0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/shared-types": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.11.2.tgz", + "integrity": "sha512-Tcles7y74xy3jN5dEC+Pt1duJYk4c7W2xu98tjWW8RewmfKD2uHkie6I1I3yifPFZXZ/QfTlaFOOoKIQ9ENZjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/tracer": "7.11.2", + "@electron/packager": "^18.3.5", + "@electron/rebuild": "^3.7.0", + "listr2": "^7.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-base": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.11.2.tgz", + "integrity": "sha512-l10I+XZRbbxFGiDLMnuXmlOppmLYmimKj6FWjEGUvft4VJFXW2BIDrLIugIGdM1nbrl/0aYjen2xRg0nZlcWzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/core-utils": "7.11.2", + "@electron-forge/shared-types": "7.11.2", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "semver": "^7.2.1", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-base/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-base/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/template-base/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/template-vite": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.11.2.tgz", + "integrity": "sha512-yFSDSu3IdyNpgLXzrwODSUyaWniHRSZI82gwcXdnJLx7D7DIDLtbx6KzEoy7QBmWZRULO3F7rLsYG+Ur7orvyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "@electron-forge/template-base": "7.11.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.11.2.tgz", + "integrity": "sha512-QvvdmO9Gdv+3aISI9+bBLKPBTyKaucs6HhXxz+IDALcdykIL9wVN0/BrWuwwgbwuw4BiJTyXGSPNXuJ+EWnP6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "@electron-forge/template-base": "7.11.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-vite-typescript/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/template-vite-typescript/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/template-vite/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-vite/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/template-vite/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/template-webpack": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.11.2.tgz", + "integrity": "sha512-JjG8XIZctrSZvTlii7Hqvt/pHDKigRk4PoLTQCs1TiT05ZWsn40itBm8cbja3L7bfm0ccDd3JTWWOl2G7PhlmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "@electron-forge/template-base": "7.11.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-webpack-typescript": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.11.2.tgz", + "integrity": "sha512-2lwK+OrCeZgYM8WqsUXJzk94rdF0z/kA7WnAf79U3COEmAAMcFIwJtwF8c/n+52UecP3yrEE70LIGmM1sjGZJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.11.2", + "@electron-forge/template-base": "7.11.2", + "fs-extra": "^10.0.0", + "typescript": "~5.4.5", + "webpack": "^5.69.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-webpack-typescript/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-webpack-typescript/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/template-webpack-typescript/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/template-webpack/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-webpack/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron-forge/template-webpack/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron-forge/tracer": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.11.2.tgz", + "integrity": "sha512-U8j5Hyj2Zt7I5PciJvPJfmEv69Gb/Da9v+k655z3Jj1cuY0UnToEJ61IhXrzlTYqo+jUKC+fgAjDJ6vltJTS0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chrome-trace-event": "^1.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/node-gyp": { + "version": "10.2.0-electron.1", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-lBSgDMQqt7QWMuIjS8zNAq5FI5o5RVBAcJUGWGI6GgoQITJt3msAkUrHp8YHj3RTVE+h70ndqMGqURjp3IfRyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/node-gyp/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize": { + "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, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/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, + "license": "MIT", + "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/notarize/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "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, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/packager": { + "version": "18.4.4", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.4.4.tgz", + "integrity": "sha512-fTUCmgL25WXTcFpM1M72VmFP8w3E4d+KNzWxmTDRpvwkfn/S206MAtM2cy0GF78KS9AwASMOUmlOIzCHeNxcGQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@electron/asar": "^3.2.13", + "@electron/get": "^3.0.0", + "@electron/notarize": "^2.1.0", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^2.0.1", + "@electron/windows-sign": "^1.0.0", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "prettier": "^3.4.2", + "resedit": "^2.0.0", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 16.13.0" + }, + "funding": { + "url": "https://github.com/electron/packager?sponsor=1" + } + }, + "node_modules/@electron/packager/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": { + "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": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/packager/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/packager/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/packager/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/packager/node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/packager/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.2.tgz", + "integrity": "sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "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": { + "@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/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/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/@electron/universal/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, + "license": "MIT", + "engines": { + "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, + "license": "BSD-2-Clause", + "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.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@hyperswarm/secret-stream": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.9.1.tgz", @@ -112,6 +1576,270 @@ "unslab": "^1.3.0" } }, + "node_modules/@inquirer/checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@inquirer/core/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^3.0.1", + "@inquirer/confirm": "^4.0.1", + "@inquirer/editor": "^3.0.1", + "@inquirer/expand": "^3.0.1", + "@inquirer/input": "^3.0.1", + "@inquirer/number": "^2.0.1", + "@inquirer/password": "^3.0.1", + "@inquirer/rawlist": "^3.0.1", + "@inquirer/search": "^2.0.1", + "@inquirer/select": "^3.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -122,6 +1850,17 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -140,6 +1879,199 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", + "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "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, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/appdmg": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@types/appdmg/-/appdmg-0.5.5.tgz", + "integrity": "sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -147,6 +2079,33 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "26.1.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", @@ -174,6 +2133,202 @@ "@types/node": "*" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vscode/sudo-prompt": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@xboxreplay/xboxlive-auth": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@xboxreplay/xboxlive-auth/-/xboxlive-auth-5.1.0.tgz", @@ -183,6 +2338,37 @@ "node": ">=16.0.0" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -195,6 +2381,18 @@ "node": ">=6.5" } }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adaptive-timeout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/adaptive-timeout/-/adaptive-timeout-1.0.1.tgz", @@ -210,6 +2408,46 @@ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", "license": "MIT" }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -226,6 +2464,77 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -250,12 +2559,70 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + }, + "bin": { + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" + } + }, "node_modules/asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==", "license": "MIT" }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/autobase": { "version": "7.28.1", "resolved": "https://registry.npmjs.org/autobase/-/autobase-7.28.1.tgz", @@ -300,6 +2667,13 @@ } } }, + "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, + "license": "MIT" + }, "node_modules/bare-abort": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/bare-abort/-/bare-abort-2.0.13.tgz", @@ -777,6 +3151,17 @@ } } }, + "node_modules/bare-daemon": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/bare-daemon/-/bare-daemon-1.2.4.tgz", + "integrity": "sha512-pyWmqqsN9x2RNzXFpHObyU8+9vgFL7q63Nhtk+xRTXcWL/LkZrYpLmIpYlyPzwZrT2vL+lrjBwVMyCljThfC+A==", + "license": "Apache-2.0", + "dependencies": { + "bare-env": "^3.0.0", + "bare-os": "^3.6.2", + "require-addon": "^1.1.0" + } + }, "node_modules/bare-debug-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bare-debug-log/-/bare-debug-log-2.0.0.tgz", @@ -2290,6 +4675,17 @@ } } }, + "node_modules/base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-data-view": "^1.1.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2310,6 +4706,19 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.8.tgz", + "integrity": "sha512-zAgkquC2WYF0PIc6XbNYkA2uuxxFavzgmX61R+dHDUa558V8Ejf8ozTZFR6QzM24RWu4kBcRkhJ5kpz77j9fnQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/big-sparse-array": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/big-sparse-array/-/big-sparse-array-1.0.3.tgz", @@ -2334,6 +4743,78 @@ "b4a": "^1.5.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "license": "ISC", + "dependencies": { + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, "node_modules/blind-relay": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.6.1.tgz", @@ -2350,6 +4831,13 @@ "streamx": "^2.15.1" } }, + "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, + "license": "MIT" + }, "node_modules/bogon": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.3.0.tgz", @@ -2360,6 +4848,50 @@ "compact-encoding-net": "^1.2.0" } }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/brittle": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/brittle/-/brittle-3.19.1.tgz", @@ -2390,6 +4922,40 @@ "brittle-pear": "bin/pear.js" } }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -2414,6 +4980,16 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", @@ -2432,6 +5008,116 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "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, + "license": "MIT", + "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/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -2442,6 +5128,27 @@ "tslib": "^2.0.3" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -2453,6 +5160,23 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", @@ -2473,6 +5197,159 @@ "tslib": "^2.0.3" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2487,6 +5364,29 @@ "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, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/codecs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/codecs/-/codecs-3.1.0.tgz", @@ -2514,6 +5414,13 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -2556,6 +5463,23 @@ "compact-encoding": "^3.0.0" } }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -2601,6 +5525,71 @@ "which-runtime": "^1.2.1" } }, + "node_modules/crc-native": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.1.8.tgz", + "integrity": "sha512-R/RYbD8lhG5M1k0iLX49tJdwHM0ipevJPpZw2Wk7b4EShyvx2P0uaq79xyRpcknjiVGiUfjFA8Gyy0mOlhABvw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/crc-universal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/crc-universal/-/crc-universal-1.0.4.tgz", + "integrity": "sha512-CE9xWEI6Gd5V0Bdmj5NoWH3d7+EIe4zUpy1sv6uvKYznzsDP1vhiWsTBmL6q9IrH2P6RRshp+8AkhR4CMtY5Hg==", + "license": "ISC", + "optionalDependencies": { + "crc-native": "^1.0.3" + } + }, + "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, + "license": "MIT" + }, + "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", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-zip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.10" + } + }, "node_modules/debounceify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.1.0.tgz", @@ -2624,6 +5613,114 @@ } } }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/device-file": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/device-file/-/device-file-2.3.1.tgz", @@ -2670,6 +5767,17 @@ "vec3": "^0.1.3" } }, + "node_modules/dir-compare": { + "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, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, "node_modules/discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", @@ -2686,6 +5794,37 @@ "tslib": "^2.0.3" } }, + "node_modules/drive-resolve": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/drive-resolve/-/drive-resolve-1.3.1.tgz", + "integrity": "sha512-Fn88wa5vry4JKtE1g4md1SPzU9/fO2h8l73Fr9kmQtaatFIvquR/V6UGjTOcBsWbNgrRMQjY8N6SNoY40o57JQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4", + "bare-module-resolve": "^1.2.5", + "unix-path-resolve": "^1.0.2" + } + }, + "node_modules/ds-store": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", + "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -2695,12 +5834,147 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/electron": { + "version": "33.4.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.4.11.tgz", + "integrity": "sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-installer-dmg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-5.0.1.tgz", + "integrity": "sha512-qOa1aAQdX57C+vzhDk3549dd/PRlNL4F8y736MTD1a43qptD+PvHY97Bo9gSf+OZ8iUWE7BrYSpk/FgLUe40EA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@types/appdmg": "^0.5.5", + "debug": "^4.3.2", + "minimist": "^1.2.7" + }, + "bin": { + "electron-installer-dmg": "dist/electron-installer-dmg-bin.js" + }, + "engines": { + "node": ">= 16" + }, + "optionalDependencies": { + "appdmg": "^0.6.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.399", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-winstaller": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.4.tgz", + "integrity": "sha512-j9ETcBGJaXxAY/b6UBpR7LZfjdU4BAO+yvr4ifqHEdyuc3UNCy91PDGkWKY5UQ4coHNYfnwFggrqD6QPeFGAlg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "semver": "^7.6.3", + "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, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/electron/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==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/encryption-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encryption-encoding/-/encryption-encoding-1.0.3.tgz", @@ -2710,12 +5984,63 @@ "hyperschema": "^1.19.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/endian-toggle": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/endian-toggle/-/endian-toggle-0.0.0.tgz", "integrity": "sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==", "license": "MIT" }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -2726,6 +6051,41 @@ "stackframe": "^1.3.4" } }, + "node_modules/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, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2735,6 +6095,80 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eta": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-3.5.0.tgz", + "integrity": "sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -2744,6 +6178,13 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2762,6 +6203,118 @@ "bare-events": "^2.7.0" } }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/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, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/exit-hook": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", @@ -2774,6 +6327,49 @@ "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, + "license": "Apache-2.0" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2786,12 +6382,56 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-lock": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/fd-lock/-/fd-lock-2.2.0.tgz", @@ -2804,6 +6444,74 @@ "resource-on-exit": "^1.0.0" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-tree": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.13.0.tgz", @@ -2816,6 +6524,58 @@ "integrity": "sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ==", "license": "MIT" }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/flora-colossus/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/flora-colossus/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/flora-colossus/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/flying-squid": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/flying-squid/-/flying-squid-1.12.0.tgz", @@ -2854,6 +6614,17 @@ "node": ">=8" } }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "imul": "^1.0.0" + } + }, "node_modules/framed-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/framed-stream/-/framed-stream-1.0.1.tgz", @@ -2864,6 +6635,34 @@ "streamx": "^2.13.0" } }, + "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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fs-native-extensions": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.5.0.tgz", @@ -2874,6 +6673,125 @@ "which-runtime": "^1.2.0" } }, + "node_modules/fs-native-lock": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fs-native-lock/-/fs-native-lock-1.2.0.tgz", + "integrity": "sha512-x2KlVzvJbNhI2vc+z9+5naq04+6XMyoeLv816sGmP4DWFonu+/N+pigIoDzFV+bdnC5BD3GLeI8eqV/dwCY57Q==", + "license": "Apache-2.0", + "dependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", + "fs-native-extensions": "^1.3.4", + "resource-on-exit": "^1.0.0" + } + }, + "node_modules/fs-temp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", + "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "random-path": "^0.1.0" + } + }, + "node_modules/fs-xattr": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", + "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/galactus/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/galactus/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/galactus/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, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/generate-object-property": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz", @@ -2898,6 +6816,149 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-mime-type": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-mime-type/-/get-mime-type-2.0.2.tgz", + "integrity": "sha512-pTrc0SYvnFGSri+yjvEIq/m/cg2Ti7Vlrlki13RDicWJzLQgKTCDt8Rhdo80vhEzanOGjbpa+KLYjOiJcA26tQ==", + "license": "Apache-2.0" + }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globbie": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/globbie/-/globbie-1.0.5.tgz", @@ -2911,6 +6972,53 @@ "picomatch": "^4.0.5" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graceful-goodbye": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.3.tgz", @@ -2921,6 +7029,43 @@ "safety-catch": "^1.0.2" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -2931,6 +7076,73 @@ "tslib": "^2.0.3" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "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, + "license": "BSD-2-Clause" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/hyperbee": { "version": "2.27.3", "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.27.3.tgz", @@ -3166,6 +7378,51 @@ ], "license": "BSD-3-Clause" }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/index-encoder": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/index-encoder/-/index-encoder-3.5.0.tgz", @@ -3175,6 +7432,95 @@ "b4a": "^1.6.4" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-address": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3184,6 +7530,80 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/is-my-json-valid/node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-options": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.2.tgz", @@ -3199,6 +7619,103 @@ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "license": "MIT" }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-variable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-valid-variable/-/is-valid-variable-1.0.1.tgz", + "integrity": "sha512-ucsrYzt8kcgu2CAOFFWSfOTwa+vPNzQHK1RL6RooSkwozJ92e9wl4cyG/GLDeuNEVj56kvuNZGCR7eSkzrhudg==", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3211,6 +7728,27 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -3233,6 +7771,16 @@ "npm": ">=6" } }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -3263,6 +7811,141 @@ "bare-events": "^2.2.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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/listen-async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/listen-async/-/listen-async-1.0.0.tgz", + "integrity": "sha512-i8x+jPmM3YaeU+5zL+NWMwzPT0/WV0q23rviQuu9EkdPuAYjnnsa5LDL406hJ/QNNkziKpnJ1T+3VxJQELskqw==", + "license": "Apache-2.0" + }, + "node_modules/listr2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/localdrive": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/localdrive/-/localdrive-2.2.1.tgz", @@ -3278,6 +7961,38 @@ "unix-path-resolve": "^1.0.2" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "optional": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -3332,6 +8047,163 @@ "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", "license": "MIT" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -3347,12 +8219,191 @@ "tslib": "^2.0.3" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/macaddress": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.5.4.tgz", "integrity": "sha512-i8xVWoUjj2woYU8kbpQby86Kq7uF7xl2brtKREXUBWpfgqx1fKXEeYzDiVMVxA/IufC1d3xxwJRHtFCX+9IspA==", "license": "MIT" }, + "node_modules/macos-alias": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.12.tgz", + "integrity": "sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.4.0" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minecraft-data": { "version": "3.112.0", "resolved": "https://registry.npmjs.org/minecraft-data/-/minecraft-data-3.112.0.tgz", @@ -3395,6 +8446,187 @@ "node": ">=22" } }, + "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": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/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, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "ISC", + "dependencies": { + "minipass": "^3.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, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/mirror-drive": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.14.2.tgz", @@ -3410,6 +8642,19 @@ "unix-path-resolve": "^1.0.2" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mojangson": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mojangson/-/mojangson-2.0.4.tgz", @@ -3451,6 +8696,29 @@ "require-addon": "^1.2.0" } }, + "node_modules/murmur-32": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", + "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/mutexify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz", @@ -3460,6 +8728,14 @@ "queue-tick": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/nanoassert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", @@ -3520,6 +8796,30 @@ "ms": "^2.1.1" } }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -3530,6 +8830,29 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abi": { + "version": "3.94.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", + "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -3550,6 +8873,16 @@ } } }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/node-rsa": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz", @@ -3581,6 +8914,284 @@ "sodium-universal": "^5.0.0" } }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/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, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/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, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/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, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/paparam": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/paparam/-/paparam-1.10.2.tgz", @@ -3597,6 +9208,50 @@ "tslib": "^2.0.3" } }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true, + "optional": true + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -3617,12 +9272,296 @@ "tslib": "^2.0.3" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pe-library": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", + "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pear-aliases": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pear-aliases/-/pear-aliases-1.0.7.tgz", + "integrity": "sha512-Z85C0naSKh3XMBKm1P1L2kYbIGE+Ph0HRSjTaQz5O99JvQq/wHylu9M2df1Ysfx7LG3UJrCCwZenrud18bZytw==", + "license": "Apache-2.0", + "dependencies": { + "hypercore-id-encoding": "^1.3.0" + } + }, + "node_modules/pear-api": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/pear-api/-/pear-api-1.30.0.tgz", + "integrity": "sha512-b9y4hCBTCmP7m3riC4O+mc5g8KNKJsLjbqi7TOFSZyvuIjJeP/d/caBYXdhKab0rcOz/kkSdNWvedox4zBtERQ==", + "license": "Apache-2.0", + "dependencies": { + "pear-constants": "^1.0.0", + "pear-errors": "^1.0.0", + "pear-gracedown": "^1.0.0", + "pear-gunk": "^1.0.0", + "pear-message": "^1.0.0", + "pear-messages": "^1.0.0", + "pear-pipe": "^1.0.1", + "pear-ref": "^1.0.2", + "pear-run": "^1.0.0", + "pear-updates": "^1.0.1", + "pear-wakeups": "^1.0.0" + } + }, + "node_modules/pear-appdrive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pear-appdrive/-/pear-appdrive-1.1.2.tgz", + "integrity": "sha512-AmCrZaNGFU/BvHR+oFP/cNEUCH1vbzezsJV9wqASoggyg8d4sSb0L6kr99ugGkAuUFlOBI2uHni71hBTaO2rDA==", + "license": "Apache-2.0", + "dependencies": { + "pear-ipc": "^6.6.1", + "pear-ref": "^1.0.1", + "ready-resource": "^1.1.2" + } + }, + "node_modules/pear-bridge": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pear-bridge/-/pear-bridge-1.2.5.tgz", + "integrity": "sha512-n6ILZteZOcESljImP/78Jv35aRNUk6TFMJyNmbVBah7cpV8W0H3IsQEvzTt1d2vCywNN+Tv7RoCVL6V3BAcC9A==", + "license": "Apache-2.0", + "dependencies": { + "bare-http1": "^4.0.2", + "get-mime-type": "^2.0.0", + "listen-async": "^1.0.0", + "pear-appdrive": "^1.0.0", + "pear-errors": "^1.0.0", + "pear-gunk": "^1.0.0", + "pear-stamp": "^1.0.1", + "ready-resource": "^1.1.1", + "script-linker": "^2.5.3", + "sodium-native": "^5.0.9", + "streamx": "^2.21.1" + } + }, + "node_modules/pear-cmd": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pear-cmd/-/pear-cmd-1.0.2.tgz", + "integrity": "sha512-vecXkSAFUS0ODh9I2zgsDcC4cW6sTQ1ZZTq5Fj/6G20HprvPNARbvraGJrkv5dRZ8Epezdgjws0vqB4W4VVd6w==", + "license": "Apache-2.0", + "dependencies": { + "paparam": "^1.8.5" + } + }, + "node_modules/pear-constants": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pear-constants/-/pear-constants-1.1.3.tgz", + "integrity": "sha512-dW8EkiLXjmzr8C8gUqZEIZ4dEKKljRNBznlRM53JPzkDhd053alCbq+T18sE/D2KvzMBW69/Pp1ExFN07xi1EA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.7", + "blake2b": "^2.1.4", + "pear-aliases": "^1.0.2", + "pear-rti": "^1.0.1", + "sodium-native": "^5.0.6", + "url-file-url": "^1.0.5", + "which-runtime": "^1.3.0" + } + }, + "node_modules/pear-crasher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pear-crasher/-/pear-crasher-1.0.1.tgz", + "integrity": "sha512-Ott6ANdu01t5zUXDQ50g0QRQ57SZu35KLuRjuKRsrOLLwdKeBTNYscX4VCgLnfKINlpGtRz/vzUGFPgBXGf6lg==", + "license": "Apache-2.0", + "dependencies": { + "pear-rti": "^1.0.1" + } + }, + "node_modules/pear-electron": { + "version": "1.7.28", + "resolved": "https://registry.npmjs.org/pear-electron/-/pear-electron-1.7.28.tgz", + "integrity": "sha512-ZCOFvVmUZgPxl8bCG0EllweW+eO2svGM5BLFNI8nppXdiIeE7ns8fLsQnGS2JdVALpG7ilaNja5pq1XRHbvhYw==", + "license": "Apache-2.0", + "dependencies": { + "bare-env": "^3.0.0", + "bare-fs": "^4.0.1", + "bare-os": "^3.4.0", + "bare-path": "^3.0.0", + "bare-subprocess": "^5.0.2", + "compact-encoding": "^2.16.1", + "localdrive": "^1.12.1", + "paparam": "^1.6.1", + "pear-api": "^1.29.1", + "pear-cmd": "^1.0.0", + "pear-constants": "^1.0.0", + "pear-crasher": "^1.0.1", + "pear-errors": "^1.0.0", + "pear-gunk": "^1.0.0", + "pear-ipc": "^6.4.0", + "pear-link": "^4.1.0", + "pear-logger": "^1.0.0", + "pear-pipe": "^1.0.2", + "pear-run": "^1.0.0", + "pear-state": "^1.0.2", + "pear-terminal": "^1.0.0", + "pear-tryboot": "^1.0.0", + "script-linker": "^2.5.3", + "streamx": "^2.20.2", + "unix-path-resolve": "^1.0.2", + "url-file-url": "^1.0.4", + "which-runtime": "^1.2.1" + } + }, + "node_modules/pear-electron/node_modules/compact-encoding": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.19.2.tgz", + "integrity": "sha512-/YjhHQE/5L4F7l5Bht69dRbP9RV6zoJPeowi8bMKQxNKe3Nh6hOY8pBGoVE9fz5GaWfEd8fWJ2aU9sB4KZuMYg==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.3.0" + } + }, + "node_modules/pear-electron/node_modules/localdrive": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/localdrive/-/localdrive-1.12.2.tgz", + "integrity": "sha512-kISUZK6naLZrvcK/+IqXk5IsAu8S6owlVM0MUT6MZrQSIzLplZ4FXljkEBHwPDe3InVue4FDG9d4p8lKXGgRCQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.1", + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", + "mirror-drive": "^1.2.0", + "mutexify": "^1.4.0", + "streamx": "^2.12.5", + "unix-path-resolve": "^1.0.2" + } + }, + "node_modules/pear-electron/node_modules/pear-link": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/pear-link/-/pear-link-4.2.1.tgz", + "integrity": "sha512-Y6xSOY36EkWmaeTYqNVT2iV0xWfzCDCBtPCF898793ADk9Lbzfq7RLJ7PhqHRS+dLI7yTlLtCCfjGR3erQ0FKQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0", + "hypercore-id-encoding": "^1.2.0", + "pear-aliases": "^1.0.0", + "pear-errors": "^1.0.0" + } + }, "node_modules/pear-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pear-errors/-/pear-errors-1.0.1.tgz", "integrity": "sha512-KQyhym09QpLT4H/z3uLW0bqixgIZic2Eip2Q8Z72QmIpFzPtp6QmnzOUwB3kuHB4dqKNa+FQWHWH0NSK5lJjlw==", "license": "Apache-2.0" }, + "node_modules/pear-gracedown": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pear-gracedown/-/pear-gracedown-1.0.5.tgz", + "integrity": "sha512-9SQBzAq/YOyphcdF3vQnnxuhfQ+ydL0LNdzbg1ztHyq9KtzGKEgZv86Nfh2eMMEkIpsSayiZOBdgssCwGX1d/Q==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.6.1", + "bare-signals": "^5.0.0", + "safety-catch": "^1.0.2", + "url-file-url": "^1.0.5" + } + }, + "node_modules/pear-gunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pear-gunk/-/pear-gunk-1.0.1.tgz", + "integrity": "sha512-xN2aGZxGXY/rpSlq24UHsc/RMX12DLJzCM5XPJriDBn7MHUrHoKmD/SZTLT6RlFeL2z9MheRnrge6oR6eIGUMA==", + "license": "Apache-2.0", + "dependencies": { + "crc-universal": "^1.0.4", + "fs-native-extensions": "^1.4.3", + "quickbit-universal": "^2.2.0", + "rocksdb-native": "^3.7.5", + "script-linker": "^2.5.4", + "sodium-native": "^5.0.8", + "udx-native": "^1.18.3" + } + }, + "node_modules/pear-interface": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pear-interface/-/pear-interface-1.1.0.tgz", + "integrity": "sha512-hJSoyY5Sk6ox6sT128TXSSuUKPdwOiRPa47ArEw6cfLMFxDAnyG1kh5xq+qTiSiENDqgV4Sjd8EtsPITRAL09Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-pipe": "^4.0.5", + "streamx": "^2.18.0" + } + }, + "node_modules/pear-ipc": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/pear-ipc/-/pear-ipc-6.12.0.tgz", + "integrity": "sha512-wnTFqtF7pqQCFUSYclW6j7Abd1SXhZ3AFNhyVzQ+qwiDgUT8q2s1K9gUH1PqybGfgQkPf26i6ew/I+vU22gPvg==", + "license": "Apache-2.0", + "dependencies": { + "bare-fs": "^4.0.1", + "bare-os": "^3.2.0", + "bare-path": "^3.0.0", + "bare-pipe": "^4.0.5", + "framed-stream": "^1.0.1", + "fs-native-extensions": "^1.2.7", + "fs-native-lock": "^1.1.0", + "ready-resource": "^1.0.3", + "streamx": "^2.16.1", + "tiny-buffer-rpc": "^2.2.0", + "which-runtime": "^1.2.0" + } + }, "node_modules/pear-link": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/pear-link/-/pear-link-5.0.1.tgz", @@ -3634,6 +9573,109 @@ "pear-errors": "^1.0.1" } }, + "node_modules/pear-logger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pear-logger/-/pear-logger-1.0.1.tgz", + "integrity": "sha512-DMFcqReoaAoxliOSAgw09RwVmWdwXaEPXG/rZ/aITPAVqZetY06P17ipuywEKECH1N1kt5JZ2hVvJPRE/nUllg==", + "license": "Apache-2.0", + "dependencies": { + "bare-format": "^1.0.1", + "bare-hrtime": "^2.0.11", + "pear-cmd": "^1.0.0", + "which-runtime": "^1.3.0" + } + }, + "node_modules/pear-message": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pear-message/-/pear-message-1.0.0.tgz", + "integrity": "sha512-ZBZsaIv4PVS38psP/x32D2xaRKf1qI9FnB0gTsRPY0NChV38qhWsnQDbXOhAYGxkTqjREC0OkDoQAha7z6wo/Q==", + "license": "Apache-2.0", + "dependencies": { + "pear-ref": "^1.0.1", + "sodium-native": "^5.0.6" + } + }, + "node_modules/pear-messages": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pear-messages/-/pear-messages-1.0.5.tgz", + "integrity": "sha512-2kCw5lnnFxBZ+d4wz8L+AmKi25M0rwdgPWsMTGLBbmkyKmaPVBQBpG8ZktsFwVPGBSLu9dFtGC79VYYDSaA3Vw==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.7", + "pear-ipc": "^6.5.0", + "pear-ref": "^1.0.1", + "sodium-native": "^5.0.6" + } + }, + "node_modules/pear-opwait": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pear-opwait/-/pear-opwait-1.0.0.tgz", + "integrity": "sha512-V8h7GWihtc5Cam4e0EDJebuwpTxndSRfVsIPAll1YZgf+QG5XrpwQeF8umvxiDBYJXwtJ9P3pVnbsM4jk7vDuA==", + "license": "Apache-2.0", + "dependencies": { + "pear-errors": "^1.0.0" + } + }, + "node_modules/pear-pipe": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pear-pipe/-/pear-pipe-1.0.6.tgz", + "integrity": "sha512-7XApSERIgctSlSjsZ8ATkFXwbkIyCEHG90GQdsc1DG2GkDYxYuGrq4c4H/YEE2jt1oq6VywwE/eNtvrlOEUeHg==", + "license": "Apache-2.0", + "dependencies": { + "bare-fs": "^4.1.6", + "bare-pipe": "^4.0.6", + "streamx": "^2.22.1", + "which-runtime": "^1.3.0" + } + }, + "node_modules/pear-ref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pear-ref/-/pear-ref-1.0.2.tgz", + "integrity": "sha512-IUGGSULYVF6jfdtsHY0XOokMp1v1KI89q8yPhsnqrLFf+Wq8EEOD0capny8gqXyu0eGkIh753X1cFUVL36n7FA==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.6.1" + } + }, + "node_modules/pear-rti": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pear-rti/-/pear-rti-1.0.1.tgz", + "integrity": "sha512-rpVNVY9Zwu8ng5sTywaMV8exCkzRWATVElmCsgFH2zfdvVqvsYMxVN1oW9xKSAP2eKJ8cInoL1UmMJLcdbFIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/pear-run": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pear-run/-/pear-run-1.0.8.tgz", + "integrity": "sha512-X56S6WJEvE5UKxH+XI1WhsgN2oCzPMg2jO/FH/bNFWX9a/LQmQobcIuxLPDBH+iuiHPM1inFScrYWVNZGWqWDw==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.7", + "bare-path": "^3.0.0", + "bare-subprocess": "^5.1.0", + "paparam": "^1.8.5", + "pear-cmd": "^1.0.0", + "pear-link": "^4.1.0", + "pear-ref": "^1.0.0", + "unix-path-resolve": "^1.0.2", + "url-file-url": "^1.0.5", + "which-runtime": "^1.3.2" + } + }, + "node_modules/pear-run/node_modules/pear-link": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/pear-link/-/pear-link-4.2.1.tgz", + "integrity": "sha512-Y6xSOY36EkWmaeTYqNVT2iV0xWfzCDCBtPCF898793ADk9Lbzfq7RLJ7PhqHRS+dLI7yTlLtCCfjGR3erQ0FKQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0", + "hypercore-id-encoding": "^1.2.0", + "pear-aliases": "^1.0.0", + "pear-errors": "^1.0.0" + } + }, "node_modules/pear-runtime": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pear-runtime/-/pear-runtime-1.3.1.tgz", @@ -3669,6 +9711,107 @@ "which-runtime": "^1.3.2" } }, + "node_modules/pear-stamp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pear-stamp/-/pear-stamp-1.0.2.tgz", + "integrity": "sha512-1cU2EnHlcLsixP9cPZqIWJORxbCKyDCQ6G9JL1d+GFaEqwVmyOCSxHwzxzSdfTccWzpBI4Zs/5r/l0YpbQuvIg==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.22.1" + } + }, + "node_modules/pear-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pear-state/-/pear-state-1.1.0.tgz", + "integrity": "sha512-zs09OU6hwvx/25OuMVaCRgLQWKGXVIcd0yFWjCqa1yo9SY9u5GMSxix7nWjtGusTYTtBKAJhFo+i53GcXsosfg==", + "license": "Apache-2.0", + "dependencies": { + "bare-env": "^3.0.0", + "bare-fs": "^4.2.0", + "bare-os": "^3.6.1", + "bare-path": "^3.0.0", + "hypercore-crypto": "^3.6.1", + "hypercore-id-encoding": "^1.3.0", + "pear-constants": "^1.0.0", + "pear-link": "^4.1.0", + "which-runtime": "^1.3.0" + } + }, + "node_modules/pear-state/node_modules/pear-link": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/pear-link/-/pear-link-4.2.1.tgz", + "integrity": "sha512-Y6xSOY36EkWmaeTYqNVT2iV0xWfzCDCBtPCF898793ADk9Lbzfq7RLJ7PhqHRS+dLI7yTlLtCCfjGR3erQ0FKQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0", + "hypercore-id-encoding": "^1.2.0", + "pear-aliases": "^1.0.0", + "pear-errors": "^1.0.0" + } + }, + "node_modules/pear-terminal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pear-terminal/-/pear-terminal-1.2.1.tgz", + "integrity": "sha512-NPdghB3DAHb8F/BQS1YyZiIAzjtwYxwfzhlk6pkZpFGtT6Lizk0oyM97eq0Np+h/gIyny+l7/Z8G6uZkJyYfSw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.6.1", + "bare-fs": "^4.2.0", + "bare-readline": "^1.0.9", + "bare-stream": "^2.7.0", + "bare-tty": "^5.0.2", + "hypercore-id-encoding": "^1.3.0", + "pear-constants": "^1.0.0", + "pear-errors": "^1.0.1", + "pear-gracedown": "^1.0.0", + "pear-opwait": "^1.0.0", + "streamx": "^2.22.1", + "tiny-byte-size": "^1.1.0", + "which-runtime": "^1.3.0" + } + }, + "node_modules/pear-tryboot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pear-tryboot/-/pear-tryboot-1.0.0.tgz", + "integrity": "sha512-0zTaj9vAXsXoKjtKhJfDBRDcfNY+1+zXu9Ttks9UgnCH0yNYTffghABjqNEOvwX5xPwLqzvHlxBamV9MckBkRA==", + "license": "Apache-2.0", + "dependencies": { + "bare-daemon": "^1.2.1", + "pear-constants": "^1.0.0" + } + }, + "node_modules/pear-updates": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pear-updates/-/pear-updates-1.1.0.tgz", + "integrity": "sha512-cD759YRSDFLqlr7sM44imVtdQTc18hflvV2v4ENtoBoKfrLnn5HWklsbgTYfE82az7G+3qaE1JBCtBih/W5dvg==", + "license": "Apache-2.0", + "dependencies": { + "pear-messages": "^1.0.0" + } + }, + "node_modules/pear-wakeups": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pear-wakeups/-/pear-wakeups-1.0.0.tgz", + "integrity": "sha512-by8XW24RjQcgETxwGJYnOAnnyFtMOC6++G/3zdwDDBuxouKZnib3JVWBdGvNdTiI8IpedApCOLqNZaHrkBxyvA==", + "license": "Apache-2.0", + "dependencies": { + "pear-messages": "^1.0.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC" + }, "node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", @@ -3682,6 +9825,57 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prettier": { "version": "3.9.6", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", @@ -3868,6 +10062,16 @@ "node": ">=8.0.0" } }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3877,6 +10081,16 @@ "node": ">= 0.6.0" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promaphore": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/promaphore/-/promaphore-1.0.0.tgz", @@ -3884,6 +10098,27 @@ "dev": true, "license": "MIT" }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/protocol-buffers-encodings": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.2.0.tgz", @@ -3946,6 +10181,17 @@ "protomux": "^3.10.1" } }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3955,12 +10201,46 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/queue-tick": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "license": "MIT" }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/quickbit-native": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.4.8.tgz", @@ -4034,6 +10314,18 @@ "integrity": "sha512-u7xCM93XqKEvPTP6xZp2ehttcAemKnh73oKNf1FvzuVCfpt6dILDt1Kxl1LeBjm2iNIeR49VGFhy4Iz3yOun+Q==", "license": "MIT" }, + "node_modules/random-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", + "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, "node_modules/random-seed": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/random-seed/-/random-seed-0.3.0.tgz", @@ -4055,6 +10347,117 @@ "node": ">=0.8" } }, + "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, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-write-mutexify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-write-mutexify/-/read-write-mutexify-2.1.0.tgz", + "integrity": "sha512-fDw/p5/acI1ytVY1UbxEDma/ej1yJH/n9NcjS9YNzcE6sPBPWdlru3ydRa/UBowUg4zqOvNMD5SOGYJrlQ6MzQ==", + "license": "MIT" + }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -4086,6 +10489,19 @@ "bare-events": "^2.2.0" } }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/record-cache": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", @@ -4101,6 +10517,17 @@ "integrity": "sha512-1WosVzUy0kPUaPMEtlNDwm99UsteALIhXXR8rerELoa63WkYIXAl0hxgwPFrIYBRWZPGUyekQ04FRtPJ7dHk9w==", "license": "Apache-2.0" }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-addon": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz", @@ -4135,6 +10562,63 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.3.tgz", + "integrity": "sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^1.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve-reject-promise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-reject-promise/-/resolve-reject-promise-1.1.0.tgz", @@ -4147,6 +10631,43 @@ "integrity": "sha512-ViJwJAknCkLRJRPR+9SISQQ7R5eRgtdIHLJsM2hHx1MweAJbJxJ5XnMjjq0Lc7ZGv44ufzAqds1nKxiVkdy4ag==", "license": "Apache-2.0" }, + "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, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4156,6 +10677,70 @@ "node": ">=0.12" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rocksdb-native": { "version": "3.17.2", "resolved": "https://registry.npmjs.org/rocksdb-native/-/rocksdb-native-3.17.2.tgz", @@ -4174,6 +10759,30 @@ "bare": ">=1.16.0" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -4238,12 +10847,86 @@ "node": ">=11.0.0" } }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/scope-lock": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/scope-lock/-/scope-lock-1.2.4.tgz", "integrity": "sha512-BpSd8VCuCxW9ZitcdIC/vjs3gMaP9bRBL5nkHcyfX2VrS52n13/rHuBA2xJ/S/4DPuRdAO/Bk8pWd8eD/gHCIA==", "license": "Apache-2.0" }, + "node_modules/script-linker": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/script-linker/-/script-linker-2.5.4.tgz", + "integrity": "sha512-hzVNCEyu/1g9egVPk7s+jTgus+ZGd12d/Rjkm2QjOmPW5l07EANXd20cjAjA3aLPRY/n5z1UUESKHUf4tli5Tg==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.6.0", + "b4a": "^1.3.1", + "cjs-module-lexer": "^1.2.2", + "drive-resolve": "^1.0.1", + "es-module-lexer": "^1.6.0", + "is-valid-variable": "^1.0.0", + "read-write-mutexify": "^2.0.0", + "source-map-bare": "^1.0.0", + "unix-path-resolve": "^1.0.2" + } + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -4256,6 +10939,14 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -4267,6 +10958,46 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/shuffled-priority-queue": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", @@ -4276,6 +11007,19 @@ "unordered-set": "^2.0.1" } }, + "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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/signal-promise": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz", @@ -4314,6 +11058,49 @@ "simdle-native": "^1.1.1" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4334,6 +11121,36 @@ "tslib": "^2.0.3" } }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sodium-native": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.1.0.tgz", @@ -4375,6 +11192,101 @@ } } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-bare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/source-map-bare/-/source-map-bare-1.0.0.tgz", + "integrity": "sha512-e1AGLUcnbp8l4URDmHXuCRlts4CRwjPVd/2XDD6a3zUdcF5lr7hp2pTYMoklJXaN4CArYBb53jXGVRsSsVsDPA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-bare/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/source-map-bare/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/source-map-bare/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/speedometer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", @@ -4387,6 +11299,27 @@ "integrity": "sha512-arrGOnli7tXoLWMqK8xXdV0qXLj3zd0OtgeME5SL/Nub0ssSYD27m9SlEsYcJGNi+VvEzVQIoBnAHOOhdZqc5Q==", "license": "ISC" }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -4394,6 +11327,17 @@ "dev": true, "license": "MIT" }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "license": "Unlicense", + "optional": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/streamx": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", @@ -4440,6 +11384,49 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/sub-encoder": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/sub-encoder/-/sub-encoder-2.1.3.tgz", @@ -4450,6 +11437,88 @@ "codecs": "^3.1.0" } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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==", + "deprecated": "Old versions of tar 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": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/teex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", @@ -4459,6 +11528,69 @@ "streamx": "^2.12.5" } }, + "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, + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/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, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/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, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", + "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/test-tmp": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/test-tmp/-/test-tmp-1.4.0.tgz", @@ -4507,6 +11639,24 @@ "b4a": "^1.6.0" } }, + "node_modules/tiny-buffer-rpc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tiny-buffer-rpc/-/tiny-buffer-rpc-2.4.0.tgz", + "integrity": "sha512-ufPVMw0J8e7EtgLaIRy/EhDjZklTTZf6SNNE5JO07xbUZ6UJNIlLCIsd3Wdd4D4A1fw+0y8Pe6dqx+Lw4IGW8Q==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.3", + "compact-encoding": "^3.0.0", + "safety-catch": "^1.0.2", + "streamx": "^2.13.2" + } + }, + "node_modules/tiny-byte-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-byte-size/-/tiny-byte-size-1.1.0.tgz", + "integrity": "sha512-OQ+i4RZzIQ0CR22DEr3G+ckRwN93R9UQMNqeym41Ntfj/dchPyWu1cuu8mvdCv61Ng3uOmNgX+8WesK1f37x+w==", + "license": "MIT" + }, "node_modules/tmatch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-5.0.0.tgz", @@ -4517,18 +11667,103 @@ "node": ">=8" } }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tn1150": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", + "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", @@ -4538,6 +11773,20 @@ "rxjs": "*" } }, + "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, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/udx-native": { "version": "1.20.7", "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.20.7.tgz", @@ -4565,6 +11814,42 @@ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "license": "MIT" }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unix-path-resolve": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unix-path-resolve/-/unix-path-resolve-1.0.2.tgz", @@ -4577,6 +11862,17 @@ "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==", "license": "MIT" }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "license": "MIT or GPL-2.0", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/unslab": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz", @@ -4586,6 +11882,37 @@ "b4a": "^1.6.6" } }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/upper-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", @@ -4613,6 +11940,37 @@ "punycode": "^2.1.0" } }, + "node_modules/url-file-url": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-file-url/-/url-file-url-1.0.5.tgz", + "integrity": "sha512-RkUWAFWSmCDpyFn2qf2QO8Gnwf0y5RadgJuDpBeFD6gEzDuh6hTNpd/jox4znFFqZ79ghAS0gGM7F3ZU4nrMWw==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0", + "which-runtime": "^1.2.0" + } + }, + "node_modules/username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -4647,6 +12005,17 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/varint": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", @@ -4659,12 +12028,96 @@ "integrity": "sha512-Sr1U3mYtMqCOonGd3LAN9iqy0qF6C+Gjil92awyK/i2OwiUo9bm7PnLgFpafymun50mOjnDcg4ToTgRssrlTcw==", "license": "BSD" }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, + "node_modules/webpack": { + "version": "5.109.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -4675,6 +12128,22 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-runtime": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.4.0.tgz", @@ -4698,12 +12167,40 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/xache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/xache/-/xache-1.3.0.tgz", "integrity": "sha512-ekAknjLTiyXJcuezqwa/cOMfFenVVY2toL4J7D3AfTn7UEDYb8JSgRnv3CK8khF7u38XZ4NjS1MXEw4RwqJ4oA==", "license": "MIT" }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/xxhash-wasm": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", @@ -4719,6 +12216,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "17.7.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", @@ -4746,6 +12250,17 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yggdrasil": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/yggdrasil/-/yggdrasil-1.8.0.tgz", @@ -4770,6 +12285,32 @@ "uuid": "dist/bin/uuid" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/z32": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz", diff --git a/package.json b/package.json index 557b51b..d291180 100644 --- a/package.json +++ b/package.json @@ -5,15 +5,19 @@ "description": "Fully decentralized peer-to-peer Minecraft mesh (Bare/Pear + Flying Squid + Holepunch — no app-level Node.js)", "license": "Apache-2.0", "private": true, + "main": "index.mjs", "bin": "bin.mjs", "upgrade": "pear://", "scripts": { "postinstall": "node scripts/patch-engines-for-bare.js && node scripts/patch-flying-squid-plugins.js && node scripts/patch-flying-squid-log.js && node scripts/patch-flying-squid-login.js && node scripts/generate-squid-imports.js", - "start": "node_modules/bare-runtime/bin/bare bin.mjs", + "dev": "env -u ELECTRON_RUN_AS_NODE electron electron/main.cjs", + "start": "env -u ELECTRON_RUN_AS_NODE electron electron/main.cjs", + "start:pear": "pear run -d .", + "start:cli": "node_modules/bare-runtime/bin/bare bin.mjs", "start:node": "node bin.mjs", "test": "brittle-node test/*.test.js", "test:bare": "brittle-bare test/*.test.js", - "docs:check": "node -e \"const fs=require('fs');const paths=['living_docs/ROADMAP.md','living_docs/CURRENT_STATUS.md','agent/RULES.md','agent/SECURITY.md','developer_docs/ARCHITECTURE.md','user_docs/README.md','lib/squid-manager.js','bin.mjs'];for (const p of paths){if(!fs.existsSync(p)){console.error('missing',p);process.exit(1)}};console.log('docs+app scaffold ok')\"", + "docs:check": "node -e \"const fs=require('fs');const paths=['living_docs/ROADMAP.md','living_docs/CURRENT_STATUS.md','agent/RULES.md','agent/SECURITY.md','developer_docs/ARCHITECTURE.md','user_docs/README.md','lib/squid-manager.js','bin.mjs','index.mjs','index.html'];for (const p of paths){if(!fs.existsSync(p)){console.error('missing',p);process.exit(1)}};console.log('docs+app scaffold ok')\"", "pear:check": "node scripts/pear-ota-check.js --allow-placeholder", "pear:check:strict": "node scripts/pear-ota-check.js", "license:check": "node scripts/license-check.js", @@ -23,12 +27,39 @@ "make": "node scripts/make.js", "make:standalone": "node scripts/bare-standalone.cjs", "make:standalone:all": "node scripts/bare-standalone.cjs --host all", + "package:client": "env -u ELECTRON_RUN_AS_NODE electron-forge package", + "make:client": "env -u ELECTRON_RUN_AS_NODE electron-forge make", + "make:client:darwin-arm64": "env -u ELECTRON_RUN_AS_NODE FJ_PACKAGE_PLATFORM=darwin FJ_PACKAGE_ARCH=arm64 electron-forge make --platform darwin --arch arm64", + "make:client:darwin-x64": "env -u ELECTRON_RUN_AS_NODE FJ_PACKAGE_PLATFORM=darwin FJ_PACKAGE_ARCH=x64 electron-forge make --platform darwin --arch x64", + "make:client:linux-x64": "env -u ELECTRON_RUN_AS_NODE FJ_PACKAGE_PLATFORM=linux FJ_PACKAGE_ARCH=x64 electron-forge make --platform linux --arch x64", + "make:client:linux-arm64": "env -u ELECTRON_RUN_AS_NODE FJ_PACKAGE_PLATFORM=linux FJ_PACKAGE_ARCH=arm64 electron-forge make --platform linux --arch arm64", + "make:client:win32-x64": "env -u ELECTRON_RUN_AS_NODE FJ_PACKAGE_PLATFORM=win32 FJ_PACKAGE_ARCH=x64 electron-forge make --platform win32 --arch x64", "make:darwin-arm64": "bare-build --name flying-jib --standalone --host darwin-arm64 --out ./out/darwin-arm64 bin.mjs", "make:darwin-x64": "bare-build --name flying-jib --standalone --host darwin-x64 --out ./out/darwin-x64 bin.mjs", "make:linux-arm64": "bare-build --name flying-jib --standalone --host linux-arm64 --out ./out/linux-arm64 bin.mjs", "make:linux-x64": "bare-build --name flying-jib --standalone --host linux-x64 --out ./out/linux-x64 bin.mjs", "make:win32-arm64": "bare-build --name flying-jib --standalone --host win32-arm64 --out ./out/win32-arm64 bin.mjs", - "make:win32-x64": "bare-build --name flying-jib --standalone --host win32-x64 --out ./out/win32-x64 bin.mjs" + "make:win32-x64": "bare-build --name flying-jib --standalone --host win32-x64 --out ./out/win32-x64 bin.mjs", + "release:rolling": "bash scripts/gitea-rolling-release.sh" + }, + "config": { + "forge": "./forge.config.cjs" + }, + "pear": { + "pre": "pear-electron/pre", + "name": "flying-jib", + "gui": { + "main": "index.html", + "backgroundColor": "#0c1a22", + "height": 820, + "width": 1180 + }, + "links": [ + "http://*", + "https://*", + "ws://*", + "wss://*" + ] }, "imports": { "#lib/*": "./lib/*", @@ -197,6 +228,8 @@ "hyperswarm": "^4.17.0", "node-rsa": "^0.4.2", "paparam": "^1.10.1", + "pear-bridge": "^1.2.5", + "pear-electron": "^1.7.28", "pear-runtime": "^1.2.0", "protomux": "^3.11.0", "ready-resource": "^1.2.0", @@ -204,12 +237,18 @@ "z32": "^1.1.0" }, "devDependencies": { + "@electron-forge/cli": "^7.11.2", + "@electron-forge/maker-dmg": "^7.11.2", + "@electron-forge/maker-squirrel": "^7.11.2", + "@electron-forge/maker-zip": "^7.11.2", "bare-build": "^1.0.2", "bare-bundle-id": "^1.0.0", "bare-module-traverse": "^1.0.0", "bare-pack": "^2.2.1", "bare-runtime": "1.29.4", "brittle": "^3.19.0", + "electron": "^33.4.11", + "pear-interface": "^1.1.0", "prettier": "^3.6.2", "prettier-config-holepunch": "^2.0.0" }, diff --git a/pear.json b/pear.json index e1c3129..49f0c1d 100644 --- a/pear.json +++ b/pear.json @@ -1,7 +1,5 @@ { "name": "flying-jib", - "type": "terminal", - "pre": false, "stage": { "ignore": [ ".git", diff --git a/scripts/gitea-rolling-release.sh b/scripts/gitea-rolling-release.sh new file mode 100755 index 0000000..677eabc --- /dev/null +++ b/scripts/gitea-rolling-release.sh @@ -0,0 +1,241 @@ +#!/usr/bin/env bash +# Build Flying Jib Bare CLI standalones (+ optional Electron desktop package) and publish a rolling Gitea release. +# +# Primary product is the Electron desktop GUI (ADR-0014); CI also packages the secondary CLI. +# +# Required: +# RELEASE_TOKEN — Gitea PAT with repository release write +# Optional: +# GITEA_URL / GITEA_OWNER / GITEA_REPO +# FJ_CLI_HOSTS — default: all 64-bit hosts +# FJ_MAKE_CLIENT=1 — build Electron desktop zip for this runner (default: 1) +# RELEASE_TAG (default: rolling) +# DRY_RUN=1 — build + stage only, no upload +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +VERSION="$(node -p "require('./package.json').version")" +STAMP="$(date -u +%Y%m%dT%H%M%SZ)" +SHA="$(git rev-parse --short HEAD 2>/dev/null || echo unknown)" +TAG="${RELEASE_TAG:-rolling}" +RELEASE_TITLE="${RELEASE_NAME:-Flying Jib rolling}" +DIST="$ROOT/dist/release" +DEFAULT_HOSTS="linux-x64,linux-arm64,darwin-x64,darwin-arm64,win32-x64,win32-arm64" +MAKE_CLIENT="${FJ_MAKE_CLIENT:-1}" + +rm -rf "$DIST" +mkdir -p "$DIST" + +log() { echo "[release] $*"; } + +detect_remote() { + local url + url="$(git remote get-url origin 2>/dev/null || true)" + if [[ "$url" =~ git@([^:]+):([^/]+)/([^/.]+) ]]; then + echo "https://${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" + elif [[ "$url" =~ https?://([^/]+)/([^/]+)/([^/.]+) ]]; then + echo "https://${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" + else + echo "" "" "" + fi +} + +read -r DETECTED_URL DETECTED_OWNER DETECTED_REPO <<<"$(detect_remote)" +GITEA_URL="${GITEA_URL:-${DETECTED_URL:-}}" +GITEA_OWNER="${GITEA_OWNER:-${DETECTED_OWNER:-}}" +GITEA_REPO="${GITEA_REPO:-${DETECTED_REPO:-flying-jib}}" + +if [[ -z "${GITEA_URL}" ]]; then + log "WARN: could not detect GITEA_URL — set GITEA_URL for upload" +fi + +export FJ_CLI_HOSTS="${FJ_CLI_HOSTS:-$DEFAULT_HOSTS}" + +log "building CLI standalones for: $FJ_CLI_HOSTS" +IFS=',' read -ra HOSTS <<<"$FJ_CLI_HOSTS" +for h in "${HOSTS[@]}"; do + h="$(echo "$h" | xargs)" + [[ -z "$h" ]] && continue + log "make:standalone host=$h" + node scripts/bare-standalone.cjs --host "$h" --out "$ROOT/out" +done + +sha_file() { + local f="$1" + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$f" + else + shasum -a 256 "$f" + fi +} + +stage_cli() { + local host="$1" + local dir="$ROOT/out/flying-jib-$host" + local bin="flying-jib" + [[ "$host" == win32-* ]] && bin="flying-jib.exe" + if [[ ! -d "$dir" ]]; then + log "WARN: missing CLI dir $dir" + return 1 + fi + if [[ ! -f "$dir/$bin" ]]; then + local f + f="$(find "$dir" -maxdepth 2 -type f \( -name 'flying-jib' -o -name 'flying-jib.exe' \) | head -1 || true)" + if [[ -n "$f" ]]; then + bin="$(basename "$f")" + cp -f "$f" "$dir/$bin" 2>/dev/null || true + else + log "WARN: no CLI binary in $dir" + return 1 + fi + fi + local archive="flying-jib-cli-${VERSION}-${host}.tar.gz" + tar -C "$dir" -czf "$DIST/$archive" . + (cd "$DIST" && sha_file "$archive" >"${archive}.sha256") + log "staged $archive" +} + +CLI_OK=0 +CLI_FAIL=0 +for h in "${HOSTS[@]}"; do + h="$(echo "$h" | xargs)" + [[ -z "$h" ]] && continue + if stage_cli "$h"; then CLI_OK=$((CLI_OK + 1)); else CLI_FAIL=$((CLI_FAIL + 1)); fi +done + +DESKTOP_OK=0 +if [[ "$MAKE_CLIENT" == "1" ]]; then + log "building Electron desktop package for $(uname -s)/$(uname -m)" + if env -u ELECTRON_RUN_AS_NODE npx electron-forge make; then + shopt -s nullglob globstar + for f in "$ROOT"/out/make/**/*.{zip,dmg,exe,nupkg} "$ROOT"/out/make/*.{zip,dmg,exe,nupkg}; do + [[ -f "$f" ]] || continue + base="$(basename "$f")" + dest="flying-jib-desktop-${VERSION}-${base}" + [[ -f "$DIST/$dest" ]] && continue + cp -f "$f" "$DIST/$dest" + (cd "$DIST" && sha_file "$dest" >"${dest}.sha256") + DESKTOP_OK=$((DESKTOP_OK + 1)) + log "staged desktop $base" + done + shopt -u nullglob globstar + else + log "WARN: electron-forge make failed — continuing with CLI artifacts" + fi +fi + +cat >"$DIST/RELEASE_NOTES.md" < && cd flying-jib +npm ci +npm start +\`\`\` + +See \`developer_docs/DESKTOP.md\`. + +## CLI (Bare standalone) + +\`\`\`bash +tar -xzf flying-jib-cli-${VERSION}-linux-x64.tar.gz +./flying-jib list +./flying-jib host +\`\`\` + +## Checksums + +See \`*.sha256\` beside each archive. +EOF + +log "artifacts in $DIST:" +ls -la "$DIST" || true +log "summary: cli ok=${CLI_OK} fail=${CLI_FAIL} desktop=${DESKTOP_OK}" + +if [[ "$CLI_OK" -eq 0 ]]; then + log "ERROR: no CLI artifacts staged" + exit 1 +fi + +if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "DRY_RUN=1 — skip Gitea upload" + exit 0 +fi + +if [[ -z "${RELEASE_TOKEN:-}" ]]; then + log "ERROR: RELEASE_TOKEN is required (or DRY_RUN=1)" + exit 1 +fi + +if [[ -z "${GITEA_URL}" || -z "${GITEA_OWNER}" || -z "${GITEA_REPO}" ]]; then + log "ERROR: GITEA_URL / GITEA_OWNER / GITEA_REPO must be set" + exit 1 +fi + +API="${GITEA_URL%/}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}" +AUTH="Authorization: token ${RELEASE_TOKEN}" + +log "Gitea API: $API tag=$TAG" + +REL_JSON="$(curl -fsSL -H "$AUTH" "$API/releases/tags/${TAG}" 2>/dev/null || true)" +if [[ -n "$REL_JSON" ]]; then + REL_ID="$(node -e "try{const j=JSON.parse(process.argv[1]);console.log(j.id||'')}catch{console.log('')}" "$REL_JSON")" + if [[ -n "$REL_ID" ]]; then + log "deleting previous release id=$REL_ID" + curl -fsSL -X DELETE -H "$AUTH" "$API/releases/$REL_ID" >/dev/null || true + fi +fi +curl -fsSL -X DELETE -H "$AUTH" "$API/tags/${TAG}" >/dev/null 2>&1 || true + +CREATE_BODY="$(node -e " +const notes=require('fs').readFileSync(process.argv[1],'utf8'); +console.log(JSON.stringify({ + tag_name: process.argv[2], + name: process.argv[3], + body: notes, + draft: false, + prerelease: true, + target_commitish: process.env.GITHUB_SHA || process.env.GITEA_SHA || 'main' +})); +" "$DIST/RELEASE_NOTES.md" "$TAG" "${RELEASE_TITLE} ${VERSION} ${SHA}")" + +CREATE_RESP="$(curl -fsSL -X POST -H "$AUTH" -H 'Content-Type: application/json' \ + -d "$CREATE_BODY" "$API/releases")" +REL_ID="$(node -e "console.log(JSON.parse(process.argv[1]).id)" "$CREATE_RESP")" +log "created release id=$REL_ID" + +shopt -s nullglob +for f in "$DIST"/*; do + [[ -f "$f" ]] || continue + base="$(basename "$f")" + case "$base" in + *.tar.gz|*.sha256|*.md|*.zip|*.dmg|*.exe|*.nupkg) ;; + *) continue ;; + esac + log "upload $base" + name_q="$(node -e "console.log(encodeURIComponent(process.argv[1]))" "$base")" + curl -fsSL -X POST -H "$AUTH" \ + -F "attachment=@${f}" \ + "$API/releases/${REL_ID}/assets?name=${name_q}" \ + >/dev/null +done + +log "release published: ${GITEA_URL}/${GITEA_OWNER}/${GITEA_REPO}/releases/tag/${TAG}" diff --git a/test/gui-control.test.js b/test/gui-control.test.js new file mode 100644 index 0000000..5db2695 --- /dev/null +++ b/test/gui-control.test.js @@ -0,0 +1,89 @@ +'use strict' + +const test = require('brittle') +const os = require('os') +const path = require('path') +const fs = require('fs') +const App = require('../app') +const { start } = require('../lib/gui-control') +const { forceLoopbackHost } = require('../lib/bind-guard') + +test('gui-control health + worlds on loopback', async (t) => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'fj-gui-')) + const app = new App({ + dir, + updates: false, + version: '0.0.0', + upgrade: 'pear://test', + name: 'Flying Jib', + displayName: 'tester' + }) + await app.ready() + const statePath = path.join(dir, 'gui-control.json') + const ctl = await start({ app, statePath }) + t.ok(ctl.baseUrl.startsWith('http://127.0.0.1:')) + t.ok(fs.existsSync(statePath)) + + const health = await fetch(`${ctl.baseUrl}/health`) + t.is(health.status, 200) + const hj = await health.json() + t.is(hj.ok, true) + + const unauth = await fetch(`${ctl.baseUrl}/worlds`) + t.is(unauth.status, 401) + + const worlds = await fetch(`${ctl.baseUrl}/worlds`, { + headers: { 'X-Flying-Jib-Token': ctl.token } + }) + t.is(worlds.status, 200) + const wj = await worlds.json() + t.ok(Array.isArray(wj.result)) + + const created = await fetch(`${ctl.baseUrl}/worlds`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Flying-Jib-Token': ctl.token + }, + body: JSON.stringify({ name: 'gui-test', version: '1.21.1' }) + }) + t.is(created.status, 200) + const cj = await created.json() + t.is(cj.result.id, 'gui-test') + + const settingsGet = await fetch(`${ctl.baseUrl}/settings`, { + headers: { 'X-Flying-Jib-Token': ctl.token } + }) + t.is(settingsGet.status, 200) + const sj = await settingsGet.json() + t.ok(sj.result.defaultPort) + + const settingsSet = await fetch(`${ctl.baseUrl}/settings`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Flying-Jib-Token': ctl.token + }, + body: JSON.stringify({ displayName: 'captain', defaultPort: 25566 }) + }) + t.is(settingsSet.status, 200) + const ss = await settingsSet.json() + t.is(ss.result.displayName, 'captain') + t.is(ss.result.defaultPort, 25566) + + const logs = await fetch(`${ctl.baseUrl}/logs`, { + headers: { 'X-Flying-Jib-Token': ctl.token } + }) + t.is(logs.status, 200) + const lj = await logs.json() + t.ok(Array.isArray(lj.result)) + t.ok(lj.result.length >= 1) + + await ctl.close() + await app.close() +}) + +test('forceLoopbackHost rejects non-loopback for gui-control', (t) => { + t.exception(() => forceLoopbackHost('0.0.0.0')) + t.is(forceLoopbackHost('127.0.0.1'), '127.0.0.1') +}) diff --git a/ui/app.js b/ui/app.js new file mode 100644 index 0000000..385e158 --- /dev/null +++ b/ui/app.js @@ -0,0 +1,499 @@ +/** + * Flying Jib desktop GUI — loopback control API client (ADR-0014). + */ + +const STATE_FILE = 'gui-control.json' +const PHASE_LABELS = { + idle: 'Idle', + 'world-selected': 'Ready', + local: 'Local Squid', + hosting: 'Hosting', + joined: 'Joined', + error: 'Error', + starting: 'Starting…' +} + +let control = null +let settings = null +let lastLogId = 0 +let statusTimer = null +let logTimer = null +let busy = false + +async function healthOk(meta) { + if (!meta?.baseUrl || !meta?.token) return null + const health = await fetch(`${meta.baseUrl}/health`).catch(() => null) + if (!health?.ok) return null + const body = await health.json().catch(() => ({})) + return { + baseUrl: meta.baseUrl, + token: meta.token, + port: meta.port, + phase: body.phase || 'idle' + } +} + +async function getControlEndpoint() { + for (let i = 0; i < 50; i++) { + try { + const res = await fetch('/api/control-meta').catch(() => null) + if (res?.ok) { + const meta = await res.json().catch(() => null) + const ok = await healthOk(meta) + if (ok) return ok + } + } catch { + // not electron shell + } + + try { + const storage = globalThis.Pear?.config?.storage + if (storage) { + const fs = await import('fs') + const path = await import('path') + const p = path.join(storage, STATE_FILE) + if (fs.existsSync(p)) { + const meta = JSON.parse(fs.readFileSync(p, 'utf8')) + const ok = await healthOk(meta) + if (ok) return ok + } + } + } catch { + // pear fs path unavailable + } + + setSessionPill('starting', 'Connecting…') + await new Promise((r) => setTimeout(r, 100)) + } + return null +} + +function api(route, opts = {}) { + const headers = { + 'Content-Type': 'application/json', + 'X-Flying-Jib-Token': control.token, + ...(opts.headers || {}) + } + return fetch(`${control.baseUrl}${route}`, { ...opts, headers }).then(async (res) => { + const body = await res.json().catch(() => ({})) + if (!res.ok || body.ok === false) { + throw new Error(body.error || `HTTP ${res.status}`) + } + return body.result + }) +} + +function escapeHtml(s) { + return String(s) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') +} + +function showBootError(msg) { + const el = document.getElementById('boot-error') + el.hidden = false + el.textContent = msg +} + +function toast(message, kind = 'info') { + const root = document.getElementById('toast-root') + const el = document.createElement('div') + el.className = `toast ${kind}` + el.textContent = message + root.appendChild(el) + setTimeout(() => { + el.remove() + }, 4200) +} + +function setSessionPill(phase, label) { + const pill = document.getElementById('session-pill') + const text = document.getElementById('session-pill-label') + pill.dataset.phase = phase || 'idle' + text.textContent = label || PHASE_LABELS[phase] || phase || 'Idle' +} + +function setBusy(btn, on) { + busy = on + if (!btn) return + const label = btn.querySelector('.btn-label') + const spinner = btn.querySelector('.btn-spinner') + btn.disabled = on + if (label) label.hidden = on + if (spinner) spinner.hidden = !on +} + +function showWorkspace() { + document.getElementById('workspace').hidden = false + document.getElementById('hero').classList.add('is-collapsed') +} + +function setPanel(name) { + showWorkspace() + for (const tab of document.querySelectorAll('.tab')) { + const on = tab.dataset.panel === name + tab.classList.toggle('is-active', on) + tab.setAttribute('aria-selected', on ? 'true' : 'false') + } + for (const panel of document.querySelectorAll('.panel')) { + const on = panel.id === `panel-${name}` + panel.hidden = !on + panel.classList.toggle('is-active', on) + } + if (name === 'status') refreshStatus() + if (name === 'worlds' || name === 'host') refreshWorlds() + if (name === 'logs') refreshLogs(true) + if (name === 'settings') fillSettingsForm() +} + +function applySettingsToForms() { + if (!settings) return + const ver = document.getElementById('create-version') + const hostPort = document.getElementById('host-port') + const hostDisplay = document.getElementById('host-display') + const joinPort = document.getElementById('join-port') + const joinDisplay = document.getElementById('join-display') + if (ver && !ver.dataset.touched) ver.value = settings.defaultVersion + if (hostPort && !hostPort.dataset.touched) hostPort.value = String(settings.defaultPort) + if (hostDisplay && !hostDisplay.dataset.touched) hostDisplay.value = settings.displayName + if (joinPort && !joinPort.dataset.touched) joinPort.value = String(settings.defaultPort) + if (joinDisplay && !joinDisplay.dataset.touched) joinDisplay.value = settings.displayName +} + +function fillSettingsForm() { + if (!settings) return + document.getElementById('settings-display').value = settings.displayName || '' + document.getElementById('settings-port').value = String(settings.defaultPort || 25565) + document.getElementById('settings-version').value = settings.defaultVersion || '1.21.1' + document.getElementById('settings-ttl').value = String(settings.inviteTtlHours ?? 168) +} + +async function loadSettings() { + settings = await api('/settings') + applySettingsToForms() + fillSettingsForm() +} + +async function refreshWorlds() { + if (!control) return + const worlds = await api('/worlds') + const list = document.getElementById('world-list') + const select = document.getElementById('host-world') + list.innerHTML = '' + select.innerHTML = '' + if (!worlds.length) { + list.innerHTML = '
  • No worlds yet — create one above.
  • ' + return + } + for (const w of worlds) { + const li = document.createElement('li') + li.innerHTML = `
    ${escapeHtml(w.name)}${escapeHtml(w.version || '')} · ${escapeHtml(w.id)}
    + ` + list.appendChild(li) + const opt = document.createElement('option') + opt.value = w.id + opt.textContent = `${w.name} (${w.version})` + select.appendChild(opt) + } + list.querySelectorAll('[data-host-world]').forEach((btn) => { + btn.addEventListener('click', () => { + select.value = btn.getAttribute('data-host-world') + setPanel('host') + }) + }) +} + +function renderStatusCards(status) { + const phase = status.phase || 'idle' + const squid = status.squid || {} + const peers = Array.isArray(status.peers) ? status.peers : [] + const cards = [ + { k: 'Phase', v: PHASE_LABELS[phase] || phase, cls: phase === 'hosting' || phase === 'joined' ? 'ok' : phase === 'idle' ? '' : 'warn' }, + { k: 'World', v: status.world || '—' }, + { k: 'Display name', v: status.displayName || '—' }, + { + k: 'Squid', + v: squid.running ? `127.0.0.1:${squid.port || '?'}` : 'Stopped', + cls: squid.running ? 'ok' : '' + }, + { + k: 'Tunnel', + v: status.tunnelHost ? 'Hosting' : status.tunnelClient ? 'Client' : 'None', + cls: status.tunnelHost || status.tunnelClient ? 'ok' : '' + }, + { k: 'Peers', v: String(peers.length) }, + { k: 'Mesh', v: status.mesh?.meshId || status.mesh?.key || '—' }, + { k: 'Storage', v: status.storage || '—' } + ] + const root = document.getElementById('status-cards') + root.innerHTML = cards + .map( + (c) => + `
    ${escapeHtml(c.k)}${escapeHtml(c.v)}
    ` + ) + .join('') +} + +async function refreshStatus() { + if (!control) return + const pre = document.getElementById('status-pre') + try { + const status = await api('/status') + setSessionPill(status.phase || 'idle') + renderStatusCards(status) + pre.textContent = JSON.stringify(status, null, 2) + if (status.settings) { + settings = status.settings + document.getElementById('settings-storage').textContent = `Storage: ${status.storage || '—'}` + } + } catch (err) { + pre.textContent = String(err.message || err) + setSessionPill('error', 'Control error') + } +} + +function appendLogLines(entries) { + const view = document.getElementById('log-view') + const autoscroll = document.getElementById('logs-autoscroll')?.checked + for (const e of entries) { + if (e.id <= lastLogId) continue + lastLogId = e.id + const row = document.createElement('div') + row.className = 'log-line' + const t = (e.at || '').slice(11, 19) || '—' + row.innerHTML = `${escapeHtml(t)}${escapeHtml(e.level || 'info')}${escapeHtml(e.message)}` + view.appendChild(row) + } + if (autoscroll) view.scrollTop = view.scrollHeight +} + +async function refreshLogs(full = false) { + if (!control) return + try { + const since = full ? 0 : lastLogId + if (full) { + document.getElementById('log-view').innerHTML = '' + lastLogId = 0 + } + const entries = await api(`/logs?since=${since}`) + appendLogLines(entries) + } catch { + // ignore transient + } +} + +async function pollHealth() { + if (!control) return + try { + const res = await fetch(`${control.baseUrl}/health`) + const body = await res.json() + if (body.phase) setSessionPill(body.phase) + } catch { + setSessionPill('error', 'Offline') + } +} + +function startPolling() { + statusTimer = setInterval(() => { + pollHealth() + const statusPanel = document.getElementById('panel-status') + if (statusPanel && !statusPanel.hidden) refreshStatus().catch(() => {}) + }, 2500) + logTimer = setInterval(() => { + refreshLogs(false).catch(() => {}) + }, 1200) +} + +async function boot() { + setSessionPill('starting', 'Connecting…') + control = await getControlEndpoint() + if (!control) { + setSessionPill('error', 'No backend') + showBootError('Could not reach Bare GUI control. Is the desktop backend running (npm start)?') + return + } + + document.documentElement.dataset.fjControl = control.baseUrl + setSessionPill(control.phase || 'idle') + + try { + await loadSettings() + } catch (err) { + toast(String(err.message || err), 'error') + } + + document.querySelectorAll('[data-panel]').forEach((el) => { + el.addEventListener('click', () => setPanel(el.dataset.panel)) + }) + + ;['create-version', 'host-port', 'host-display', 'join-port', 'join-display'].forEach((id) => { + const el = document.getElementById(id) + el?.addEventListener('input', () => { + el.dataset.touched = '1' + }) + }) + + document.getElementById('btn-refresh-worlds').addEventListener('click', () => { + refreshWorlds().catch((err) => toast(err.message, 'error')) + }) + + document.getElementById('form-create').addEventListener('submit', async (e) => { + e.preventDefault() + if (busy) return + const fd = new FormData(e.target) + const btn = document.getElementById('btn-create') + setBusy(btn, true) + try { + await api('/worlds', { + method: 'POST', + body: JSON.stringify({ + name: fd.get('name'), + version: fd.get('version') || settings?.defaultVersion || '1.21.1' + }) + }) + e.target.reset() + applySettingsToForms() + await refreshWorlds() + toast('World created', 'success') + setPanel('host') + } catch (err) { + toast(String(err.message || err), 'error') + } finally { + setBusy(btn, false) + } + }) + + document.getElementById('form-host').addEventListener('submit', async (e) => { + e.preventDefault() + if (busy) return + const fd = new FormData(e.target) + const btn = document.getElementById('btn-host') + setBusy(btn, true) + try { + const result = await api('/host', { + method: 'POST', + body: JSON.stringify({ + world: fd.get('world'), + port: Number(fd.get('port')) || settings?.defaultPort || 25565, + displayName: fd.get('displayName') || settings?.displayName || 'host', + noExpire: Boolean(fd.get('noExpire')) + }) + }) + const box = document.getElementById('host-result') + box.hidden = false + document.getElementById('host-invite').value = result.invite || '' + document.getElementById('host-hint').textContent = + `Squid on 127.0.0.1:${result.squid?.port || fd.get('port')}. Share the invite privately, then connect Java Edition there.` + setSessionPill('hosting') + toast('Hosting — invite ready', 'success') + refreshLogs(false) + } catch (err) { + toast(String(err.message || err), 'error') + } finally { + setBusy(btn, false) + } + }) + + document.getElementById('btn-copy-invite').addEventListener('click', async () => { + const text = document.getElementById('host-invite').value + try { + await navigator.clipboard.writeText(text) + toast('Invite copied', 'success') + } catch { + document.getElementById('host-invite').select() + toast('Select and copy the invite manually', 'info') + } + }) + + document.getElementById('form-join').addEventListener('submit', async (e) => { + e.preventDefault() + if (busy) return + const fd = new FormData(e.target) + const btn = document.getElementById('btn-join') + setBusy(btn, true) + try { + const result = await api('/join', { + method: 'POST', + body: JSON.stringify({ + invite: String(fd.get('invite') || '').trim(), + port: Number(fd.get('port')) || settings?.defaultPort || 25565, + displayName: fd.get('displayName') || settings?.displayName || 'player' + }) + }) + const hint = document.getElementById('join-hint') + hint.hidden = false + hint.textContent = `Tunnel up. Minecraft → Multiplayer → Direct Connection → 127.0.0.1:${result.localPort || result.port || fd.get('port')}` + setSessionPill('joined') + toast('Joined — open Minecraft', 'success') + refreshLogs(false) + } catch (err) { + toast(String(err.message || err), 'error') + } finally { + setBusy(btn, false) + } + }) + + document.getElementById('btn-refresh').addEventListener('click', () => { + refreshStatus().catch((err) => toast(err.message, 'error')) + }) + + document.getElementById('btn-stop').addEventListener('click', async () => { + if (busy) return + try { + await api('/stop', { method: 'POST', body: '{}' }) + document.getElementById('host-result').hidden = true + document.getElementById('join-hint').hidden = true + await refreshStatus() + toast('Session stopped', 'success') + } catch (err) { + toast(String(err.message || err), 'error') + } + }) + + document.getElementById('btn-clear-logs').addEventListener('click', async () => { + try { + await api('/logs/clear', { method: 'POST', body: '{}' }) + lastLogId = 0 + document.getElementById('log-view').innerHTML = '' + await refreshLogs(true) + } catch (err) { + toast(err.message, 'error') + } + }) + + document.getElementById('form-settings').addEventListener('submit', async (e) => { + e.preventDefault() + const fd = new FormData(e.target) + try { + settings = await api('/settings', { + method: 'POST', + body: JSON.stringify({ + displayName: fd.get('displayName'), + defaultPort: Number(fd.get('defaultPort')), + defaultVersion: fd.get('defaultVersion'), + inviteTtlHours: Number(fd.get('inviteTtlHours')) + }) + }) + ;['host-port', 'host-display', 'join-port', 'join-display', 'create-version'].forEach((id) => { + const el = document.getElementById(id) + if (el) delete el.dataset.touched + }) + applySettingsToForms() + toast('Settings saved', 'success') + } catch (err) { + toast(String(err.message || err), 'error') + } + }) + + await refreshWorlds() + await refreshStatus() + await refreshLogs(true) + startPolling() +} + +boot().catch((err) => { + setSessionPill('error', 'Boot failed') + showBootError(String(err.message || err)) +}) diff --git a/ui/styles.css b/ui/styles.css new file mode 100644 index 0000000..2954760 --- /dev/null +++ b/ui/styles.css @@ -0,0 +1,775 @@ +:root { + --bg-deep: #071018; + --bg-mid: #0c1a22; + --bg-panel: rgba(12, 26, 34, 0.72); + --sea: #1a6b7a; + --sea-bright: #2a9aad; + --foam: #d8efe8; + --sail: #e8c07a; + --ink: #e6f2ef; + --muted: #8aa8a3; + --danger: #c45c4a; + --ok: #3d9b7a; + --warn: #c4a04a; + --radius: 4px; + --font-display: "Fraunces", Georgia, serif; + --font-body: "Figtree", system-ui, sans-serif; + --font-mono: "SF Mono", ui-monospace, Menlo, Consolas, monospace; + --titlebar-h: 42px; + --ease: cubic-bezier(0.22, 1, 0.36, 1); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body { + margin: 0; + min-height: 100%; + background: var(--bg-deep); + color: var(--ink); + font-family: var(--font-body); + font-size: 15px; + line-height: 1.45; +} + +body { + overflow-x: hidden; +} + +button, +input, +select, +textarea { + font: inherit; + color: inherit; +} + +/* ─── Titlebar ─── */ +#titlebar { + position: fixed; + top: 0; + left: 0; + right: 0; + width: 100%; + height: var(--titlebar-h); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px 0 8px; + z-index: 1100; + overflow: visible; + -webkit-app-region: drag; + background: linear-gradient(180deg, rgba(7, 16, 24, 0.96), rgba(7, 16, 24, 0.72)); + border-bottom: 1px solid rgba(216, 239, 232, 0.06); + backdrop-filter: blur(12px) saturate(1.2); + -webkit-backdrop-filter: blur(12px) saturate(1.2); +} + +#titlebar > * { + -webkit-app-region: no-drag; +} + +.titlebar-left { + display: flex; + align-items: center; + gap: 10px; + flex: 0 1 auto; + min-width: 0; + max-width: 70%; + z-index: 2; +} + +#titlebar pear-ctrl { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + justify-content: flex-start; + position: relative; + z-index: 5; + line-height: 0; + min-width: 54px; + min-height: 28px; + margin: 0; + padding: 0 4px; + overflow: visible; + -webkit-app-region: no-drag; +} + +#titlebar pear-ctrl[data-platform='darwin'] { + min-width: 78px; + margin: 0 8px; +} + +#titlebar pear-ctrl[data-platform='linux'], +#titlebar pear-ctrl[data-platform='win32'] { + min-width: 110px; + gap: 2px; +} + +#titlebar pear-ctrl.fj-electron-ctrl { + display: inline-flex; + align-items: center; + gap: 2px; +} + +#titlebar .fj-win-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 28px; + margin: 0; + padding: 0; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--muted); + cursor: pointer; + -webkit-app-region: no-drag; + transition: background 0.12s ease, color 0.12s ease; +} + +#titlebar .fj-win-btn:hover { + background: rgba(216, 239, 232, 0.12); + color: var(--ink); +} + +#titlebar .fj-win-btn--close:hover { + background: rgba(196, 92, 74, 0.9); + color: #fff; +} + +.titlebar-brand { + font-family: var(--font-display); + font-weight: 600; + font-size: 14px; + letter-spacing: 0.01em; + white-space: nowrap; +} + +.titlebar-label { + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--muted); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.titlebar-right { + display: flex; + align-items: center; + gap: 8px; + flex: 0 0 auto; +} + +.session-pill { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 4px 10px; + border-radius: 999px; + background: rgba(216, 239, 232, 0.06); + border: 1px solid rgba(216, 239, 232, 0.1); + font-size: 12px; + color: var(--muted); + max-width: 220px; +} + +.session-pill #session-pill-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.health-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--muted); + box-shadow: 0 0 0 0 rgba(138, 168, 163, 0.4); + flex: 0 0 auto; +} + +.session-pill[data-phase='idle'] .health-dot { + background: var(--muted); +} +.session-pill[data-phase='local'] .health-dot, +.session-pill[data-phase='world-selected'] .health-dot { + background: var(--warn); +} +.session-pill[data-phase='hosting'] .health-dot, +.session-pill[data-phase='joined'] .health-dot { + background: var(--ok); + animation: pulse-ok 2s var(--ease) infinite; +} +.session-pill[data-phase='error'] .health-dot { + background: var(--danger); +} + +@keyframes pulse-ok { + 0%, + 100% { + box-shadow: 0 0 0 0 rgba(61, 155, 122, 0.45); + } + 50% { + box-shadow: 0 0 0 6px rgba(61, 155, 122, 0); + } +} + +/* ─── Shell / Hero ─── */ +.shell { + padding-top: var(--titlebar-h); + min-height: 100vh; +} + +.hero { + position: relative; + min-height: calc(100vh - var(--titlebar-h)); + display: grid; + align-items: end; + padding: clamp(2rem, 6vw, 5rem); + overflow: hidden; +} + +.hero.is-collapsed { + min-height: 0; + padding: 1.25rem clamp(1.25rem, 4vw, 2.5rem); + border-bottom: 1px solid rgba(216, 239, 232, 0.06); +} + +.hero.is-collapsed .lede, +.hero.is-collapsed .cta-row { + display: none; +} + +.hero.is-collapsed .headline { + font-size: 1.15rem; + margin: 0; +} + +.hero.is-collapsed .brand { + font-size: 0.85rem; + margin-bottom: 0.15rem; +} + +.hero-atmosphere { + position: absolute; + inset: 0; + background: + radial-gradient(1200px 700px at 15% 110%, rgba(26, 107, 122, 0.45), transparent 55%), + radial-gradient(900px 500px at 90% 10%, rgba(232, 192, 122, 0.12), transparent 50%), + linear-gradient(180deg, transparent 20%, rgba(7, 16, 24, 0.85)); + animation: atmosphere-drift 18s ease-in-out infinite alternate; + pointer-events: none; +} + +.hero-atmosphere::after { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E"); + opacity: 0.5; + mix-blend-mode: soft-light; +} + +@keyframes atmosphere-drift { + from { + transform: scale(1) translate(0, 0); + } + to { + transform: scale(1.05) translate(-1%, 1%); + } +} + +.hero-copy { + position: relative; + z-index: 1; + max-width: 36rem; + animation: rise-in 0.7s var(--ease) both; +} + +@keyframes rise-in { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.brand { + font-family: var(--font-display); + font-size: clamp(2.4rem, 6vw, 3.6rem); + font-weight: 700; + margin: 0 0 0.35rem; + letter-spacing: -0.02em; + line-height: 1.05; +} + +.headline { + font-family: var(--font-display); + font-weight: 500; + font-size: clamp(1.25rem, 2.5vw, 1.65rem); + margin: 0 0 0.75rem; + color: var(--foam); +} + +.lede { + margin: 0 0 1.5rem; + color: var(--muted); + max-width: 32rem; +} + +.cta-row { + display: flex; + flex-wrap: wrap; + gap: 0.6rem; + align-items: center; +} + +/* ─── Buttons ─── */ +.btn { + appearance: none; + border: 1px solid transparent; + border-radius: var(--radius); + padding: 0.65rem 1.1rem; + cursor: pointer; + background: rgba(216, 239, 232, 0.08); + transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease, opacity 0.15s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +.btn:hover:not(:disabled) { + background: rgba(216, 239, 232, 0.14); +} + +.btn:active:not(:disabled) { + transform: translateY(1px); +} + +.btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn.primary { + background: linear-gradient(180deg, var(--sea-bright), var(--sea)); + color: #041016; + font-weight: 600; +} + +.btn.primary:hover:not(:disabled) { + filter: brightness(1.06); +} + +.btn.ghost { + border-color: rgba(216, 239, 232, 0.18); + background: transparent; +} + +.btn.text { + background: transparent; + color: var(--muted); + padding-inline: 0.4rem; +} + +.btn.danger { + background: rgba(196, 92, 74, 0.2); + border-color: rgba(196, 92, 74, 0.45); + color: #f0c4bc; +} + +.btn.sm { + padding: 0.4rem 0.75rem; + font-size: 13px; +} + +.btn-spinner { + width: 14px; + height: 14px; + border: 2px solid rgba(4, 16, 22, 0.25); + border-top-color: rgba(4, 16, 22, 0.9); + border-radius: 50%; + animation: spin 0.7s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* ─── Workspace ─── */ +.workspace { + padding: 1.25rem clamp(1.25rem, 4vw, 2.5rem) 3rem; + animation: rise-in 0.45s var(--ease) both; +} + +.tabs { + display: flex; + flex-wrap: wrap; + gap: 0.25rem; + margin-bottom: 1.25rem; + border-bottom: 1px solid rgba(216, 239, 232, 0.08); + padding-bottom: 0.35rem; +} + +.tab { + appearance: none; + border: 0; + background: transparent; + color: var(--muted); + padding: 0.55rem 0.9rem; + cursor: pointer; + border-radius: var(--radius); + font-weight: 500; +} + +.tab:hover { + color: var(--ink); + background: rgba(216, 239, 232, 0.05); +} + +.tab.is-active { + color: var(--ink); + background: rgba(42, 154, 173, 0.18); +} + +.panel-head { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: space-between; + gap: 0.75rem; + margin-bottom: 1.1rem; +} + +.panel-head h2 { + font-family: var(--font-display); + font-size: 1.45rem; + font-weight: 600; + margin: 0 0 0.2rem; +} + +.panel-head p { + margin: 0; + color: var(--muted); + font-size: 0.95rem; +} + +.panel[hidden] { + display: none !important; +} + +/* ─── Forms ─── */ +.inline-form, +.stack-form { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-bottom: 1.25rem; + align-items: end; +} + +.stack-form { + flex-direction: column; + align-items: stretch; + max-width: 36rem; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.75rem; +} + +@media (max-width: 640px) { + .form-row { + grid-template-columns: 1fr; + } +} + +label { + display: flex; + flex-direction: column; + gap: 0.35rem; + flex: 1 1 10rem; + font-size: 13px; + color: var(--muted); +} + +label span { + letter-spacing: 0.02em; +} + +.check-label { + flex-direction: row; + align-items: center; + gap: 0.5rem; + color: var(--ink); + font-size: 14px; +} + +.check-label.sm { + font-size: 13px; + color: var(--muted); +} + +input, +select, +textarea { + background: rgba(7, 16, 24, 0.65); + border: 1px solid rgba(216, 239, 232, 0.14); + border-radius: var(--radius); + padding: 0.55rem 0.7rem; + outline: none; + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +input:focus, +select:focus, +textarea:focus { + border-color: rgba(42, 154, 173, 0.65); + box-shadow: 0 0 0 3px rgba(42, 154, 173, 0.15); +} + +textarea { + resize: vertical; + min-height: 4.5rem; + font-family: var(--font-mono); + font-size: 12.5px; + line-height: 1.4; +} + +.hint { + margin: 0.5rem 0 0; + color: var(--muted); + font-size: 0.92rem; +} + +.hint.success { + color: #9ad4bf; +} + +/* ─── Worlds list ─── */ +.world-list { + list-style: none; + margin: 0; + padding: 0; + display: grid; + gap: 0.5rem; + max-width: 40rem; +} + +.world-list li { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + padding: 0.85rem 1rem; + background: var(--bg-panel); + border: 1px solid rgba(216, 239, 232, 0.08); + border-radius: var(--radius); +} + +.world-list li strong { + display: block; + font-weight: 600; +} + +.world-list li span { + color: var(--muted); + font-size: 12.5px; +} + +.world-list .empty { + color: var(--muted); + padding: 1rem; + border: 1px dashed rgba(216, 239, 232, 0.12); + border-radius: var(--radius); +} + +/* ─── Result / status ─── */ +.result-card { + max-width: 36rem; + padding: 1rem; + background: var(--bg-panel); + border: 1px solid rgba(42, 154, 173, 0.28); + border-radius: var(--radius); + animation: rise-in 0.35s var(--ease) both; +} + +.result-card-head { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; +} + +.result-card-head h3 { + margin: 0; + font-size: 1rem; + font-family: var(--font-display); +} + +.result-card textarea { + width: 100%; +} + +.status-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 0.75rem; + margin-bottom: 1rem; +} + +.status-card { + padding: 0.9rem 1rem; + background: var(--bg-panel); + border: 1px solid rgba(216, 239, 232, 0.08); + border-radius: var(--radius); +} + +.status-card .k { + display: block; + font-size: 11px; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--muted); + margin-bottom: 0.25rem; +} + +.status-card .v { + font-weight: 600; + word-break: break-word; +} + +.status-card .v.ok { + color: #9ad4bf; +} +.status-card .v.warn { + color: var(--sail); +} +.status-card .v.bad { + color: #f0c4bc; +} + +.raw-status { + margin-top: 0.5rem; + color: var(--muted); + font-size: 13px; +} + +.status-pre { + margin: 0.5rem 0 0; + padding: 0.85rem 1rem; + background: rgba(7, 16, 24, 0.8); + border: 1px solid rgba(216, 239, 232, 0.08); + border-radius: var(--radius); + font-family: var(--font-mono); + font-size: 12px; + overflow: auto; + max-height: 280px; + color: var(--foam); +} + +/* ─── Logs ─── */ +.log-view { + max-height: min(55vh, 480px); + overflow: auto; + background: rgba(7, 16, 24, 0.85); + border: 1px solid rgba(216, 239, 232, 0.08); + border-radius: var(--radius); + padding: 0.5rem 0; + font-family: var(--font-mono); + font-size: 12px; + line-height: 1.45; +} + +.log-line { + display: grid; + grid-template-columns: 78px 52px 1fr; + gap: 0.6rem; + padding: 0.2rem 0.85rem; +} + +.log-line:hover { + background: rgba(216, 239, 232, 0.04); +} + +.log-line .t { + color: var(--muted); +} + +.log-line .l { + text-transform: uppercase; + font-size: 10px; + letter-spacing: 0.04em; + padding-top: 0.15rem; +} + +.log-line .l.info { + color: var(--sea-bright); +} +.log-line .l.error { + color: #f0c4bc; +} +.log-line .l.warn { + color: var(--sail); +} + +.log-line .m { + white-space: pre-wrap; + word-break: break-word; +} + +/* ─── Toasts / boot error ─── */ +.toast-root { + position: fixed; + top: calc(var(--titlebar-h) + 10px); + right: 12px; + z-index: 1200; + display: flex; + flex-direction: column; + gap: 0.4rem; + width: min(360px, calc(100vw - 24px)); + pointer-events: none; +} + +.toast { + pointer-events: auto; + padding: 0.7rem 0.9rem; + border-radius: var(--radius); + background: rgba(12, 26, 34, 0.95); + border: 1px solid rgba(216, 239, 232, 0.14); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35); + animation: rise-in 0.25s var(--ease) both; + font-size: 13.5px; +} + +.toast.error { + border-color: rgba(196, 92, 74, 0.5); +} +.toast.success { + border-color: rgba(61, 155, 122, 0.5); +} + +.boot-error { + margin: 1rem clamp(1.25rem, 4vw, 2.5rem); + padding: 0.85rem 1rem; + background: rgba(196, 92, 74, 0.15); + border: 1px solid rgba(196, 92, 74, 0.4); + border-radius: var(--radius); + color: #f0c4bc; +} diff --git a/user_docs/GETTING_STARTED.md b/user_docs/GETTING_STARTED.md index 1edb8c1..8783066 100644 --- a/user_docs/GETTING_STARTED.md +++ b/user_docs/GETTING_STARTED.md @@ -1,51 +1,53 @@ # Getting Started -**Status:** Local flow **Planned** (Phase 1). Private invites **Planned** (Phase 2). +**Status:** Desktop GUI + local host/join **available**. CLI secondary. ## What you need -- Flying Jib **standalone app** for your OS (when builds are available) — **you do not need Node.js** +- **Flying Jib desktop** (Electron) — from source or a release installer/ZIP — **or** a **CLI standalone** - Minecraft **Java Edition** (version matching the world, e.g. 1.21.x) -- A network connection for multiplayer with friends (not required for solo localhost) +- Network for multiplayer with friends (not required for solo localhost) -## Install +You should **not** need Node.js to *play* with a standalone CLI binary. Developers use npm to build and run the desktop app. -Installation methods (**Planned**): +## Install (GUI — primary) -- Download a **single executable / app bundle** for your platform (Bare standalone build) -- Or install/update via **Pear** when a pear link is published (P2P OTA) +### From source -You should **not** need to install Node.js, npm, or a separate Minecraft server jar. +```sh +git clone && cd flying-jib +npm ci +npm start +``` -Until then, developers build from source — see [../developer_docs/SETUP.md](../developer_docs/SETUP.md). +### From a release -## First launch +Download the **desktop** ZIP/DMG/Setup for your OS from the Gitea **`rolling`** release, then open **Flying Jib**. -1. Open **Flying Jib** (the app itself — not `node` or a server installer). -2. Create a new private world (name + Minecraft version). -3. Start the world. The app starts a local server **inside itself**, bound only to your computer. -4. Note the **local port** (default `25565`). -5. Open Minecraft Java Edition → Multiplayer → Add server → address `127.0.0.1` or `localhost` and that port. -6. Join and play solo. +See [DESKTOP.md](../developer_docs/DESKTOP.md) for packaging details. -## Invite a friend (CLI) +## First launch (GUI) -1. Host: `flying-jib host ` — copy the `fj1.…` invite (secret). -2. Send it through a private channel. -3. Friend: `flying-jib join 'fj1.…'` -4. Friend connects Java Edition to **their** localhost port shown by the app. -5. You both appear in the same world hosted on the inviter’s machine. +1. Open **Flying Jib** (`npm start` or the installed app). +2. Check the titlebar status pill (Idle → Hosting / Joined). +3. **Worlds** — create a world (or use Settings for default name/port/version). +4. **Host** — pick the world, Host & share, **Copy** the `fj1.…` invite (secret). +5. Minecraft Java → Multiplayer → `127.0.0.1` (port shown, default `25565`). +6. Friend: **Join** with the invite, then connect *their* Java client to *their* localhost port. +7. **Logs** / **Status** for live session detail; **Stop session** when done. -GUI invite/QR is still **Planned**. +## CLI (secondary) -## Safety basics +Download `flying-jib-cli-*-*.tar.gz` from the Gitea **`rolling`** release, or: -- Anyone with your invite can try to join — treat it like a password. -- Flying Jib never needs you to open Minecraft ports on your router. -- The game server is not exposed to the public Internet as a normal Minecraft listener. +```sh +npm run start:cli -- create my-world +npm run start:cli -- host my-world +npm run start:cli -- join 'fj1.…' +``` -## Next reads +## Next -- [PRIVATE_WORLDS.md](./PRIVATE_WORLDS.md) -- [INVITES_AND_CAPABILITIES.md](./INVITES_AND_CAPABILITIES.md) -- [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) +- [README](./README.md) — user overview +- [DESKTOP.md](../developer_docs/DESKTOP.md) — desktop architecture & installers +- [SECURITY](../agent/SECURITY.md) — invites are secrets