From 2a223812786dda21ae08ce1da30a6e1df12cb713 Mon Sep 17 00:00:00 2001 From: hazre Date: Mon, 20 Jul 2026 19:20:32 +0200 Subject: [PATCH 01/21] feat: add mise support Signed-off-by: hazre --- mise.toml | 7 +++++++ rust-toolchain.toml | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 mise.toml create mode 100644 rust-toolchain.toml diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000000..04d18ed87f --- /dev/null +++ b/mise.toml @@ -0,0 +1,7 @@ +[settings] +idiomatic_version_file_enable_tools = ["pnpm", "node", "rust"] +experimental = true + +[tools] +cargo-binstall = "1.21.0" +"cargo:knope" = "0.23.0" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000000..59277fee77 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.97.1" +components = ["clippy", "rustfmt"] From d3f6b89607eb2c5c5d4cae5a95650f111ff2f014 Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 01:43:28 +0200 Subject: [PATCH 02/21] chore(tauri): update cargo.toml metadata Signed-off-by: hazre --- knope.toml | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/knope.toml b/knope.toml index 04cc4e690e..24ed9d44cb 100644 --- a/knope.toml +++ b/knope.toml @@ -1,5 +1,5 @@ [package] -versioned_files = ["package.json", "src-tauri/tauri.conf.json"] +versioned_files = ["package.json", "src-tauri/tauri.conf.json", "src-tauri/Cargo.toml"] changelog = "CHANGELOG.md" extra_changelog_sections = [ { name = "Security", types = [ diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index abf76250f8..de87db9451 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -5349,7 +5349,7 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sable" -version = "0.1.0" +version = "1.20.0" dependencies = [ "aes", "async-stream", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 5ce3edb089..0a21145489 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,12 +1,11 @@ [package] name = "sable" -version = "0.1.0" +version = "1.20.0" description = "Yet another matrix client but better" -authors = ["you"] -license = "" -repository = "" +authors = ["Sable Maintainers"] +license = "AGPL-3.0-or-later" +repository = "https://github.com/SableClient/Sable" edition = "2021" -rust-version = "1.88.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From e6c1d1b05cc0c6876a196466a3727b99a6ba327c Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 01:52:12 +0200 Subject: [PATCH 03/21] chore: move pnpm overrides to pnpm-workspace.yaml Signed-off-by: hazre --- package.json | 7 +------ pnpm-workspace.yaml | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ee8ec0799b..4de819eb85 100644 --- a/package.json +++ b/package.json @@ -162,10 +162,5 @@ "node": "24.x", "pnpm": ">=10" }, - "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be", - "pnpm": { - "overrides": { - "jsdom>undici": "^7.28.0" - } - } + "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be" } diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dd46996060..0b5e9b21ec 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,6 +18,7 @@ overrides: brace-expansion: '>=1.1.12' esbuild: '>=0.25.0' flatted: '>=3.4.2' + jsdom>undici: '^7.28.0' lodash: '>=4.17.23' minimatch: '>=10.2.3' rollup: '>=4.59.0' From c28302ed92aa5bd6fd1cbf6a9e30b27ecbd15331 Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 01:55:57 +0200 Subject: [PATCH 04/21] chore(scripts): convert shell scripts to cross-platform ESM Signed-off-by: hazre --- scripts/cef-copy-libs.sh | 1 + scripts/cef-package.sh | 1 + scripts/icons/replace.js | 163 +++++++++++++++++++++++++++++++++++++++ scripts/replace-logo.sh | 126 ------------------------------ scripts/tauri.js | 70 ++++++++--------- 5 files changed, 199 insertions(+), 162 deletions(-) create mode 100644 scripts/icons/replace.js delete mode 100755 scripts/replace-logo.sh diff --git a/scripts/cef-copy-libs.sh b/scripts/cef-copy-libs.sh index 99e0261266..30603f8170 100644 --- a/scripts/cef-copy-libs.sh +++ b/scripts/cef-copy-libs.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +#MISE description="Copy CEF runtime libs next to the built binary" # Copy the CEF runtime (libcef.so + resources) next to a built binary so the app # is self-contained: works standalone, when launched by the OS via a sable:// # deep link, or from a release package. Pair with the rpath=$ORIGIN that diff --git a/scripts/cef-package.sh b/scripts/cef-package.sh index aeff0fd11f..440d48644d 100755 --- a/scripts/cef-package.sh +++ b/scripts/cef-package.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +#MISE description="Package CEF build into deb/rpm/AppImage" # Package the Linux CEF build into deb/rpm/AppImage. Used by CI and locally. # Run after the binary is built (pnpm tauri:cef build). # Usage: scripts/cef-package.sh [version] diff --git a/scripts/icons/replace.js b/scripts/icons/replace.js new file mode 100644 index 0000000000..3f02f54150 --- /dev/null +++ b/scripts/icons/replace.js @@ -0,0 +1,163 @@ +#!/usr/bin/env node +//MISE description="Replace logo/icon assets in public/ from SVG inputs via ffmpeg" + +import { execFileSync } from 'node:child_process'; +import { existsSync, mkdirSync, copyFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createInterface } from 'node:readline'; +import { PrefixedLogger, createTextHelpers } from './utils/console-style.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const BASE_DIR = resolve(__dirname, '..'); + +const logger = new PrefixedLogger('[replace-logo]'); +const { red } = createTextHelpers({ useColor: logger.useColor }); + +/** + * Display a question on stdin and return the user's trimmed response. + * @param {string} question - The prompt text to display. + * @returns {Promise} The user's input with surrounding whitespace removed. + */ +function prompt(question) { + const rl = createInterface({ input: process.stdin, output: process.stdout }); + return new Promise((resolve_) => { + rl.question(question, (answer) => { + rl.close(); + resolve_(answer.trim()); + }); + }); +} + +/** Print CLI usage instructions to stdout. */ +function usage() { + logger.info(`Usage: run this script and provide four file paths when prompted. +It will replace icons in the repository public/ tree using ffmpeg. + +You will be prompted for: + - maskless (borderless) logo (used for maskable icons) + - circular logo (used for circular icons) + - highlight variant (icon for highlight indicator) + - unread variant (icon for unread indicator) + +Requires: ffmpeg, base64`); +} + +/** + * Render an SVG to a PNG at the given square dimension using ffmpeg. + * Creates the output directory if it doesn't already exist. + * @param {string} input - Absolute path to the source SVG file. + * @param {string} output - Absolute path for the generated PNG. + * @param {string | number} size - Width and height in pixels. + */ +function ffmpegCmd(input, output, size) { + mkdirSync(dirname(output), { recursive: true }); + logger.info(`Generating ${output} (${size} x ${size})`); + execFileSync( + 'ffmpeg', + ['-y', '-width', String(size), '-height', String(size), '-i', input, output], + { + stdio: 'pipe', + } + ); +} + +/** + * Check whether a file path has an SVG extension (case-insensitive). + * @param {string} filePath + * @returns {boolean} + */ +function isSvg(filePath) { + return filePath.toLowerCase().endsWith('.svg'); +} + +/** + * Entry point. Prompts for four SVG logo variants, validates them, + * then renders PNGs at every required size and copies SVGs into public/res/svg/. + * @param {string[]} args - CLI arguments (supports --help / -h). + */ +async function main(args) { + if (args.includes('--help') || args.includes('-h')) { + usage(); + process.exit(0); + } + + const maskless = await prompt('Path to maskless (borderless) logo: '); + const circular = await prompt('Path to circular logo: '); + const highlight = await prompt('Path to highlight variant: '); + const unread = await prompt('Path to unread variant: '); + + for (const f of [maskless, circular, highlight, unread]) { + if (!existsSync(f)) { + logger.error(`${red('File not found:')} ${f}`); + process.exit(2); + } + if (!isSvg(f)) { + logger.error(`${red('Input must be an SVG:')} ${f}`); + process.exit(3); + } + } + + /** @type {[number, string][]} */ + const CIRCULAR_TARGETS = [ + [512, 'public/favicon.png'], + [2560, 'public/full_res_sable.png'], + [144, 'public/res/logo/logo-144x144.png'], + [192, 'public/res/logo/logo-192x192.png'], + [256, 'public/res/logo/logo-256x256.png'], + [36, 'public/res/logo/logo-36x36.png'], + [384, 'public/res/logo/logo-384x384.png'], + [48, 'public/res/logo/logo-48x48.png'], + [512, 'public/res/logo/logo-512x512.png'], + [72, 'public/res/logo/logo-72x72.png'], + [96, 'public/res/logo/logo-96x96.png'], + ]; + + logger.info('Replacing circular icons...'); + for (const [size, out] of CIRCULAR_TARGETS) { + ffmpegCmd(circular, resolve(BASE_DIR, out), size); + } + + /** @type {[number, string][]} */ + const MASKABLE_TARGETS = [ + [114, 'public/res/logo-maskable/logo-maskable-114x114.png'], + [120, 'public/res/logo-maskable/logo-maskable-120x120.png'], + [144, 'public/res/logo-maskable/logo-maskable-144x144.png'], + [152, 'public/res/logo-maskable/logo-maskable-152x152.png'], + [167, 'public/res/logo-maskable/logo-maskable-167x167.png'], + [180, 'public/res/logo-maskable/logo-maskable-180x180.png'], + [192, 'public/res/logo-maskable/logo-maskable-192x192.png'], + [256, 'public/res/logo-maskable/logo-maskable-256x256.png'], + [36, 'public/res/logo-maskable/logo-maskable-36x36.png'], + [384, 'public/res/logo-maskable/logo-maskable-384x384.png'], + [48, 'public/res/logo-maskable/logo-maskable-48x48.png'], + [512, 'public/res/logo-maskable/logo-maskable-512x512.png'], + [57, 'public/res/logo-maskable/logo-maskable-57x57.png'], + [60, 'public/res/logo-maskable/logo-maskable-60x60.png'], + [72, 'public/res/logo-maskable/logo-maskable-72x72.png'], + [76, 'public/res/logo-maskable/logo-maskable-76x76.png'], + [96, 'public/res/logo-maskable/logo-maskable-96x96.png'], + ]; + + logger.info('Replacing maskable icons (using maskless input)...'); + for (const [size, out] of MASKABLE_TARGETS) { + ffmpegCmd(maskless, resolve(BASE_DIR, out), size); + } + + logger.info('Handling SVG assets in public/res/svg/...'); + const svgDir = resolve(BASE_DIR, 'public/res/svg'); + mkdirSync(svgDir, { recursive: true }); + + logger.info(`Copying circular SVG to ${svgDir}/logo.svg`); + copyFileSync(circular, resolve(svgDir, 'logo.svg')); + + logger.info(`Copying maskable SVG to ${svgDir}/logo-maskable.svg`); + copyFileSync(maskless, resolve(svgDir, 'logo-maskable.svg')); + + copyFileSync(highlight, resolve(svgDir, 'highlight.svg')); + copyFileSync(unread, resolve(svgDir, 'unread.svg')); + + logger.info('All done. Please review the generated files.'); +} + +main(process.argv.slice(2)); diff --git a/scripts/replace-logo.sh b/scripts/replace-logo.sh deleted file mode 100755 index 5d92318512..0000000000 --- a/scripts/replace-logo.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -readonly BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -usage(){ - cat <&2 - exit 2 - fi - if [[ "${f,,}" != *.svg ]]; then - echo "Input must be an SVG: $f" >&2 - exit 3 - fi -done - -ffmpeg_cmd(){ - local in="$1" out="$2" size="$3" - mkdir -p "$(dirname "$out")" - echo "Generating $out ($size x $size)" - ffmpeg -y -width "$size" -height "$size" -i "$in" "$out" 2>/dev/null -} - -# All inputs are required to be SVG. Use ffmpeg to render SVGs to PNG targets -# and copy SVGs directly to the svg assets directory. - -is_svg(){ - local f="$1" - [[ "${f,,}" == *.svg ]] -} - -echo "Replacing circular icons..." - -declare -a CIRCULAR_TARGETS=( - "512:$BASE_DIR/public/favicon.png" - "2560:$BASE_DIR/public/full_res_sable.png" - "144:$BASE_DIR/public/res/logo/logo-144x144.png" - "192:$BASE_DIR/public/res/logo/logo-192x192.png" - "256:$BASE_DIR/public/res/logo/logo-256x256.png" - "36:$BASE_DIR/public/res/logo/logo-36x36.png" - "384:$BASE_DIR/public/res/logo/logo-384x384.png" - "48:$BASE_DIR/public/res/logo/logo-48x48.png" - "512:$BASE_DIR/public/res/logo/logo-512x512.png" - "72:$BASE_DIR/public/res/logo/logo-72x72.png" - "96:$BASE_DIR/public/res/logo/logo-96x96.png" -) - -for entry in "${CIRCULAR_TARGETS[@]}"; do - size=${entry%%:*} - out=${entry#*:} - ffmpeg_cmd "$CIRCULAR" "$out" "$size" -done - -echo "Replacing maskable icons (using maskless input)..." - -declare -a MASKABLE_TARGETS=( - "114:$BASE_DIR/public/res/logo-maskable/logo-maskable-114x114.png" - "120:$BASE_DIR/public/res/logo-maskable/logo-maskable-120x120.png" - "144:$BASE_DIR/public/res/logo-maskable/logo-maskable-144x144.png" - "152:$BASE_DIR/public/res/logo-maskable/logo-maskable-152x152.png" - "167:$BASE_DIR/public/res/logo-maskable/logo-maskable-167x167.png" - "180:$BASE_DIR/public/res/logo-maskable/logo-maskable-180x180.png" - "192:$BASE_DIR/public/res/logo-maskable/logo-maskable-192x192.png" - "256:$BASE_DIR/public/res/logo-maskable/logo-maskable-256x256.png" - "36:$BASE_DIR/public/res/logo-maskable/logo-maskable-36x36.png" - "384:$BASE_DIR/public/res/logo-maskable/logo-maskable-384x384.png" - "48:$BASE_DIR/public/res/logo-maskable/logo-maskable-48x48.png" - "512:$BASE_DIR/public/res/logo-maskable/logo-maskable-512x512.png" - "57:$BASE_DIR/public/res/logo-maskable/logo-maskable-57x57.png" - "60:$BASE_DIR/public/res/logo-maskable/logo-maskable-60x60.png" - "72:$BASE_DIR/public/res/logo-maskable/logo-maskable-72x72.png" - "76:$BASE_DIR/public/res/logo-maskable/logo-maskable-76x76.png" - "96:$BASE_DIR/public/res/logo-maskable/logo-maskable-96x96.png" -) - -for entry in "${MASKABLE_TARGETS[@]}"; do - size=${entry%%:*} - out=${entry#*:} - ffmpeg_cmd "$MASKLESS" "$out" "$size" -done - -echo "Handling SVG assets in public/res/svg/..." - -SVG_DIR="$BASE_DIR/public/res/svg" -mkdir -p "$SVG_DIR" - -# logo.svg from circular input (inputs are SVG so copy directly) -echo "Copying circular SVG to $SVG_DIR/logo.svg" -cp "$CIRCULAR" "$SVG_DIR/logo.svg" - -# logo-maskable.svg from maskless input -echo "Copying maskable SVG to $SVG_DIR/logo-maskable.svg" -cp "$MASKLESS" "$SVG_DIR/logo-maskable.svg" - -# highlight.svg -cp "$HIGHLIGHT" "$SVG_DIR/highlight.svg" - -# unread.svg -cp "$UNREAD" "$SVG_DIR/unread.svg" - -echo "All done. Please review the generated files." diff --git a/scripts/tauri.js b/scripts/tauri.js index 4ed2803ced..6fe6526345 100644 --- a/scripts/tauri.js +++ b/scripts/tauri.js @@ -1,18 +1,9 @@ #!/usr/bin/env node - -/** - * Script to run tauri commands for a given runtime (wry or cef) with prepended CLI args. - * - * Usage: - * script/tauri [prepended-args...] - * - * Examples: - * script/tauri cef dev --verbose - * script/tauri cef dev -- --verbose - * Both will run: tauri dev --features cef -- --verbose --no-default-features - */ +//MISE description="Run Tauri CLI with platform-specific feature flags" +//USAGE arg "" help="Target" default="wry" choices "wry" "cef" "android" "ios" import { run } from '@tauri-apps/cli'; +import { spawn } from 'node:child_process'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import process from 'node:process'; @@ -27,19 +18,19 @@ const __dirname = dirname(__filename); const cmdlineArgs = process.argv.slice(2); if (cmdlineArgs.length < 2) { - logger.error('Usage: node scripts/tauri [prepended-args...]'); + logger.error('Usage: node scripts/tauri [prepended-args...]'); + logger.error(` ${dim('platform:')} wry, cef, android, or ios`); logger.error(` ${dim('command:')} dev or build`); - logger.error(` ${dim('runtime:')} wry or cef`); - logger.error( - ` ${dim('prepended-args:')} Arguments to prepend to the cargo args (-- separator is optional)` - ); process.exit(1); } -const [runtime, cmd, ...tauriArgs] = cmdlineArgs; +const [platform, cmd, ...tauriArgs] = cmdlineArgs; + +const MOBILE = ['android', 'ios']; +const DESKTOP = ['wry', 'cef']; -if (!['wry', 'cef'].includes(runtime)) { - logger.error(`Invalid runtime: ${runtime}. Must be 'wry' or 'cef'`); +if (![...DESKTOP, ...MOBILE].includes(platform)) { + logger.error(`Invalid platform: ${platform}. Must be wry, cef, android, or ios`); process.exit(1); } if (!['dev', 'build'].includes(cmd)) { @@ -47,23 +38,30 @@ if (!['dev', 'build'].includes(cmd)) { process.exit(1); } -tauriArgs.unshift('--features', `${runtime},updater`); -// tauri's Linux bundler can't package CEF; scripts/cef-package.sh does that. -if (runtime === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { - tauriArgs.unshift('--no-bundle'); -} -if (!tauriArgs.includes('--')) { - tauriArgs.push('--'); -} -tauriArgs.push('--no-default-features'); +process.chdir(join(__dirname, '..')); -const args = [cmd, ...tauriArgs]; +if (MOBILE.includes(platform)) { + logger.info(`${dim('Running:')} tauri ${[platform, cmd, ...tauriArgs].join(' ')}`); + const child = spawn('tauri', [platform, cmd, ...tauriArgs], { + stdio: 'inherit', + shell: true, + }); + child.on('exit', (code) => process.exit(code ?? 1)); +} else { + const args = [cmd, '--features', `${platform},updater`, ...tauriArgs]; + if (!tauriArgs.includes('--')) { + args.push('--'); + } + args.push('--no-default-features'); -process.chdir(join(__dirname, '..')); + if (platform === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { + args.unshift('--no-bundle'); + } -logger.info(`${dim('Running:')} tauri ${args.join(' ')}`); + logger.info(`${dim('Running:')} tauri ${args.join(' ')}`); -run(args, 'tauri').catch((error) => { - logger.error(`Failed to run tauri: ${error?.message ?? error}`); - process.exit(1); -}); + run(args, 'tauri').catch((error) => { + logger.error(`Failed to run tauri: ${error?.message ?? error}`); + process.exit(1); + }); +} From 5a006e1c22af00949705f3823874cf867fe841b5 Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 01:55:57 +0200 Subject: [PATCH 05/21] chore(mise): add task definitions and reorganize scripts Signed-off-by: hazre --- .github/workflows/tauri-build.yml | 2 +- mise.toml | 64 ++++++++++++++++++- .../{cef-copy-libs.sh => cef/copy-libs.sh} | 0 scripts/{cef-package.sh => cef/package.sh} | 0 .../symlink.js} | 1 + scripts/install-knope.js | 2 + scripts/normalize-imports.js | 2 + 7 files changed, 67 insertions(+), 4 deletions(-) rename scripts/{cef-copy-libs.sh => cef/copy-libs.sh} (100%) rename scripts/{cef-package.sh => cef/package.sh} (100%) mode change 100755 => 100644 rename scripts/{symlink-tauri-icons.js => icons/symlink.js} (98%) diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 1158c3db1b..9cbb5ae3ac 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -280,7 +280,7 @@ jobs: - name: Build native packages if: matrix.cef shell: bash - run: bash scripts/cef-package.sh "$VERSION" + run: bash scripts/cef/package.sh "$VERSION" - name: Sign the AppImage for the updater if: ${{ matrix.cef && env.TAURI_SIGNING_PRIVATE_KEY != '' }} diff --git a/mise.toml b/mise.toml index 04d18ed87f..3cfa1a944b 100644 --- a/mise.toml +++ b/mise.toml @@ -1,7 +1,65 @@ +[env] +_.path = ["{{config_root}}/node_modules/.bin"] + [settings] idiomatic_version_file_enable_tools = ["pnpm", "node", "rust"] experimental = true -[tools] -cargo-binstall = "1.21.0" -"cargo:knope" = "0.23.0" +[task_config] +includes = ["scripts"] + +[tasks.dev] +description = "Start Vite dev server" +alias = "d" +run = "vite dev" +raw = true + +[tasks.build] +description = "Build frontend with Vite" +alias = "b" +run = "vite build" + +[tasks.preview] +description = "Preview the production build" +alias = "p" +run = "vite preview" + +[tasks.lint] +description = "Run all linting, typechecking, formatting, and dead code checks" +alias = "l" +run = ["tsc", "oxlint .", "oxfmt --check .", "knip"] + +[tasks.lint-fix] +description = "Fix lint issues, format, and run typecheck and dead code checks" +alias = "lf" +run = ["oxlint . --fix", "oxfmt .", "knip --fix"] + +[tasks.test] +description = "Run tests" +alias = "t" +run = "vitest" +raw = true + +[tasks.document-change] +description = "Document a change with knope" +alias = "doc" +run = "knope document-change" + +[tasks."cargo:lint"] +description = "Check Rust formatting and lint with Clippy" +alias = ["cl", "cargo-lint"] +dir = "src-tauri" +run = ["cargo fmt --check", "cargo clippy --all-targets --all-features -- -D warnings"] + +[tasks."cargo:lint-fix"] +description = "Fix Rust formatting and lint issues" +alias = ["clf", "cargo-lint-fix"] +dir = "src-tauri" +run = ["cargo fmt", "cargo clippy --fix --allow-dirty --all-targets --all-features -- -D warnings"] + +[tasks."cargo:test"] +description = "Run Rust tests" +alias = ["ct", "cargo-test"] +dir = "src-tauri" +run = "cargo test" +raw = true diff --git a/scripts/cef-copy-libs.sh b/scripts/cef/copy-libs.sh similarity index 100% rename from scripts/cef-copy-libs.sh rename to scripts/cef/copy-libs.sh diff --git a/scripts/cef-package.sh b/scripts/cef/package.sh old mode 100755 new mode 100644 similarity index 100% rename from scripts/cef-package.sh rename to scripts/cef/package.sh diff --git a/scripts/symlink-tauri-icons.js b/scripts/icons/symlink.js similarity index 98% rename from scripts/symlink-tauri-icons.js rename to scripts/icons/symlink.js index 25674f335c..9387639324 100644 --- a/scripts/symlink-tauri-icons.js +++ b/scripts/icons/symlink.js @@ -1,4 +1,5 @@ #!/usr/bin/env node +//MISE description="Create symlinks for Tauri icons from the source set" /* eslint-disable no-console */ import fs from 'node:fs'; diff --git a/scripts/install-knope.js b/scripts/install-knope.js index 74fd9c2643..ced1f260b6 100644 --- a/scripts/install-knope.js +++ b/scripts/install-knope.js @@ -1,4 +1,6 @@ #!/usr/bin/env node +//MISE hide=true +//MISE description="Install or update knope to the pinned version" import { spawnSync } from 'node:child_process'; import process from 'node:process'; import { chmodSync, existsSync, mkdirSync, realpathSync, writeFileSync } from 'node:fs'; diff --git a/scripts/normalize-imports.js b/scripts/normalize-imports.js index 77af442c38..415e366967 100644 --- a/scripts/normalize-imports.js +++ b/scripts/normalize-imports.js @@ -1,4 +1,6 @@ #!/usr/bin/env node +//MISE hide=true +//MISE description="Normalize import paths across the codebase" /* oxlint-disable no-console */ import fs from 'node:fs/promises'; From c984d932da78f22927516f5c273a1942febbac31 Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 04:01:52 +0200 Subject: [PATCH 06/21] chore(scripts): replace fpm with nfpm for deb/rpm packaging - Add nfpm.yaml declarative config with contents, deps, per-packager overrides - Replace fpm CLI invocations in package.sh with nfpm pkg - Manage appimagetool and nfpm via mise file task tools - Remove manual appimagetool download + sha256 verification - Fix stale paths from scripts/cef/ move (ROOT, copy-libs reference, usage) - Add version extraction guard and appimagetool availability check Signed-off-by: hazre --- nfpm.yaml | 48 +++++++++++++++++++++++++++++ scripts/cef/package.sh | 70 +++++++++++++++++------------------------- 2 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 nfpm.yaml diff --git a/nfpm.yaml b/nfpm.yaml new file mode 100644 index 0000000000..8f44eab705 --- /dev/null +++ b/nfpm.yaml @@ -0,0 +1,48 @@ +# yaml-language-server: $schema=https://nfpm.goreleaser.com/schema.json + +name: sable +arch: amd64 +platform: linux +version: ${PKG_VERSION} +release: ${PKG_RELEASE} +version_schema: semver +section: net +maintainer: SableClient +description: Sable, a Matrix client +homepage: https://sable.moe + +contents: + - src: ${PKGROOT}/opt/sable/ + dst: /opt/sable + type: tree + - src: ${PKGROOT}/usr/ + dst: /usr + type: tree + +overrides: + deb: + depends: + - libgtk-3-0 + - libnss3 + - libnspr4 + - libgbm1 + - libdrm2 + - libxkbcommon0 + - libasound2 + - libcups2 + - xdg-utils + - xwayland + - libayatana-appindicator3-1 + rpm: + depends: + - gtk3 + - nss + - nspr + - mesa-libgbm + - libdrm + - libxkbcommon + - alsa-lib + - cups-libs + - xdg-utils + - xorg-x11-server-Xwayland + - libayatana-appindicator3.so.1()(64bit) diff --git a/scripts/cef/package.sh b/scripts/cef/package.sh index 440d48644d..0523d777f5 100644 --- a/scripts/cef/package.sh +++ b/scripts/cef/package.sh @@ -1,13 +1,15 @@ #!/usr/bin/env bash #MISE description="Package CEF build into deb/rpm/AppImage" +#MISE tools={nfpm="2.47.0", "github:AppImage/appimagetool" = {version = "1.9.1", matching = ".AppImage"}} # Package the Linux CEF build into deb/rpm/AppImage. Used by CI and locally. # Run after the binary is built (pnpm tauri:cef build). -# Usage: scripts/cef-package.sh [version] +# Usage: scripts/cef/package.sh [version] set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" VERSION="${1:-$(grep -m1 '"version":' src-tauri/tauri.conf.json | sed 's/.*: *"\(.*\)".*/\1/')}" +: "${VERSION:?version not found in src-tauri/tauri.conf.json}" DEB_VERSION="$VERSION" RPM_VERSION="$VERSION" RPM_ITERATION=1 @@ -45,7 +47,7 @@ stage_runtime() { local dest="$1" mkdir -p "$dest" cp "$STAGE/$BIN_NAME" "$dest/sable" - bash scripts/cef-copy-libs.sh release "$dest" + bash scripts/cef/copy-libs.sh release "$dest" } # Bundle the system-tray libraries (Tauri's linuxdeploy path normally does this, @@ -87,8 +89,10 @@ MimeType=x-scheme-handler/sable;x-scheme-handler/moe.sable.app; EOF } -if command -v fpm >/dev/null 2>&1; then +CONFIG="$ROOT/nfpm.yaml" +if command -v nfpm >/dev/null 2>&1; then PKGROOT="$WORK/pkgroot" + export PKGROOT stage_runtime "$PKGROOT/opt/sable" mkdir -p "$PKGROOT/usr/bin" "$PKGROOT/usr/share/applications" cat > "$PKGROOT/usr/bin/sable" <<'EOF' @@ -102,57 +106,39 @@ EOF cp "src-tauri/icons/${size}.png" \ "$PKGROOT/usr/share/icons/hicolor/${size}/apps/sable.png" done - # 128x128@2x is 256x256 mkdir -p "$PKGROOT/usr/share/icons/hicolor/256x256/apps" cp "src-tauri/icons/128x128@2x.png" \ "$PKGROOT/usr/share/icons/hicolor/256x256/apps/sable.png" - COMMON=(-s dir -n sable - --description "Sable, a Matrix client" - --url "https://sable.moe" --maintainer "SableClient" - --category net) - # CEF deps: no WebKitGTK. ALSA/CUPS are NEEDED by libcef.so; - # xwayland because main.rs forces GDK_BACKEND=x11. - DEB_DEPS=(--depends libgtk-3-0 --depends libnss3 --depends libnspr4 - --depends libgbm1 --depends libdrm2 --depends libxkbcommon0 - --depends libasound2 --depends libcups2 --depends xdg-utils - --depends xwayland --depends libayatana-appindicator3-1) - (cd "$OUT/deb" && fpm "${COMMON[@]}" -v "$DEB_VERSION" --iteration 1 \ - -t deb -a amd64 -p "Sable-${VERSION}-linux-x86_64.deb" "${DEB_DEPS[@]}" -C "$PKGROOT" .) + PKG_VERSION="$DEB_VERSION" PKG_RELEASE=1 nfpm pkg -f "$CONFIG" -p deb \ + -t "$OUT/deb/Sable-${VERSION}-linux-x86_64.deb" - RPM_DEPS=(--depends gtk3 --depends nss --depends nspr - --depends mesa-libgbm --depends libdrm --depends libxkbcommon - --depends alsa-lib --depends cups-libs --depends xdg-utils - --depends xorg-x11-server-Xwayland - --depends 'libayatana-appindicator3.so.1()(64bit)') - (cd "$OUT/rpm" && fpm "${COMMON[@]}" -v "$RPM_VERSION" --iteration "$RPM_ITERATION" \ - -t rpm -a x86_64 -p "Sable-${VERSION}-linux-x86_64.rpm" "${RPM_DEPS[@]}" -C "$PKGROOT" .) + PKG_VERSION="$RPM_VERSION" PKG_RELEASE="$RPM_ITERATION" nfpm pkg -f "$CONFIG" -p rpm \ + -t "$OUT/rpm/Sable-${VERSION}-linux-x86_64.rpm" else - echo "fpm not found; skipping deb/rpm (building AppImage only)" + echo "nfpm not found; skipping deb/rpm" fi -APPDIR="$WORK/Sable.AppDir" -stage_runtime "$APPDIR/usr/bin" -stage_appindicator "$APPDIR/usr/bin" -# nosuid AppImage mount: drop setuid chrome-sandbox, use the namespace sandbox. -rm -f "$APPDIR/usr/bin/chrome-sandbox" -write_desktop "$APPDIR/sable.desktop" -cp src-tauri/icons/128x128.png "$APPDIR/sable.png" -cat > "$APPDIR/AppRun" <<'EOF' +if command -v appimagetool >/dev/null 2>&1; then + APPDIR="$WORK/Sable.AppDir" + stage_runtime "$APPDIR/usr/bin" + stage_appindicator "$APPDIR/usr/bin" + # nosuid AppImage mount: drop setuid chrome-sandbox, use the namespace sandbox. + rm -f "$APPDIR/usr/bin/chrome-sandbox" + write_desktop "$APPDIR/sable.desktop" + cp src-tauri/icons/128x128.png "$APPDIR/sable.png" + cat > "$APPDIR/AppRun" <<'EOF' #!/bin/sh HERE="$(dirname "$(readlink -f "$0")")" export LD_LIBRARY_PATH="$HERE/usr/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" exec "$HERE/usr/bin/sable" "$@" EOF -chmod 755 "$APPDIR/AppRun" + chmod 755 "$APPDIR/AppRun" -APPIMAGETOOL_SHA256=ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0 -APPIMAGETOOL="$WORK/appimagetool" -curl -fsSL -o "$APPIMAGETOOL" \ - https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage -echo "${APPIMAGETOOL_SHA256} $APPIMAGETOOL" | sha256sum -c - -chmod +x "$APPIMAGETOOL" -APPIMAGE_EXTRACT_AND_RUN=1 ARCH=x86_64 "$APPIMAGETOOL" "$APPDIR" \ - "$OUT/appimage/Sable-${VERSION}-linux-x86_64.AppImage" + ARCH=x86_64 appimagetool "$APPDIR" \ + "$OUT/appimage/Sable-${VERSION}-linux-x86_64.AppImage" +else + echo "appimagetool not found; skipping AppImage" >&2 +fi echo "Packages in: $OUT" From 6b19077c2e3bc80c7402afc00fa52a4f91c8b999 Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 05:31:25 +0200 Subject: [PATCH 07/21] chore(ci): update ci to use mise Signed-off-by: hazre --- .github/actions/prepare-tofu/action.yml | 16 +++---- .github/actions/setup/action.yml | 10 ++--- .github/workflows/cloudflare-web-deploy.yml | 24 +++++++++-- .github/workflows/cloudflare-web-dev.yml | 4 +- .github/workflows/codeql.yml | 2 + .github/workflows/docker-publish.yml | 6 ++- .github/workflows/flake-lock-fix.yml | 9 ++-- .github/workflows/prepare-release.yml | 8 ++-- .github/workflows/release.yml | 7 +-- .github/workflows/rust-quality.yml | 20 +++++---- .github/workflows/tauri-build.yml | 47 ++++++++++++--------- .github/zizmor.yml | 4 ++ mise.toml | 38 ++++++++++++++--- 13 files changed, 123 insertions(+), 72 deletions(-) create mode 100644 .github/zizmor.yml diff --git a/.github/actions/prepare-tofu/action.yml b/.github/actions/prepare-tofu/action.yml index c64332e3cd..09e5f92c75 100644 --- a/.github/actions/prepare-tofu/action.yml +++ b/.github/actions/prepare-tofu/action.yml @@ -2,10 +2,6 @@ name: Prepare OpenTofu Deployment description: Prepares OpenTofu in infra/web. inputs: - opentofu-version: - description: The OpenTofu version to install. - required: false - default: '1.11.5' is_release_tag: description: Whether the build is for a release tag. Passed through to VITE_IS_RELEASE_TAG. required: false @@ -27,22 +23,20 @@ runs: SENTRY_ORG: ${{ env.SENTRY_ORG }} SENTRY_PROJECT: ${{ env.SENTRY_PROJECT }} - - name: Setup OpenTofu - uses: opentofu/setup-opentofu@9d84900f3238fab8cd84ce47d658d25dd008be2f # v1.0.8 - with: - tofu_version: ${{ inputs.opentofu-version }} + - name: Setup OpenTofu via mise + uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1 - name: Check formatting shell: bash working-directory: ${{ github.workspace }}/infra/web - run: tofu fmt -check + run: mise run opentofu -- fmt -check - name: Initialize OpenTofu shell: bash working-directory: ${{ github.workspace }}/infra/web - run: tofu init -input=false -reconfigure + run: mise run opentofu -- init -input=false -reconfigure - name: Validate configuration shell: bash working-directory: ${{ github.workspace }}/infra/web - run: tofu validate -no-color + run: mise run opentofu -- validate -no-color diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 9b4c9acbb3..961db8d82e 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -18,14 +18,10 @@ inputs: runs: using: composite steps: - - name: Setup pnpm - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0 - - - name: Setup node - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + - name: Setup tools (mise) + uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1 with: - node-version-file: '.node-version' - cache: 'pnpm' + cache: true - name: Install dependencies shell: bash diff --git a/.github/workflows/cloudflare-web-deploy.yml b/.github/workflows/cloudflare-web-deploy.yml index 14d65c869e..5bba6a672e 100644 --- a/.github/workflows/cloudflare-web-deploy.yml +++ b/.github/workflows/cloudflare-web-deploy.yml @@ -55,8 +55,16 @@ jobs: - name: Resolve release version id: version shell: bash + env: + GIT_TAG: ${{ inputs.git_tag }} + REF_NAME: ${{ github.ref_name }} + EVENT_NAME: ${{ github.event_name }} run: | - TAG="${{ github.event_name == 'workflow_dispatch' && inputs.git_tag || github.ref_name }}" + if [[ "$EVENT_NAME" == "workflow_dispatch" && -n "$GIT_TAG" ]]; then + TAG="$GIT_TAG" + else + TAG="$REF_NAME" + fi echo "version=${TAG#v}" >> "$GITHUB_OUTPUT" - name: Prepare OpenTofu deployment @@ -95,8 +103,16 @@ jobs: - name: Resolve release version id: version shell: bash + env: + GIT_TAG: ${{ inputs.git_tag }} + REF_NAME: ${{ github.ref_name }} + EVENT_NAME: ${{ github.event_name }} run: | - TAG="${{ github.event_name == 'workflow_dispatch' && inputs.git_tag || github.ref_name }}" + if [[ "$EVENT_NAME" == "workflow_dispatch" && -n "$GIT_TAG" ]]; then + TAG="$GIT_TAG" + else + TAG="$REF_NAME" + fi echo "version=${TAG#v}" >> "$GITHUB_OUTPUT" - name: Prepare OpenTofu deployment @@ -112,7 +128,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Plan infrastructure - run: tofu plan -input=false -no-color + run: mise run opentofu -- plan -input=false -no-color - name: Apply infrastructure - run: tofu apply -input=false -auto-approve + run: mise run opentofu -- apply -input=false -auto-approve diff --git a/.github/workflows/cloudflare-web-dev.yml b/.github/workflows/cloudflare-web-dev.yml index ef2f711a94..e21bf8388d 100644 --- a/.github/workflows/cloudflare-web-dev.yml +++ b/.github/workflows/cloudflare-web-dev.yml @@ -62,7 +62,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - name: Plan infrastructure - run: tofu plan -input=false -no-color + run: mise run opentofu -- plan -input=false -no-color - name: Apply infrastructure - run: tofu apply -input=false -auto-approve + run: mise run opentofu -- apply -input=false -auto-approve diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bdb1d0bd5e..07e14f5034 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -58,6 +58,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false # Add any setup steps before running the `github/codeql-action/init` action. # This includes steps like installing compilers or runtimes (`actions/setup-node` diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 7b6ed21bc9..b52dd86b2b 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -49,8 +49,8 @@ jobs: id: release_tag shell: bash run: | - if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ inputs.git_tag }}" ]]; then - TAG="${{ inputs.git_tag }}" + if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${INPUTS_GIT_TAG}" ]]; then + TAG="${INPUTS_GIT_TAG}" else TAG="${GITHUB_REF#refs/tags/}" fi @@ -65,6 +65,8 @@ jobs: echo "value=" >> "$GITHUB_OUTPUT" echo "is_release=false" >> "$GITHUB_OUTPUT" fi + env: + INPUTS_GIT_TAG: ${{ inputs.git_tag }} - name: Extract metadata id: meta diff --git a/.github/workflows/flake-lock-fix.yml b/.github/workflows/flake-lock-fix.yml index c7b844e721..fdf800a849 100644 --- a/.github/workflows/flake-lock-fix.yml +++ b/.github/workflows/flake-lock-fix.yml @@ -42,17 +42,20 @@ jobs: - name: Get GitHub App User ID id: get-user-id - run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT" + run: echo "user-id=$(gh api "/users/${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]" --jq .id)" >> "$GITHUB_OUTPUT" env: GH_TOKEN: ${{ steps.app-token.outputs.token }} + STEPS_APP_TOKEN_OUTPUTS_APP_SLUG: ${{ steps.app-token.outputs.app-slug }} - name: Configure bot git identity run: | - git config --global user.name '${{ steps.app-token.outputs.app-slug }}[bot]' - git config --global user.email '${{ steps.get-user-id.outputs.user-id }}+${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com' + git config --global user.name '${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]' + git config --global user.email '${STEPS_GET_USER_ID_OUTPUTS_USER_ID}+${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]@users.noreply.github.com' gh auth setup-git env: GH_TOKEN: ${{ steps.app-token.outputs.token }} + STEPS_APP_TOKEN_OUTPUTS_APP_SLUG: ${{ steps.app-token.outputs.app-slug }} + STEPS_GET_USER_ID_OUTPUTS_USER_ID: ${{ steps.get-user-id.outputs.user-id }} - name: Commit and push if changed if: steps.check.outcome == 'failure' diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 60573416bf..29ae03c5d1 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -20,6 +20,8 @@ jobs: with: app-id: ${{ secrets.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} + permission-contents: write + permission-pull-requests: write - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: @@ -29,12 +31,8 @@ jobs: - uses: fregante/setup-git-user@024bc0b8e177d7e77203b48dab6fb45666854b35 # v2.0.2 - - uses: knope-dev/action@19617851f9f13ab2f27a05989c55efb18aca3675 # v2.1.2 - with: - version: 0.22.3 - - name: Prepare Release - run: knope prepare-release --verbose + run: mise run knope -- prepare-release --verbose env: GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e6e5f9d7f1..6eca8284bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,6 +20,7 @@ jobs: with: app-id: ${{ secrets.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} + permission-contents: write - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: @@ -27,11 +28,7 @@ jobs: persist-credentials: true token: ${{ steps.generate-token.outputs.token }} - - uses: knope-dev/action@19617851f9f13ab2f27a05989c55efb18aca3675 # v2.1.2 - with: - version: 0.22.3 - - name: Create Release - run: knope release --verbose + run: mise run knope -- release --verbose env: GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} diff --git a/.github/workflows/rust-quality.yml b/.github/workflows/rust-quality.yml index f7fdd08f00..98679c0943 100644 --- a/.github/workflows/rust-quality.yml +++ b/.github/workflows/rust-quality.yml @@ -20,17 +20,19 @@ jobs: runs-on: ubuntu-latest permissions: contents: read + env: + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - name: Setup Rust - uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c # 2c7215f132e9ebf062739d9130488b56d53c060c + - name: Setup mise + uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1 with: - toolchain: stable - components: rustfmt + cache: true - name: Check Rust formatting run: cargo fmt --manifest-path src-tauri/Cargo.toml -- --check @@ -40,6 +42,9 @@ jobs: runs-on: ubuntu-22.04 permissions: contents: read + env: + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -60,11 +65,10 @@ jobs: libxdo-dev \ pkg-config - - name: Setup Rust - uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c # 2c7215f132e9ebf062739d9130488b56d53c060c + - name: Setup mise + uses: jdx/mise-action@dad1bfd3df957f44999b559dd69dc1671cb4e9ea # v4.2.1 with: - toolchain: stable - components: clippy + cache: true - name: Cache Rust build uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 9cbb5ae3ac..9cb7cdbf21 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -120,7 +120,7 @@ jobs: - name: macOS platform: macos-latest asset-platform: macos-universal - rust-targets: aarch64-apple-darwin,x86_64-apple-darwin + rust-targets: aarch64-apple-darwin x86_64-apple-darwin args: --target universal-apple-darwin bundle_path: src-tauri/target/universal-apple-darwin/release/bundle - name: Windows @@ -145,6 +145,8 @@ jobs: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always NODE_OPTIONS: --max-old-space-size=8192 TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} @@ -178,11 +180,10 @@ jobs: - name: Setup app uses: ./.github/actions/setup - - name: Setup Rust - uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c # 2c7215f132e9ebf062739d9130488b56d53c060c - with: - toolchain: stable - targets: ${{ matrix.rust-targets }} + - name: Add Rust targets + if: ${{ matrix.rust-targets != '' }} + shell: bash + run: rustup target add ${{ matrix.rust-targets }} - name: Cache Rust build uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 @@ -339,7 +340,10 @@ jobs: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always NODE_OPTIONS: --max-old-space-size=8192 + RUST_TARGETS: aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android ANDROID_KEY_BASE64: ${{ secrets.ANDROID_KEY_BASE64 }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} @@ -362,11 +366,9 @@ jobs: - name: Setup Android SDK uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1 - - name: Setup Rust - uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c # 2c7215f132e9ebf062739d9130488b56d53c060c - with: - toolchain: stable - targets: aarch64-linux-android,armv7-linux-androideabi + - name: Add Rust targets + shell: bash + run: rustup target add $RUST_TARGETS - name: Cache Rust build uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 @@ -453,6 +455,9 @@ jobs: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always + RUST_TARGETS: aarch64-apple-ios NODE_OPTIONS: --max-old-space-size=8192 steps: - name: Checkout repository @@ -464,11 +469,9 @@ jobs: - name: Setup app uses: ./.github/actions/setup - - name: Setup Rust - uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c # 2c7215f132e9ebf062739d9130488b56d53c060c - with: - toolchain: stable - targets: aarch64-apple-ios + - name: Add Rust targets + shell: bash + run: rustup target add $RUST_TARGETS - name: Cache Rust build uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 @@ -522,7 +525,8 @@ jobs: shell: bash env: GH_TOKEN: ${{ github.token }} - run: gh release upload "$TAG" "${{ steps.ipa.outputs.path }}" --clobber + STEPS_IPA_OUTPUTS_PATH: ${{ steps.ipa.outputs.path }} + run: gh release upload "$TAG" "${STEPS_IPA_OUTPUTS_PATH}" --clobber - name: Update AltStore/SideStore source shell: bash @@ -531,8 +535,10 @@ jobs: REPO: ${{ github.repository }} ALTSTORE_VERSION: ${{ steps.ipa.outputs.ipa_version }} ALTSTORE_VERSION_BUILD: ${{ steps.ipa.outputs.ipa_build }} + STEPS_IPA_OUTPUTS_NAME: ${{ steps.ipa.outputs.name }} + STEPS_IPA_OUTPUTS_SIZE: ${{ steps.ipa.outputs.size }} run: | - DOWNLOAD_URL="https://github.com/$REPO/releases/download/$TAG/${{ steps.ipa.outputs.name }}" + DOWNLOAD_URL="https://github.com/$REPO/releases/download/$TAG/${STEPS_IPA_OUTPUTS_NAME}" DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" if gh release download "$TAG" --pattern 'altstore-source.json' --dir . --clobber 2>/dev/null; then echo "Using existing altstore-source.json from release $TAG" @@ -540,7 +546,7 @@ jobs: echo "Using repo altstore-source.json" fi node .github/scripts/update-altstore-source.mjs \ - altstore-source.json "${ALTSTORE_VERSION:-$VERSION}" "${ALTSTORE_VERSION_BUILD:-$VERSION}" "${{ steps.ipa.outputs.size }}" "$DOWNLOAD_URL" "$DATE" "Sable $VERSION" + altstore-source.json "${ALTSTORE_VERSION:-$VERSION}" "${ALTSTORE_VERSION_BUILD:-$VERSION}" "${STEPS_IPA_OUTPUTS_SIZE}" "$DOWNLOAD_URL" "$DATE" "Sable $VERSION" gh release upload "$TAG" altstore-source.json --clobber updater-manifest: @@ -572,8 +578,9 @@ jobs: shell: bash env: GH_TOKEN: ${{ github.token }} + NEEDS_SETUP_RELEASE_OUTPUTS_NIGHTLY: ${{ needs.setup-release.outputs.nightly }} run: | - if [ "${{ needs.setup-release.outputs.nightly }}" = "true" ]; then + if [ "${NEEDS_SETUP_RELEASE_OUTPUTS_NIGHTLY}" = "true" ]; then gh release view "$TAG" --json assets \ | jq -r --arg cutoff "$STARTED_AT" \ '.assets[] | select(.updatedAt <= $cutoff and (.name | endswith(".sig"))) | .name' \ diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 0000000000..191a75c29d --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,4 @@ +rules: + cache-poisoning: + remap: + severity: informational diff --git a/mise.toml b/mise.toml index 3cfa1a944b..3d7fafb9de 100644 --- a/mise.toml +++ b/mise.toml @@ -29,7 +29,7 @@ description = "Run all linting, typechecking, formatting, and dead code checks" alias = "l" run = ["tsc", "oxlint .", "oxfmt --check .", "knip"] -[tasks.lint-fix] +[tasks."lint:fix"] description = "Fix lint issues, format, and run typecheck and dead code checks" alias = "lf" run = ["oxlint . --fix", "oxfmt .", "knip --fix"] @@ -40,10 +40,16 @@ alias = "t" run = "vitest" raw = true -[tasks.document-change] +[tasks.knope] +run = "knope" +raw_args = true +hide = true +tools = { "cargo:knope" = "0.23.0", cargo-binstall = "1.20.1" } + +[tasks."knope:document-change"] description = "Document a change with knope" -alias = "doc" -run = "knope document-change" +alias = ["doc", "doc"] +run = { task = "knope", args = ["document-change"] } [tasks."cargo:lint"] description = "Check Rust formatting and lint with Clippy" @@ -51,7 +57,7 @@ alias = ["cl", "cargo-lint"] dir = "src-tauri" run = ["cargo fmt --check", "cargo clippy --all-targets --all-features -- -D warnings"] -[tasks."cargo:lint-fix"] +[tasks."cargo:lint:fix"] description = "Fix Rust formatting and lint issues" alias = ["clf", "cargo-lint-fix"] dir = "src-tauri" @@ -63,3 +69,25 @@ alias = ["ct", "cargo-test"] dir = "src-tauri" run = "cargo test" raw = true + +[tasks."actions:pin"] +description = "Pin GitHub Actions to SHA commit hashes" +run = "pinact run" +tools = { "pinact" = "latest" } + +[tasks."actions:audit"] +description = "Audit GitHub Actions for security issues" +run = "zizmor .github/workflows" +tools = { "zizmor" = "latest" } + +[tasks."actions:update"] +description = "Update pinned GitHub Actions to latest SHAs" +run = "pinact run -u" +tools = { "pinact" = "latest" } + + +[tasks.opentofu] +run = "tofu" +raw_args = true +hide = true +tools = { "opentofu" = "1.11.5" } \ No newline at end of file From 2a3692d7def5a970fe1e2ba1115591d869b4699b Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 07:23:34 +0200 Subject: [PATCH 08/21] chore: use devEngines for node version Signed-off-by: hazre --- .node-version | 1 - .npmrc | 0 .nvmrc | 1 - package.json | 5 ++--- 4 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 .node-version create mode 100644 .npmrc delete mode 100644 .nvmrc diff --git a/.node-version b/.node-version deleted file mode 100644 index 32f8c50de0..0000000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -24.13.1 diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index a4a7a41bca..0000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v24.14.0 diff --git a/package.json b/package.json index 4de819eb85..9c30743b7c 100644 --- a/package.json +++ b/package.json @@ -158,9 +158,8 @@ "vitest": "^4.1.9", "wrangler": "^4.106.0" }, - "engines": { - "node": "24.x", - "pnpm": ">=10" + "devEngines": { + "runtime": { "name": "node", "version": "24.x" } }, "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be" } From fd8ee5742d96bc2c5c12bea7e07247fa527b7c3a Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 07:37:18 +0200 Subject: [PATCH 09/21] chore: update pnpm lock file Signed-off-by: hazre --- pnpm-lock.yaml | 1233 +++--------------------------------------------- 1 file changed, 70 insertions(+), 1163 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4457b0829..4ac5e2a67f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,15 @@ settings: excludeLinksFromLockfile: false overrides: + brace-expansion: '>=1.1.12' + esbuild: '>=0.25.0' + flatted: '>=3.4.2' jsdom>undici: ^7.28.0 + lodash: '>=4.17.23' + minimatch: '>=10.2.3' + rollup: '>=4.59.0' + serialize-javascript: '>=7.0.3' + undici: '>=7.24.0' importers: @@ -252,21 +260,18 @@ importers: '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 version: 0.2.3(esbuild@0.28.1) - '@playwright/test': - specifier: ^1.61.1 - version: 1.61.1 '@rollup/plugin-inject': specifier: ^5.0.5 - version: 5.0.5(rollup@2.80.0) + version: 5.0.5(rollup@4.62.0) '@rollup/plugin-wasm': specifier: ^6.2.2 - version: 6.2.2(rollup@2.80.0) + version: 6.2.2(rollup@4.62.0) '@sableclient/sable-call-embedded': specifier: 1.1.7 version: 1.1.7 '@sentry/vite-plugin': specifier: ^5.3.0 - version: 5.3.0(rollup@2.80.0) + version: 5.3.0(rollup@4.62.0) '@tauri-apps/cli': specifier: 2.11.4 version: 2.11.4 @@ -333,9 +338,6 @@ importers: oxlint-tsgolint: specifier: ^0.24.0 version: 0.24.0 - testcontainers: - specifier: ^12.0.4 - version: 12.0.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -344,7 +346,7 @@ importers: version: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) vite-plugin-compression2: specifier: ^2.5.3 - version: 2.5.3(rollup@2.80.0) + version: 2.5.3(rollup@4.62.0) vite-plugin-pwa: specifier: ^1.3.0 version: 1.3.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) @@ -353,10 +355,10 @@ importers: version: 3.4.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) vite-plugin-svgr: specifier: 4.5.0 - version: 4.5.0(rollup@2.80.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + version: 4.5.0(rollup@4.62.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) vite-plugin-top-level-await: specifier: ^1.6.0 - version: 1.6.0(@swc/helpers@0.5.23)(rollup@2.80.0)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) + version: 1.6.0(@swc/helpers@0.5.23)(rollup@4.62.0)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) vitest: specifier: ^4.1.9 version: 4.1.9(@types/node@24.13.2)(@vitest/coverage-v8@4.1.9)(@vitest/ui@4.1.9)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)) @@ -924,9 +926,6 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1061,7 +1060,7 @@ packages: '@esbuild-plugins/node-globals-polyfill@0.2.3': resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} peerDependencies: - esbuild: '*' + esbuild: '>=0.25.0' '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} @@ -1390,20 +1389,6 @@ packages: '@fontsource/space-mono@5.2.9': resolution: {integrity: sha512-b61faFOHEISQ/pD25G+cfGY9o/WW6lRv6hBQQfpWvEJ4y1V+S4gmth95EVyBE2VL3qDYHeVQ8nBzrplzdXTDDg==} - '@grpc/grpc-js@1.14.4': - resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - - '@grpc/proto-loader@0.8.1': - resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} - engines: {node: '>=6'} - hasBin: true - '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -1566,10 +1551,6 @@ packages: '@internationalized/string@3.2.9': resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -1596,15 +1577,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@kwsites/file-exists@1.1.1': - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - '@matrix-org/matrix-sdk-crypto-wasm@18.3.1': resolution: {integrity: sha512-VRjWhE1UgHnPpJ3b9B5+8z71ZC/HICFngPPFIN6ktzmUBKI5RusPujzbAQUoB3CgZ0yU58L99AfSQS4YTztSWw==} engines: {node: '>= 18'} @@ -2211,15 +2186,6 @@ packages: react: '>= 16.8' react-dom: '>= 16.8' - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.61.1': - resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} - engines: {node: '>=18'} - hasBin: true - '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -2232,33 +2198,6 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.5': - resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} - - '@protobufjs/eventemitter@1.1.1': - resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} - - '@protobufjs/fetch@1.1.1': - resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.2': - resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} - '@react-leaflet/core@2.1.0': resolution: {integrity: sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==} peerDependencies: @@ -2382,7 +2321,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: '@types/babel__core': optional: true @@ -2391,7 +2330,7 @@ packages: resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2400,7 +2339,7 @@ packages: resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2408,13 +2347,13 @@ packages: '@rollup/plugin-replace@2.4.2': resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + rollup: '>=4.59.0' '@rollup/plugin-terser@0.4.4': resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2423,7 +2362,7 @@ packages: resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2432,7 +2371,7 @@ packages: resolution: {integrity: sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2441,13 +2380,13 @@ packages: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0 + rollup: '>=4.59.0' '@rollup/pluginutils@5.4.0': resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -2690,7 +2629,7 @@ packages: resolution: {integrity: sha512-hgPGPYdQJ/G1cGYOxAb7d4z3V+/k/E5/P/5TFPEEBLuIbFFk+JG0CISUDJdzXJjO382Lb99PBJuXGbueBmO79w==} engines: {node: '>= 18'} peerDependencies: - rollup: '>=3.2.0' + rollup: '>=4.59.0' peerDependenciesMeta: rollup: optional: true @@ -3064,12 +3003,6 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/docker-modem@3.0.6': - resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} - - '@types/dockerode@4.0.1': - resolution: {integrity: sha512-cmUpB+dPN955PxBEuXE3f6lKO1hHiIGYJA46IVF3BJpNsZGvtBDcRnlrHYHtOH/B6vtDOyl2kZ2ShAu3mgc27Q==} - '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -3091,9 +3024,6 @@ packages: '@types/leaflet@1.9.21': resolution: {integrity: sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==} - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} @@ -3114,15 +3044,6 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/ssh2-streams@0.1.13': - resolution: {integrity: sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==} - - '@types/ssh2@0.5.52': - resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} - - '@types/ssh2@1.15.5': - resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3208,10 +3129,6 @@ packages: '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} @@ -3231,34 +3148,14 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3281,9 +3178,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3295,9 +3189,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async-lock@1.4.1: - resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -3313,14 +3204,6 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} - b4a@1.8.1: - resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -3339,50 +3222,10 @@ packages: badwords-list@2.0.1-4: resolution: {integrity: sha512-FxfZUp7B9yCnesNtFQS9v6PvZdxTYa14Q60JR6vhjdQdWI4naTjJIyx22JzoER8ooeT8SAAKoHLjKfCV7XgYUQ==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - bare-events@2.9.1: - resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.7.4: - resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-path@3.1.1: - resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} - - bare-stream@2.13.3: - resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} - peerDependencies: - bare-abort-controller: '*' - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.4.6: - resolution: {integrity: sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==} - base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} @@ -3394,9 +3237,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -3407,18 +3247,12 @@ packages: bind-event-listener@3.0.0: resolution: {integrity: sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} blurhash@2.0.5: resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==} - brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -3438,27 +3272,12 @@ packages: bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - buildcheck@0.0.7: - resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} - engines: {node: '>=10.0.0'} - - byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -3494,19 +3313,12 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chroma-js@3.2.0: resolution: {integrity: sha512-os/OippSlX1RlWWr+QDPcGUZs0uoqr32urfxESG9U93lhUfbnlyckte84Q8P1UQY/qth983AS1JONKmLS4T0nw==} classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - cloudflared@0.7.1: resolution: {integrity: sha512-jJn1Gu9Tf4qnIu8tfiHZ25Hs8rNcRYSVf8zAd97wvYdOCzftm1CTs1S/RPhijjGi8gUT1p9yzfDi9zYlU/0RwA==} hasBin: true @@ -3515,13 +3327,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3533,10 +3338,6 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} - compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -3557,9 +3358,6 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -3569,19 +3367,6 @@ packages: typescript: optional: true - cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} - create-web-stream@1.1.3: resolution: {integrity: sha512-ocdWcsi6F8/8f0L/Fsbt3UmPSB+7H5hXR0aRr7Wiu7TXC1Z8vwlwxpeO4+gMgJ8g4TqwM5oTnSid43Jxm2ArwA==} engines: {node: '>=18.9.0'} @@ -3680,18 +3465,6 @@ packages: resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} hasBin: true - docker-compose@1.4.2: - resolution: {integrity: sha512-rPHigTKGaEHpkUmfd69QgaOp+Os5vGJwG/Ry8lcr8W/382AmI+z/D7qoa9BybKIkqNppaIbs8RYeHSevdQjWww==} - engines: {node: '>= 6.0.0'} - - docker-modem@5.0.7: - resolution: {integrity: sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA==} - engines: {node: '>= 8.0'} - - dockerode@5.0.1: - resolution: {integrity: sha512-avsq/xk4YPIrn0CgleX5bjT9Y8IT1p9PxrNQ++RBQ2WEyFfHCTDsT9kmyxz+H/axnjAwg8wJWEIuPGOUuNupiA==} - engines: {node: '>= 14.17'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3728,9 +3501,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -3739,12 +3509,6 @@ packages: electron-to-chromium@1.5.374: resolution: {integrity: sha512-HCF5i7izveksHSGqa7mhDh6tr3Uz9Dar2RAjwuh69bw3QGPVObjQIgLwQWeO/Rxp9/r0KdboKy9RbpQDl97fjg==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojibase-data@17.0.0: resolution: {integrity: sha512-Yvgb5AWoHViHV/gq1qr5ZAarcBip+B27/ZLRsUJkbgAEaLlZ/fof9g882LTpmEpyhBNEC0m2SEmItljHsTygjA==} peerDependencies: @@ -3754,9 +3518,6 @@ packages: resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} engines: {node: '>=18.12.0'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3833,16 +3594,9 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3854,9 +3608,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -3942,18 +3693,10 @@ packages: react-dom: optional: true - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3977,10 +3720,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3988,10 +3727,6 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4007,11 +3742,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} @@ -4124,9 +3854,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -4185,10 +3912,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -4281,9 +4004,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -4302,9 +4022,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.2.3: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} @@ -4394,10 +4111,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - leaflet@1.9.4: resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} @@ -4495,9 +4208,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -4511,9 +4221,6 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4586,26 +4293,10 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -4625,9 +4316,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nan@2.28.0: - resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==} - nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4673,9 +4361,6 @@ packages: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4758,10 +4443,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -4794,16 +4475,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.61.1: - resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.61.1: - resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} - engines: {node: '>=18'} - hasBin: true - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4824,13 +4495,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -4838,23 +4502,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - - properties-reader@3.0.1: - resolution: {integrity: sha512-WPn+h9RGEExOKdu4bsF4HksG/uzd3cFq3MFtq8PsFeExPse5Ha/VOjQNyHhjboBFwGXGev6muJYTSPAOkROq2g==} - engines: {node: '>=18'} - - protobufjs@7.6.5: - resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} - engines: {node: '>=12.0.0'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4862,9 +4512,6 @@ packages: raf-schd@4.0.3: resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-aria@3.50.0: resolution: {integrity: sha512-S0Os6QZk33fzUAKu1QLT9afoUaCBt1ZNdoiq0n2YMVgKIdNIQS8zxiZ8O9hYE6QyDkHKjD6q39LQZ+qaSAIgjw==} peerDependencies: @@ -4962,20 +4609,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -5010,10 +4643,6 @@ packages: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -5033,20 +4662,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - rolldown@1.0.3: resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@2.80.0: - resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} - engines: {node: '>=10.0.0'} - hasBin: true - rollup@4.62.0: resolution: {integrity: sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5056,12 +4676,6 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -5070,9 +4684,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -5096,8 +4707,9 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} + engines: {node: '>=20.0.0'} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -5142,9 +4754,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -5205,16 +4814,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - - ssh-remote-port-forward@1.0.4: - resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} - - ssh2@1.17.0: - resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} - engines: {node: '>=10.16.0'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5225,17 +4824,6 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamx@2.28.0: - resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -5252,24 +4840,10 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -5309,28 +4883,12 @@ packages: tabbable@6.5.0: resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} - tar-fs@2.1.5: - resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} - - tar-fs@3.1.3: - resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} - tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.2.0: - resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - tauri-plugin-android-fs-api@28.4.0: resolution: {integrity: sha512-YOo1P+cRjuaoPbTNZprMhr56ruKO4hIDq7kJOum91NqkN+VWY9F+UPAdjZokhzJSsbkeY0nsb1VDLXb2/h3f3w==} - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -5344,12 +4902,6 @@ packages: engines: {node: '>=10'} hasBin: true - testcontainers@12.0.4: - resolution: {integrity: sha512-QIR/8xF1+F/26cIM+9B4yyxNTbKJxAv3hygZyhPRgZ8Q2AhlPZjDdpXRuk16V37X4bgJRI3hXFhoEICMBA7Adg==} - - text-decoder@1.2.7: - resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} @@ -5379,10 +4931,6 @@ packages: resolution: {integrity: sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg==} hasBin: true - tmp@0.2.7: - resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} - engines: {node: '>=14.14'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5408,9 +4956,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -5454,9 +4999,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -5464,10 +5006,6 @@ packages: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} - undici@8.8.0: - resolution: {integrity: sha512-ubshXMXwF3MQIMF1y/WxZdNBnjEKeSg2wF5mcGUtU55YTw34tnVVpKRlLf7ruDXZ5344KokPVX4RBx1wJm64Bw==} - engines: {node: '>=22.19.0'} - unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -5513,9 +5051,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -5624,7 +5159,7 @@ packages: peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 '@vitejs/devtools': ^0.1.18 - esbuild: ^0.27.0 || ^0.28.0 + esbuild: '>=0.25.0' jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -5839,17 +5374,6 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -5869,10 +5393,6 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -5881,14 +5401,6 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.3: - resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} - engines: {node: '>=12'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5899,10 +5411,6 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -6634,8 +6142,6 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@balena/dockerignore@1.0.2': {} - '@bcoe/v8-coverage@1.0.2': {} '@bramus/specificity@2.4.2': @@ -6927,25 +6433,6 @@ snapshots: '@fontsource/space-mono@5.2.9': {} - '@grpc/grpc-js@1.14.4': - dependencies: - '@grpc/proto-loader': 0.8.1 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.6.5 - yargs: 17.7.3 - - '@grpc/proto-loader@0.8.1': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.6.5 - yargs: 17.7.3 - '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -7054,15 +6541,6 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/cliui@9.0.0': {} '@jridgewell/gen-mapping@0.3.13': @@ -7094,16 +6572,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@js-sdsl/ordered-map@4.4.2': {} - '@juggle/resize-observer@3.4.0': {} - '@kwsites/file-exists@1.1.1': - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@matrix-org/matrix-sdk-crypto-wasm@18.3.1': {} '@napi-rs/canvas-android-arm64@1.0.2': @@ -7443,13 +6913,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@pkgjs/parseargs@0.11.0': - optional: true - - '@playwright/test@1.61.1': - dependencies: - playwright: 1.61.1 - '@polka/url@1.0.0-next.29': {} '@poppinss/colors@4.1.6': @@ -7464,26 +6927,6 @@ snapshots: '@poppinss/exception@1.2.3': {} - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.5': {} - - '@protobufjs/eventemitter@1.1.1': {} - - '@protobufjs/fetch@1.1.1': - dependencies: - '@protobufjs/aspromise': 1.1.2 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.2': {} - '@react-leaflet/core@2.1.0(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: leaflet: 1.9.4 @@ -7549,73 +6992,73 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@2.80.0)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@4.62.0)': dependencies: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 - '@rollup/pluginutils': 3.1.0(rollup@2.80.0) - rollup: 2.80.0 + '@rollup/pluginutils': 3.1.0(rollup@4.62.0) + rollup: 4.62.0 optionalDependencies: '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color - '@rollup/plugin-inject@5.0.5(rollup@2.80.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.62.0)': dependencies: - '@rollup/pluginutils': 5.4.0(rollup@2.80.0) + '@rollup/pluginutils': 5.4.0(rollup@4.62.0) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/plugin-node-resolve@15.3.1(rollup@2.80.0)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.62.0)': dependencies: - '@rollup/pluginutils': 5.4.0(rollup@2.80.0) + '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.12 optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/plugin-replace@2.4.2(rollup@2.80.0)': + '@rollup/plugin-replace@2.4.2(rollup@4.62.0)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + '@rollup/pluginutils': 3.1.0(rollup@4.62.0) magic-string: 0.25.9 - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/plugin-terser@0.4.4(rollup@2.80.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.62.0)': dependencies: - serialize-javascript: 6.0.2 + serialize-javascript: 7.0.7 smob: 1.6.2 terser: 5.48.0 optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/plugin-virtual@3.0.2(rollup@2.80.0)': + '@rollup/plugin-virtual@3.0.2(rollup@4.62.0)': optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/plugin-wasm@6.2.2(rollup@2.80.0)': + '@rollup/plugin-wasm@6.2.2(rollup@4.62.0)': dependencies: - '@rollup/pluginutils': 5.4.0(rollup@2.80.0) + '@rollup/pluginutils': 5.4.0(rollup@4.62.0) optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/pluginutils@3.1.0(rollup@2.80.0)': + '@rollup/pluginutils@3.1.0(rollup@4.62.0)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.2 - rollup: 2.80.0 + rollup: 4.62.0 - '@rollup/pluginutils@5.4.0(rollup@2.80.0)': + '@rollup/pluginutils@5.4.0(rollup@4.62.0)': dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 '@rollup/rollup-android-arm-eabi@4.62.0': optional: true @@ -7789,20 +7232,20 @@ snapshots: '@sentry/browser-utils': 10.63.0 '@sentry/core': 10.63.0 - '@sentry/rollup-plugin@5.3.0(rollup@2.80.0)': + '@sentry/rollup-plugin@5.3.0(rollup@4.62.0)': dependencies: '@sentry/bundler-plugin-core': 5.3.0 magic-string: 0.30.21 optionalDependencies: - rollup: 2.80.0 + rollup: 4.62.0 transitivePeerDependencies: - encoding - supports-color - '@sentry/vite-plugin@5.3.0(rollup@2.80.0)': + '@sentry/vite-plugin@5.3.0(rollup@4.62.0)': dependencies: '@sentry/bundler-plugin-core': 5.3.0 - '@sentry/rollup-plugin': 5.3.0(rollup@2.80.0) + '@sentry/rollup-plugin': 5.3.0(rollup@4.62.0) transitivePeerDependencies: - encoding - rollup @@ -8133,17 +7576,6 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/docker-modem@3.0.6': - dependencies: - '@types/node': 24.13.2 - '@types/ssh2': 1.15.5 - - '@types/dockerode@4.0.1': - dependencies: - '@types/docker-modem': 3.0.6 - '@types/node': 24.13.2 - '@types/ssh2': 1.15.5 - '@types/estree@0.0.39': {} '@types/estree@1.0.9': {} @@ -8160,10 +7592,6 @@ snapshots: dependencies: '@types/geojson': 7946.0.16 - '@types/node@18.19.130': - dependencies: - undici-types: 5.26.5 - '@types/node@24.13.2': dependencies: undici-types: 7.18.2 @@ -8185,19 +7613,6 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/ssh2-streams@0.1.13': - dependencies: - '@types/node': 24.13.2 - - '@types/ssh2@0.5.52': - dependencies: - '@types/node': 24.13.2 - '@types/ssh2-streams': 0.1.13 - - '@types/ssh2@1.15.5': - dependencies: - '@types/node': 18.19.130 - '@types/trusted-types@2.0.7': {} '@use-gesture/core@10.3.1': {} @@ -8374,10 +7789,6 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - acorn@8.17.0: {} agent-base@6.0.2: @@ -8397,45 +7808,13 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.3: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 - archiver-utils@5.0.2: - dependencies: - glob: 10.5.0 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.18.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.7.0 - readdir-glob: 1.1.3 - tar-stream: 3.2.0 - zip-stream: 6.0.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - argparse@2.0.1: {} aria-hidden@1.2.6: @@ -8463,10 +7842,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - assertion-error@2.0.1: {} ast-v8-to-istanbul@1.0.4: @@ -8477,8 +7852,6 @@ snapshots: async-function@1.0.0: {} - async-lock@1.4.1: {} - async@3.2.6: {} at-least-node@1.0.0: {} @@ -8489,8 +7862,6 @@ snapshots: await-to-js@3.0.0: {} - b4a@1.8.1: {} - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -8517,49 +7888,14 @@ snapshots: badwords-list@2.0.1-4: {} - balanced-match@1.0.2: {} - balanced-match@4.0.4: {} - bare-events@2.9.1: {} - - bare-fs@4.7.4: - dependencies: - bare-events: 2.9.1 - bare-path: 3.1.1 - bare-stream: 2.13.3(bare-events@2.9.1) - bare-url: 2.4.6 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - bare-path@3.1.1: {} - - bare-stream@2.13.3(bare-events@2.9.1): - dependencies: - b4a: 1.8.1 - streamx: 2.28.0 - teex: 1.0.1 - optionalDependencies: - bare-events: 2.9.1 - transitivePeerDependencies: - - react-native-b4a - - bare-url@2.4.6: - dependencies: - bare-path: 3.1.1 - base-x@5.0.1: {} base64-js@1.5.1: {} baseline-browser-mapping@2.10.37: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -8568,20 +7904,10 @@ snapshots: bind-event-listener@3.0.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - blake3-wasm@2.1.5: {} blurhash@2.0.5: {} - brace-expansion@2.1.1: - dependencies: - balanced-match: 1.0.2 - brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -8604,25 +7930,13 @@ snapshots: dependencies: base-x: 5.0.1 - buffer-crc32@1.0.0: {} - buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - buildcheck@0.0.7: - optional: true - - byline@5.0.0: {} - cac@7.0.0: {} call-bind-apply-helpers@1.0.2: @@ -8662,42 +7976,20 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: {} - chroma-js@3.2.0: {} classnames@2.5.1: {} - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cloudflared@0.7.1: {} clsx@2.1.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - commander@2.20.3: {} commander@8.3.0: {} common-tags@1.8.2: {} - compress-commons@6.0.2: - dependencies: - crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - compute-scroll-into-view@3.1.1: {} confbox@0.1.8: {} @@ -8712,8 +8004,6 @@ snapshots: dependencies: browserslist: 4.28.2 - core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 @@ -8723,19 +8013,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - cpu-features@0.0.10: - dependencies: - buildcheck: 0.0.7 - nan: 2.28.0 - optional: true - - crc-32@1.2.2: {} - - crc32-stream@6.0.0: - dependencies: - crc-32: 1.2.2 - readable-stream: 4.7.0 - create-web-stream@1.1.3: {} cross-fetch@4.0.0: @@ -8822,30 +8099,6 @@ snapshots: direction@1.0.4: {} - docker-compose@1.4.2: - dependencies: - yaml: 2.9.0 - - docker-modem@5.0.7: - dependencies: - debug: 4.4.3 - readable-stream: 3.6.2 - split-ca: 1.0.1 - ssh2: 1.17.0 - transitivePeerDependencies: - - supports-color - - dockerode@5.0.1: - dependencies: - '@balena/dockerignore': 1.0.2 - '@grpc/grpc-js': 1.14.4 - '@grpc/proto-loader': 0.7.15 - docker-modem: 5.0.7 - protobufjs: 7.6.5 - tar-fs: 2.1.5 - transitivePeerDependencies: - - supports-color - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -8885,28 +8138,18 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - ejs@3.1.10: dependencies: jake: 10.9.4 electron-to-chromium@1.5.374: {} - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - emojibase-data@17.0.0(emojibase@17.0.0): dependencies: emojibase: 17.0.0 emojibase@17.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - entities@4.5.0: {} entities@8.0.0: {} @@ -9081,24 +8324,14 @@ snapshots: '@types/node': 24.13.2 require-like: 0.1.2 - event-target-shim@5.0.1: {} - eventemitter3@5.0.4: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.9.1 - transitivePeerDependencies: - - bare-abort-controller - events@3.3.0: {} expect-type@1.3.0: {} fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-json-stable-stringify@2.1.0: {} fast-uri@3.1.2: {} @@ -9117,7 +8350,7 @@ snapshots: filelist@1.0.6: dependencies: - minimatch: 5.1.9 + minimatch: 10.2.5 fill-range@7.1.1: dependencies: @@ -9173,8 +8406,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - fs-constants@1.0.0: {} - fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -9182,9 +8413,6 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -9208,8 +8436,6 @@ snapshots: gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9225,8 +8451,6 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} - get-port@5.1.1: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -9246,15 +8470,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -9375,8 +8590,6 @@ snapshots: indent-string@4.0.0: {} - inherits@2.0.4: {} - inline-style-parser@0.2.7: {} internal-slot@1.1.0: @@ -9441,8 +8654,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -9523,8 +8734,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} @@ -9542,12 +8751,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.2.3: dependencies: '@isaacs/cliui': 9.0.0 @@ -9641,10 +8844,6 @@ snapshots: yaml: 2.9.0 zod: 4.4.3 - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - leaflet@1.9.4: {} leven@3.1.0: {} @@ -9711,8 +8910,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.camelcase@4.3.0: {} - lodash.debounce@4.0.8: {} lodash.sortby@4.7.0: {} @@ -9721,8 +8918,6 @@ snapshots: loglevel@1.9.2: {} - long@5.3.2: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -9808,20 +9003,8 @@ snapshots: dependencies: brace-expansion: 5.0.6 - minimatch@5.1.9: - dependencies: - brace-expansion: 2.1.1 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.1 - minipass@7.1.3: {} - mkdirp-classic@0.5.3: {} - - mkdirp@3.0.1: {} - mlly@1.8.2: dependencies: acorn: 8.17.0 @@ -9841,9 +9024,6 @@ snapshots: ms@2.1.3: {} - nan@2.28.0: - optional: true - nanoid@3.3.12: {} no-case@3.0.4: @@ -9876,10 +9056,6 @@ snapshots: obug@2.1.3: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -10026,11 +9202,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - path-scurry@2.0.2: dependencies: lru-cache: 11.5.1 @@ -10058,14 +9229,6 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - playwright-core@1.61.1: {} - - playwright@1.61.1: - dependencies: - playwright-core: 1.61.1 - optionalDependencies: - fsevents: 2.3.2 - possible-typed-array-names@1.1.0: {} postcss@8.5.15: @@ -10084,10 +9247,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - progress@2.0.3: {} prop-types@15.8.1: @@ -10096,48 +9255,12 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - - properties-reader@3.0.1: - dependencies: - '@kwsites/file-exists': 1.1.1 - mkdirp: 3.0.1 - transitivePeerDependencies: - - supports-color - - protobufjs@7.6.5: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.5 - '@protobufjs/eventemitter': 1.1.1 - '@protobufjs/fetch': 1.1.1 - '@protobufjs/float': 1.0.2 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.2 - '@types/node': 24.13.2 - long: 5.3.2 - proxy-from-env@1.1.0: {} - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - punycode@2.3.1: {} raf-schd@4.0.3: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - react-aria@3.50.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@internationalized/date': 3.12.2 @@ -10237,34 +9360,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.9 - readdirp@3.6.0: dependencies: picomatch: 2.3.2 @@ -10315,8 +9410,6 @@ snapshots: dependencies: jsesc: 3.1.0 - require-directory@2.1.1: {} - require-from-string@2.0.2: {} require-like@0.1.2: {} @@ -10332,8 +9425,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - retry@0.12.0: {} - rolldown@1.0.3: dependencies: '@oxc-project/types': 0.133.0 @@ -10355,10 +9446,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.3 '@rolldown/binding-win32-x64-msvc': 1.0.3 - rollup@2.80.0: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.62.0: dependencies: '@types/estree': 1.0.9 @@ -10398,10 +9485,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -10413,8 +9496,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safer-buffer@2.1.2: {} - saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -10433,9 +9514,7 @@ snapshots: semver@7.8.4: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.0.7: {} set-function-length@1.2.2: dependencies: @@ -10526,8 +9605,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} sirv@3.0.2: @@ -10591,21 +9668,6 @@ snapshots: sourcemap-codec@1.4.8: {} - split-ca@1.0.1: {} - - ssh-remote-port-forward@1.0.4: - dependencies: - '@types/ssh2': 0.5.52 - ssh2: 1.17.0 - - ssh2@1.17.0: - dependencies: - asn1: 0.2.6 - bcrypt-pbkdf: 1.0.2 - optionalDependencies: - cpu-features: 0.0.10 - nan: 2.28.0 - stackback@0.0.2: {} std-env@4.1.0: {} @@ -10615,27 +9677,6 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamx@2.28.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.7 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.9 @@ -10676,28 +9717,12 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - strip-comments@2.0.1: {} strip-indent@3.0.0: @@ -10728,58 +9753,13 @@ snapshots: tabbable@6.5.0: {} - tar-fs@2.1.5: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.4 - tar-stream: 2.2.0 - - tar-fs@3.1.3: - dependencies: - pump: 3.0.4 - tar-stream: 3.2.0 - optionalDependencies: - bare-fs: 4.7.4 - bare-path: 3.1.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar-mini@0.2.0: {} - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar-stream@3.2.0: - dependencies: - b4a: 1.8.1 - bare-fs: 4.7.4 - fast-fifo: 1.3.2 - streamx: 2.28.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tauri-plugin-android-fs-api@28.4.0: dependencies: '@tauri-apps/api': 2.11.1 create-web-stream: 1.1.3 - teex@1.0.1: - dependencies: - streamx: 2.28.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - temp-dir@2.0.0: {} tempy@0.6.0: @@ -10796,35 +9776,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - testcontainers@12.0.4: - dependencies: - '@balena/dockerignore': 1.0.2 - '@types/dockerode': 4.0.1 - archiver: 7.0.1 - async-lock: 1.4.1 - byline: 5.0.0 - debug: 4.4.3 - docker-compose: 1.4.2 - dockerode: 5.0.1 - get-port: 5.1.1 - proper-lockfile: 4.1.2 - properties-reader: 3.0.1 - ssh-remote-port-forward: 1.0.4 - tar-fs: 3.1.3 - tmp: 0.2.7 - undici: 8.8.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - - text-decoder@1.2.7: - dependencies: - b4a: 1.8.1 - transitivePeerDependencies: - - react-native-b4a - tiny-invariant@1.3.1: {} tinybench@2.9.0: {} @@ -10846,8 +9797,6 @@ snapshots: dependencies: tldts-core: 7.4.3 - tmp@0.2.7: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -10870,8 +9819,6 @@ snapshots: tslib@2.8.1: {} - tweetnacl@0.14.5: {} - type-fest@0.16.0: {} typed-array-buffer@1.0.3: @@ -10928,14 +9875,10 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} - undici-types@7.18.2: {} undici@7.28.0: {} - undici@8.8.0: {} - unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -10971,8 +9914,6 @@ snapshots: dependencies: react: 18.3.1 - util-deprecate@1.0.2: {} - uuid@10.0.0: {} virtua@0.49.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -11001,9 +9942,9 @@ snapshots: - tsx - yaml - vite-plugin-compression2@2.5.3(rollup@2.80.0): + vite-plugin-compression2@2.5.3(rollup@4.62.0): dependencies: - '@rollup/pluginutils': 5.4.0(rollup@2.80.0) + '@rollup/pluginutils': 5.4.0(rollup@4.62.0) tar-mini: 0.2.0 transitivePeerDependencies: - rollup @@ -11027,9 +9968,9 @@ snapshots: tinyglobby: 0.2.17 vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) - vite-plugin-svgr@4.5.0(rollup@2.80.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-svgr@4.5.0(rollup@4.62.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: - '@rollup/pluginutils': 5.4.0(rollup@2.80.0) + '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0) @@ -11038,9 +9979,9 @@ snapshots: - supports-color - typescript - vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.23)(rollup@2.80.0)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.23)(rollup@4.62.0)(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@2.80.0) + '@rollup/plugin-virtual': 3.0.2(rollup@4.62.0) '@swc/core': 1.15.41(@swc/helpers@0.5.23) '@swc/wasm': 1.15.41 uuid: 10.0.0 @@ -11210,10 +10151,10 @@ snapshots: '@babel/core': 7.29.7 '@babel/preset-env': 7.29.7(@babel/core@7.29.7) '@babel/runtime': 7.29.7 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@2.80.0) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.80.0) - '@rollup/plugin-replace': 2.4.2(rollup@2.80.0) - '@rollup/plugin-terser': 0.4.4(rollup@2.80.0) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.7)(@types/babel__core@7.20.5)(rollup@4.62.0) + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.62.0) + '@rollup/plugin-replace': 2.4.2(rollup@4.62.0) + '@rollup/plugin-terser': 0.4.4(rollup@4.62.0) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.20.0 common-tags: 1.8.2 @@ -11222,7 +10163,7 @@ snapshots: glob: 11.1.0 lodash: 4.18.1 pretty-bytes: 5.6.0 - rollup: 2.80.0 + rollup: 4.62.0 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 @@ -11348,44 +10289,16 @@ snapshots: - bufferutil - utf-8-validate - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - wrappy@1.0.2: {} - ws@8.21.0: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} - y18n@5.0.8: {} - yallist@3.1.1: {} yaml@2.9.0: {} - yargs-parser@21.1.1: {} - - yargs@17.7.3: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} youch-core@0.3.3: @@ -11401,10 +10314,4 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 - zip-stream@6.0.1: - dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 - readable-stream: 4.7.0 - zod@4.4.3: {} From eda3bac62e4a2aa0781cad4b26f46b57af9f5f6d Mon Sep 17 00:00:00 2001 From: hazre Date: Wed, 22 Jul 2026 07:47:07 +0200 Subject: [PATCH 10/21] style: fix formatting Signed-off-by: hazre --- .github/dependabot.yml | 16 ++-------------- mise.toml | 2 +- package.json | 5 ++++- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2d8ea67ab6..60224d4efb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -66,18 +66,6 @@ updates: commit-message: prefix: chore groups: - # tauri core + build + plugins are version-coupled; bump together so a - # core major bump lands with matching plugin updates in the same PR - # rather than as broken intermediate states. - tauri-family: + docker: patterns: - - tauri - - tauri-build - - tauri-plugin-* - cargo-major: - update-types: - - major - cargo-non-major: - update-types: - - minor - - patch + - '*' diff --git a/mise.toml b/mise.toml index 3d7fafb9de..9112674a1f 100644 --- a/mise.toml +++ b/mise.toml @@ -90,4 +90,4 @@ tools = { "pinact" = "latest" } run = "tofu" raw_args = true hide = true -tools = { "opentofu" = "1.11.5" } \ No newline at end of file +tools = { "opentofu" = "1.11.5" } diff --git a/package.json b/package.json index 9c30743b7c..65ae7fb59a 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,10 @@ "wrangler": "^4.106.0" }, "devEngines": { - "runtime": { "name": "node", "version": "24.x" } + "runtime": { + "name": "node", + "version": "24.x" + } }, "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be" } From 65a49825486ad20b0a6b42cd2f95c56e5af0d69a Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 00:38:01 +0200 Subject: [PATCH 11/21] fix: knipe issues Signed-off-by: hazre --- knip.json | 2 +- scripts/icons/replace.js | 26 +++++++++++++++++++++++--- scripts/icons/symlink.js | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/knip.json b/knip.json index 5075b01ce2..6b0e9046d5 100644 --- a/knip.json +++ b/knip.json @@ -13,7 +13,7 @@ "@matrix-org/matrix-sdk-crypto-wasm", "@sableclient/twemoji-font" ], - "ignoreBinaries": ["knope"], + "ignoreBinaries": ["knope", "mise"], "rules": { "exports": "off", "types": "off", diff --git a/scripts/icons/replace.js b/scripts/icons/replace.js index 3f02f54150..bf50c01f73 100644 --- a/scripts/icons/replace.js +++ b/scripts/icons/replace.js @@ -1,16 +1,36 @@ #!/usr/bin/env node //MISE description="Replace logo/icon assets in public/ from SVG inputs via ffmpeg" +//MISE tools={ffmpeg="7.1.1"} import { execFileSync } from 'node:child_process'; import { existsSync, mkdirSync, copyFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; +import { dirname, resolve, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { createInterface } from 'node:readline'; -import { PrefixedLogger, createTextHelpers } from './utils/console-style.js'; +import { PrefixedLogger, createTextHelpers } from '../utils/console-style.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); const BASE_DIR = resolve(__dirname, '..'); +function resolveBinary(name) { + try { + const root = execFileSync('mise', ['where', name], { encoding: 'utf-8' }).trim(); + const candidates = [ + join(root, 'Library', 'bin', `${name}.exe`), + join(root, 'bin', `${name}.exe`), + join(root, `${name}.exe`), + ]; + for (const exe of candidates) { + if (existsSync(exe)) return exe; + } + } catch { + /* fallback to path */ + } + return name; +} + +const FFMPEG = resolveBinary('ffmpeg'); + const logger = new PrefixedLogger('[replace-logo]'); const { red } = createTextHelpers({ useColor: logger.useColor }); @@ -54,7 +74,7 @@ function ffmpegCmd(input, output, size) { mkdirSync(dirname(output), { recursive: true }); logger.info(`Generating ${output} (${size} x ${size})`); execFileSync( - 'ffmpeg', + FFMPEG, ['-y', '-width', String(size), '-height', String(size), '-i', input, output], { stdio: 'pipe', diff --git a/scripts/icons/symlink.js b/scripts/icons/symlink.js index 9387639324..43c2066b00 100644 --- a/scripts/icons/symlink.js +++ b/scripts/icons/symlink.js @@ -5,7 +5,7 @@ import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; -import { createTextHelpers } from './utils/console-style.js'; +import { createTextHelpers } from '../utils/console-style.js'; const ANDROID_ICONS = [ 'mipmap-hdpi', From acb92f0cbbbe08c29a699f38e5be4c4253a5a969 Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 01:16:28 +0200 Subject: [PATCH 12/21] chore(mise): define tauri packages Signed-off-by: hazre --- .github/actions/setup/action.yml | 10 +++++ .github/workflows/quality-checks.yml | 2 +- .github/workflows/tauri-build.yml | 57 ++++++++++--------------- mise.tauri.toml | 63 ++++++++++++++++++++++++++++ mise.toml | 42 +++++++++++++++---- scripts/icons/replace.js | 2 +- scripts/icons/symlink.js | 2 +- scripts/install-knope.js | 2 +- scripts/tauri.js | 3 +- 9 files changed, 135 insertions(+), 48 deletions(-) create mode 100644 mise.tauri.toml diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 961db8d82e..c3464dc0b2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -6,6 +6,10 @@ inputs: description: Command used to install dependencies. required: false default: pnpm install --frozen-lockfile + tauri: + description: Whether to install Tauri build dependencies via mise. + required: false + default: 'false' build: description: Whether to build the app after installing dependencies. required: false @@ -30,6 +34,12 @@ runs: env: INPUTS_INSTALL_COMMAND: ${{ inputs.install-command }} + - name: Install Tauri build dependencies + if: ${{ inputs.tauri == 'true' }} + shell: bash + working-directory: ${{ github.workspace }} + run: mise run tauri:setup + - name: Build app if: ${{ inputs.build == 'true' }} shell: bash diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml index a9ac437082..265ecafc67 100644 --- a/.github/workflows/quality-checks.yml +++ b/.github/workflows/quality-checks.yml @@ -40,7 +40,7 @@ jobs: - name: Setup app uses: ./.github/actions/setup - - name: Run ESLint + - name: Run Lint run: pnpm run lint typecheck: diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 9cb7cdbf21..578a26e009 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -157,28 +157,10 @@ jobs: ref: ${{ needs.setup-release.outputs.ref }} persist-credentials: false - - name: Install Linux build dependencies - if: matrix.cef - shell: bash - run: | - sudo apt-get update - sudo apt-get install -y \ - libwebkit2gtk-4.1-dev \ - libgtk-3-dev \ - libayatana-appindicator3-dev \ - librsvg2-dev \ - libsoup-3.0-dev \ - libssl-dev \ - libxdo-dev \ - build-essential \ - file \ - rpm \ - ruby \ - ruby-dev - sudo gem install --no-document fpm - - name: Setup app uses: ./.github/actions/setup + with: + tauri: 'true' - name: Add Rust targets if: ${{ matrix.rust-targets != '' }} @@ -196,8 +178,7 @@ jobs: UPDATER_ENDPOINT: ${{ needs.setup-release.outputs.nightly == 'true' && format('https://github.com/{0}/releases/download/nightly/latest.json', github.repository) || '' }} run: node .github/scripts/set-tauri-version.mjs "$VERSION" "$UPDATER_ENDPOINT" - # --- macOS / Windows: standard wry build via tauri-action --- - - name: Configure desktop build + - name: Configure build args shell: bash env: IS_NIGHTLY: ${{ needs.setup-release.outputs.nightly }} @@ -216,11 +197,22 @@ jobs: echo "TAURI_BUILD_ARGS=${ARGS# }" >> "$GITHUB_ENV" - name: Build desktop bundles - id: tauri if: ${{ !matrix.cef }} - uses: tauri-apps/tauri-action@1deb371b0cd8bd54025b384f1cd735e725c4060f # v1.0.0 - with: - args: ${{ matrix.args }} ${{ env.TAURI_BUILD_ARGS }} + shell: bash + run: pnpm tauri build ${{ matrix.args }} $TAURI_BUILD_ARGS + + - name: Package macOS .app for updater + if: ${{ matrix.name == 'macOS' }} + shell: bash + run: | + macos_dir="${{ matrix.bundle_path }}/macos" + if [ -d "$macos_dir" ]; then + for app in "$macos_dir"/*.app; do + [ -e "$app" ] || continue + echo "Packaging $(basename "$app") into .tar.gz" + tar czf "$app.tar.gz" -C "$macos_dir" "$(basename "$app")" + done + fi - name: Normalize desktop artifact names if: ${{ !matrix.cef }} @@ -281,7 +273,7 @@ jobs: - name: Build native packages if: matrix.cef shell: bash - run: bash scripts/cef/package.sh "$VERSION" + run: mise run cef:package "$VERSION" - name: Sign the AppImage for the updater if: ${{ matrix.cef && env.TAURI_SIGNING_PRIVATE_KEY != '' }} @@ -356,15 +348,8 @@ jobs: - name: Setup app uses: ./.github/actions/setup - - - name: Setup Java - uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0 with: - distribution: temurin - java-version: '17' - - - name: Setup Android SDK - uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1 + tauri: 'true' - name: Add Rust targets shell: bash @@ -468,6 +453,8 @@ jobs: - name: Setup app uses: ./.github/actions/setup + with: + tauri: 'true' - name: Add Rust targets shell: bash diff --git a/mise.tauri.toml b/mise.tauri.toml new file mode 100644 index 0000000000..a3f830a106 --- /dev/null +++ b/mise.tauri.toml @@ -0,0 +1,63 @@ +# Tauri-specific dev tools and system dependencies. +# Loaded via `MISE_ENV=tauri` (set by `mise run setup:tauri` or CI). + +[settings] +idiomatic_version_file_enable_tools = ["pnpm", "node", "rust"] +experimental = true + +[tools] +# Android +java = "temurin-21" +android-sdk = "22.0" + +[bootstrap.packages] +# Debian/Ubuntu +"apt:build-essential" = "latest" +"apt:file" = "latest" +"apt:libayatana-appindicator3-dev" = "latest" +"apt:libgtk-3-dev" = "latest" +"apt:librsvg2-dev" = "latest" +"apt:libsoup-3.0-dev" = "latest" +"apt:libssl-dev" = "latest" +"apt:libwebkit2gtk-4.1-dev" = "latest" +"apt:libxdo-dev" = "latest" +"apt:pkg-config" = "latest" +"apt:curl" = "latest" +"apt:wget" = "latest" + +# Fedora/RHEL +"dnf:webkit2gtk4.1-devel" = "latest" +"dnf:openssl-devel" = "latest" +"dnf:libappindicator-gtk3-devel" = "latest" +"dnf:librsvg2-devel" = "latest" +"dnf:libxdo-devel" = "latest" +"dnf:curl" = "latest" +"dnf:wget" = "latest" +"dnf:file" = "latest" + +# Arch +"pacman:webkit2gtk-4.1" = "latest" +"pacman:base-devel" = "latest" +"pacman:openssl" = "latest" +"pacman:librsvg" = "latest" +"pacman:xdotool" = "latest" +"pacman:curl" = "latest" +"pacman:wget" = "latest" +"pacman:file" = "latest" + +# Alpine +"apk:webkit2gtk-4.1-dev" = "latest" +"apk:build-base" = "latest" +"apk:openssl" = "latest" +"apk:libayatana-appindicator-dev" = "latest" +"apk:librsvg" = "latest" +"apk:curl" = "latest" +"apk:wget" = "latest" +"apk:file" = "latest" + +# macOS +"brew:curl" = "latest" +"brew:wget" = "latest" + +# iOS +"brew:cocoapods" = "latest" diff --git a/mise.toml b/mise.toml index 9112674a1f..b685db0737 100644 --- a/mise.toml +++ b/mise.toml @@ -1,13 +1,22 @@ +min_version = '2026.7.11' + [env] _.path = ["{{config_root}}/node_modules/.bin"] [settings] -idiomatic_version_file_enable_tools = ["pnpm", "node", "rust"] +idiomatic_version_file_enable_tools = ["pnpm", "node"] +minimum_release_age = "1d" experimental = true [task_config] includes = ["scripts"] +[tasks.setup] +description = "Install dependencies with pnpm" +run = 'pnpm install' +sources = ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml', 'mise.toml'] +outputs = ['node_modules/.pnpm/lock.yaml'] + [tasks.dev] description = "Start Vite dev server" alias = "d" @@ -25,12 +34,12 @@ alias = "p" run = "vite preview" [tasks.lint] -description = "Run all linting, typechecking, formatting, and dead code checks" +description = "Check lint, types, formatting, and dead code" alias = "l" run = ["tsc", "oxlint .", "oxfmt --check .", "knip"] [tasks."lint:fix"] -description = "Fix lint issues, format, and run typecheck and dead code checks" +description = "Fix lint, formatting, and dead code issues" alias = "lf" run = ["oxlint . --fix", "oxfmt .", "knip --fix"] @@ -51,14 +60,32 @@ description = "Document a change with knope" alias = ["doc", "doc"] run = { task = "knope", args = ["document-change"] } +[tasks."tauri:setup"] +description = "Install Tauri tools and system packages" +run = ["mise install", "mise bootstrap packages apply --yes"] +env = { MISE_ENV = "tauri" } + +[tasks."tauri:setup:macos"] +description = "Install Xcode" +confirm = { message = "Install Xcode? (required for Tauri)", default = "no" } +run = "xcode-select --install 2>/dev/null || true" + +[tasks."tauri:setup:windows"] +description = "Install Visual Studio Build Tools + WebView2 runtime" +confirm = { message = "Install Visual Studio Build Tools and WebView2 runtime? (required for Tauri)", default = "no" } +run = [ + "winget install --id Microsoft.VisualStudio.BuildTools --source winget --force --override '--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --addProductLang En-us'", + "winget install --id Microsoft.EdgeWebView2Runtime --source winget", +] + [tasks."cargo:lint"] -description = "Check Rust formatting and lint with Clippy" +description = "Check Rust formatting and Clippy lints" alias = ["cl", "cargo-lint"] dir = "src-tauri" -run = ["cargo fmt --check", "cargo clippy --all-targets --all-features -- -D warnings"] +run = ["cargo fmt --check", "cargo clippy --locked --all-targets --all-features -- -D warnings"] [tasks."cargo:lint:fix"] -description = "Fix Rust formatting and lint issues" +description = "Fix Rust formatting and Clippy issues" alias = ["clf", "cargo-lint-fix"] dir = "src-tauri" run = ["cargo fmt", "cargo clippy --fix --allow-dirty --all-targets --all-features -- -D warnings"] @@ -67,7 +94,7 @@ run = ["cargo fmt", "cargo clippy --fix --allow-dirty --all-targets --all-featur description = "Run Rust tests" alias = ["ct", "cargo-test"] dir = "src-tauri" -run = "cargo test" +run = "cargo test --locked" raw = true [tasks."actions:pin"] @@ -85,7 +112,6 @@ description = "Update pinned GitHub Actions to latest SHAs" run = "pinact run -u" tools = { "pinact" = "latest" } - [tasks.opentofu] run = "tofu" raw_args = true diff --git a/scripts/icons/replace.js b/scripts/icons/replace.js index bf50c01f73..ba35bec148 100644 --- a/scripts/icons/replace.js +++ b/scripts/icons/replace.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -//MISE description="Replace logo/icon assets in public/ from SVG inputs via ffmpeg" +//MISE description="Replace icon assets from SVG inputs" //MISE tools={ffmpeg="7.1.1"} import { execFileSync } from 'node:child_process'; diff --git a/scripts/icons/symlink.js b/scripts/icons/symlink.js index 43c2066b00..4cd200ea44 100644 --- a/scripts/icons/symlink.js +++ b/scripts/icons/symlink.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -//MISE description="Create symlinks for Tauri icons from the source set" +//MISE description="Create Tauri icon symlinks" /* eslint-disable no-console */ import fs from 'node:fs'; diff --git a/scripts/install-knope.js b/scripts/install-knope.js index ced1f260b6..a3bb04045f 100644 --- a/scripts/install-knope.js +++ b/scripts/install-knope.js @@ -1,6 +1,6 @@ #!/usr/bin/env node //MISE hide=true -//MISE description="Install or update knope to the pinned version" +//MISE description="Install knope" import { spawnSync } from 'node:child_process'; import process from 'node:process'; import { chmodSync, existsSync, mkdirSync, realpathSync, writeFileSync } from 'node:fs'; diff --git a/scripts/tauri.js b/scripts/tauri.js index 6fe6526345..0093341b1c 100644 --- a/scripts/tauri.js +++ b/scripts/tauri.js @@ -1,5 +1,6 @@ #!/usr/bin/env node -//MISE description="Run Tauri CLI with platform-specific feature flags" +//MISE description="Run Tauri CLI" +//MISE depends="tauri:setup" //USAGE arg "" help="Target" default="wry" choices "wry" "cef" "android" "ios" import { run } from '@tauri-apps/cli'; From 0f86ae30de83f9a5216054a866a0a51d14d820fd Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 04:01:01 +0200 Subject: [PATCH 13/21] chore: make tauri.js pass through to tauri cli Signed-off-by: hazre --- scripts/tauri.js | 80 ++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/scripts/tauri.js b/scripts/tauri.js index 0093341b1c..686004aaa5 100644 --- a/scripts/tauri.js +++ b/scripts/tauri.js @@ -1,10 +1,19 @@ #!/usr/bin/env node //MISE description="Run Tauri CLI" //MISE depends="tauri:setup" -//USAGE arg "" help="Target" default="wry" choices "wry" "cef" "android" "ios" +//MISE raw_args=true + +/** + * Passes through to the Tauri CLI. When the first argument is a desktop runtime + * (`wry` or `cef`) and the second is `dev` or `build`, injects the appropriate + * Cargo feature flags (`--features ,updater --no-default-features`). + * Everything else is forwarded to `tauri` as-is. + * + * script/tauri cef dev --verbose + * → tauri dev --features cef,updater -- --verbose --no-default-features + */ import { run } from '@tauri-apps/cli'; -import { spawn } from 'node:child_process'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import process from 'node:process'; @@ -17,52 +26,43 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const cmdlineArgs = process.argv.slice(2); +process.chdir(join(__dirname, '..')); -if (cmdlineArgs.length < 2) { - logger.error('Usage: node scripts/tauri [prepended-args...]'); - logger.error(` ${dim('platform:')} wry, cef, android, or ios`); - logger.error(` ${dim('command:')} dev or build`); - process.exit(1); -} - -const [platform, cmd, ...tauriArgs] = cmdlineArgs; - -const MOBILE = ['android', 'ios']; const DESKTOP = ['wry', 'cef']; -if (![...DESKTOP, ...MOBILE].includes(platform)) { - logger.error(`Invalid platform: ${platform}. Must be wry, cef, android, or ios`); - process.exit(1); +function runTauri(args) { + logger.info(`${dim('Running:')} tauri ${args.join(' ')}`); + run(args, 'tauri').catch((error) => { + logger.error(`Failed to run tauri: ${error?.message ?? error}`); + process.exit(1); + }); } -if (!['dev', 'build'].includes(cmd)) { - logger.error(`Invalid command: ${cmd}. Must be 'dev' or 'build'`); - process.exit(1); + +if (cmdlineArgs.length === 0 || !DESKTOP.includes(cmdlineArgs[0])) { + runTauri(cmdlineArgs); + process.exit(0); } -process.chdir(join(__dirname, '..')); +const [platform, cmd, ...tauriArgs] = cmdlineArgs; -if (MOBILE.includes(platform)) { - logger.info(`${dim('Running:')} tauri ${[platform, cmd, ...tauriArgs].join(' ')}`); - const child = spawn('tauri', [platform, cmd, ...tauriArgs], { - stdio: 'inherit', - shell: true, - }); - child.on('exit', (code) => process.exit(code ?? 1)); -} else { - const args = [cmd, '--features', `${platform},updater`, ...tauriArgs]; - if (!tauriArgs.includes('--')) { - args.push('--'); - } - args.push('--no-default-features'); +if (!cmd) { + runTauri(cmdlineArgs); + process.exit(0); +} - if (platform === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { - args.unshift('--no-bundle'); - } +if (!['dev', 'build'].includes(cmd)) { + runTauri([cmd, ...tauriArgs]); + process.exit(0); +} - logger.info(`${dim('Running:')} tauri ${args.join(' ')}`); +const args = [cmd, '--features', `${platform},updater`, ...tauriArgs]; +if (!tauriArgs.includes('--')) { + args.push('--'); +} +args.push('--no-default-features'); - run(args, 'tauri').catch((error) => { - logger.error(`Failed to run tauri: ${error?.message ?? error}`); - process.exit(1); - }); +if (platform === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { + args.splice(1, 0, '--no-bundle'); } + +runTauri(args); From 09b58ca2e2972da6b0c608dba1b4fa1652806a1e Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 04:49:24 +0200 Subject: [PATCH 14/21] docs: add mise docs to README Signed-off-by: hazre --- README.md | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bc361d5b6e..57e39c72df 100644 --- a/README.md +++ b/README.md @@ -120,23 +120,38 @@ Invalid or unknown keys are ignored. * For example, if you want to deploy on `https://sable.moe/app`, then set `base: '/app'`. ## Local development + > [!TIP] -> We recommend using a version manager as versions change quickly. [fnm](https://github.com/Schniz/fnm) is a great cross-platform option (Windows, macOS, and Linux). [NVM on Windows](https://github.com/coreybutler/nvm-windows#installation--upgrades) and [nvm](https://github.com/nvm-sh/nvm) on Linux/macOS are also good choices. Use the version defined in [`.node-version`](.node-version). +> The easiest way to get started is with [mise](https://mise.jdx.dev/getting-started.html), it manages node, pnpm, rust, and other tooling. -Execute the following commands to start a development server: -```sh -fnm use --corepack-enabled # Activates the Node version and enables corepack -# If you not using fnm, install corepack manually: npm install --global corepack@latest -corepack install # Installs the pnpm version specified in package.json -pnpm i # Installs all dependencies -pnpm run dev # Serve a development version +```bash +mise install # Install all required tools +mise run setup # Install dependencies (pnpm install) +mise run dev # Start the Vite dev server ``` +Run `mise tasks` to list all available tasks (build, test, lint, etc.). + To build the app: ```sh -pnpm run build # Compiles the app into the dist/ directory +mise run build ``` +### Desktop & Mobile (Tauri) + +Sable uses [Tauri](https://v2.tauri.app) for native desktop and mobile builds. + +```bash +mise run tauri:setup # Install Rust toolchain + system packages +mise run tauri:setup:macos # Install Xcode (macOS only) +mise run tauri:setup:windows # Install VS Build Tools + WebView2 (Windows only) +mise run tauri wry dev # Dev server with system webview (WebKit/WebView2) +mise run tauri cef build # Production build with Chromium Embedded Framework +mise run tauri --help # Any other args pass through to the Tauri CLI +``` + +When the first argument is `wry` or `cef` and the second is `dev` or `build`, the wrapper injects `--features ,updater --no-default-features`. Everything else is forwarded to `tauri` as-is. + ## Deployment and infrastructure Deployment workflows and infrastructure details live in [`infra/README.md`](infra/README.md). From dce9d4c87122b3a5d5d47abffe5059d2c4f34be4 Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 05:05:41 +0200 Subject: [PATCH 15/21] chore(mise): add tauri ios setup task Signed-off-by: hazre --- .github/workflows/tauri-build.yml | 4 ++-- mise.toml | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 578a26e009..3c66c30679 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -469,9 +469,9 @@ jobs: shell: bash run: node .github/scripts/set-tauri-version.mjs "$VERSION" - - name: Setup Xcode + - name: Set up iOS shell: bash - run: pnpm tauri ios init + run: mise -y run tauri:setup:ios - name: Symlink icons to the ios folder shell: bash diff --git a/mise.toml b/mise.toml index b685db0737..69bba1d977 100644 --- a/mise.toml +++ b/mise.toml @@ -68,7 +68,13 @@ env = { MISE_ENV = "tauri" } [tasks."tauri:setup:macos"] description = "Install Xcode" confirm = { message = "Install Xcode? (required for Tauri)", default = "no" } -run = "xcode-select --install 2>/dev/null || true" +run = "xcode-select --install" + +[tasks."tauri:setup:ios"] +description = "Set up iOS Xcode project" +depends = ["tauri:setup:macos"] +confirm = { message = "Set up iOS Xcode project? (required for Tauri)", default = "no" } +run = [{ task = "tauri", args = ["ios", "init"] }] [tasks."tauri:setup:windows"] description = "Install Visual Studio Build Tools + WebView2 runtime" From 3c21410905e6c1e4925347a351bbdd72e4d86ad0 Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 05:17:02 +0200 Subject: [PATCH 16/21] fix: invalid script path in package.json Signed-off-by: hazre --- .github/workflows/tauri-build.yml | 2 +- package.json | 2 +- scripts/icons/symlink.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 3c66c30679..81f99cf2a3 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -475,7 +475,7 @@ jobs: - name: Symlink icons to the ios folder shell: bash - run: pnpm run setup:tauri-icons --write --force + run: mise run icons:symlink --write --force - name: Build unsigned IPA id: ipa diff --git a/package.json b/package.json index 65ae7fb59a..ab63531984 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "document-change": "knope document-change", "postinstall": "node scripts/install-knope.js", "setup:knope": "node scripts/install-knope.js", - "setup:tauri-icons": "node scripts/symlink-tauri-icons.js", + "setup:tauri-icons": "node scripts/icons/symlink.js", "lint:normalize-imports": "node scripts/normalize-imports.js" }, "dependencies": { diff --git a/scripts/icons/symlink.js b/scripts/icons/symlink.js index 4cd200ea44..1f0c4ae8f2 100644 --- a/scripts/icons/symlink.js +++ b/scripts/icons/symlink.js @@ -1,5 +1,6 @@ #!/usr/bin/env node //MISE description="Create Tauri icon symlinks" +//MISE raw_args=true /* eslint-disable no-console */ import fs from 'node:fs'; From e5779b5f488c67bdcb458d7ae289a44497a9fa1c Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 06:15:16 +0200 Subject: [PATCH 17/21] fix: tauri script being unreliable through mise Signed-off-by: hazre --- scripts/tauri.js | 53 +++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/scripts/tauri.js b/scripts/tauri.js index 686004aaa5..3d89ef1119 100644 --- a/scripts/tauri.js +++ b/scripts/tauri.js @@ -28,41 +28,44 @@ const __dirname = dirname(__filename); const cmdlineArgs = process.argv.slice(2); process.chdir(join(__dirname, '..')); -const DESKTOP = ['wry', 'cef']; +const DESKTOP = new Set(['wry', 'cef']); -function runTauri(args) { +async function runTauri(args) { logger.info(`${dim('Running:')} tauri ${args.join(' ')}`); - run(args, 'tauri').catch((error) => { + try { + await run(args, 'tauri'); + } catch (error) { logger.error(`Failed to run tauri: ${error?.message ?? error}`); process.exit(1); - }); + } } -if (cmdlineArgs.length === 0 || !DESKTOP.includes(cmdlineArgs[0])) { - runTauri(cmdlineArgs); - process.exit(0); -} +async function main() { + if (cmdlineArgs.length === 0 || !DESKTOP.has(cmdlineArgs[0])) { + return runTauri(cmdlineArgs); + } -const [platform, cmd, ...tauriArgs] = cmdlineArgs; + const [platform, cmd, ...tauriArgs] = cmdlineArgs; -if (!cmd) { - runTauri(cmdlineArgs); - process.exit(0); -} + if (!cmd) { + return runTauri(cmdlineArgs); + } -if (!['dev', 'build'].includes(cmd)) { - runTauri([cmd, ...tauriArgs]); - process.exit(0); -} + if (!['dev', 'build'].includes(cmd)) { + return runTauri([cmd, ...tauriArgs]); + } -const args = [cmd, '--features', `${platform},updater`, ...tauriArgs]; -if (!tauriArgs.includes('--')) { - args.push('--'); -} -args.push('--no-default-features'); + const args = [cmd, '--features', `${platform},updater`, ...tauriArgs]; + if (!tauriArgs.includes('--')) { + args.push('--'); + } + args.push('--no-default-features'); + + if (platform === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { + args.splice(1, 0, '--no-bundle'); + } -if (platform === 'cef' && cmd === 'build' && !tauriArgs.includes('--no-bundle')) { - args.splice(1, 0, '--no-bundle'); + return runTauri(args); } -runTauri(args); +main(); From 541036b3f531d0e823466cee89883e0baf055185 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Thu, 23 Jul 2026 11:30:17 +0200 Subject: [PATCH 18/21] perf(android): cache gradle, pin NDK, use lld linker --- .github/workflows/tauri-build.yml | 11 ++++++++--- mise.tauri.toml | 3 +++ mise.toml | 9 +++++++++ src-tauri/build.rs | 5 +++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tauri-build.yml b/.github/workflows/tauri-build.yml index 81f99cf2a3..90c2c3e898 100644 --- a/.github/workflows/tauri-build.yml +++ b/.github/workflows/tauri-build.yml @@ -334,6 +334,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} CARGO_INCREMENTAL: 0 CARGO_TERM_COLOR: always + MISE_ENV: tauri NODE_OPTIONS: --max-old-space-size=8192 RUST_TARGETS: aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android ANDROID_KEY_BASE64: ${{ secrets.ANDROID_KEY_BASE64 }} @@ -351,6 +352,10 @@ jobs: with: tauri: 'true' + - name: Setup Android SDK + NDK + shell: bash + run: mise run tauri:setup:android + - name: Add Rust targets shell: bash run: rustup target add $RUST_TARGETS @@ -360,13 +365,13 @@ jobs: with: workspaces: src-tauri - - name: Cache Gradle - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0 - name: Resolve NDK shell: bash run: | - echo "NDK_HOME=$ANDROID_HOME/ndk/$(ls -1 "$ANDROID_HOME/ndk" | sort -V | tail -n1)" >> "$GITHUB_ENV" + echo "NDK_HOME=$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION" >> "$GITHUB_ENV" - name: Stamp release version into tauri.conf.json shell: bash diff --git a/mise.tauri.toml b/mise.tauri.toml index a3f830a106..9362bb0b01 100644 --- a/mise.tauri.toml +++ b/mise.tauri.toml @@ -1,6 +1,9 @@ # Tauri-specific dev tools and system dependencies. # Loaded via `MISE_ENV=tauri` (set by `mise run setup:tauri` or CI). +[env] +ANDROID_NDK_VERSION = "29.0.14206865" + [settings] idiomatic_version_file_enable_tools = ["pnpm", "node", "rust"] experimental = true diff --git a/mise.toml b/mise.toml index 69bba1d977..a951554dba 100644 --- a/mise.toml +++ b/mise.toml @@ -65,6 +65,15 @@ description = "Install Tauri tools and system packages" run = ["mise install", "mise bootstrap packages apply --yes"] env = { MISE_ENV = "tauri" } +[tasks."tauri:setup:android"] +description = "Install Android SDK packages + NDK (no Android Studio needed)" +depends = ["tauri:setup"] +env = { MISE_ENV = "tauri" } +run = [ + "yes | sdkmanager --licenses", + 'sdkmanager "platform-tools" "platforms;android-36" "build-tools;35.0.0" "ndk;{{env.ANDROID_NDK_VERSION}}"', +] + [tasks."tauri:setup:macos"] description = "Install Xcode" confirm = { message = "Install Xcode? (required for Tauri)", default = "no" } diff --git a/src-tauri/build.rs b/src-tauri/build.rs index f51d01ff68..27a87ba03d 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -26,6 +26,11 @@ fn main() { println!("cargo:rustc-link-arg-bins=-Wl,-rpath,/usr/lib/swift"); } + // Use the NDK's lld linker for faster Android linking. + if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("android") { + println!("cargo:rustc-link-arg=-fuse-ld=lld"); + } + tauri_typegen::BuildSystem::generate_at_build_time() .expect("Failed to generate TypeScript bindings"); From c83522d7e6a868fa332c21b1880ffc310e893ba2 Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 06:20:44 +0200 Subject: [PATCH 19/21] fix: move updater and global banner to appshell Signed-off-by: hazre --- src/app/components/app-shell/AppShell.tsx | 6 ++++++ src/app/pages/client/ClientNonUIFeatures.tsx | 7 +------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/components/app-shell/AppShell.tsx b/src/app/components/app-shell/AppShell.tsx index d8405df231..25b264a102 100644 --- a/src/app/components/app-shell/AppShell.tsx +++ b/src/app/components/app-shell/AppShell.tsx @@ -9,6 +9,9 @@ import { type as osType } from '@tauri-apps/plugin-os'; import { TauriFrontendReady } from '$components/tauri/TauriFrontendReady'; import { DesktopTitleBar } from '$components/tauri/DesktopTitleBar'; import { MacTitleBar } from '$components/tauri/MacTitleBar'; +import { DesktopUpdater } from '$pages/client/DesktopUpdater'; +import { WebUpdater } from '$pages/client/WebUpdater'; +import { GlobalBannerRenderer } from '$components/global-banner/GlobalBannerRenderer'; import { Toast } from '$components/toast/Toast'; import type { ScreenSize } from '$hooks/useScreenSize'; import { ScreenSizeProvider } from '$hooks/useScreenSize'; @@ -88,6 +91,9 @@ function AppShellFrame({ children, portalContainer, onPortalContainerChange }: A > {titlebarKind === 'desktop' && } {titlebarKind === 'mac' && } + + +
- - + - From 1c0950faee591c8795d5bcb5f13fade3d23cb8f9 Mon Sep 17 00:00:00 2001 From: hazre Date: Thu, 23 Jul 2026 06:46:42 +0200 Subject: [PATCH 20/21] feat: add desktop auto-update pill with download progress and manual check Signed-off-by: hazre --- .changeset/desktop-update-pill.md | 5 + src/app/components/SyncConnectionStatus.tsx | 36 +++- src/app/components/icons/phosphor.tsx | 2 + src/app/components/tauri/DesktopTitleBar.tsx | 4 + .../components/tauri/DesktopUpdatePill.tsx | 36 ++++ src/app/components/tauri/MacTitleBar.tsx | 10 +- src/app/features/settings/about/About.tsx | 93 +++++++++- .../TauriNotificationsApiClient.ts | 8 +- src/app/features/settings/settingsLink.ts | 1 + .../pages/client/BackgroundNotifications.tsx | 8 +- src/app/pages/client/DesktopUpdater.tsx | 164 ++++++++++++++---- src/app/state/desktopUpdate.ts | 30 ++++ src/app/styles/overrides/TauriDesktop.css | 17 +- 13 files changed, 365 insertions(+), 49 deletions(-) create mode 100644 .changeset/desktop-update-pill.md create mode 100644 src/app/components/tauri/DesktopUpdatePill.tsx create mode 100644 src/app/state/desktopUpdate.ts diff --git a/.changeset/desktop-update-pill.md b/.changeset/desktop-update-pill.md new file mode 100644 index 0000000000..5b9472cc48 --- /dev/null +++ b/.changeset/desktop-update-pill.md @@ -0,0 +1,5 @@ +--- +default: minor +--- + +Desktop app now periodically checks for updates, shows an update pill in the titlebar when one is available, and lets you manually check for updates in Settings > About. diff --git a/src/app/components/SyncConnectionStatus.tsx b/src/app/components/SyncConnectionStatus.tsx index 4383079362..8e8d1f1a37 100644 --- a/src/app/components/SyncConnectionStatus.tsx +++ b/src/app/components/SyncConnectionStatus.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import classNames from 'classnames'; import { Box, config, Text } from 'folds'; import { AnimatePresence, motion, useReducedMotion, type Variants } from 'framer-motion'; @@ -10,6 +11,8 @@ const TITLEBAR_EASE_OUT_SOFT: [number, number, number, number] = [0.24, 0.72, 0. type SyncConnectionStatusProps = { status: TitlebarStatusView | null; + onClick?: () => void; + icon?: React.ReactNode; }; export function getSyncConnectionStatusView( @@ -157,7 +160,7 @@ export function SyncConnectionStatusBanner({ status }: SyncConnectionStatusProps ); } -export function SyncConnectionStatusTitlebar({ status }: SyncConnectionStatusProps) { +export function SyncConnectionStatusTitlebar({ status, onClick, icon }: SyncConnectionStatusProps) { const shouldReduceMotion = useReducedMotion(); const progress = status?.progress; const pillVariants = shouldReduceMotion @@ -233,10 +236,12 @@ export function SyncConnectionStatusTitlebar({ status }: SyncConnectionStatusPro }; return ( - + {status && ( { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick(); + } + } + : undefined + } style={{ transformOrigin: 'center top', position: 'relative', overflow: 'hidden', willChange: shouldReduceMotion ? 'opacity' : 'transform, opacity, clip-path', + cursor: onClick ? 'pointer' : undefined, }} variants={pillVariants} initial="hidden" @@ -256,11 +273,20 @@ export function SyncConnectionStatusTitlebar({ status }: SyncConnectionStatusPro exit="exit" > - {status.text} + {icon && ( + + {icon} + + )} + {status.text} {progress !== undefined && (
+
+ +
+ } + /> + + )} Promise | void; }; @@ -135,10 +135,6 @@ export async function ensureTauriNotificationPermission(): Promise { return permissionPromise; } -// Desktop webviews can't show web notifications (WKWebView lacks the API; the -// Linux CEF runtime never grants it), so desktop routes through the native plugin. -const DESKTOP_TAURI_OS = new Set(['linux', 'macos', 'windows']); -export const isDesktopTauri = (): boolean => isTauri() && DESKTOP_TAURI_OS.has(osType()); export const isIosTauri = (): boolean => isTauri() && osType() === 'ios'; export const isAndroidTauri = (): boolean => isTauri() && osType() === 'android'; // Platforms where OS notifications go through the native plugin instead of web APIs. @@ -183,3 +179,5 @@ export async function sendNativeTauriNotification({ ...(icon ? { icon } : {}), }); } + +export { isDesktopTauri }; diff --git a/src/app/features/settings/settingsLink.ts b/src/app/features/settings/settingsLink.ts index e2ed6d0b86..fb7857f310 100644 --- a/src/app/features/settings/settingsLink.ts +++ b/src/app/features/settings/settingsLink.ts @@ -218,6 +218,7 @@ const settingsLinkFocusIdsBySection: Record isTauri() && DESKTOP_TAURI_OS.has(osType()); - let desktopNotificationSeq = 1; const nextDesktopNotificationId = (): number => { const id = desktopNotificationSeq; diff --git a/src/app/pages/client/DesktopUpdater.tsx b/src/app/pages/client/DesktopUpdater.tsx index 35e54decdc..0b4406ccda 100644 --- a/src/app/pages/client/DesktopUpdater.tsx +++ b/src/app/pages/client/DesktopUpdater.tsx @@ -1,61 +1,162 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useAtomValue } from 'jotai'; -import { isTauri } from '@tauri-apps/api/core'; -import { type as osType } from '@tauri-apps/plugin-os'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import type { Update } from '@tauri-apps/plugin-updater'; +import { isDesktopTauri } from '$utils/platform'; import { autoUpdateCheckAtom } from '$state/autoUpdateCheck'; import { createLogger } from '$utils/debug'; +import { hasCustomDesktopTitlebar } from '$utils/tauriTitlebar'; +import { useDesktopSetting } from '$state/hooks/desktopSettings'; import { ArrowUp } from '$components/icons/phosphor'; import { useRegisterGlobalBanner, type GlobalBanner } from '$state/globalBanners'; +import { + updatePhaseAtom, + updateBannerVisibleAtom, + triggerUpdateCheckAtom, + desktopUpdateLastCheckedAtom, + fakeDesktopUpdate, +} from '$state/desktopUpdate'; const log = createLogger('DesktopUpdater'); - -const DESKTOP_TAURI_OS = new Set(['linux', 'macos', 'windows']); -const isDesktopTauri = (): boolean => isTauri() && DESKTOP_TAURI_OS.has(osType()); +const UPDATE_POLL_INTERVAL_MS = 300_000; // 5 minutes export function DesktopUpdater() { const autoUpdateCheck = useAtomValue(autoUpdateCheckAtom); + const triggerCount = useAtomValue(triggerUpdateCheckAtom); + const setPhase = useSetAtom(updatePhaseAtom); + const [bannerVisible, setBannerVisible] = useAtom(updateBannerVisibleAtom); + const setLastChecked = useSetAtom(desktopUpdateLastCheckedAtom); const [updateInfo, setUpdateInfo] = useState(null); - const [isInstalling, setIsInstalling] = useState(false); const [isDownloaded, setIsDownloaded] = useState(false); + const [isInstalled, setIsInstalled] = useState(false); + const [isInstalling, setIsInstalling] = useState(false); const [dismissed, setDismissed] = useState(false); + const [useCustomTitleBar] = useDesktopSetting('useCustomTitleBar'); + const hasUpdateRef = useRef(false); useEffect(() => { if (!isDesktopTauri()) return undefined; - if (!autoUpdateCheck) return undefined; + if (triggerCount === 0 && !autoUpdateCheck && !fakeDesktopUpdate()) return undefined; + + let mounted = true; - let isMounted = true; - async function checkUpdate() { + setPhase({ type: 'checking' }); + + async function run() { try { + if (fakeDesktopUpdate()) { + log.log('Fake update: simulating download'); + setUpdateInfo({ version: '9.9.9', body: 'Fake changelog for testing.' } as Update); + setPhase({ type: 'downloading', progress: 0 }); + for (let pct = 0; pct <= 100; pct += 2) { + // eslint-disable-next-line no-await-in-loop + await new Promise((r) => setTimeout(r, 40)); + if (!mounted) return; + setPhase({ type: 'downloading', progress: pct }); + } + if (!mounted) return; + setIsDownloaded(true); + setPhase({ type: 'ready', version: '9.9.9' }); + setLastChecked(new Date().toISOString()); + if (!hasCustomDesktopTitlebar(useCustomTitleBar)) setBannerVisible(true); + return; + } + const { check } = await import('@tauri-apps/plugin-updater'); const update = await check(); - if (update && isMounted) { - log.log(`Desktop update ${update.version} available`); - setUpdateInfo(update); + if (!mounted) return; + + if (!update) { + if (!hasUpdateRef.current) { + setPhase({ type: 'idle' }); + } + setLastChecked(new Date().toISOString()); + return; } + + log.log(`Desktop update ${update.version} available, downloading...`); + setUpdateInfo(update); + setIsInstalled(false); + setDismissed(false); + hasUpdateRef.current = true; + setPhase({ type: 'downloading', progress: 0 }); + + let downloadedBytes = 0; + let contentLength = 0; + await update.download((event) => { + if (event.event === 'Started') { + contentLength = event.data.contentLength ?? 0; + } else if (event.event === 'Progress') { + downloadedBytes += event.data.chunkLength; + const pct = contentLength > 0 ? Math.round((downloadedBytes / contentLength) * 100) : 0; + setPhase({ type: 'downloading', progress: Math.min(pct, 100) }); + } + }); + + if (!mounted) return; + log.log(`Update ${update.version} downloaded`); + setIsDownloaded(true); + setPhase({ type: 'ready', version: update.version }); + setLastChecked(new Date().toISOString()); + if (!hasCustomDesktopTitlebar(useCustomTitleBar)) setBannerVisible(true); } catch (err) { log.error('Desktop update check failed', err); + if (mounted) { + if (!hasUpdateRef.current) { + setPhase({ type: 'idle' }); + } + setLastChecked(new Date().toISOString()); + } } } - checkUpdate(); + run(); + + if (autoUpdateCheck) { + const interval = setInterval(run, UPDATE_POLL_INTERVAL_MS); + return () => { + mounted = false; + clearInterval(interval); + }; + } + return () => { - isMounted = false; + mounted = false; }; - }, [autoUpdateCheck]); + }, [ + autoUpdateCheck, + triggerCount, + setPhase, + setBannerVisible, + setLastChecked, + useCustomTitleBar, + ]); + + useEffect(() => { + if (bannerVisible && dismissed) { + setDismissed(false); + } + }, [bannerVisible, dismissed]); const handleInstall = useCallback(async () => { if (!updateInfo) return; try { setIsInstalling(true); - await updateInfo.downloadAndInstall(); + setPhase({ type: 'installing' }); + + if (fakeDesktopUpdate()) { + await new Promise((r) => setTimeout(r, 1500)); + } else { + await updateInfo.install(); + } + + setPhase({ type: 'ready', version: updateInfo.version }); setIsInstalling(false); - setIsDownloaded(true); + setIsInstalled(true); } catch (err) { - log.error('Failed to download and install update', err); + log.error('Failed to install update', err); setIsInstalling(false); } - }, [updateInfo]); + }, [updateInfo, setPhase]); const handleRestart = useCallback(async () => { try { @@ -68,18 +169,19 @@ export function DesktopUpdater() { const handleDismiss = useCallback(() => { setDismissed(true); - }, []); + setBannerVisible(false); + }, [setBannerVisible]); const bannerData = useMemo(() => { - if (!updateInfo || dismissed) return null; + if (!bannerVisible || !updateInfo || dismissed) return null; - if (isDownloaded) { + if (isInstalled) { return { id: 'desktop-update-restart', priority: 200, icon: ArrowUp, - title: 'Update Ready', - description: `Sable ${updateInfo.version} has been downloaded. Restart the app to finish updating.`, + title: 'Update Installed', + description: `Sable ${updateInfo.version} has been installed. Restart the app to finish updating.`, primaryAction: { label: 'Restart Now', variant: 'Primary', @@ -93,12 +195,14 @@ export function DesktopUpdater() { }; } + if (!isDownloaded) return null; + return { - id: 'desktop-update-available', + id: 'desktop-update-ready', priority: 200, icon: ArrowUp, - title: 'Desktop Update Available', - description: `Sable ${updateInfo.version} is available for installation.`, + title: 'Update Available', + description: `Sable ${updateInfo.version} is ready to install.${updateInfo.body ? `\n${updateInfo.body}` : ''}`, primaryAction: { label: isInstalling ? 'Installing...' : 'Install & Update', variant: 'Primary', @@ -111,9 +215,11 @@ export function DesktopUpdater() { }, }; }, [ + bannerVisible, updateInfo, dismissed, isDownloaded, + isInstalled, isInstalling, handleInstall, handleRestart, diff --git a/src/app/state/desktopUpdate.ts b/src/app/state/desktopUpdate.ts new file mode 100644 index 0000000000..f7ee98e210 --- /dev/null +++ b/src/app/state/desktopUpdate.ts @@ -0,0 +1,30 @@ +import { atom } from 'jotai'; +import { + atomWithLocalStorage, + getLocalStorageItem, + setLocalStorageItem, +} from './utils/atomWithLocalStorage'; + +export type UpdatePhase = + | { type: 'idle' } + | { type: 'checking' } + | { type: 'downloading'; progress: number } + | { type: 'ready'; version: string } + | { type: 'installing' }; + +export const updatePhaseAtom = atom({ type: 'idle' }); + +export const updateBannerVisibleAtom = atom(false); + +export const triggerUpdateCheckAtom = atom(0); + +const DESKTOP_UPDATE_LAST_CHECKED_KEY = 'desktopUpdateLastChecked'; + +export const desktopUpdateLastCheckedAtom = atomWithLocalStorage( + DESKTOP_UPDATE_LAST_CHECKED_KEY, + (key) => getLocalStorageItem(key, null), + (key, value) => setLocalStorageItem(key, value) +); + +export const fakeDesktopUpdate = (): boolean => + localStorage.getItem('sable_fake_desktop_update') === '1'; diff --git a/src/app/styles/overrides/TauriDesktop.css b/src/app/styles/overrides/TauriDesktop.css index 695a8cf8f2..5863fde177 100644 --- a/src/app/styles/overrides/TauriDesktop.css +++ b/src/app/styles/overrides/TauriDesktop.css @@ -6,7 +6,7 @@ .tauri-titlebar { height: var(--tauri-titlebar-height); display: grid; - grid-template-columns: 1fr auto; + grid-template-columns: 1fr auto auto; align-items: stretch; position: relative; background: var(--sable-bg-container); @@ -44,6 +44,21 @@ letter-spacing: 0.02em; } +.tauri-titlebar__update { + display: flex; + align-items: center; + padding-inline: 4px; + app-region: no-drag; + -webkit-app-region: no-drag; +} + +.tauri-titlebar--mac .tauri-titlebar__update { + position: absolute; + right: 8px; + top: 0; + height: 100%; +} + .tauri-titlebar__controls { display: flex; app-region: no-drag; From 71983bd154ec2ab057323be5bba0fea4d2ff822f Mon Sep 17 00:00:00 2001 From: 7w1 Date: Fri, 24 Jul 2026 20:09:40 -0500 Subject: [PATCH 21/21] Update pnpm-lock.yaml --- pnpm-lock.yaml | 1050 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1050 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ac5e2a67f..3f742b21cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -260,6 +260,9 @@ importers: '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 version: 0.2.3(esbuild@0.28.1) + '@playwright/test': + specifier: ^1.61.1 + version: 1.61.1 '@rollup/plugin-inject': specifier: ^5.0.5 version: 5.0.5(rollup@4.62.0) @@ -338,6 +341,9 @@ importers: oxlint-tsgolint: specifier: ^0.24.0 version: 0.24.0 + testcontainers: + specifier: ^12.0.4 + version: 12.0.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -926,6 +932,9 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1389,6 +1398,20 @@ packages: '@fontsource/space-mono@5.2.9': resolution: {integrity: sha512-b61faFOHEISQ/pD25G+cfGY9o/WW6lRv6hBQQfpWvEJ4y1V+S4gmth95EVyBE2VL3qDYHeVQ8nBzrplzdXTDDg==} + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} + engines: {node: '>=6'} + hasBin: true + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -1551,6 +1574,10 @@ packages: '@internationalized/string@3.2.9': resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -1577,9 +1604,15 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + '@matrix-org/matrix-sdk-crypto-wasm@18.3.1': resolution: {integrity: sha512-VRjWhE1UgHnPpJ3b9B5+8z71ZC/HICFngPPFIN6ktzmUBKI5RusPujzbAQUoB3CgZ0yU58L99AfSQS4YTztSWw==} engines: {node: '>= 18'} @@ -2186,6 +2219,15 @@ packages: react: '>= 16.8' react-dom: '>= 16.8' + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.61.1': + resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} + engines: {node: '>=18'} + hasBin: true + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -2198,6 +2240,33 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + '@react-leaflet/core@2.1.0': resolution: {integrity: sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==} peerDependencies: @@ -3003,6 +3072,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@4.0.1': + resolution: {integrity: sha512-cmUpB+dPN955PxBEuXE3f6lKO1hHiIGYJA46IVF3BJpNsZGvtBDcRnlrHYHtOH/B6vtDOyl2kZ2ShAu3mgc27Q==} + '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -3024,6 +3099,9 @@ packages: '@types/leaflet@1.9.21': resolution: {integrity: sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} @@ -3044,6 +3122,15 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/ssh2-streams@0.1.13': + resolution: {integrity: sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.5': + resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3129,6 +3216,10 @@ packages: '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} @@ -3148,14 +3239,34 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3178,6 +3289,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3189,6 +3303,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -3204,6 +3321,14 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -3226,6 +3351,43 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.6: + resolution: {integrity: sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==} + base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} @@ -3237,6 +3399,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -3247,6 +3412,9 @@ packages: bind-event-listener@3.0.0: resolution: {integrity: sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -3272,12 +3440,27 @@ packages: bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buildcheck@0.0.7: + resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} + engines: {node: '>=10.0.0'} + + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} @@ -3313,12 +3496,19 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chroma-js@3.2.0: resolution: {integrity: sha512-os/OippSlX1RlWWr+QDPcGUZs0uoqr32urfxESG9U93lhUfbnlyckte84Q8P1UQY/qth983AS1JONKmLS4T0nw==} classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + cloudflared@0.7.1: resolution: {integrity: sha512-jJn1Gu9Tf4qnIu8tfiHZ25Hs8rNcRYSVf8zAd97wvYdOCzftm1CTs1S/RPhijjGi8gUT1p9yzfDi9zYlU/0RwA==} hasBin: true @@ -3327,6 +3517,13 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3338,6 +3535,10 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -3358,6 +3559,9 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -3367,6 +3571,19 @@ packages: typescript: optional: true + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + create-web-stream@1.1.3: resolution: {integrity: sha512-ocdWcsi6F8/8f0L/Fsbt3UmPSB+7H5hXR0aRr7Wiu7TXC1Z8vwlwxpeO4+gMgJ8g4TqwM5oTnSid43Jxm2ArwA==} engines: {node: '>=18.9.0'} @@ -3465,6 +3682,18 @@ packages: resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} hasBin: true + docker-compose@1.4.2: + resolution: {integrity: sha512-rPHigTKGaEHpkUmfd69QgaOp+Os5vGJwG/Ry8lcr8W/382AmI+z/D7qoa9BybKIkqNppaIbs8RYeHSevdQjWww==} + engines: {node: '>= 6.0.0'} + + docker-modem@5.0.7: + resolution: {integrity: sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA==} + engines: {node: '>= 8.0'} + + dockerode@5.0.1: + resolution: {integrity: sha512-avsq/xk4YPIrn0CgleX5bjT9Y8IT1p9PxrNQ++RBQ2WEyFfHCTDsT9kmyxz+H/axnjAwg8wJWEIuPGOUuNupiA==} + engines: {node: '>= 14.17'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3501,6 +3730,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -3509,6 +3741,12 @@ packages: electron-to-chromium@1.5.374: resolution: {integrity: sha512-HCF5i7izveksHSGqa7mhDh6tr3Uz9Dar2RAjwuh69bw3QGPVObjQIgLwQWeO/Rxp9/r0KdboKy9RbpQDl97fjg==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojibase-data@17.0.0: resolution: {integrity: sha512-Yvgb5AWoHViHV/gq1qr5ZAarcBip+B27/ZLRsUJkbgAEaLlZ/fof9g882LTpmEpyhBNEC0m2SEmItljHsTygjA==} peerDependencies: @@ -3518,6 +3756,9 @@ packages: resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} engines: {node: '>=18.12.0'} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3594,9 +3835,16 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3608,6 +3856,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -3693,10 +3944,18 @@ packages: react-dom: optional: true + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3720,6 +3979,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3727,6 +3990,10 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3742,6 +4009,11 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} @@ -3854,6 +4126,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -3912,6 +4187,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -4004,6 +4283,9 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -4022,6 +4304,9 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} @@ -4111,6 +4396,10 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leaflet@1.9.4: resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} @@ -4208,6 +4497,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -4221,6 +4513,9 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4297,6 +4592,14 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -4316,6 +4619,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nan@2.28.0: + resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==} + nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4361,6 +4667,9 @@ packages: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4443,6 +4752,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -4475,6 +4788,16 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4495,6 +4818,13 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -4502,9 +4832,23 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@3.0.1: + resolution: {integrity: sha512-WPn+h9RGEExOKdu4bsF4HksG/uzd3cFq3MFtq8PsFeExPse5Ha/VOjQNyHhjboBFwGXGev6muJYTSPAOkROq2g==} + engines: {node: '>=18'} + + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} + engines: {node: '>=12.0.0'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4609,6 +4953,20 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4643,6 +5001,10 @@ packages: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -4662,6 +5024,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + rolldown@1.0.3: resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4676,6 +5042,12 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -4684,6 +5056,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -4754,6 +5129,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -4814,6 +5192,16 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.17.0: + resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} + engines: {node: '>=10.16.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -4824,6 +5212,17 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -4840,10 +5239,24 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -4883,12 +5296,28 @@ packages: tabbable@6.5.0: resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} + + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} + tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + tauri-plugin-android-fs-api@28.4.0: resolution: {integrity: sha512-YOo1P+cRjuaoPbTNZprMhr56ruKO4hIDq7kJOum91NqkN+VWY9F+UPAdjZokhzJSsbkeY0nsb1VDLXb2/h3f3w==} + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -4902,6 +5331,12 @@ packages: engines: {node: '>=10'} hasBin: true + testcontainers@12.0.4: + resolution: {integrity: sha512-QIR/8xF1+F/26cIM+9B4yyxNTbKJxAv3hygZyhPRgZ8Q2AhlPZjDdpXRuk16V37X4bgJRI3hXFhoEICMBA7Adg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} @@ -4931,6 +5366,10 @@ packages: resolution: {integrity: sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg==} hasBin: true + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4956,6 +5395,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -4999,6 +5441,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -5051,6 +5496,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -5374,6 +5822,17 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -5393,6 +5852,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -5401,6 +5864,14 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5411,6 +5882,10 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -6142,6 +6617,8 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@balena/dockerignore@1.0.2': {} + '@bcoe/v8-coverage@1.0.2': {} '@bramus/specificity@2.4.2': @@ -6433,6 +6910,25 @@ snapshots: '@fontsource/space-mono@5.2.9': {} + '@grpc/grpc-js@1.14.4': + dependencies: + '@grpc/proto-loader': 0.8.1 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.5 + yargs: 17.7.3 + + '@grpc/proto-loader@0.8.1': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.5 + yargs: 17.7.3 + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -6541,6 +7037,15 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} '@jridgewell/gen-mapping@0.3.13': @@ -6572,8 +7077,16 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@js-sdsl/ordered-map@4.4.2': {} + '@juggle/resize-observer@3.4.0': {} + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@matrix-org/matrix-sdk-crypto-wasm@18.3.1': {} '@napi-rs/canvas-android-arm64@1.0.2': @@ -6913,6 +7426,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@pkgjs/parseargs@0.11.0': + optional: true + + '@playwright/test@1.61.1': + dependencies: + playwright: 1.61.1 + '@polka/url@1.0.0-next.29': {} '@poppinss/colors@4.1.6': @@ -6927,6 +7447,26 @@ snapshots: '@poppinss/exception@1.2.3': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + '@react-leaflet/core@2.1.0(leaflet@1.9.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: leaflet: 1.9.4 @@ -7576,6 +8116,17 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 24.13.2 + '@types/ssh2': 1.15.5 + + '@types/dockerode@4.0.1': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 24.13.2 + '@types/ssh2': 1.15.5 + '@types/estree@0.0.39': {} '@types/estree@1.0.9': {} @@ -7592,6 +8143,10 @@ snapshots: dependencies: '@types/geojson': 7946.0.16 + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + '@types/node@24.13.2': dependencies: undici-types: 7.18.2 @@ -7613,6 +8168,19 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/ssh2-streams@0.1.13': + dependencies: + '@types/node': 24.13.2 + + '@types/ssh2@0.5.52': + dependencies: + '@types/node': 24.13.2 + '@types/ssh2-streams': 0.1.13 + + '@types/ssh2@1.15.5': + dependencies: + '@types/node': 18.19.130 + '@types/trusted-types@2.0.7': {} '@use-gesture/core@10.3.1': {} @@ -7789,6 +8357,10 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn@8.17.0: {} agent-base@6.0.2: @@ -7808,13 +8380,45 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.18.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.2.0 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + argparse@2.0.1: {} aria-hidden@1.2.6: @@ -7842,6 +8446,10 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + assertion-error@2.0.1: {} ast-v8-to-istanbul@1.0.4: @@ -7852,6 +8460,8 @@ snapshots: async-function@1.0.0: {} + async-lock@1.4.1: {} + async@3.2.6: {} at-least-node@1.0.0: {} @@ -7862,6 +8472,8 @@ snapshots: await-to-js@3.0.0: {} + b4a@1.8.1: {} + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -7890,12 +8502,45 @@ snapshots: balanced-match@4.0.4: {} + bare-events@2.9.1: {} + + bare-fs@4.7.4: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.6 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.6: + dependencies: + bare-path: 3.1.1 + base-x@5.0.1: {} base64-js@1.5.1: {} baseline-browser-mapping@2.10.37: {} + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -7904,6 +8549,12 @@ snapshots: bind-event-listener@3.0.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} blurhash@2.0.5: {} @@ -7930,13 +8581,25 @@ snapshots: dependencies: base-x: 5.0.1 + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buildcheck@0.0.7: + optional: true + + byline@5.0.0: {} + cac@7.0.0: {} call-bind-apply-helpers@1.0.2: @@ -7976,20 +8639,42 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + chroma-js@3.2.0: {} classnames@2.5.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cloudflared@0.7.1: {} clsx@2.1.1: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + commander@2.20.3: {} commander@8.3.0: {} common-tags@1.8.2: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + compute-scroll-into-view@3.1.1: {} confbox@0.1.8: {} @@ -8004,6 +8689,8 @@ snapshots: dependencies: browserslist: 4.28.2 + core-util-is@1.0.3: {} + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 @@ -8013,6 +8700,19 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.7 + nan: 2.28.0 + optional: true + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + create-web-stream@1.1.3: {} cross-fetch@4.0.0: @@ -8099,6 +8799,30 @@ snapshots: direction@1.0.4: {} + docker-compose@1.4.2: + dependencies: + yaml: 2.9.0 + + docker-modem@5.0.7: + dependencies: + debug: 4.4.3 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.17.0 + transitivePeerDependencies: + - supports-color + + dockerode@5.0.1: + dependencies: + '@balena/dockerignore': 1.0.2 + '@grpc/grpc-js': 1.14.4 + '@grpc/proto-loader': 0.7.15 + docker-modem: 5.0.7 + protobufjs: 7.6.5 + tar-fs: 2.1.5 + transitivePeerDependencies: + - supports-color + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -8138,18 +8862,28 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ejs@3.1.10: dependencies: jake: 10.9.4 electron-to-chromium@1.5.374: {} + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + emojibase-data@17.0.0(emojibase@17.0.0): dependencies: emojibase: 17.0.0 emojibase@17.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@4.5.0: {} entities@8.0.0: {} @@ -8324,14 +9058,24 @@ snapshots: '@types/node': 24.13.2 require-like: 0.1.2 + event-target-shim@5.0.1: {} + eventemitter3@5.0.4: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} expect-type@1.3.0: {} fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-json-stable-stringify@2.1.0: {} fast-uri@3.1.2: {} @@ -8406,6 +9150,8 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + fs-constants@1.0.0: {} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -8413,6 +9159,9 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -8436,6 +9185,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8451,6 +9202,8 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} + get-port@5.1.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8470,6 +9223,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -8590,6 +9352,8 @@ snapshots: indent-string@4.0.0: {} + inherits@2.0.4: {} + inline-style-parser@0.2.7: {} internal-slot@1.1.0: @@ -8654,6 +9418,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -8734,6 +9500,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -8751,6 +9519,12 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: dependencies: '@isaacs/cliui': 9.0.0 @@ -8844,6 +9618,10 @@ snapshots: yaml: 2.9.0 zod: 4.4.3 + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leaflet@1.9.4: {} leven@3.1.0: {} @@ -8910,6 +9688,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.debounce@4.0.8: {} lodash.sortby@4.7.0: {} @@ -8918,6 +9698,8 @@ snapshots: loglevel@1.9.2: {} + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -9005,6 +9787,10 @@ snapshots: minipass@7.1.3: {} + mkdirp-classic@0.5.3: {} + + mkdirp@3.0.1: {} + mlly@1.8.2: dependencies: acorn: 8.17.0 @@ -9024,6 +9810,9 @@ snapshots: ms@2.1.3: {} + nan@2.28.0: + optional: true + nanoid@3.3.12: {} no-case@3.0.4: @@ -9056,6 +9845,10 @@ snapshots: obug@2.1.3: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -9202,6 +9995,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.5.1 @@ -9229,6 +10027,14 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 + playwright-core@1.61.1: {} + + playwright@1.61.1: + dependencies: + playwright-core: 1.61.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} postcss@8.5.15: @@ -9247,6 +10053,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + progress@2.0.3: {} prop-types@15.8.1: @@ -9255,8 +10065,40 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + properties-reader@3.0.1: + dependencies: + '@kwsites/file-exists': 1.1.1 + mkdirp: 3.0.1 + transitivePeerDependencies: + - supports-color + + protobufjs@7.6.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 24.13.2 + long: 5.3.2 + proxy-from-env@1.1.0: {} + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} raf-schd@4.0.3: {} @@ -9360,6 +10202,34 @@ snapshots: dependencies: loose-envify: 1.4.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 10.2.5 + readdirp@3.6.0: dependencies: picomatch: 2.3.2 @@ -9410,6 +10280,8 @@ snapshots: dependencies: jsesc: 3.1.0 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} require-like@0.1.2: {} @@ -9425,6 +10297,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry@0.12.0: {} + rolldown@1.0.3: dependencies: '@oxc-project/types': 0.133.0 @@ -9485,6 +10359,10 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -9496,6 +10374,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safer-buffer@2.1.2: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -9605,6 +10485,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sirv@3.0.2: @@ -9668,6 +10550,21 @@ snapshots: sourcemap-codec@1.4.8: {} + split-ca@1.0.1: {} + + ssh-remote-port-forward@1.0.4: + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.17.0 + + ssh2@1.17.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.28.0 + stackback@0.0.2: {} std-env@4.1.0: {} @@ -9677,6 +10574,27 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.9 @@ -9717,12 +10635,28 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-comments@2.0.1: {} strip-indent@3.0.0: @@ -9753,13 +10687,58 @@ snapshots: tabbable@6.5.0: {} + tar-fs@2.1.5: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + + tar-fs@3.1.3: + dependencies: + pump: 3.0.4 + tar-stream: 3.2.0 + optionalDependencies: + bare-fs: 4.7.4 + bare-path: 3.1.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + tar-mini@0.2.0: {} + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.4 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + tauri-plugin-android-fs-api@28.4.0: dependencies: '@tauri-apps/api': 2.11.1 create-web-stream: 1.1.3 + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + temp-dir@2.0.0: {} tempy@0.6.0: @@ -9776,6 +10755,35 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + testcontainers@12.0.4: + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 4.0.1 + archiver: 7.0.1 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.4.3 + docker-compose: 1.4.2 + dockerode: 5.0.1 + get-port: 5.1.1 + proper-lockfile: 4.1.2 + properties-reader: 3.0.1 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.1.3 + tmp: 0.2.7 + undici: 7.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + tiny-invariant@1.3.1: {} tinybench@2.9.0: {} @@ -9797,6 +10805,8 @@ snapshots: dependencies: tldts-core: 7.4.3 + tmp@0.2.7: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -9819,6 +10829,8 @@ snapshots: tslib@2.8.1: {} + tweetnacl@0.14.5: {} + type-fest@0.16.0: {} typed-array-buffer@1.0.3: @@ -9875,6 +10887,8 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} + undici-types@7.18.2: {} undici@7.28.0: {} @@ -9914,6 +10928,8 @@ snapshots: dependencies: react: 18.3.1 + util-deprecate@1.0.2: {} + uuid@10.0.0: {} virtua@0.49.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -10289,16 +11305,44 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + ws@8.21.0: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yaml@2.9.0: {} + yargs-parser@21.1.1: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} youch-core@0.3.3: @@ -10314,4 +11358,10 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod@4.4.3: {}