From 5f3608939c20b4c1229cb1a49359f3344c9fbc54 Mon Sep 17 00:00:00 2001 From: Seokju Na Date: Sun, 14 Jun 2026 23:27:16 +0900 Subject: [PATCH 1/3] impl android sdk --- .github/workflows/ci.yaml | 37 + README.md | 9 + e2e/.gitignore | 4 + e2e/.yarnrc.yml | 3 + e2e/README.md | 52 + e2e/appium.ts | 101 + e2e/context.ts | 171 + e2e/device.ts | 180 + e2e/package.json | 24 + e2e/smoke.spec.ts | 17 + e2e/vitest.config.ts | 16 + e2e/vitest.global-setup.ts | 20 + e2e/vitest.setup.ts | 19 + e2e/yarn.lock | 5833 +++++++++++++++++ gradle.properties | 7 + gradle/libs.versions.toml | 9 +- lib/build.gradle.kts | 6 +- lib/lint.xml | 14 + lib/src/main/kotlin/dev/wvb/Conversions.kt | 185 + lib/src/main/kotlin/dev/wvb/Source.kt | 169 + lib/src/main/kotlin/dev/wvb/WebViewBundle.kt | 248 + .../kotlin/dev/wvb/WebViewBundleClient.kt | 128 + .../kotlin/dev/wvb/WebViewBundleProtocol.kt | 133 + lib/src/main/kotlin/dev/wvb/WebViewSetup.kt | 102 + lib/src/main/kotlin/dev/wvb/wvb_ffi.kt | 1213 +++- settings.gradle.kts | 1 + testapp/build.gradle.kts | 38 + testapp/src/main/AndroidManifest.xml | 23 + .../bundles/hacker-news/hacker-news_0.0.1.wvb | Bin 0 -> 586256 bytes testapp/src/main/assets/bundles/manifest.json | 7 + .../main/assets/bundles/next/next_1.0.0.wvb | Bin 0 -> 1249696 bytes .../kotlin/dev/wvb/testapp/MainActivity.kt | 78 + 32 files changed, 8637 insertions(+), 210 deletions(-) create mode 100644 .github/workflows/ci.yaml create mode 100644 e2e/.gitignore create mode 100644 e2e/.yarnrc.yml create mode 100644 e2e/README.md create mode 100644 e2e/appium.ts create mode 100644 e2e/context.ts create mode 100644 e2e/device.ts create mode 100644 e2e/package.json create mode 100644 e2e/smoke.spec.ts create mode 100644 e2e/vitest.config.ts create mode 100644 e2e/vitest.global-setup.ts create mode 100644 e2e/vitest.setup.ts create mode 100644 e2e/yarn.lock create mode 100644 lib/lint.xml create mode 100644 lib/src/main/kotlin/dev/wvb/Conversions.kt create mode 100644 lib/src/main/kotlin/dev/wvb/Source.kt create mode 100644 lib/src/main/kotlin/dev/wvb/WebViewBundle.kt create mode 100644 lib/src/main/kotlin/dev/wvb/WebViewBundleClient.kt create mode 100644 lib/src/main/kotlin/dev/wvb/WebViewBundleProtocol.kt create mode 100644 lib/src/main/kotlin/dev/wvb/WebViewSetup.kt create mode 100644 testapp/build.gradle.kts create mode 100644 testapp/src/main/AndroidManifest.xml create mode 100644 testapp/src/main/assets/bundles/hacker-news/hacker-news_0.0.1.wvb create mode 100644 testapp/src/main/assets/bundles/manifest.json create mode 100644 testapp/src/main/assets/bundles/next/next_1.0.0.wvb create mode 100644 testapp/src/main/kotlin/dev/wvb/testapp/MainActivity.kt diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..503ca4d --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,37 @@ +name: ci +on: + pull_request: +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true +jobs: + gradle-build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # 4.0.1 + - run: ./gradlew :lib:assembleRelease :lib:lintRelease :testapp:assembleDebug + e2e: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # 4.0.1 + # KVM hardware acceleration for the Android emulator on Linux runners. + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - run: corepack enable + - run: yarn install --immutable + working-directory: e2e + # Boots an emulator, then runs `yarn test`; the harness reuses the running + # emulator and builds the APK via its vitest globalSetup. + - uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # 2.37.0 + with: + api-level: 31 + arch: x86_64 + target: google_apis + disable-animations: true + working-directory: e2e + script: yarn test diff --git a/README.md b/README.md index 3ec77f1..2c60cce 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,15 @@ Tags follow the upstream convention: `ffi/` for releases and `prerelease/` for prereleases. Run `node scripts/install.mjs --help` for all options. +## Test App & E2E + +`testapp/` is a Android Application that serves a **real builtin `.wvb`** +to a `WebView`, and `e2e/` drives it with Appium. + +```sh +cd e2e && yarn install && yarn e2e +``` + ## License MIT License diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 0000000..e2b3ebc --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.yarn/ +*.log +.appium/ diff --git a/e2e/.yarnrc.yml b/e2e/.yarnrc.yml new file mode 100644 index 0000000..446307c --- /dev/null +++ b/e2e/.yarnrc.yml @@ -0,0 +1,3 @@ +nodeLinker: node-modules +enableScripts: true +npmMinimalAgeGate: 0 diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 0000000..75641ef --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,52 @@ +# webview-bundle-android e2e + +Appium-driven end-to-end tests for the `testapp` module, mirroring the iOS e2e. + +## How it works + +The `testapp` (`MainActivity`) is a minimal WebView host: it serves the builtin +`hacker-news` bundle over `https://hacker-news.wvb/` and loads it on launch. It +carries **no** test logic of its own. The scenarios live in the shared +`@wvb-playground/webview-hacker-news` package (the same suite the iOS e2e runs) +and are expressed against the platform-agnostic `WebviewDriver` from +`@wvb-playground/testing`. + +The Appium session is switched into the testapp's **WEBVIEW** context, then each +exported `testCase` is run through `createAppiumDriver(driver, { baseURL: +"https://hacker-news.wvb" })`, which drives the live DOM (CSS selectors, +in-app navigation via `goto`). + +`vitest` orchestrates it: + +- **globalSetup** (`vitest.global-setup.ts`) builds the debug APK + (`./gradlew :testapp:assembleDebug`). +- **setup** (`vitest.setup.ts`) installs the `uiautomator2` Appium driver, boots + (or reuses) an emulator, starts an Appium server (with + `chromedriver_autodownload` enabled), opens a session that installs and + launches the testapp, and switches into its WEBVIEW context. +- **smoke.spec.ts** runs every `testCase` from + `@wvb-playground/webview-hacker-news/testing`. + +## Prerequisites + +- The Android SDK, with `platform-tools` (adb) and `emulator` available. Set + `ANDROID_HOME` (or `ANDROID_SDK_ROOT`) if it is not at the platform default. +- At least one AVD. The first one is used unless `ANDROID_AVD` is set; an + already-booted device/emulator is reused. +- Node + a package manager (the repo pins toolchain via `mise`). +- Appium is installed as a dev dependency; the `uiautomator2` driver is installed + into `~/.appium` on first run. + +## Run + +```sh +# from this directory +yarn install +yarn test +``` + +Environment knobs: + +- `ANDROID_AVD` — AVD to boot when no device is already running. +- `WVB_E2E_HEADLESS=1` — boot the emulator with `-no-window` (default on `CI`). +- `WVB_E2E_KEEP=1` — leave a self-booted emulator running after the test. diff --git a/e2e/appium.ts b/e2e/appium.ts new file mode 100644 index 0000000..7cb3dee --- /dev/null +++ b/e2e/appium.ts @@ -0,0 +1,101 @@ +import os from "node:os"; +import path from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import { execa, type ResultPromise } from "execa"; + +export const APPIUM_PORT = 4723; + +if (!process.env.APPIUM_HOME) { + process.env.APPIUM_HOME = path.join(os.homedir(), ".appium"); +} + +/** Ensures the given Appium drivers are installed into `APPIUM_HOME` (default `~/.appium`). */ +export async function ensureAppiumDrivers(drivers: string[]): Promise { + const installed = await listInstalledDrivers(); + for (const driver of drivers) { + if (driver in installed) { + continue; + } + console.log(`[appium] installing driver: ${driver}`); + await execa("appium", ["driver", "install", driver], { + preferLocal: true, + stdout: "inherit", + stderr: "inherit", + timeout: 5 * 60_000, + }); + } +} + +async function listInstalledDrivers(): Promise> { + const { stdout } = await execa( + "appium", + ["driver", "list", "--installed", "--json"], + { + preferLocal: true, + reject: false, + }, + ); + try { + return JSON.parse(stdout || "{}"); + } catch { + return {}; + } +} + +export interface AppiumServer { + port: number; + stop: () => Promise; +} + +export async function startAppiumServer( + port = APPIUM_PORT, +): Promise { + console.log(`[appium] starting server on port ${port}`); + const proc: ResultPromise = execa( + "appium", + [ + "--port", + String(port), + "--base-path", + "/", + "--log-level", + "error", + // Lets UiAutomator2 download a chromedriver matching the device's WebView + // when one isn't already cached, so the WEBVIEW context can be entered. + // Appium 3 requires the feature be namespaced by driver (or `*` for all). + "--allow-insecure", + "*:chromedriver_autodownload", + ], + { preferLocal: true, stdout: "inherit", stderr: "inherit" }, + ); + proc.catch(() => {}); + + await waitForAppiumServer(port, 60_000); + + return { + port, + stop: async () => { + proc.kill("SIGTERM"); + await proc.catch(() => {}); + }, + }; +} + +async function waitForAppiumServer( + port: number, + timeoutMs: number, +): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + const res = await fetch(`http://127.0.0.1:${port}/status`); + if (res.ok) { + return; + } + } catch {} + await delay(500); + } + throw new Error( + `Appium server did not become ready on port ${port} within ${timeoutMs}ms`, + ); +} diff --git a/e2e/context.ts b/e2e/context.ts new file mode 100644 index 0000000..186e5ef --- /dev/null +++ b/e2e/context.ts @@ -0,0 +1,171 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { glob } from "tinyglobby"; +import { remote } from "webdriverio"; +import { + APPIUM_PORT, + type AppiumServer, + ensureAppiumDrivers, + startAppiumServer, +} from "./appium.js"; +import { type AndroidDevice, ensureAndroidDevice } from "./device.js"; + +export const ROOT = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "..", +); +export const APP_PACKAGE = "dev.wvb.android.testapp"; +export const APP_ACTIVITY = "dev.wvb.testapp.MainActivity"; + +export type Driver = Awaited>; + +export interface TestContext { + server: AppiumServer; + device: AndroidDevice; + driver: Driver; +} + +/** Locates the built debug APK (fixed output path, then a glob fallback). */ +export async function findApk(): Promise { + const fixed = path.join( + ROOT, + "testapp", + "build", + "outputs", + "apk", + "debug", + "testapp-debug.apk", + ); + if (await pathExists(fixed)) { + return fixed; + } + + const matches = await glob("testapp/build/outputs/apk/debug/*.apk", { + cwd: ROOT, + absolute: true, + }); + return matches[0]; +} + +async function pathExists(p: string): Promise { + try { + await fs.access(p); + return true; + } catch { + return false; + } +} + +export async function createTestContext(): Promise { + const apkPath = await findApk(); + if (!apkPath) { + throw new Error( + "Built testapp-debug.apk not found — the vitest globalSetup build step must run first.", + ); + } + + await ensureAppiumDrivers(["uiautomator2"]); + const device = await ensureAndroidDevice(); + + const server = await startAppiumServer(APPIUM_PORT); + + const sessionTimeout = process.env.CI ? 720_000 : 360_000; + + console.log( + `[device] installing ${path.basename(apkPath)} -> ${device.serial}`, + ); + const driver = await remote({ + hostname: "127.0.0.1", + port: server.port, + path: "/", + logLevel: "error", + connectionRetryTimeout: sessionTimeout, + connectionRetryCount: 0, + capabilities: { + platformName: "Android", + "appium:automationName": "UiAutomator2", + "appium:udid": device.serial, + // Appium installs the APK and launches the activity. + "appium:app": apkPath, + "appium:appPackage": APP_PACKAGE, + "appium:appActivity": APP_ACTIVITY, + "appium:appWaitActivity": "*", + "appium:autoGrantPermissions": true, + "appium:newCommandTimeout": 240, + "appium:adbExecTimeout": 120_000, + "appium:uiautomator2ServerInstallTimeout": 120_000, + "appium:uiautomator2ServerLaunchTimeout": 120_000, + // The testapp hosts a debuggable WebView; let UiAutomator2 fetch a matching + // chromedriver for it (enabled by the server's `chromedriver_autodownload` + // insecure feature — see `startAppiumServer`). + "appium:chromedriverAutodownload": true, + "appium:ensureWebviewsHavePages": true, + "appium:nativeWebScreenshot": true, + }, + }); + + await switchToWebview(driver); + + return { server, device, driver }; +} + +/** ms to wait for the testapp's WebView to expose a debuggable WEBVIEW context. */ +const WEBVIEW_CONTEXT_TIMEOUT = process.env.CI ? 120_000 : 60_000; + +/** + * Switches `driver` into the testapp's WEBVIEW context so the + * `@wvb-playground/testing` Appium driver can run CSS selectors and navigate via + * `browser.url(...)`. The WebView loads `https://hacker-news.wvb/` on launch, so its + * context appears shortly after the session starts. + */ +async function switchToWebview(driver: Driver): Promise { + let contexts: string[] = []; + await driver.waitUntil( + async () => { + contexts = ((await driver.getContexts()) ?? []).map(String); + return contexts.some((c) => c.startsWith("WEBVIEW")); + }, + { + timeout: WEBVIEW_CONTEXT_TIMEOUT, + interval: 1000, + timeoutMsg: `no WEBVIEW context appeared (saw: ${contexts.join(", ") || "none"})`, + }, + ); + + const webview = contexts.find((c) => c.startsWith("WEBVIEW")); + if (!webview) { + throw new Error("WEBVIEW context disappeared after being detected"); + } + console.log(`[driver] switching to webview context: ${webview}`); + await driver.switchContext(webview); +} + +export async function disposeTestContext( + context: TestContext | undefined, +): Promise { + if (!context) { + return; + } + await context.driver.deleteSession().catch(() => {}); + await context.server.stop(); + if (context.device.bootedByUs && !process.env.WVB_E2E_KEEP) { + await context.device.shutdown(); + } +} + +let active: TestContext | undefined; + +/** Set by `vitest.setup.ts`'s `beforeAll` so specs can reach the live context. */ +export function setActiveContext(context: TestContext | undefined): void { + active = context; +} + +export function getTestContext(): TestContext { + if (!active) { + throw new Error( + "Test context not started — vitest.setup.ts beforeAll did not run.", + ); + } + return active; +} diff --git a/e2e/device.ts b/e2e/device.ts new file mode 100644 index 0000000..fe9329f --- /dev/null +++ b/e2e/device.ts @@ -0,0 +1,180 @@ +import { existsSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import { execa } from "execa"; + +export interface AndroidDevice { + serial: string; + name: string; + /** Whether this process booted the emulator (callers decide whether to shut it down). */ + bootedByUs: boolean; + shutdown: () => Promise; +} + +/** Locates the Android SDK from the env or the platform's default install path. */ +function resolveSdk(): string { + const fromEnv = process.env.ANDROID_HOME ?? process.env.ANDROID_SDK_ROOT; + if (fromEnv && existsSync(fromEnv)) { + return fromEnv; + } + const home = os.homedir(); + const candidates = [ + path.join(home, "Library/Android/sdk"), // macOS + path.join(home, "Android/Sdk"), // Linux + path.join(home, "AppData/Local/Android/Sdk"), // Windows + ]; + for (const c of candidates) { + if (existsSync(c)) { + return c; + } + } + throw new Error( + "Android SDK not found. Set ANDROID_HOME (or ANDROID_SDK_ROOT).", + ); +} + +const SDK = resolveSdk(); +const EXE = process.platform === "win32" ? ".exe" : ""; +const ADB = path.join(SDK, "platform-tools", `adb${EXE}`); +const EMULATOR = path.join(SDK, "emulator", `emulator${EXE}`); + +async function adb( + args: string[], + opts: Record = {}, +): Promise<{ stdout: string }> { + const { stdout } = await execa(ADB, args, { reject: false, ...opts }); + return { stdout: stdout ?? "" }; +} + +/** Serials of devices currently in the `device` (online) state. */ +async function listSerials(): Promise { + const { stdout } = await adb(["devices"]); + return stdout + .split("\n") + .slice(1) + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => line.split(/\s+/)) + .filter(([, state]) => state === "device") + .map(([serial]) => serial as string); +} + +async function isBooted(serial: string): Promise { + const { stdout } = await adb([ + "-s", + serial, + "shell", + "getprop", + "sys.boot_completed", + ]); + return stdout.trim() === "1"; +} + +async function waitFor( + fn: () => Promise, + timeoutMs: number, + intervalMs: number, + message: string, +): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + const value = await fn(); + if (value) { + return value; + } + await delay(intervalMs); + } + throw new Error(`${message} within ${timeoutMs}ms`); +} + +async function pickAvd(): Promise { + const { stdout } = await execa(EMULATOR, ["-list-avds"], { reject: false }); + const avds = stdout + .split("\n") + .map((s) => s.trim()) + .filter(Boolean); + if (avds.length === 0) { + throw new Error( + "No Android AVDs found. Create one (e.g. via Android Studio or `avdmanager`).", + ); + } + return avds[0]!; +} + +async function bootEmulator(avd: string): Promise { + console.log(`[device] booting AVD: ${avd}`); + const before = new Set(await listSerials()); + + const headless = Boolean(process.env.CI || process.env.WVB_E2E_HEADLESS); + const args = [ + "-avd", + avd, + "-no-snapshot", + "-no-boot-anim", + "-no-audio", + "-gpu", + "swiftshader_indirect", + ]; + if (headless) { + args.push("-no-window"); + } + const proc = execa(EMULATOR, args, { detached: true, stdio: "ignore" }); + proc.unref(); + proc.catch(() => {}); + + const serial = await waitFor( + async () => { + const now = await listSerials(); + return ( + now.find((s) => !before.has(s)) ?? + now.find((s) => s.startsWith("emulator-")) + ); + }, + 120_000, + 1000, + "emulator did not appear", + ); + + await adb(["-s", serial, "wait-for-device"]); + await waitFor( + async () => ((await isBooted(serial)) ? true : undefined), + 180_000, + 2000, + "emulator did not finish booting", + ); + console.log(`[device] booted ${serial}`); + + return { + serial, + name: avd, + bootedByUs: true, + shutdown: async () => { + await adb(["-s", serial, "emu", "kill"]); + }, + }; +} + +/** + * Reuses an already-booted device/emulator, or boots an AVD (`ANDROID_AVD`, or the + * first available) and waits for it to finish booting. + */ +export async function ensureAndroidDevice( + avdName = process.env.ANDROID_AVD, +): Promise { + await adb(["start-server"]); + + for (const serial of await listSerials()) { + if (await isBooted(serial)) { + console.log(`[device] reusing running device: ${serial}`); + return { + serial, + name: serial, + bootedByUs: false, + shutdown: async () => {}, + }; + } + } + + return bootEmulator(avdName ?? (await pickAvd())); +} diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 0000000..fc6a3f2 --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,24 @@ +{ + "name": "webview-bundle-android-e2e", + "version": "0.0.0", + "private": true, + "type": "module", + "description": "Appium-driven E2E tests for the WebViewBundle Android testapp", + "packageManager": "yarn@4.16.0", + "scripts": { + "test": "vitest run" + }, + "dependencies": { + "@wvb-playground/testing": "^0.0.0", + "@wvb-playground/webview-hacker-news": "^0.0.0" + }, + "devDependencies": { + "@types/node": "^25", + "appium": "^3.5.0", + "execa": "^9.5.2", + "tinyglobby": "^0.2.10", + "typescript": "6.0.3", + "vitest": "4.1.8", + "webdriverio": "9.28.0" + } +} diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 0000000..3440880 --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,17 @@ +import { createAppiumDriver } from "@wvb-playground/testing/appium"; +import { testCases } from "@wvb-playground/webview-hacker-news/testing"; +import { describe, test } from "vitest"; +import { getTestContext } from "./context.js"; + +describe("hacker-news tests", () => { + for (const testCase of testCases) { + test(testCase.name, async () => { + const { driver } = getTestContext(); + const webviewDriver = createAppiumDriver(driver, { + baseURL: "https://hacker-news.wvb", + }); + + await testCase.run(webviewDriver); + }); + } +}); diff --git a/e2e/vitest.config.ts b/e2e/vitest.config.ts new file mode 100644 index 0000000..a4cb747 --- /dev/null +++ b/e2e/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig, type ViteUserConfig } from "vitest/config"; + +const config: ViteUserConfig = defineConfig({ + test: { + name: "webview-bundle-android/e2e", + include: ["**/*.spec.ts"], + fileParallelism: false, + pool: "forks", + testTimeout: 120_000, + hookTimeout: 1_800_000, + globalSetup: ["./vitest.global-setup.ts"], + setupFiles: ["./vitest.setup.ts"], + }, +}); + +export { config as default }; diff --git a/e2e/vitest.global-setup.ts b/e2e/vitest.global-setup.ts new file mode 100644 index 0000000..04546c3 --- /dev/null +++ b/e2e/vitest.global-setup.ts @@ -0,0 +1,20 @@ +import { spawnSync } from "node:child_process"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); + +function run(cmd: string, args: string[], cwd: string): void { + console.log(`\n$ ${cmd} ${args.join(" ")} (cwd: ${cwd})`); + const res = spawnSync(cmd, args, { cwd, stdio: "inherit" }); + if (res.status !== 0) { + throw new Error( + `command failed (${res.status ?? res.signal}): ${cmd} ${args.join(" ")}`, + ); + } +} + +export default function setup(): void { + const gradlew = process.platform === "win32" ? "gradlew.bat" : "./gradlew"; + run(gradlew, [":testapp:assembleDebug"], ROOT); +} diff --git a/e2e/vitest.setup.ts b/e2e/vitest.setup.ts new file mode 100644 index 0000000..74c3706 --- /dev/null +++ b/e2e/vitest.setup.ts @@ -0,0 +1,19 @@ +import { afterAll, beforeAll } from "vitest"; +import { + createTestContext, + disposeTestContext, + setActiveContext, + type TestContext, +} from "./context.js"; + +let context: TestContext | undefined; + +beforeAll(async () => { + context = await createTestContext(); + setActiveContext(context); +}); + +afterAll(async () => { + await disposeTestContext(context); + setActiveContext(undefined); +}); diff --git a/e2e/yarn.lock b/e2e/yarn.lock new file mode 100644 index 0000000..b3bf82a --- /dev/null +++ b/e2e/yarn.lock @@ -0,0 +1,5833 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 10 + cacheKey: 10c0 + +"@appium/base-driver@npm:10.6.0": + version: 10.6.0 + resolution: "@appium/base-driver@npm:10.6.0" + dependencies: + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + "@colors/colors": "npm:1.6.0" + async-lock: "npm:1.4.1" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + body-parser: "npm:2.2.2" + express: "npm:5.2.1" + fastest-levenshtein: "npm:1.0.16" + http-status-codes: "npm:2.3.0" + lru-cache: "npm:11.5.0" + method-override: "npm:3.0.0" + morgan: "npm:1.10.1" + path-to-regexp: "npm:8.4.2" + serve-favicon: "npm:2.5.1" + spdy: "npm:4.0.2" + type-fest: "npm:5.6.0" + dependenciesMeta: + spdy: + optional: true + checksum: 10c0/750d654a6a3c660edbe07dc050e4f32026f5aeae41a8ed5665be657ffcb40a5ae287d265f0fe8db48d141bb23867f0dbf1ae15a0ad5f9f35a270db3eece192a9 + languageName: node + linkType: hard + +"@appium/base-plugin@npm:3.3.0": + version: 3.3.0 + resolution: "@appium/base-plugin@npm:3.3.0" + dependencies: + "@appium/base-driver": "npm:10.6.0" + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + checksum: 10c0/85a6f087506d8f1277d0630001aa5cbdeeca3b864daad212cbcb122389034b5b7f0724e3404751503c27572a7a2478fc727b9ffa1f2af64242b0ee7ae342bde4 + languageName: node + linkType: hard + +"@appium/docutils@npm:2.4.3": + version: 2.4.3 + resolution: "@appium/docutils@npm:2.4.3" + dependencies: + "@appium/support": "npm:7.2.3" + consola: "npm:3.4.2" + diff: "npm:9.0.0" + lilconfig: "npm:3.1.3" + package-directory: "npm:8.2.0" + read-pkg: "npm:10.1.0" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + yaml: "npm:2.9.0" + yargs: "npm:18.0.0" + yargs-parser: "npm:22.0.0" + bin: + appium-docs: bin/appium-docs.js + checksum: 10c0/e7482dd7489dedab2054f34c78a8bae8bbb7da18b03abf8f3f68ae9eb91c38a6a69c9d18000c9f908bbcbe2d4a922fbadee36eb85ca61686e013b18950ae0946 + languageName: node + linkType: hard + +"@appium/logger@npm:2.0.8": + version: 2.0.8 + resolution: "@appium/logger@npm:2.0.8" + dependencies: + console-control-strings: "npm:1.1.0" + lru-cache: "npm:11.5.0" + set-blocking: "npm:2.0.0" + checksum: 10c0/e3ce8fdc5e093e1c533fa0d08739b21341423ff6fc55c9cd3539ee21e086f3ed6f6dcf7f9fe62331467d06533132a9fb093cadde7d50c0fd213761354f352580 + languageName: node + linkType: hard + +"@appium/schema@npm:1.2.0": + version: 1.2.0 + resolution: "@appium/schema@npm:1.2.0" + dependencies: + json-schema: "npm:0.4.0" + checksum: 10c0/233d2f94dca075d48d1cbc865366ed5f74a7874860d285dd7bbc064e82bdb547e18d75b2b62cc1e568935bccad67976ddb9d3e226a01800fbf162cb23fd2ce01 + languageName: node + linkType: hard + +"@appium/support@npm:7.2.3": + version: 7.2.3 + resolution: "@appium/support@npm:7.2.3" + dependencies: + "@appium/logger": "npm:2.0.8" + "@appium/tsconfig": "npm:1.1.2" + "@appium/types": "npm:1.5.0" + "@colors/colors": "npm:1.6.0" + archiver: "npm:8.0.0" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + base64-stream: "npm:1.0.0" + bluebird: "npm:3.7.2" + bplist-creator: "npm:0.1.1" + bplist-parser: "npm:0.3.2" + form-data: "npm:4.0.5" + get-stream: "npm:9.0.1" + glob: "npm:13.0.6" + jsftp: "npm:2.1.3" + klaw: "npm:4.1.0" + lockfile: "npm:1.0.4" + log-symbols: "npm:7.0.1" + ncp: "npm:2.0.0" + package-directory: "npm:8.2.0" + plist: "npm:4.0.0" + pluralize: "npm:8.0.0" + read-pkg: "npm:10.1.0" + resolve-from: "npm:5.0.0" + sanitize-filename: "npm:1.6.4" + semver: "npm:7.8.1" + sharp: "npm:0.34.5" + shell-quote: "npm:1.8.4" + supports-color: "npm:10.2.2" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + uuid: "npm:14.0.0" + which: "npm:6.0.1" + yauzl: "npm:3.3.1" + dependenciesMeta: + sharp: + optional: true + checksum: 10c0/d7b4f94bc12f2d8280d1f0390191b4708336986fb643705aa6f9f8e5d9c3e36f7f0b8540e9616da38e4b90640e69f8728d5582d2428bf590bd06a2739c830554 + languageName: node + linkType: hard + +"@appium/tsconfig@npm:1.1.2": + version: 1.1.2 + resolution: "@appium/tsconfig@npm:1.1.2" + dependencies: + "@tsconfig/node20": "npm:20.1.9" + checksum: 10c0/e847d004189694d84254be37ac505d85b4cdb5dbc35eadbbea996a3e706419b868a2d23df4210830f744eea9e6000236ef852715458130f32459ffef55ed0f8a + languageName: node + linkType: hard + +"@appium/types@npm:1.5.0": + version: 1.5.0 + resolution: "@appium/types@npm:1.5.0" + dependencies: + "@appium/logger": "npm:2.0.8" + "@appium/schema": "npm:1.2.0" + "@appium/tsconfig": "npm:1.1.2" + type-fest: "npm:5.6.0" + checksum: 10c0/11122ee33944e222e33bbdbd36688ced9bdb382f20d0a8de780f1a47d70f6012c08b45f75e78cd8a74643a27300257da9c0403f5cce339c31086f994842c2e35 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.26.2": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10c0/4795354e7ae0dcafa72de1cd04ec51252dc1498517170beaf019e03effc5b7bf13c6b21a3949a77e07b8125be7f106ed1131350d8ebd4566ae874094a726d62b + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.8": + version: 2.0.8 + resolution: "@dabh/diagnostics@npm:2.0.8" + dependencies: + "@so-ric/colorspace": "npm:^1.1.6" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/64701c272f7de02800039fea99796507670fe5f67d4eb7718599351ec156936efd123fcab7ee18f9d7874939caaacc08e7c7a6bb05ff8cda6d930ad041cc555c + languageName: node + linkType: hard + +"@emnapi/core@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/core@npm:1.10.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10c0/f51d08227857b60632de7714d708124f0e100a1462dde6df8221760939aa3204a73193830371830fac0716f3ccd2129f2cac1b17cd7d7958bc4da9018a296edb + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/runtime@npm:1.10.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/953f14991d1aefb92ee6f8eb27dea725e484791a53a0cb5f47d9e0087b9a2c929ff2e92adf95af15d6ad456db6300c6b761ebf72b50a875b874a83520b3ba093 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.7.0": + version: 1.11.1 + resolution: "@emnapi/runtime@npm:1.11.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 + languageName: node + linkType: hard + +"@img/colour@npm:^1.0.0": + version: 1.1.0 + resolution: "@img/colour@npm:1.1.0" + checksum: 10c0/2ebea2c0bbaee73b99badcefa04e1e71d83f36e5369337d3121dca841f4569533c4e2faddda6d62dd247f0d5cca143711f9446c59bcce81e427ba433a7a94a17 + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": "npm:^1.7.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.1.5 + resolution: "@napi-rs/wasm-runtime@npm:1.1.5" + dependencies: + "@tybys/wasm-util": "npm:^0.10.2" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/727f2b6ae0e68bbe5d39aeb68aa6f183314e9f03dc50bb55a962849535b2db53ecc3fbf1554d8656a54488a608df5a2634670595cf5874dc4af2ee59f817c65d + languageName: node + linkType: hard + +"@nodable/entities@npm:^2.1.0": + version: 2.2.0 + resolution: "@nodable/entities@npm:2.2.0" + checksum: 10c0/a5ace5b2f747ae5b851f68a1731526c3e10feacde80469415d15a0df0e960251b515e3cd4ea080a3534e0610ac74b0d3252f607ef2f536bcc97e22d324231578 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.133.0": + version: 0.133.0 + resolution: "@oxc-project/types@npm:0.133.0" + checksum: 10c0/70c57ba58644f7ec217b670c301801f4d06995f4ccdba6b2bd106ea3e5ee49d616573e6ef8d55530b87571a960696543687f3850e87ad173d3f88965c30cdd63 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@promptbook/utils@npm:0.69.5": + version: 0.69.5 + resolution: "@promptbook/utils@npm:0.69.5" + dependencies: + spacetrim: "npm:0.11.59" + checksum: 10c0/148aa35a01151740d175b1c2c640349cc3af4c42f5f927c77f92b68ccb4303331e4e27e595d21d36ad97bf4556d4a8741346215f6228b193efd5dd027f013550 + languageName: node + linkType: hard + +"@puppeteer/browsers@npm:^2.2.0": + version: 2.13.2 + resolution: "@puppeteer/browsers@npm:2.13.2" + dependencies: + debug: "npm:^4.4.3" + extract-zip: "npm:^2.0.1" + progress: "npm:^2.0.3" + proxy-agent: "npm:^6.5.0" + semver: "npm:^7.7.4" + tar-fs: "npm:^3.1.1" + yargs: "npm:^17.7.2" + bin: + browsers: lib/cjs/main-cli.js + checksum: 10c0/d4f7a6b160a87598f9bb6524d475e4bb16effb7ee39e82a731e51af3454858e95d80c1cfe2030dfadfc407b77d7ef60f0f8c1a2dcf4532dce30f09c09df29082 + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-android-arm64@npm:1.0.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.3" + dependencies: + "@emnapi/core": "npm:1.10.0" + "@emnapi/runtime": "npm:1.10.0" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:^1.0.0": + version: 1.0.1 + resolution: "@rolldown/pluginutils@npm:1.0.1" + checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd + languageName: node + linkType: hard + +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + +"@sidvind/better-ajv-errors@npm:5.0.0": + version: 5.0.0 + resolution: "@sidvind/better-ajv-errors@npm:5.0.0" + dependencies: + kleur: "npm:^4.1.0" + peerDependencies: + ajv: ^7.0.0 || ^8.0.0 + checksum: 10c0/ef2559d0a6809f2da820159f818b6bc19c5ff18f577b41eb0762eb30dd3b6ddae31dda0d61963498840b0b0482b106a1f21b05183c730c20a619174cc48b6ba8 + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + +"@so-ric/colorspace@npm:^1.1.6": + version: 1.1.6 + resolution: "@so-ric/colorspace@npm:1.1.6" + dependencies: + color: "npm:^5.0.2" + text-hex: "npm:1.0.x" + checksum: 10c0/f3ad26afefbb8d6101ea7c385cd5f402d4291c2ffc9cabe37030d5fdb8bda980ee534a0d7c250f8233fc3a59b99272410177cd98b219f6b3770f91a0fdb6eb3e + languageName: node + linkType: hard + +"@standard-schema/spec@npm:^1.1.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 + languageName: node + linkType: hard + +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49 + languageName: node + linkType: hard + +"@tsconfig/node20@npm:20.1.9": + version: 20.1.9 + resolution: "@tsconfig/node20@npm:20.1.9" + checksum: 10c0/04e4e515dc6ce9386af74accb565884c3771b355208acc3d3dee32f0ce4c1d12e59319e05200fb2b87a8655ed4d8eb9910e36667a91e4683879feea9938d90d1 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.10.2": + version: 0.10.2 + resolution: "@tybys/wasm-util@npm:0.10.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 + languageName: node + linkType: hard + +"@types/chai@npm:^5.2.2": + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" + dependencies: + "@types/deep-eql": "npm:*" + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f + languageName: node + linkType: hard + +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.0": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^25": + version: 25.9.3 + resolution: "@types/node@npm:25.9.3" + dependencies: + undici-types: "npm:>=7.24.0 <7.24.7" + checksum: 10c0/72d3aece9d42c2c641bcd3f3cb2dc2828b4bd384dfcbd910c404b8859a68bd69d50c4769ce7defd4ff5e049768e23e615f09407ea2cbbb5f44b90d75a7c6b8ca + languageName: node + linkType: hard + +"@types/node@npm:^20.1.0, @types/node@npm:^20.11.30": + version: 20.19.43 + resolution: "@types/node@npm:20.19.43" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/9bcec3b5295bdd77ff0b44a528a69f7e22028c347507ba2c69be47ec84e30299f45043b222e9c86c510e138c9c53b2419dd5cd34920602a4a5a381c288075318 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.4": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 + languageName: node + linkType: hard + +"@types/sinonjs__fake-timers@npm:^8.1.5": + version: 8.1.5 + resolution: "@types/sinonjs__fake-timers@npm:8.1.5" + checksum: 10c0/2b8bdc246365518fc1b08f5720445093cce586183acca19a560be6ef81f824bd9a96c090e462f622af4d206406dadf2033c5daf99a51c1096da6494e5c8dc32e + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + +"@types/which@npm:^2.0.1": + version: 2.0.2 + resolution: "@types/which@npm:2.0.2" + checksum: 10c0/c9a2ca5f1d4ca26381cd8adc7415f9e203fa5bfa2f7855c68bc5b676dc402f9c31bd8c83766bfa73d7aa70a0f4b979e7eb139ceec41a17ac2e1fc08a5bca6ba8 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.3": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab + languageName: node + linkType: hard + +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + +"@vitest/expect@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/expect@npm:4.1.8" + dependencies: + "@standard-schema/spec": "npm:^1.1.0" + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + chai: "npm:^6.2.2" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/f7bf6c720d2427c3bd0b35472ebd84d963be7d09ecf52a0fb05e8c4d5d0c9ee164a8c28eee6360947be1b245b47faefab54560cb98e5cb678c1c1074260b9149 + languageName: node + linkType: hard + +"@vitest/mocker@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/mocker@npm:4.1.8" + dependencies: + "@vitest/spy": "npm:4.1.8" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.21" + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/f8cb2b8b55dc2cba0b2399aeee528b0187042f22cbc2d50a4fd6141f5aa246ebc41700f45dd1d73eca44ddfb57dcde48b2eb317bfbb1198f5ab2cc4fd04b2ea0 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/pretty-format@npm:4.1.8" + dependencies: + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/553c456692a4b9ae13cd116c234c74b4495e0f1a0d5c51ffc3fab8ea085e3550769967e29db79bdac0cf127b1bf88b7f70bfba3dcc72be6bddf834433e30cc91 + languageName: node + linkType: hard + +"@vitest/runner@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/runner@npm:4.1.8" + dependencies: + "@vitest/utils": "npm:4.1.8" + pathe: "npm:^2.0.3" + checksum: 10c0/706808a4b7b95ea9a9268fc152dd39e15a9a754f37c7990aea167486a9094caa913dae454771ae02c18dccfabd667f8cc38eed33a1307a79d32a89878b5bcce1 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/snapshot@npm:4.1.8" + dependencies: + "@vitest/pretty-format": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + magic-string: "npm:^0.30.21" + pathe: "npm:^2.0.3" + checksum: 10c0/ba4c32112491d42d24986f921c50ede5edbdb4b7eafa16c72cf8d2c9ecc44121fdb3d9365236747a9841f0d6776affc6457470fcbb082df9dbc28c24792a0c6d + languageName: node + linkType: hard + +"@vitest/spy@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/spy@npm:4.1.8" + checksum: 10c0/3c10c0325a09d16bc0e77c0be96c47c15416186e33332880c0d1dd0a51d51a866091067b81f2a2ef6fb422a7760e6cf15c04d91a0eca4d59f62e8c8401fa53fc + languageName: node + linkType: hard + +"@vitest/utils@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/utils@npm:4.1.8" + dependencies: + "@vitest/pretty-format": "npm:4.1.8" + convert-source-map: "npm:^2.0.0" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/acda9d3d640c1ebc81afb358ac30589d7d7d583af81e2d09419f0af9cbe41f3ce0b90527326943bf0da51614be5fc31afcd32259f6beb32b3417999d6ef380f3 + languageName: node + linkType: hard + +"@wdio/config@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/config@npm:9.28.0" + dependencies: + "@wdio/logger": "npm:9.18.0" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + deepmerge-ts: "npm:^7.0.3" + glob: "npm:^10.2.2" + import-meta-resolve: "npm:^4.0.0" + jiti: "npm:^2.6.1" + checksum: 10c0/0c1b46c3ca20a5543920e71e03a3fcef8b141b22cd500cce0c44177689354dcc42d0180a1886e31e8992197f9bf876b93c1e47ba0d02b2c97156109d44a5e3ce + languageName: node + linkType: hard + +"@wdio/logger@npm:9.18.0, @wdio/logger@npm:^9.18.0": + version: 9.18.0 + resolution: "@wdio/logger@npm:9.18.0" + dependencies: + chalk: "npm:^5.1.2" + loglevel: "npm:^1.6.0" + loglevel-plugin-prefix: "npm:^0.8.4" + safe-regex2: "npm:^5.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/c11cc06ea9f6696a0077f29d0360c10828317e5980815408d04cad99db1a64a6bc1491583ffef681e46e18476f061f37a2e18706f06488715291f3bfc8b32615 + languageName: node + linkType: hard + +"@wdio/protocols@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/protocols@npm:9.28.0" + checksum: 10c0/d71ddd19b73140cb18f24c2e35f992c8f58d6450d5dec911df3e4094e95a40eb3559123f65fd04b69d6e5fa8d1fb63ba86c5433285a7044a09bc2f8e012c1764 + languageName: node + linkType: hard + +"@wdio/repl@npm:9.16.2": + version: 9.16.2 + resolution: "@wdio/repl@npm:9.16.2" + dependencies: + "@types/node": "npm:^20.1.0" + checksum: 10c0/9f46cef8098e3c4f0aa16f6104582b423e3b9d5d99ef901b6f8c64248e81b47512f36e4c198c626459370433ae8c30e0494f86966a99a9f8f773fe37f3b2fc4b + languageName: node + linkType: hard + +"@wdio/types@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/types@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.1.0" + checksum: 10c0/c277976ff98947fb73242cc32da3cdf39484e077b9560ecc76db1e40d42bdfd08a8e27af384af4cbf8723ad9c2120e02d2aec1bb2d3a1f2924a7598c961baf57 + languageName: node + linkType: hard + +"@wdio/utils@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/utils@npm:9.28.0" + dependencies: + "@puppeteer/browsers": "npm:^2.2.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/types": "npm:9.28.0" + decamelize: "npm:^6.0.0" + deepmerge-ts: "npm:^7.0.3" + edgedriver: "npm:^6.1.2" + geckodriver: "npm:^6.1.0" + get-port: "npm:^7.0.0" + import-meta-resolve: "npm:^4.0.0" + locate-app: "npm:^2.2.24" + mitt: "npm:^3.0.1" + safaridriver: "npm:^1.0.0" + split2: "npm:^4.2.0" + wait-port: "npm:^1.1.0" + checksum: 10c0/8da49341974ed9d48d2ecb4d665841c4220dc6304ff3fe6b62d56c6c8caa7845a5a226f84c68e74409bc84c6509ba732c814ef9faab75106c36a4d78d9ba3ccb + languageName: node + linkType: hard + +"@wvb-playground/testing@npm:^0.0.0": + version: 0.0.0 + resolution: "@wvb-playground/testing@npm:0.0.0" + peerDependencies: + playwright-core: ^1.40.0 + selenium-webdriver: ^4.0.0 + webdriverio: ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + playwright-core: + optional: true + selenium-webdriver: + optional: true + webdriverio: + optional: true + checksum: 10c0/aff3809a52ced27cdba6a05dc7e60375ee72b6581d95e1bac684f25f94c275f0bcd68f0d8edab10f281427b1c3605758562c3b6b15d95bb0ae0454136982f2ab + languageName: node + linkType: hard + +"@wvb-playground/webview-hacker-news@npm:^0.0.0": + version: 0.0.0 + resolution: "@wvb-playground/webview-hacker-news@npm:0.0.0" + dependencies: + "@wvb-playground/testing": "npm:^0.0.0" + peerDependencies: + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vitest: + optional: true + checksum: 10c0/722a88b4c43c1a9e7b274bebef3aa6126683aa1300d6e04186de65f090943f3512546b8ca17f08f5a5ae8f586560ede615f87cfc319112c9f23074f8b5c2f6be + languageName: node + linkType: hard + +"@xmldom/xmldom@npm:^0.9.10": + version: 0.9.10 + resolution: "@xmldom/xmldom@npm:0.9.10" + checksum: 10c0/38a9c9b95450d7fccebc61371c8e0b90ceaae992886484108333d29ccbd2640e3555b6af012f15ce1beb5067aeb40486659b6183fad38af179e82d28028bfc5d + languageName: node + linkType: hard + +"@zip.js/zip.js@npm:^2.8.11": + version: 2.8.26 + resolution: "@zip.js/zip.js@npm:2.8.26" + checksum: 10c0/246e446309f55c3cc7beecf5d69e53aebb149707804afccb0bbaf07b31efe129292b4cc5f4f974092a583be5cbf79277b2864e9f6902ce8bb6d0cbd244844ebe + languageName: node + linkType: hard + +"abbrev@npm:^5.0.0": + version: 5.0.0 + resolution: "abbrev@npm:5.0.0" + checksum: 10c0/8e88f5c798ea4562d28c5a3e9ad69e3879890bc5d695d8f2dffb8609be4c890aacc8f80ef4553fdd2c6a62d70c2ce8bc57b38074e383beb7487bdafa9ed42ea5 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv-formats@npm:3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a + languageName: node + linkType: hard + +"ajv@npm:8.20.0, ajv@npm:^8.0.0": + version: 8.20.0 + resolution: "ajv@npm:8.20.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/5df9a1c8f83863cde1bd3a9ddb426f599718f88e3dc9153616c79fb28e0be455335830d7f21d745576519f057b371352daa31047b6a33d7036fe08777d60cf2a + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.2.2": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 + languageName: node + linkType: hard + +"anynum@npm:^1.0.0": + version: 1.0.0 + resolution: "anynum@npm:1.0.0" + checksum: 10c0/c929fed8f4127cd706312da58ae2aa83a06e62059eef04392fe2bacec003b6f6b7ca5f2719bd09c693b100f185bcf6405419744812f1096cdb53aed4034b9209 + languageName: node + linkType: hard + +"appium@npm:^3.5.0": + version: 3.5.0 + resolution: "appium@npm:3.5.0" + dependencies: + "@appium/base-driver": "npm:10.6.0" + "@appium/base-plugin": "npm:3.3.0" + "@appium/docutils": "npm:2.4.3" + "@appium/logger": "npm:2.0.8" + "@appium/schema": "npm:1.2.0" + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + "@sidvind/better-ajv-errors": "npm:5.0.0" + ajv: "npm:8.20.0" + ajv-formats: "npm:3.0.1" + argparse: "npm:2.0.1" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + lilconfig: "npm:3.1.3" + lodash: "npm:4.18.1" + lru-cache: "npm:11.5.0" + ora: "npm:5.4.1" + package-changed: "npm:3.0.0" + resolve-from: "npm:5.0.0" + semver: "npm:7.8.1" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + winston: "npm:3.19.0" + ws: "npm:8.21.0" + yaml: "npm:2.9.0" + bin: + appium: index.js + checksum: 10c0/b7389561965cc9c53d8d8e1754ebd7e2608337731cdb56102565f8d5faad4838651823ad72652180b6114cd5b4de56646710c4369354ca94f5dff32e1c90f6e0 + languageName: node + linkType: hard + +"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": + version: 5.0.2 + resolution: "archiver-utils@npm:5.0.2" + dependencies: + glob: "npm:^10.0.0" + graceful-fs: "npm:^4.2.0" + is-stream: "npm:^2.0.1" + lazystream: "npm:^1.0.0" + lodash: "npm:^4.17.15" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/3782c5fa9922186aa1a8e41ed0c2867569faa5f15c8e5e6418ea4c1b730b476e21bd68270b3ea457daf459ae23aaea070b2b9f90cf90a59def8dc79b9e4ef538 + languageName: node + linkType: hard + +"archiver@npm:8.0.0": + version: 8.0.0 + resolution: "archiver@npm:8.0.0" + dependencies: + async: "npm:^3.2.4" + buffer-crc32: "npm:^1.0.0" + is-stream: "npm:^4.0.0" + lazystream: "npm:^1.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + readdir-glob: "npm:^3.0.0" + tar-stream: "npm:^3.0.0" + zip-stream: "npm:^7.0.2" + checksum: 10c0/bcb12f3c8c0baac15ab0b3e92d2b6a249a09c59ffded8b259bdf5ff7ea547a75a93d79e614f99d8ba9d5f4a8ee43bbcedcd07117b1faef3369249fd8070efec8 + languageName: node + linkType: hard + +"archiver@npm:^7.0.1": + version: 7.0.1 + resolution: "archiver@npm:7.0.1" + dependencies: + archiver-utils: "npm:^5.0.2" + async: "npm:^3.2.4" + buffer-crc32: "npm:^1.0.0" + readable-stream: "npm:^4.0.0" + readdir-glob: "npm:^1.1.2" + tar-stream: "npm:^3.0.0" + zip-stream: "npm:^6.0.1" + checksum: 10c0/02afd87ca16f6184f752db8e26884e6eff911c476812a0e7f7b26c4beb09f06119807f388a8e26ed2558aa8ba9db28646ebd147a4f99e46813b8b43158e1438e + languageName: node + linkType: hard + +"argparse@npm:2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"aria-query@npm:^5.3.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e + languageName: node + linkType: hard + +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + +"async-lock@npm:1.4.1": + version: 1.4.1 + resolution: "async-lock@npm:1.4.1" + checksum: 10c0/f696991c7d894af1dc91abc81cc4f14b3785190a35afb1646d8ab91138238d55cabd83bfdd56c42663a008d72b3dc39493ff83797e550effc577d1ccbde254af + languageName: node + linkType: hard + +"async@npm:^3.2.3, async@npm:^3.2.4": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asyncbox@npm:6.3.0": + version: 6.3.0 + resolution: "asyncbox@npm:6.3.0" + dependencies: + p-limit: "npm:^7.2.0" + checksum: 10c0/822a7546f539cbcfe09c4244f478e76c4678e3fbf91a77eebe8abac3aa4d9614d6ce390fcb3b03dc71bc98a45c87b704cc13fb9cdbbefa187cdc64734c82a80b + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"axios@npm:1.16.1": + version: 1.16.1 + resolution: "axios@npm:1.16.1" + dependencies: + follow-redirects: "npm:^1.16.0" + form-data: "npm:^4.0.5" + https-proxy-agent: "npm:^5.0.1" + proxy-from-env: "npm:^2.1.0" + checksum: 10c0/2f77e37e6552bbff8a772d058fb09500198e9188c6b20dc799d82dbe12a8cb506f6eed4e4e62a9ba612a35cbab496faa26d68f9bff14a53af6d15c3e136391a7 + languageName: node + linkType: hard + +"b4a@npm:^1.6.4, b4a@npm:^1.8.1": + version: 1.8.1 + resolution: "b4a@npm:1.8.1" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 10c0/344d8c94b244ec7a9cb516ea43a98216312454cb72478e4b7628a679ee343be237564c53bbe73995ab10ea9bc923b420236081b180b3cf78fd0c945bfc886798 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + +"bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": + version: 2.9.1 + resolution: "bare-events@npm:2.9.1" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 10c0/576fba522bdd2167f35e86791e6c881fdaaf542aa5fca0acfaf8fac7a2c0789340f1cafa0b63e216808efb5cc710887c0cf683f1783293bf98a215d8555ecc36 + languageName: node + linkType: hard + +"bare-fs@npm:^4.0.1, bare-fs@npm:^4.5.5": + version: 4.7.2 + resolution: "bare-fs@npm:4.7.2" + dependencies: + bare-events: "npm:^2.5.4" + bare-path: "npm:^3.0.0" + bare-stream: "npm:^2.6.4" + bare-url: "npm:^2.2.2" + fast-fifo: "npm:^1.3.2" + peerDependencies: + bare-buffer: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + checksum: 10c0/b70ad408b532dc244660a48b56a9d730c9f0e772d493693ad289dfe4c90ea65ce38674d78f0b9242c8856b549e15cb1dd9e2634ae1322c6e8118dc58719126c5 + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.9.1 + resolution: "bare-os@npm:3.9.1" + checksum: 10c0/65219ea4ae8b843395bc91be8c65d4ab6d7479d4b38a247efdde80341523c17fc242d5b0b8f09f89d6e54ef7ebec9700b3d9d4334559ffd4c1398b15cf93fa03 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.1 + resolution: "bare-path@npm:3.0.1" + dependencies: + bare-os: "npm:^3.0.1" + checksum: 10c0/5f9b7ce5643fd0da64997a8630f2707a1a0e943f0f092d1562bd839699042714650268aa7d271d5a1ce089163b15695564ac4419f839431f1cec552d3bda8317 + languageName: node + linkType: hard + +"bare-stream@npm:^2.6.4": + version: 2.13.3 + resolution: "bare-stream@npm:2.13.3" + dependencies: + b4a: "npm:^1.8.1" + streamx: "npm:^2.25.0" + teex: "npm:^1.0.1" + peerDependencies: + bare-abort-controller: "*" + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + checksum: 10c0/1867ca2e89042a7a9c53e8415a0be6e958bdc7231bc0858a793ec35614419eb6e57ad7a27db2de3dc75a799f7432494e27029b3805eee53693629ff64cae16c9 + languageName: node + linkType: hard + +"bare-url@npm:^2.2.2": + version: 2.4.5 + resolution: "bare-url@npm:2.4.5" + dependencies: + bare-path: "npm:^3.0.0" + checksum: 10c0/5077ddb2386548a1efad58418e4d7d6895700b1ecf95d1a63e020f4ae01ebdf7e5f393c9f9b45f3228de32c4803161a80785cf999b03cecdd913516795c50f7c + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"base64-stream@npm:1.0.0": + version: 1.0.0 + resolution: "base64-stream@npm:1.0.0" + checksum: 10c0/5735cb5678c61a01763cc158e599a57bf23cbc1d1d6e14e0bf28a559bf0ac3cc0ef223db415ec8cdc6eeb086b08b6340f2c949be89b5cb53f7d7abb8370dd823 + languageName: node + linkType: hard + +"basic-auth@npm:~2.0.1": + version: 2.0.1 + resolution: "basic-auth@npm:2.0.1" + dependencies: + safe-buffer: "npm:5.1.2" + checksum: 10c0/05f56db3a0fc31c89c86b605231e32ee143fb6ae38dc60616bc0970ae6a0f034172def99e69d3aed0e2c9e7cac84e2d63bc51a0b5ff6ab5fc8808cc8b29923c1 + languageName: node + linkType: hard + +"basic-ftp@npm:^5.0.2": + version: 5.3.1 + resolution: "basic-ftp@npm:5.3.1" + checksum: 10c0/03511b488cd292abfa82a8c0ea3b9573b40d12d2f1518d6f41a9461b012b3376d3e6d50679b38d9b2b4f48fd6e8e0418ac196312ee7e2da13cb801169940d1c3 + languageName: node + linkType: hard + +"big-integer@npm:1.6.x": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"bluebird@npm:3.7.2": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + +"body-parser@npm:2.2.2, body-parser@npm:^2.2.1": + version: 2.2.2 + resolution: "body-parser@npm:2.2.2" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.3" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.7.0" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.1" + raw-body: "npm:^3.0.1" + type-is: "npm:^2.0.1" + checksum: 10c0/95a830a003b38654b75166ca765358aa92ee3d561bf0e41d6ccdde0e1a0c9783cab6b90b20eb635d23172c010b59d3563a137a738e74da4ba714463510d05137 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"bplist-creator@npm:0.1.1": + version: 0.1.1 + resolution: "bplist-creator@npm:0.1.1" + dependencies: + stream-buffers: "npm:2.2.x" + checksum: 10c0/427ec37263ce0e8c68a83f595fc9889a9cbf2e6fda2de18e1f8ef7f0c6ce68c0cdbb7c9c1f3bb3f2d217407af8cffbdf254bf0f71c99f2186175d07752f08a47 + languageName: node + linkType: hard + +"bplist-parser@npm:0.3.2": + version: 0.3.2 + resolution: "bplist-parser@npm:0.3.2" + dependencies: + big-integer: "npm:1.6.x" + checksum: 10c0/4dc307c11d2511a01255e87e370d4ab6f1962b35fdc27605fd4ce9a557a259c2dc9f87822617ddb1f7aa062a71e30ef20d6103329ac7ce235628f637fb0ed763 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1, brace-expansion@npm:^2.0.2": + version: 2.1.1 + resolution: "brace-expansion@npm:2.1.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/63b5ddce608b70b50a76817c0526faf8ea67a9180073d88bb402f6bbc22a22da6b1dfac4f65efc53e5faa80222fb7d44bbf2fc638c3f55365975573f671d0ccb + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.5": + version: 5.0.6 + resolution: "brace-expansion@npm:5.0.6" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/8c919869b90f61d533b341d3340be5ee4413232ea89b8246cbc2f38eb014f1d8182785c98a006eaf6111d02dc9eeffefdc240d5ac158625b2ed084dccd4bbf9b + languageName: node + linkType: hard + +"buffer-crc32@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-crc32@npm:1.0.0" + checksum: 10c0/8b86e161cee4bb48d5fa622cbae4c18f25e4857e5203b89e23de59e627ab26beb82d9d7999f2b8de02580165f61f83f997beaf02980cdf06affd175b651921ab + languageName: node + linkType: hard + +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"bytes@npm:^3.1.2, bytes@npm:~3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"chai@npm:^6.2.2": + version: 6.2.2 + resolution: "chai@npm:6.2.2" + checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 + languageName: node + linkType: hard + +"chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.1.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + +"cheerio-select@npm:^2.1.0": + version: 2.1.0 + resolution: "cheerio-select@npm:2.1.0" + dependencies: + boolbase: "npm:^1.0.0" + css-select: "npm:^5.1.0" + css-what: "npm:^6.1.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + checksum: 10c0/2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 + languageName: node + linkType: hard + +"cheerio@npm:^1.0.0-rc.12": + version: 1.2.0 + resolution: "cheerio@npm:1.2.0" + dependencies: + cheerio-select: "npm:^2.1.0" + dom-serializer: "npm:^2.0.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.2.2" + encoding-sniffer: "npm:^0.2.1" + htmlparser2: "npm:^10.1.0" + parse5: "npm:^7.3.0" + parse5-htmlparser2-tree-adapter: "npm:^7.1.0" + parse5-parser-stream: "npm:^7.1.2" + undici: "npm:^7.19.0" + whatwg-mimetype: "npm:^4.0.0" + checksum: 10c0/91a566aabfa9962f28056045bb7d92d79c0f8f3abb1fb86a852a9d1760556adddeb01a36b6f08fa7c133282375d387ae450a181a659e76c6a64016c30cc3f611 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" + dependencies: + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-convert@npm:^3.1.3": + version: 3.1.3 + resolution: "color-convert@npm:3.1.3" + dependencies: + color-name: "npm:^2.0.0" + checksum: 10c0/427648b442c6ea6dab5ba03f4962201ee59f128c80b25d5a0f7d9aab0ef52519a9db8a9bb3cf40b73f86eb19b5ca6aeb0ab930665f3d14973ce776d7d0448a15 + languageName: node + linkType: hard + +"color-name@npm:^2.0.0": + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: 10c0/9c953caba99557fce472232ded438c56b902c569cb15d66fcfbdf6374206126eef52ab66459f3984d4074b4aa8ab95e6f4b31a8e4f228dea57d0afecf94281fa + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^2.1.3": + version: 2.1.4 + resolution: "color-string@npm:2.1.4" + dependencies: + color-name: "npm:^2.0.0" + checksum: 10c0/18a9fefec153d885e0dbfb076f3a65cdcd19f52d96c719f2f261e90e5b7dafd13c51baac399d7099eac290f004d340045ab9467312dcc8afefe6f877ec5c4428 + languageName: node + linkType: hard + +"color@npm:^5.0.2": + version: 5.0.3 + resolution: "color@npm:5.0.3" + dependencies: + color-convert: "npm:^3.1.3" + color-string: "npm:^2.1.3" + checksum: 10c0/f08a03c5113ae4aa36dba9d2438596b194b897e18b961310643cb63872add1da507cd238df264eb434bbdbe3a377ec41f90d877531acca611523cfcd365db1b6 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:^6.2.0": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"commander@npm:^9.3.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 10c0/5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + +"compress-commons@npm:^6.0.2": + version: 6.0.2 + resolution: "compress-commons@npm:6.0.2" + dependencies: + crc-32: "npm:^1.2.0" + crc32-stream: "npm:^6.0.0" + is-stream: "npm:^2.0.1" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/2347031b7c92c8ed5011b07b93ec53b298fa2cd1800897532ac4d4d1aeae06567883f481b6e35f13b65fc31b190c751df6635434d525562f0203fde76f1f0814 + languageName: node + linkType: hard + +"compress-commons@npm:^7.0.0": + version: 7.0.1 + resolution: "compress-commons@npm:7.0.1" + dependencies: + crc-32: "npm:^1.2.0" + crc32-stream: "npm:^7.0.1" + is-stream: "npm:^4.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/9837b9971c7e536f14b113178e944741a0cb76051db2c84ff23da2b6321f2f6da8ed922d713bb643987d4cd39eeaa537c73d9d7843f9eb74f8fe47afe93d0733 + languageName: node + linkType: hard + +"consola@npm:3.4.2": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10c0/7cebe57ecf646ba74b300bcce23bff43034ed6fbec9f7e39c27cee1dc00df8a21cd336b466ad32e304ea70fba04ec9e890c200270de9a526ce021ba8a7e4c11a + languageName: node + linkType: hard + +"console-control-strings@npm:1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + languageName: node + linkType: hard + +"content-disposition@npm:^1.0.0": + version: 1.1.0 + resolution: "content-disposition@npm:1.1.0" + checksum: 10c0/94e0aef65873e69330f5f187fbc44ebce593bdcb8013dd8a68b7d0f159ca089bd30db3f8095d829f81c341695b60a6085ee6e15e6d775c4a325b586cc8d91974 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"content-type@npm:^2.0.0": + version: 2.0.0 + resolution: "content-type@npm:2.0.0" + checksum: 10c0/491539fff707d7594b0ca4fabcc084bef2a31ffa754ff0a4f80c4377e3963cff0394317f9271c24087596c97fa675bc123d61fa34ffe65b4904e7d3d3098de72 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 + languageName: node + linkType: hard + +"cookie@npm:^0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: 10c0/11dcf4a2e77ee793835d49f2c028838eae58b44f50d1ff08394a610bfd817523f105d6ae4d9b5bef0aad45510f633eb23c903e9902e4409bed1ce70cb82b9bf0 + languageName: node + linkType: hard + +"crc32-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "crc32-stream@npm:6.0.0" + dependencies: + crc-32: "npm:^1.2.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/bf9c84571ede2d119c2b4f3a9ef5eeb9ff94b588493c0d3862259af86d3679dcce1c8569dd2b0a6eff2f35f5e2081cc1263b846d2538d4054da78cf34f262a3d + languageName: node + linkType: hard + +"crc32-stream@npm:^7.0.1": + version: 7.0.1 + resolution: "crc32-stream@npm:7.0.1" + dependencies: + crc-32: "npm:^1.2.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/0d8d217ca4f328bba859a6bef8593028d24841bef2fe4dc44ae892c7cace4301ce6d5676b568642ddb0a709ee3f0f7af1d1ada4c9c399bc5a4ff9b93d5d1071d + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"css-select@npm:^5.1.0": + version: 5.2.2 + resolution: "css-select@npm:5.2.2" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.1.0" + domhandler: "npm:^5.0.2" + domutils: "npm:^3.0.1" + nth-check: "npm:^2.0.1" + checksum: 10c0/d79fffa97106007f2802589f3ed17b8c903f1c961c0fc28aa8a051eee0cbad394d8446223862efd4c1b40445a6034f626bb639cf2035b0bfc468544177593c99 + languageName: node + linkType: hard + +"css-shorthand-properties@npm:^1.1.1": + version: 1.1.2 + resolution: "css-shorthand-properties@npm:1.1.2" + checksum: 10c0/848445ae836da55a3e00333b8413e0ade323d292ebd7336c9ebe1c1da6adc2b7d6e30e6aca808a37e33c5ba4923b795affe21229a5942098534ee3ad77beea52 + languageName: node + linkType: hard + +"css-value@npm:^0.0.1": + version: 0.0.1 + resolution: "css-value@npm:0.0.1" + checksum: 10c0/1d3f5177df6c8d0ef26b98e2c3376b44c4a3898336bb2fb38d3ac38ee2e2848a4ca4fddec291108e1a254439f2c1462ac5cf71e342480b9123ac5f3cd1251cd5 + languageName: node + linkType: hard + +"css-what@npm:^6.1.0": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10c0/91e24c26fb977b4ccef30d7007d2668c1c10ac0154cc3f42f7304410e9594fb772aea4f30c832d2993b132ca8d99338050866476210316345ec2e7d47b248a56 + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:^6.0.2": + version: 6.0.2 + resolution: "data-uri-to-buffer@npm:6.0.2" + checksum: 10c0/f76922bf895b3d7d443059ff278c9cc5efc89d70b8b80cd9de0aa79b3adc6d7a17948eefb8692e30398c43635f70ece1673d6085cc9eba2878dbc6c6da5292ac + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:3.1.0": + version: 3.1.0 + resolution: "debug@npm:3.1.0" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/5bff34a352d7b2eaa31886eeaf2ee534b5461ec0548315b2f9f80bd1d2533cab7df1fa52e130ce27bc31c3945fbffb0fc72baacdceb274b95ce853db89254ea4 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:^3.1.0": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decamelize@npm:^6.0.0, decamelize@npm:^6.0.1": + version: 6.0.1 + resolution: "decamelize@npm:6.0.1" + checksum: 10c0/c0a3a529591ebab1d1a9458b60684194e91d904e9b0a56367d3d507b2c8ab89dfd40c61423ca6a1eb2f70e2d44d2efe78f3342326395d3738d1d42592b1a6224 + languageName: node + linkType: hard + +"deepmerge-ts@npm:^7.0.3": + version: 7.1.5 + resolution: "deepmerge-ts@npm:7.1.5" + checksum: 10c0/3a265a2086f334e3ecf43a7d4138c950cb99e0b39e816fa7fd7f5326161364e51b13010906908212667619066f5b48de738ed42543212323fbbb5d4ed7ebdc84 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"depd@npm:^2.0.0, depd@npm:~2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"diff@npm:9.0.0": + version: 9.0.0 + resolution: "diff@npm:9.0.0" + checksum: 10c0/a971cc88f66071a33bd3942db2f51b57d484e9856265ae45cf44fb28ab2fde91f132d9c26d8be0fb6082d2be94d29e1295c1adb251b7461935d6a2dd304cd161 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a + languageName: node + linkType: hard + +"domutils@npm:^3.0.1, domutils@npm:^3.2.2": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"duplexer@npm:~0.1.1": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"edge-paths@npm:^3.0.5": + version: 3.0.5 + resolution: "edge-paths@npm:3.0.5" + dependencies: + "@types/which": "npm:^2.0.1" + which: "npm:^2.0.2" + checksum: 10c0/690c3d274004ab1ea87be50d261690c788ad27debdb0b7a38b0d91e823510b2ef3aa58735666cfeafc88e2d935f329f968901caee860cde3f50110f1d383e6e3 + languageName: node + linkType: hard + +"edgedriver@npm:^6.1.2": + version: 6.3.0 + resolution: "edgedriver@npm:6.3.0" + dependencies: + "@wdio/logger": "npm:^9.18.0" + "@zip.js/zip.js": "npm:^2.8.11" + decamelize: "npm:^6.0.1" + edge-paths: "npm:^3.0.5" + fast-xml-parser: "npm:^5.3.3" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + which: "npm:^6.0.0" + bin: + edgedriver: bin/edgedriver.js + checksum: 10c0/95d276332e1d4022826df10779d5a1804713e239ecd42e1a4fc20884c4187e0e5edd3dce17401407766c127a2a6cab95b230af1000dccf658b79166f6ed2a887 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.6.0 + resolution: "emoji-regex@npm:10.6.0" + checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + +"encodeurl@npm:^2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"encoding-sniffer@npm:^0.2.1": + version: 0.2.1 + resolution: "encoding-sniffer@npm:0.2.1" + dependencies: + iconv-lite: "npm:^0.6.3" + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/d6b591880788f3baf8dd1744636dd189d24a1ec93e6f9817267c60ac3458a5191ca70ab1a186fb67731beff1c3489c6527dfdc4718158ed8460ab2f400dd5e7d + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 + languageName: node + linkType: hard + +"entities@npm:^4.2.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 + languageName: node + linkType: hard + +"entities@npm:^7.0.1": + version: 7.0.1 + resolution: "entities@npm:7.0.1" + checksum: 10c0/b4fb9937bb47ecb00aaaceb9db9cdd1cc0b0fb649c0e843d05cf5dbbd2e9d2df8f98721d8b1b286445689c72af7b54a7242fc2d63ef7c9739037a8c73363e7ca + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-module-lexer@npm:^2.0.0": + version: 2.1.0 + resolution: "es-module-lexer@npm:2.1.0" + checksum: 10c0/93bcf2454fa72d67fe3ccd0abef8ce7933f5840a319513418a643dd8e9c6aa8f49709cecfae02ded722805dd327232d30723a807cc52e6809d6ac697c62c29fb + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.2 + resolution: "es-object-atoms@npm:1.1.2" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1772861f094f739d6f41b579cfb9a18579daffeb434552a370a5fbef50a32d22227e27b63fdbb757b7ddd429d1b42fe52ccae7966d9302a2ec221b6f1b41bbc4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + +"esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"etag@npm:^1.8.1, etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: "npm:^2.7.0" + checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"execa@npm:^9.5.2": + version: 9.6.1 + resolution: "execa@npm:9.6.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.1" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.2.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10c0/636b36585306a3c8bc3a9d7b25d2d915fb06d8c9b9b02a804280d62562de3b34535affc1b7702b039320e0953daa6545a073f3c4b63fe974c1fe11336c56b467 + languageName: node + linkType: hard + +"expect-type@npm:^1.3.0": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"express@npm:5.2.1": + version: 5.2.1 + resolution: "express@npm:5.2.1" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.1" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 + languageName: node + linkType: hard + +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^2.0.1": + version: 2.0.1 + resolution: "fast-deep-equal@npm:2.0.1" + checksum: 10c0/1602e0d6ed63493c865cc6b03f9070d6d3926e8cd086a123060b58f80a295f3f08b1ecfb479ae7c45b7fd45535202aea7cf5b49bc31bffb81c20b1502300be84 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.1.2 + resolution: "fast-uri@npm:3.1.2" + checksum: 10c0/5b35641895959f3f7ab7a7b1b5542bded159346f25ec9f256817b206d50b64eda5828e90d605a2e2fc645c90519a7259c2bab2c942ee728c88b88e5be21b090d + languageName: node + linkType: hard + +"fast-xml-builder@npm:^1.2.0": + version: 1.2.0 + resolution: "fast-xml-builder@npm:1.2.0" + dependencies: + path-expression-matcher: "npm:^1.5.0" + xml-naming: "npm:^0.1.0" + checksum: 10c0/84bb105cd04e91d6dcb746c4dbaeb12903b510e7ab9a06ffde55b5a582e005559a87d84467f18a655c6c4baf098f696fd74cee3cbe1aea9d01385907768ba32d + languageName: node + linkType: hard + +"fast-xml-parser@npm:^5.3.3": + version: 5.8.0 + resolution: "fast-xml-parser@npm:5.8.0" + dependencies: + "@nodable/entities": "npm:^2.1.0" + fast-xml-builder: "npm:^1.2.0" + path-expression-matcher: "npm:^1.5.0" + strnum: "npm:^2.3.0" + xml-naming: "npm:^0.1.0" + bin: + fxparser: src/cli/cli.js + checksum: 10c0/cd0828b7daf3f683c64d0d6a0c719f1476d4f02f1089cf345a9bc0b886e7d5fa18c11da025d480ea67a41765be63135cbd952051942c9d0b422a5d4dde11814e + languageName: node + linkType: hard + +"fastest-levenshtein@npm:1.0.16": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + +"finalhandler@npm:^2.1.0": + version: 2.1.1 + resolution: "finalhandler@npm:2.1.1" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10c0/6bd664e21b7b2e79efcaace7d1a427169f61cce048fae68eb56290e6934e676b78e55d89f5998c5508871345bc59a61f47002dc505dc7288be68cceac1b701e2 + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.1 + resolution: "find-up-simple@npm:1.0.1" + checksum: 10c0/ad34de157b7db925d50ff78302fefb28e309f3bc947c93ffca0f9b0bccf9cf1a2dc57d805d5c94ec9fc60f4838f5dbdfd2a48ecd77c23015fa44c6dd5f60bc40 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + +"follow-redirects@npm:^1.16.0": + version: 1.16.0 + resolution: "follow-redirects@npm:1.16.0" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/a1e2900163e6f1b4d1ed5c221b607f41decbab65534c63fe7e287e40a5d552a6496e7d9d7d976fa4ba77b4c51c11e5e9f683f10b43011ea11e442ff128d0e181 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"form-data@npm:4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b + languageName: node + linkType: hard + +"form-data@npm:^4.0.5": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc + languageName: node + linkType: hard + +"fresh@npm:~0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"ftp-response-parser@npm:^1.0.1": + version: 1.0.1 + resolution: "ftp-response-parser@npm:1.0.1" + dependencies: + readable-stream: "npm:^1.0.31" + checksum: 10c0/b10207924ba22514063a3f6c388ac68443d6ee2183a7feda1309dfbaa02659adfeda58c88d2d30b5a2906605710740796265532d8e9e634305e56b7c770f7e15 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"geckodriver@npm:^6.1.0": + version: 6.1.0 + resolution: "geckodriver@npm:6.1.0" + dependencies: + "@wdio/logger": "npm:^9.18.0" + "@zip.js/zip.js": "npm:^2.8.11" + decamelize: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + modern-tar: "npm:^0.7.2" + bin: + geckodriver: bin/geckodriver.js + checksum: 10c0/d7e28b02b40ee3af01a061f33382ef7874bc8d2a9a46fc0ce6209274b1c21c27f7297a0307b6ffd2af87f19f4e8d24c23ca99e03bfed16f9f170e30ffc3437f6 + languageName: node + linkType: hard + +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-east-asian-width@npm:^1.0.0": + version: 1.6.0 + resolution: "get-east-asian-width@npm:1.6.0" + checksum: 10c0/7e72e9550fd49ca5b246f9af6bb2afc129c96412845ff6556b3274fd44817a381702ca17028efe9866b261a3d44254cbf21e6c90cf05b4b61675630af776d431 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d + languageName: node + linkType: hard + +"get-port@npm:^7.0.0": + version: 7.2.0 + resolution: "get-port@npm:7.2.0" + checksum: 10c0/4ed741d9008ad15a24e2098c8971918025cc8241624245e704ecc62bb65160db5c79de5d7112acdaabccbe0714cd0704008c74d43a1f7a24a5875e58b84621be + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-stream@npm:9.0.1, get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-uri@npm:^6.0.1": + version: 6.0.5 + resolution: "get-uri@npm:6.0.5" + dependencies: + basic-ftp: "npm:^5.0.2" + data-uri-to-buffer: "npm:^6.0.2" + debug: "npm:^4.3.4" + checksum: 10c0/c7ff5d5d55de53d23ecce7c5108cc3ed0db1174db43c9aa15506d640283d36ee0956fd8ba1fc50b06a718466cc85794ae9d8860193f91318afe846e3e7010f3a + languageName: node + linkType: hard + +"glob@npm:13.0.6": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + +"glob@npm:^10.0.0, glob@npm:^10.2.2": + version: 10.5.0 + resolution: "glob@npm:10.5.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 + languageName: node + linkType: hard + +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 10c0/108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a + languageName: node + linkType: hard + +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.2, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 + languageName: node + linkType: hard + +"hosted-git-info@npm:^9.0.0": + version: 9.0.3 + resolution: "hosted-git-info@npm:9.0.3" + dependencies: + lru-cache: "npm:^11.1.0" + checksum: 10c0/8f216ccb461ca54ae1846745325ced6a880b53101a58c820b813f067caa301576bf974f787df5688b7f0f1b752cdfcbaa2979751d1fcfd604032cc57bc538607 + languageName: node + linkType: hard + +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 + languageName: node + linkType: hard + +"htmlfy@npm:^0.8.1": + version: 0.8.1 + resolution: "htmlfy@npm:0.8.1" + checksum: 10c0/5c76ffd5d99b66335a7cafefa573b8e63e561bb04e3d40d37cb759a06ea8e2f98be663d678bcbd920f2c90ee097e04e4cafa25f8573c08e01f0072742c741d59 + languageName: node + linkType: hard + +"htmlparser2@npm:^10.1.0": + version: 10.1.0 + resolution: "htmlparser2@npm:10.1.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.2.2" + entities: "npm:^7.0.1" + checksum: 10c0/36394e29b80cfcc5e78e0fa4d3aa21fdaac3e6778d23e5c933e625c290987cd9a724a2eb0753ab60ed0c69dfaba0ab115f0ee50fb112fd8f0c4d522e7e0089a2 + languageName: node + linkType: hard + +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 + languageName: node + linkType: hard + +"http-errors@npm:^2.0.0, http-errors@npm:^2.0.1, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1, http-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http-status-codes@npm:2.3.0": + version: 2.3.0 + resolution: "http-status-codes@npm:2.3.0" + checksum: 10c0/c2412188929e8eed6623eef468c62d0c3c082919c03e9b74fd79cfd060d11783dba44603e38a3cee52d26563fe32005913eaf6120aa8ba907da1238f3eaad5fe + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^8.0.1": + version: 8.0.1 + resolution: "human-signals@npm:8.0.1" + checksum: 10c0/195ac607108c56253757717242e17cd2e21b29f06c5d2dad362e86c672bf2d096e8a3bbb2601841c376c2301c4ae7cff129e87f740aa4ebff1390c163114c7c4 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: 10c0/f8ba7ede69bee9260241ad078d2d535848745ff5f6995c7c7cb41cfdc9ccc213f66e10fa5afb881f90298b24a3f7344b637b592beb4f54e582770cdce3f1f039 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.0.0": + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c + languageName: node + linkType: hard + +"index-to-position@npm:^1.1.0": + version: 1.2.0 + resolution: "index-to-position@npm:1.2.0" + checksum: 10c0/d7ac9fae9fad1d7fbeb7bd92e1553b26e8b10522c2d80af5c362828428a41360e21fc5915d7b8c8227eb0f0d37b12099846ac77381a04d6c0059eb81749e374d + languageName: node + linkType: hard + +"inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ip-address@npm:^10.1.1": + version: 10.2.0 + resolution: "ip-address@npm:10.2.0" + checksum: 10c0/5a00aada6e922c9c69dfc800ed5d0fa3348675ebdeed0e1575f503f27ca385b5f534363c9af7ad1daf64c1f1409388cdd3cc2e9b9b0fe1c924a431378d55075a + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^4.0.0, is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jiti@npm:^2.6.1": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/1b1e2310a490dce1aeea3da5f5dfe18273516c20ce48be2e98eb8ea452d5f3dcc8fd0cfd6d28b4052a24c5dbab6e3089b2d7e79f0bce7915b10d750929563c42 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"jsftp@npm:2.1.3": + version: 2.1.3 + resolution: "jsftp@npm:2.1.3" + dependencies: + debug: "npm:^3.1.0" + ftp-response-parser: "npm:^1.0.1" + once: "npm:^1.4.0" + parse-listing: "npm:^1.1.3" + stream-combiner: "npm:^0.2.2" + unorm: "npm:^1.4.1" + checksum: 10c0/e834bb2b28ebfc52d0eb16512ffbea1e196066a6d42e1cfbb6f68c03468f21a96f97eeeba13a7e79cfbcc1105ae09157c029a8c9c5f01d4fb9f462f50eaf926b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + +"jszip@npm:^3.10.1": + version: 3.10.1 + resolution: "jszip@npm:3.10.1" + dependencies: + lie: "npm:~3.3.0" + pako: "npm:~1.0.2" + readable-stream: "npm:~2.3.6" + setimmediate: "npm:^1.0.5" + checksum: 10c0/58e01ec9c4960383fb8b38dd5f67b83ccc1ec215bf74c8a5b32f42b6e5fb79fada5176842a11409c4051b5b94275044851814a31076bf49e1be218d3ef57c863 + languageName: node + linkType: hard + +"klaw@npm:4.1.0": + version: 4.1.0 + resolution: "klaw@npm:4.1.0" + checksum: 10c0/f2fb70843ab61bc7df9f180307fa35d5b080753f57f6936755d3d707b50b752e210f2b21523c23c0621e161eb920dea66d6139d6b71d8f76b58754902d0e0034 + languageName: node + linkType: hard + +"kleur@npm:^4.1.0": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + +"lazystream@npm:^1.0.0": + version: 1.0.1 + resolution: "lazystream@npm:1.0.1" + dependencies: + readable-stream: "npm:^2.0.5" + checksum: 10c0/ea4e509a5226ecfcc303ba6782cc269be8867d372b9bcbd625c88955df1987ea1a20da4643bf9270336415a398d33531ebf0d5f0d393b9283dc7c98bfcbd7b69 + languageName: node + linkType: hard + +"lie@npm:~3.3.0": + version: 3.3.0 + resolution: "lie@npm:3.3.0" + dependencies: + immediate: "npm:~3.0.5" + checksum: 10c0/56dd113091978f82f9dc5081769c6f3b947852ecf9feccaf83e14a123bc630c2301439ce6182521e5fbafbde88e88ac38314327a4e0493a1bea7e0699a7af808 + languageName: node + linkType: hard + +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 + languageName: node + linkType: hard + +"lilconfig@npm:3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc + languageName: node + linkType: hard + +"locate-app@npm:^2.2.24": + version: 2.5.0 + resolution: "locate-app@npm:2.5.0" + dependencies: + "@promptbook/utils": "npm:0.69.5" + type-fest: "npm:4.26.0" + userhome: "npm:1.0.1" + checksum: 10c0/40a688b72e6153d57026ee0ed56425d697a9f9d8e1a32ff9aa7ecd7baa6a5a468c820849a855f40ebfbbac3378d03828f7d9f0c38830679813245aa54a53bd40 + languageName: node + linkType: hard + +"lockfile@npm:1.0.4": + version: 1.0.4 + resolution: "lockfile@npm:1.0.4" + dependencies: + signal-exit: "npm:^3.0.2" + checksum: 10c0/80b7777ceb43105d9e588733c3efc2514653a5e3a0dae3e61347a1f5381da34dcaa2caaa60c39ed5d4ad31c1735a4831e5639a0ba1c508bfea8dbc9c89777b37 + languageName: node + linkType: hard + +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 10c0/2caf0e4808f319d761d2939ee0642fa6867a4bbf2cfce43276698828380756b99d4c4fa226d881655e6ac298dd453fe12a5ec8ba49861777759494c534936985 + languageName: node + linkType: hard + +"lodash.zip@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.zip@npm:4.2.0" + checksum: 10c0/e596da80a6138e369998b50c78b51ed6cf984b4f239e59056aa18dca5972a213c491c511caf5888a2dec603c67265caf942099bec554a86a5c7ff1937d57f0e4 + languageName: node + linkType: hard + +"lodash@npm:4.18.1, lodash@npm:^4.17.15": + version: 4.18.1 + resolution: "lodash@npm:4.18.1" + checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 + languageName: node + linkType: hard + +"log-symbols@npm:7.0.1": + version: 7.0.1 + resolution: "log-symbols@npm:7.0.1" + dependencies: + is-unicode-supported: "npm:^2.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10c0/71d30f9a44b8604b14df5e7c9b579d739997253db7385339d493ece41ee2cc74c1f96c5b4c0b2c1e0829b05348d4f287e68faab495b7a094a80f51351c816075 + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f + languageName: node + linkType: hard + +"loglevel-plugin-prefix@npm:^0.8.4": + version: 0.8.4 + resolution: "loglevel-plugin-prefix@npm:0.8.4" + checksum: 10c0/357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec + languageName: node + linkType: hard + +"loglevel@npm:^1.6.0": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 + languageName: node + linkType: hard + +"lru-cache@npm:11.5.0": + version: 11.5.0 + resolution: "lru-cache@npm:11.5.0" + checksum: 10c0/b92c2a7518128dec6b244bf3eb9fd79964d316cdeb12865ebfc2cebb4dfe9b24e3767a3923d71e6eb735f56b557fc55f08f150a53097d7805afb628c90158df4 + languageName: node + linkType: hard + +"lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0": + version: 11.5.1 + resolution: "lru-cache@npm:11.5.1" + checksum: 10c0/7b341cea79a8efe9c6a6f20c8757a77eca5b25d7ff983ccf4e11e547b81f6787824baa1c84705251dff84ab4ffac85717ac354b9d02e465f86a9f8b166409979 + languageName: node + linkType: hard + +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + +"magic-string@npm:^0.30.21": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 + languageName: node + linkType: hard + +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 + languageName: node + linkType: hard + +"method-override@npm:3.0.0": + version: 3.0.0 + resolution: "method-override@npm:3.0.0" + dependencies: + debug: "npm:3.1.0" + methods: "npm:~1.1.2" + parseurl: "npm:~1.3.2" + vary: "npm:~1.1.2" + checksum: 10c0/0da9a25961b6dd909698e20fc4598f810ba1632e92928136558854296cdf6baa014f0f9170cf65d88aaec496c7c486fdf914964e24532dce0b15390b946ffabe + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.2": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/35a0dd1035d14d185664f346efcdb72e93ef7a9b6e9ae808bd1f6358227010267fab52657b37562c80fc888ff76becb2b2938deb5e730818b7983bf8bd359767 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimatch@npm:^10.2.2": + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" + dependencies: + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd + languageName: node + linkType: hard + +"minimatch@npm:^5.1.0": + version: 5.1.9 + resolution: "minimatch@npm:5.1.9" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/4202718683815a7288b13e470160a4f9560cf392adef4f453927505817e01ef6b3476ecde13cfcaed17e7326dd3b69ad44eb2daeb19a217c5500f9277893f1d6 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.9 + resolution: "minimatch@npm:9.0.9" + dependencies: + brace-expansion: "npm:^2.0.2" + checksum: 10c0/0b6a58530dbb00361745aa6c8cffaba4c90f551afe7c734830bd95fd88ebf469dd7355a027824ea1d09e37181cfeb0a797fb17df60c15ac174303ac110eb7e86 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"mitt@npm:^3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 + languageName: node + linkType: hard + +"modern-tar@npm:^0.7.2": + version: 0.7.6 + resolution: "modern-tar@npm:0.7.6" + checksum: 10c0/1733590c67f31141a7efafd084d82f1da6818f20a7e6edc66623bf9e91b7451f4da079536e3e0e29b20947ea92219cba8d415cea19734edd15fe3bbd874b4846 + languageName: node + linkType: hard + +"morgan@npm:1.10.1": + version: 1.10.1 + resolution: "morgan@npm:1.10.1" + dependencies: + basic-auth: "npm:~2.0.1" + debug: "npm:2.6.9" + depd: "npm:~2.0.0" + on-finished: "npm:~2.3.0" + on-headers: "npm:~1.1.0" + checksum: 10c0/2ecd68504d29151b516a6233839e4f27ae0312acc4dbcb1fe84ff9b5db0eb9b25f31258a931dcf689184b4858839572095fcc62eef3cbd7339287d59f1424346 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3, ms@npm:~2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb + languageName: node + linkType: hard + +"ncp@npm:2.0.0": + version: 2.0.0 + resolution: "ncp@npm:2.0.0" + bin: + ncp: ./bin/ncp + checksum: 10c0/d515babf9d3205ab9252e7d640af7c3e1a880317016d41f2fce2e6b9c8f60eb8bb6afde30e8c4f8e1e3fa551465f094433c3f364b25a85d6a28ec52c1ad6e067 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"netmask@npm:^2.0.2": + version: 2.1.1 + resolution: "netmask@npm:2.1.1" + checksum: 10c0/c78e31869b0578fb0a9874a0c0fdf0e1f8b3492392d1043355fb11d9ea42ef94e0216c6aee7d8e15db39d1a8caf331f9b144ae3ee43fd951b73a66837711fb09 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 13.0.0 + resolution: "node-gyp@npm:13.0.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + nopt: "npm:^10.0.0" + proc-log: "npm:^7.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" + which: "npm:^7.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/e7525c427db2d16aa368b8947187de83083d2a8dda23e3e096a71c22ae637ac5bb8ed7cf6c871f1b9118cd2729dbfee4ff3a4245e2b79226900227b15831b492 + languageName: node + linkType: hard + +"nopt@npm:^10.0.0": + version: 10.0.1 + resolution: "nopt@npm:10.0.1" + dependencies: + abbrev: "npm:^5.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/980d89257f9587f3e1f77877ddbf905d6aa3b738ec33e49a4fa1a059a0dd82eb28063982b150654a7ae9de386f2ead60e56172db7d37cf56de545f7392a2a26a + languageName: node + linkType: hard + +"normalize-package-data@npm:^8.0.0": + version: 8.0.0 + resolution: "normalize-package-data@npm:8.0.0" + dependencies: + hosted-git-info: "npm:^9.0.0" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/abd9d85912d6435979a5779d30e54b7725a6271e36186f284d00b33886a584d738ca7c2d2569e7f7e1be9cc72d90c1485d58562f546163b49edb87ea30804acf + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 + languageName: node + linkType: hard + +"obug@npm:^2.1.1": + version: 2.1.3 + resolution: "obug@npm:2.1.3" + checksum: 10c0/cb8187fed0a5fc8445507c950e89f3c1bd43895658c398b5803f6b7804dfa0c562975ecce1e67f3d9247d521452a5bfade9e0e951cc0326b7444272f7c24d25f + languageName: node + linkType: hard + +"on-finished@npm:^2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"on-finished@npm:~2.3.0": + version: 2.3.0 + resolution: "on-finished@npm:2.3.0" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/c904f9e518b11941eb60279a3cbfaf1289bd0001f600a950255b1dede9fe3df8cd74f38483550b3bb9485165166acb5db500c3b4c4337aec2815c88c96fcc2ea + languageName: node + linkType: hard + +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10c0/2c3b6b0d68ec9adbd561dc2d61c9b14da8ac03d8a2f0fd9e97bdf0600c887d5d97f664ff3be6876cf40cda6e3c587d73a4745e10b426ac50c7664fc5a0dfc0a1 + languageName: node + linkType: hard + +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"ora@npm:5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"p-limit@npm:^7.2.0": + version: 7.3.0 + resolution: "p-limit@npm:7.3.0" + dependencies: + yocto-queue: "npm:^1.2.1" + checksum: 10c0/8030f0ccc67d80d9c12f2b4ed277c5ede151f80a09cb1b143ab0ee597940784f2cf6e07e92d54c023fe9836784329750c25c6cd4488a7a326c0ae0ec2efca982 + languageName: node + linkType: hard + +"pac-proxy-agent@npm:^7.1.0": + version: 7.2.0 + resolution: "pac-proxy-agent@npm:7.2.0" + dependencies: + "@tootallnate/quickjs-emscripten": "npm:^0.23.0" + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + get-uri: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.6" + pac-resolver: "npm:^7.0.1" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/0265c17c9401c2ea735697931a6553a0c6d8b20c4d7d4e3b3a0506080ba69a8d5ad656e2a6be875411212e2b6ed7a4d9526dd3997e08581fdfb1cbcad454c296 + languageName: node + linkType: hard + +"pac-resolver@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-resolver@npm:7.0.1" + dependencies: + degenerator: "npm:^5.0.0" + netmask: "npm:^2.0.2" + checksum: 10c0/5f3edd1dd10fded31e7d1f95776442c3ee51aa098c28b74ede4927d9677ebe7cebb2636750c24e945f5b84445e41ae39093d3a1014a994e5ceb9f0b1b88ebff5 + languageName: node + linkType: hard + +"package-changed@npm:3.0.0": + version: 3.0.0 + resolution: "package-changed@npm:3.0.0" + dependencies: + commander: "npm:^6.2.0" + bin: + package-changed: bin/package-changed.js + checksum: 10c0/b2a386bb82ececf11cf2728914085915f4a0fff092646f8643ec6cf64c4e5e664f8e589f56bbe9c8f5a86372b4545d576b1da0c91aee518f19472f4b449ad7e4 + languageName: node + linkType: hard + +"package-directory@npm:8.2.0": + version: 8.2.0 + resolution: "package-directory@npm:8.2.0" + dependencies: + find-up-simple: "npm:^1.0.0" + checksum: 10c0/a2426d4ec22098ba8f35e9d0fa0935e0040ddd276d91330c790a68e36c01a41985ddd81ab1878e5ce9d395d98ca04aab99d107cb68431ff77a087c15e14d40a2 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"pako@npm:~1.0.2": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + +"parse-json@npm:^8.3.0": + version: 8.3.0 + resolution: "parse-json@npm:8.3.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + index-to-position: "npm:^1.1.0" + type-fest: "npm:^4.39.1" + checksum: 10c0/0eb5a50f88b8428c8f7a9cf021636c16664f0c62190323652d39e7bdf62953e7c50f9957e55e17dc2d74fc05c89c11f5553f381dbc686735b537ea9b101c7153 + languageName: node + linkType: hard + +"parse-listing@npm:^1.1.3": + version: 1.1.3 + resolution: "parse-listing@npm:1.1.3" + checksum: 10c0/59e72ec5e3cd14d2bb24cbcab1f6533b3bd53c3a554c7c3a71423fac90bd796e0d81e5c339b87177da0cd4c3488658dd1b60e235a67572b3eb4d1c770ac0e8e0 + languageName: node + linkType: hard + +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^7.1.0": + version: 7.1.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.1.0" + dependencies: + domhandler: "npm:^5.0.3" + parse5: "npm:^7.0.0" + checksum: 10c0/e5a4e0b834c84c9e244b5749f8d007f4baaeafac7a1da2c54be3421ffd9ef8fdec4f198bf55cda22e88e6ba95e9943f6ed5aa3ae5900b39972ebf5dc8c3f4722 + languageName: node + linkType: hard + +"parse5-parser-stream@npm:^7.1.2": + version: 7.1.2 + resolution: "parse5-parser-stream@npm:7.1.2" + dependencies: + parse5: "npm:^7.0.0" + checksum: 10c0/e236c61000d38ecad369e725a48506b051cebad8abb00e6d4e8bff7aa85c183820fcb45db1559cc90955bdbbdbd665ea94c41259594e74566fff411478dc7fcb + languageName: node + linkType: hard + +"parse5@npm:^7.0.0, parse5@npm:^7.3.0": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: "npm:^6.0.0" + checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 + languageName: node + linkType: hard + +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"path-expression-matcher@npm:^1.5.0": + version: 1.5.0 + resolution: "path-expression-matcher@npm:1.5.0" + checksum: 10c0/646cb5bc66cd7d809a52288336f3ac1e6223f156fd8e912936e490e590f7f93e8056d4fd25fcbcc7da61bb698fa520112cb050372a3f65e7b79bd4afa0f77610 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 + languageName: node + linkType: hard + +"path-to-regexp@npm:8.4.2, path-to-regexp@npm:^8.0.0": + version: 8.4.2 + resolution: "path-to-regexp@npm:8.4.2" + checksum: 10c0/05b115c49b47ad252ce05faa32930f643f23769c68b8bcfe78ad833545140c48bbffb3266986d6c8d5db13a64cf12e07e0d72d9882cab830efeefa553533ebaf + languageName: node + linkType: hard + +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 + languageName: node + linkType: hard + +"plist@npm:4.0.0": + version: 4.0.0 + resolution: "plist@npm:4.0.0" + dependencies: + "@xmldom/xmldom": "npm:^0.9.10" + xmlbuilder: "npm:^15.1.1" + checksum: 10c0/e2d97e11407e873e39764c7397207790dc31b2ddf8a7685bf602ce828de986ee7cce334deb3a630b65e5e99c4be95ea2f14f8c6bb44a900d11edc7f488ab16a8 + languageName: node + linkType: hard + +"pluralize@npm:8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10c0/2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 + languageName: node + linkType: hard + +"postcss@npm:^8.5.15": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" + dependencies: + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/7f2e63ae22fbe43aace1bf652bd99da4e90737c64194d49e51ddc9cd0f9e51ff2861a7d734379b494deffa03a880a5c65eec70bc29ee9ebaa7136dde3eee8f31 + languageName: node + linkType: hard + +"pretty-ms@npm:^9.2.0": + version: 9.3.0 + resolution: "pretty-ms@npm:9.3.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/555ea39a1de48a30601938aedb76d682871d33b6dee015281c37108921514b11e1792928b1648c2e5589acc73c8ef0fb5e585fb4c718e340a28b86799e90fb34 + languageName: node + linkType: hard + +"proc-log@npm:^7.0.0": + version: 7.0.0 + resolution: "proc-log@npm:7.0.0" + checksum: 10c0/b89c2d862604f35fec795477b0c7e376feab3ba0d4f4d291c4e959567442697cf451ac557d0623c1cc38af45a78128b983410f397a10c5d3a67f76c33de4754b + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c + languageName: node + linkType: hard + +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"proxy-agent@npm:^6.5.0": + version: 6.5.0 + resolution: "proxy-agent@npm:6.5.0" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:^7.0.1" + https-proxy-agent: "npm:^7.0.6" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:^7.1.0" + proxy-from-env: "npm:^1.1.0" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/7fd4e6f36bf17098a686d4aee3b8394abfc0b0537c2174ce96b0a4223198b9fafb16576c90108a3fcfc2af0168bd7747152bfa1f58e8fee91d3780e79aab7fd8 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10c0/ed01729fd4d094eab619cd7e17ce3698b3413b31eb102c4904f9875e677cd207392795d5b4adee9cec359dfd31c44d5ad7595a3a3ad51c40250e141512281c58 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.4 + resolution: "pump@npm:3.0.4" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/2780e66b5471c19e3e3e1063b84f3f6a3a08367f24c5ed552f98cd5901e6ada27c7ad6495d4244f553fd03b01884a4561933064f053f47c8994d84fd352768ea + languageName: node + linkType: hard + +"qs@npm:^6.14.0, qs@npm:^6.14.1": + version: 6.15.2 + resolution: "qs@npm:6.15.2" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/e6fd5f6f0aab06d480fe9ab15cebfc4ce4235303e2f91dc69a8f7f4df1e668a61c11d1cfbabacf4295cbbeb7b670ed23db45307480726259761f98e5695e93a7 + languageName: node + linkType: hard + +"query-selector-shadow-dom@npm:^1.0.1": + version: 1.0.1 + resolution: "query-selector-shadow-dom@npm:1.0.1" + checksum: 10c0/f36de03f170ff1da69c3eecfa7f8b01e450a46dd266c921e17f36076ec59862eee00179489f30cb17c118bb56e868436578c01ea66f671fb358750d6ae474125 + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:^3.0.1": + version: 3.0.2 + resolution: "raw-body@npm:3.0.2" + dependencies: + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.7.0" + unpipe: "npm:~1.0.0" + checksum: 10c0/d266678d08e1e7abea62c0ce5864344e980fa81c64f6b481e9842c5beaed2cdcf975f658a3ccd67ad35fc919c1f6664ccc106067801850286a6cbe101de89f29 + languageName: node + linkType: hard + +"read-pkg@npm:10.1.0": + version: 10.1.0 + resolution: "read-pkg@npm:10.1.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.4" + normalize-package-data: "npm:^8.0.0" + parse-json: "npm:^8.3.0" + type-fest: "npm:^5.4.4" + unicorn-magic: "npm:^0.4.0" + checksum: 10c0/6a284bd00945239f715b8a0e986ad0faf29e184f5f26890734991c2696e48b4fa330939f937faac85bc4a2f6be17f8fce288ecd795b337bb4e37a5b75c464569 + languageName: node + linkType: hard + +"readable-stream@npm:^1.0.31": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10c0/fd86d068da21cfdb10f7a4479f2e47d9c0a9b0c862fc0c840a7e5360201580a55ac399c764b12a4f6fa291f8cee74d9c4b7562e0d53b3c4b2769f2c98155d957 + languageName: node + linkType: hard + +"readdir-glob@npm:^1.1.2": + version: 1.1.3 + resolution: "readdir-glob@npm:1.1.3" + dependencies: + minimatch: "npm:^5.1.0" + checksum: 10c0/a37e0716726650845d761f1041387acd93aa91b28dd5381950733f994b6c349ddc1e21e266ec7cc1f9b92e205a7a972232f9b89d5424d07361c2c3753d5dbace + languageName: node + linkType: hard + +"readdir-glob@npm:^3.0.0": + version: 3.0.0 + resolution: "readdir-glob@npm:3.0.0" + dependencies: + minimatch: "npm:^10.2.2" + checksum: 10c0/9a358c8347b4db2a1f72168da67f7ef8d9ccd51f7fdaa127eed8170a1025e97942705f827b0b45e6fdc0e40f04d0859ba75c3d471ee1fcc9e2cfb9fc81606989 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-from@npm:5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resq@npm:^1.11.0": + version: 1.11.0 + resolution: "resq@npm:1.11.0" + dependencies: + fast-deep-equal: "npm:^2.0.1" + checksum: 10c0/870e70bcbb85fcfe311c6742843decd4ef870252d00f4b041960076f98b2ff4d18cf88aca36d4f4838ca8bc6ded27097fefb31ab3340390adfcb8a82b9474a95 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"ret@npm:~0.5.0": + version: 0.5.0 + resolution: "ret@npm:0.5.0" + checksum: 10c0/220868b194f87bf1998e32e409086eec6b39e860c052bf267f8ad4d0131706a9773d45fd3f91acfb1a7c928fce002b694ab86fdba90bc8d4b8df68fa8645c5cc + languageName: node + linkType: hard + +"rgb2hex@npm:0.2.5": + version: 0.2.5 + resolution: "rgb2hex@npm:0.2.5" + checksum: 10c0/32bf5373fe2690efc2a1761c9b50500faa6248e86ef3051766b06d4e95f3c49acfa6d522da5ea87e5db3ec5412ed777570fd626b1505c54bb5a970653fc9757b + languageName: node + linkType: hard + +"rolldown@npm:1.0.3": + version: 1.0.3 + resolution: "rolldown@npm:1.0.3" + dependencies: + "@oxc-project/types": "npm:=0.133.0" + "@rolldown/binding-android-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-x64": "npm:1.0.3" + "@rolldown/binding-freebsd-x64": "npm:1.0.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-musl": "npm:1.0.3" + "@rolldown/binding-openharmony-arm64": "npm:1.0.3" + "@rolldown/binding-wasm32-wasi": "npm:1.0.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.3" + "@rolldown/pluginutils": "npm:^1.0.0" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-ppc64-gnu": + optional: true + "@rolldown/binding-linux-s390x-gnu": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: ./bin/cli.mjs + checksum: 10c0/5f9dd47b7abf203b16bc600db68542f245e974c800e59ff50b76157d1dada1403657690435b036fabca88e93d13a67c31abe5cfaa6f61ce33717f61720204cdf + languageName: node + linkType: hard + +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 + languageName: node + linkType: hard + +"safaridriver@npm:^1.0.0": + version: 1.0.1 + resolution: "safaridriver@npm:1.0.1" + checksum: 10c0/ee45d882f8193ac4151128ebb6574eef6a518abf637d0d457f7c2aa1a5ed8a29f1c160d86e3242bbbcede97ed927896ad9445e8ece1a31e81c686b03f2023ef0 + languageName: node + linkType: hard + +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0, safe-buffer@npm:~5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-regex2@npm:^5.0.0": + version: 5.1.1 + resolution: "safe-regex2@npm:5.1.1" + dependencies: + ret: "npm:~0.5.0" + bin: + safe-regex2: bin/safe-regex2.js + checksum: 10c0/65c59fb33de8e500fa1d7254cc7f9b6b8b932f925bcfc8d92273ec024c259052a2b3c975bbf5a9f9dd49cd3b0fa394fb56f36d6b10e394404056edfd1223fd17 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sanitize-filename@npm:1.6.4": + version: 1.6.4 + resolution: "sanitize-filename@npm:1.6.4" + dependencies: + truncate-utf8-bytes: "npm:^1.0.0" + checksum: 10c0/b56415a95e4f90dc992cd126b5f45c7b39d178662fbd0dc48f03203e35c58ab8e9eb3f5cebfaabc46f1438093d65a3a3cc96875e2b036a1474e19593bee9a540 + languageName: node + linkType: hard + +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 + languageName: node + linkType: hard + +"semver@npm:7.8.1": + version: 7.8.1 + resolution: "semver@npm:7.8.1" + bin: + semver: bin/semver.js + checksum: 10c0/92d6871d6347e1f99d0ba396a70f2545ccf2a032cda3d378fa0699edf7506b5c6d266aed55c8b88e72bd91a30d2351e4f39db479375374430fcdc4b58f4e3c1a + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.7.3, semver@npm:^7.7.4": + version: 7.8.4 + resolution: "semver@npm:7.8.4" + bin: + semver: bin/semver.js + checksum: 10c0/81b7c296fd7927b80f67fa516b75fa1017caac8167795320de28e76ccbc6f7f01763c30ecd10d6a0d8fd089708ab0548a5aebb94b0870e99c2a2b4600a46389b + languageName: node + linkType: hard + +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.1 + resolution: "send@npm:1.2.1" + dependencies: + debug: "npm:^4.4.3" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.1" + mime-types: "npm:^3.0.2" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.2" + checksum: 10c0/fbbbbdc902a913d65605274be23f3d604065cfc3ee3d78bf9fc8af1dc9fc82667c50d3d657f5e601ac657bac9b396b50ee97bd29cd55436320cf1cddebdcec72 + languageName: node + linkType: hard + +"serialize-error@npm:^12.0.0": + version: 12.0.0 + resolution: "serialize-error@npm:12.0.0" + dependencies: + type-fest: "npm:^4.31.0" + checksum: 10c0/d8422db262dd28422834e0acdaaa2425ba6735f791417cfbcbceb201ddea0e41ccd2865778afeb9b33c28273f01e89a4503fa670f82c0a387de61e2b0f8d74e4 + languageName: node + linkType: hard + +"serve-favicon@npm:2.5.1": + version: 2.5.1 + resolution: "serve-favicon@npm:2.5.1" + dependencies: + etag: "npm:~1.8.1" + fresh: "npm:~0.5.2" + ms: "npm:~2.1.3" + parseurl: "npm:~1.3.2" + safe-buffer: "npm:~5.2.1" + checksum: 10c0/b0860fa122096207357ee11eba34692f0ce9ef5b62f12d41fac5384e905556e44340661cae966df8d59b4bd5b7ee140596b4a1c39e4778216641588c3f246e48 + languageName: node + linkType: hard + +"serve-static@npm:^2.2.0": + version: 2.2.1 + resolution: "serve-static@npm:2.2.1" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10c0/37986096e8572e2dfaad35a3925fa8da0c0969f8814fd7788e84d4d388bc068cf0c06d1658509788e55bed942a6b6d040a8a267fa92bb9ffb1179f8bacde5fd7 + languageName: node + linkType: hard + +"set-blocking@npm:2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + +"setprototypeof@npm:~1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"sharp@npm:0.34.5": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/fd79e29df0597a7d5704b8461c51f944ead91a5243691697be6e8243b966402beda53ddc6f0a53b96ea3cb8221f0b244aa588114d3ebf8734fb4aefd41ab802f + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:1.8.4, shell-quote@npm:^1.8.1": + version: 1.8.4 + resolution: "shell-quote@npm:1.8.4" + checksum: 10c0/86c93678bc394cb81f5ddcdc87df9c95d279ef9652775cd1cd1eed361404169a8d8cbaacaeed232ab09919e36ee1e5363863570390d78571f8c22b7f6312fb40 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.1 + resolution: "side-channel@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + side-channel-list: "npm:^1.0.1" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/dc0ab81d67f61bda9247d053ce93f41c3fd8ad2bdcb9cf9d8d2f8540d488f26d87a5e99ebfc07eea49ec025867b2452b705442d974b1478f0395e69f6bfb3270 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.5": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.9 + resolution: "socks@npm:2.8.9" + dependencies: + ip-address: "npm:^10.1.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2d4350c31142b0931eb1758825b426bcbf4bfb5eed682ca48bc46dc9e7d1930ec366ea574ad49fc6c1fd9e9e17ce243be0ef13e31fc4b0319d9093f1fb19743c + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spacetrim@npm:0.11.59": + version: 0.11.59 + resolution: "spacetrim@npm:0.11.59" + checksum: 10c0/1cb7e55b161ca05b792d0306d87e69d254f2e785397f7dbeb4013fd833ff63cee4f1047d10c9785ede66e4ee97cd1c3bc595e50244447027d29bfb9d0111cc00 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.23 + resolution: "spdx-license-ids@npm:3.0.23" + checksum: 10c0/8495620f6f2a237749cce922ea2d593a66f7885c301b1a0f5542183e7041182f27f616a8f13345cefdea0c9b3e0899328e0aa8cec100cf4f3fac4bb3bd975515 + languageName: node + linkType: hard + +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb + languageName: node + linkType: hard + +"spdy@npm:4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf + languageName: node + linkType: hard + +"split2@npm:^4.2.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"statuses@npm:^2.0.1, statuses@npm:^2.0.2, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f + languageName: node + linkType: hard + +"std-env@npm:^4.0.0-rc.1": + version: 4.1.0 + resolution: "std-env@npm:4.1.0" + checksum: 10c0/2e14b6b490db34cb969a48d9cf7c35bca4a47653914aac2814221baae7b867a5b15940d133625c391621971f98cd2266a5dc7036669960e883f1081db2a56558 + languageName: node + linkType: hard + +"stream-buffers@npm:2.2.x": + version: 2.2.0 + resolution: "stream-buffers@npm:2.2.0" + checksum: 10c0/14a351f0a066eaa08c8c64a74f4aedd87dd7a8e59d4be224703da33dca3eb370828ee6c0ae3fff59a9c743e8098728fc95c5f052ae7741672a31e6b1430ba50a + languageName: node + linkType: hard + +"stream-combiner@npm:^0.2.2": + version: 0.2.2 + resolution: "stream-combiner@npm:0.2.2" + dependencies: + duplexer: "npm:~0.1.1" + through: "npm:~2.3.4" + checksum: 10c0/b5d2782fbfa9251c88e01af1b1f54bc183673a776989dce2842b345be7fc3ce7eb2eade363b3c198ba0e5153a20a96e0014d0d0e884153f885d7ee919f22b639 + languageName: node + linkType: hard + +"streamx@npm:^2.12.5, streamx@npm:^2.15.0, streamx@npm:^2.25.0": + version: 2.28.0 + resolution: "streamx@npm:2.28.0" + dependencies: + events-universal: "npm:^1.0.0" + fast-fifo: "npm:^1.3.2" + text-decoder: "npm:^1.1.0" + checksum: 10c0/1cd5647c4dbdaadf4623b48183bab1d71bdc251e24c8f3baddf9fb9fa75096a7d446aba2c58a4f71964eeb5753f514b59e97bfdf94a60ce2c1b33594410b0342 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string-width@npm:^7.0.0, string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.2.0 + resolution: "strip-ansi@npm:7.2.0" + dependencies: + ansi-regex: "npm:^6.2.2" + checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 + languageName: node + linkType: hard + +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + +"strnum@npm:^2.3.0": + version: 2.4.0 + resolution: "strnum@npm:2.4.0" + dependencies: + anynum: "npm:^1.0.0" + checksum: 10c0/36ac1ca6f511d8216d9b07934359f78afb158eedee73fb057c77b1cffa160a60cb848b35f219bd2c115b0037e8ec3962f492874ea4b10ef021ab6403dbb10e7e + languageName: node + linkType: hard + +"supports-color@npm:10.2.2": + version: 10.2.2 + resolution: "supports-color@npm:10.2.2" + checksum: 10c0/fb28dd7e0cdf80afb3f2a41df5e068d60c8b4f97f7140de2eaed5b42e075d82a0e980b20a2c0efd2b6d73cfacb55555285d8cc719fa0472220715aefeaa1da7c + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"tagged-tag@npm:^1.0.0": + version: 1.0.0 + resolution: "tagged-tag@npm:1.0.0" + checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 + languageName: node + linkType: hard + +"tar-fs@npm:^3.1.1": + version: 3.1.2 + resolution: "tar-fs@npm:3.1.2" + dependencies: + bare-fs: "npm:^4.0.1" + bare-path: "npm:^3.0.0" + pump: "npm:^3.0.0" + tar-stream: "npm:^3.1.5" + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 10c0/9dcbbbef9cdfc27f47651fe679f15952a6a8e6b3c9761c4bf3f416ace41cf462fb6292519bd3e041cadfcc0b89043a6bdecb46ff19f770b6864b77dcde7bad46 + languageName: node + linkType: hard + +"tar-stream@npm:^3.0.0, tar-stream@npm:^3.1.5": + version: 3.2.0 + resolution: "tar-stream@npm:3.2.0" + dependencies: + b4a: "npm:^1.6.4" + bare-fs: "npm:^4.5.5" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/8a06c915f93c9b0906e79867e36a9cfe197da4d41b72e89ec0de99577ae755505d14815c1346b70c2410aa09d3145c3e3af2ff5802b6af84990cdd6c60dbb997 + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.16 + resolution: "tar@npm:7.5.16" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/4f37f3c4bd2ca2755fd736a5df1d573c1a868ec1b1e893346aeafa95ac510f9e2fd1469420bd866cc7904799e5bd4ac62b5d4f03fe27747d6e1e373b44505c5c + languageName: node + linkType: hard + +"teen_process@npm:4.1.3": + version: 4.1.3 + resolution: "teen_process@npm:4.1.3" + dependencies: + shell-quote: "npm:^1.8.1" + checksum: 10c0/1d34393af165cfa3022186e9d4168d32d228918718130fbd83ee531ba8deb4210248a7645f6aba507e5f4168bf51133a16a78d64bb890c873d72c80d0ca4d1e7 + languageName: node + linkType: hard + +"teex@npm:^1.0.1": + version: 1.0.1 + resolution: "teex@npm:1.0.1" + dependencies: + streamx: "npm:^2.12.5" + checksum: 10c0/8df9166c037ba694b49d32a49858e314c60e513d55ac5e084dbf1ddbb827c5fa43cc389a81e87684419c21283308e9d68bb068798189c767ec4c252f890b8a77 + languageName: node + linkType: hard + +"text-decoder@npm:^1.1.0": + version: 1.2.7 + resolution: "text-decoder@npm:1.2.7" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10c0/929938ed154fbadb660a7f3d1aca30b7e53649a731af7583168fcfba0c158046325d35d945926e2a512bb62d1a49a7818151c987ea38b48853f01e1615722fc5 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + +"through@npm:~2.3.4": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^1.0.2": + version: 1.2.4 + resolution: "tinyexec@npm:1.2.4" + checksum: 10c0/153b8db6b080194b558ff145b9cffc36b80a6e07babd644dcfbe49c807eee668c876049d28bdee90b96304476f883352f2dad91b3f86bc23832532f4363e66ff + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c + languageName: node + linkType: hard + +"tinyrainbow@npm:^3.1.0": + version: 3.1.0 + resolution: "tinyrainbow@npm:3.1.0" + checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 + languageName: node + linkType: hard + +"toidentifier@npm:~1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + languageName: node + linkType: hard + +"truncate-utf8-bytes@npm:^1.0.0": + version: 1.0.2 + resolution: "truncate-utf8-bytes@npm:1.0.2" + dependencies: + utf8-byte-length: "npm:^1.0.1" + checksum: 10c0/af2b431fc4314f119b551e5fccfad49d4c0ef82e13ba9ca61be6567801195b08e732ce9643542e8ad1b3df44f3df2d7345b3dd34f723954b6bb43a14584d6b3c + languageName: node + linkType: hard + +"tslib@npm:^2.0.1, tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"type-fest@npm:4.26.0": + version: 4.26.0 + resolution: "type-fest@npm:4.26.0" + checksum: 10c0/3819b65fedd4655ed90703dad9e14248fb61f0a232dce8385e59771bdeaeca08195fe0683d892d62fcd84c0f3bb18bd4b0c3c2ba29023187d267868e75c53076 + languageName: node + linkType: hard + +"type-fest@npm:5.6.0": + version: 5.6.0 + resolution: "type-fest@npm:5.6.0" + dependencies: + tagged-tag: "npm:^1.0.0" + checksum: 10c0/5468a8ffda7f3904e6f7bbd8069eb8b6dd4bd9156e206df7a01d09a73e28cd1afedf74ead9d0fc12841c8c90074194859feca240511c50800962fde1bd9ddcbc + languageName: node + linkType: hard + +"type-fest@npm:^4.31.0, type-fest@npm:^4.39.1": + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4 + languageName: node + linkType: hard + +"type-fest@npm:^5.4.4": + version: 5.7.0 + resolution: "type-fest@npm:5.7.0" + dependencies: + tagged-tag: "npm:^1.0.0" + checksum: 10c0/f71ed17b753649421e419db8cc2e140f930333a1467b1d9cca2e0e4052900fd442f2360bae73f3a6bf9340d949ac46d9a1598c709b4c8089272e7624df9c8716 + languageName: node + linkType: hard + +"type-is@npm:^2.0.1": + version: 2.1.0 + resolution: "type-is@npm:2.1.0" + dependencies: + content-type: "npm:^2.0.0" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10c0/a6018f8f509de48f2c7429305e3a920e73b374fa93127dd0877ae1c2df65a5d33907caac8afb0c37a9b9fc7c49f29e3f55d668963dc845d966930b667c07f50e + languageName: node + linkType: hard + +"typescript@npm:6.0.3": + version: 6.0.3 + resolution: "typescript@npm:6.0.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/4a25ff5045b984370f48f196b3a0120779b1b343d40b9a68d114ea5e5fff099809b2bb777576991a63a5cd59cf7bffd96ff6fe10afcefbcb8bd6fb96ad4b6606 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A6.0.3#optional!builtin": + version: 6.0.3 + resolution: "typescript@patch:typescript@npm%3A6.0.3#optional!builtin::version=6.0.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/2f25c74e65663c248fa1ade2b8459d9ce5372ff9dad07067310f132966ebec1d93f6c42f0baf77a6b6a7a91460463f708e6887013aaade22111037457c6b25df + languageName: node + linkType: hard + +"undici-types@npm:>=7.24.0 <7.24.7": + version: 7.24.6 + resolution: "undici-types@npm:7.24.6" + checksum: 10c0/d9cd8befb643ac904615c280a095ba4240531f6bb4a5e75a22a7483630ca8d3f1016d2ab6ace6ceda1f63b3a2db2fe037fafe121d6917a0187573aa548ff78ca + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + +"undici@npm:^6.21.3, undici@npm:^6.25.0": + version: 6.26.0 + resolution: "undici@npm:6.26.0" + checksum: 10c0/cf2b4caf58c33d6582970991290cc7a6486d6e738845f25dcdd16952d708ec844815c6d30362919764fcaf30f719891289341f1ada496f003ce2700310453a47 + languageName: node + linkType: hard + +"undici@npm:^7.19.0": + version: 7.27.2 + resolution: "undici@npm:7.27.2" + checksum: 10c0/714632147c80eb8eda8a52df51b481d346df5e035ccc1d87eb3bbcb8f92ec25d7cbbe81abdeae5db4e37a93e490c8d2fa2359ecdca4b2c5c6c513dcd2626ad47 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.4.0": + version: 0.4.0 + resolution: "unicorn-magic@npm:0.4.0" + checksum: 10c0/cd6eff90967a5528dfa2016bdb5b38b0cd64c8558f9ba04fb5c2c23f3a232a67dfe2bfa4c45af3685d5f1a40dbac6a36d48e053f80f97ae4da1e0f6a55431685 + languageName: node + linkType: hard + +"unorm@npm:^1.4.1": + version: 1.6.0 + resolution: "unorm@npm:1.6.0" + checksum: 10c0/ff0caa3292f318e2e832d02ad019a401118fe42f5e554dca3b9c7e4a2a3100eda051945711234a6ffbd74088cf51930755782456d30864240936cb3485f80a01 + languageName: node + linkType: hard + +"unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"urlpattern-polyfill@npm:^10.0.0": + version: 10.1.0 + resolution: "urlpattern-polyfill@npm:10.1.0" + checksum: 10c0/5b124fd8d0ae920aa2a48b49a7a3b9ad1643b5ce7217b808fb6877826e751cabc01897fd4c85cd1989c4e729072b63aad5c3ba1c1325e4433e0d2f6329156bf1 + languageName: node + linkType: hard + +"userhome@npm:1.0.1": + version: 1.0.1 + resolution: "userhome@npm:1.0.1" + checksum: 10c0/ded66b35487f4cd255d54b6e9ddb1f6c8bf9c1886495da7afc8433a123406a1b87ce4b32ea932fc7947958149385e3562ca139b3e2abffd9d630b864989d32f0 + languageName: node + linkType: hard + +"utf8-byte-length@npm:^1.0.1": + version: 1.0.5 + resolution: "utf8-byte-length@npm:1.0.5" + checksum: 10c0/e69bda3299608f4cc75976da9fb74ac94801a58b9ca29fdad03a20ec952e7477d7f226c12716b5f36bd4cff8151d1d152d02ee1df3752f017d4b2c725ce3e47a + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"uuid@npm:14.0.0": + version: 14.0.0 + resolution: "uuid@npm:14.0.0" + bin: + uuid: dist-node/bin/uuid + checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.4": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"vary@npm:^1.1.2, vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.0.16 + resolution: "vite@npm:8.0.16" + dependencies: + fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.32.0" + picomatch: "npm:^4.0.4" + postcss: "npm:^8.5.15" + rolldown: "npm:1.0.3" + tinyglobby: "npm:^0.2.17" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: ">=1.21.0" + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + "@vitejs/devtools": + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/d75be3fbe2f63e6a8145325970338afaf0dd4d96ba9175c13f9a286fd5f95afc489401b693e4fa6c0899a4dd0e137be91cdf9401a40a635563911ad5036e3467 + languageName: node + linkType: hard + +"vitest@npm:4.1.8": + version: 4.1.8 + resolution: "vitest@npm:4.1.8" + dependencies: + "@vitest/expect": "npm:4.1.8" + "@vitest/mocker": "npm:4.1.8" + "@vitest/pretty-format": "npm:4.1.8" + "@vitest/runner": "npm:4.1.8" + "@vitest/snapshot": "npm:4.1.8" + "@vitest/spy": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + es-module-lexer: "npm:^2.0.0" + expect-type: "npm:^1.3.0" + magic-string: "npm:^0.30.21" + obug: "npm:^2.1.1" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + std-env: "npm:^4.0.0-rc.1" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^1.0.2" + tinyglobby: "npm:^0.2.15" + tinyrainbow: "npm:^3.1.0" + vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@opentelemetry/api": ^1.9.0 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.1.8 + "@vitest/browser-preview": 4.1.8 + "@vitest/browser-webdriverio": 4.1.8 + "@vitest/coverage-istanbul": 4.1.8 + "@vitest/coverage-v8": 4.1.8 + "@vitest/ui": 4.1.8 + happy-dom: "*" + jsdom: "*" + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@opentelemetry/api": + optional: true + "@types/node": + optional: true + "@vitest/browser-playwright": + optional: true + "@vitest/browser-preview": + optional: true + "@vitest/browser-webdriverio": + optional: true + "@vitest/coverage-istanbul": + optional: true + "@vitest/coverage-v8": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vite: + optional: false + bin: + vitest: vitest.mjs + checksum: 10c0/f459c500f8818c7a2318cd23228b4e5c0b5efb25bf8e5cb7f116c6d26e51482b2f800a8bb19837c0b5f0d05c51519edbf502bc8ceb5bd86868e8facf1d2c498e + languageName: node + linkType: hard + +"wait-port@npm:^1.1.0": + version: 1.1.0 + resolution: "wait-port@npm:1.1.0" + dependencies: + chalk: "npm:^4.1.2" + commander: "npm:^9.3.0" + debug: "npm:^4.3.4" + bin: + wait-port: bin/wait-port.js + checksum: 10c0/1bf321c27ec31b71d2ddb16251bd9bdc3bcdb604a2f895ff780f53b1b97302a1823e4762d0c99954be9ada63d6d2a77e74928e06f11dcd01b9ed1f26eb60b353 + languageName: node + linkType: hard + +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"webdriver@npm:9.28.0": + version: 9.28.0 + resolution: "webdriver@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.1.0" + "@types/ws": "npm:^8.5.3" + "@wdio/config": "npm:9.28.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/protocols": "npm:9.28.0" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + deepmerge-ts: "npm:^7.0.3" + https-proxy-agent: "npm:^7.0.6" + undici: "npm:^6.21.3" + ws: "npm:^8.8.0" + checksum: 10c0/461b28f6bae9fff606010ed978c075b4b4379aa6ea8a58b37507c7363f26ea9c5eae5727ec6ec131c439213548bee741c10d7f85cbb2d79a5da281f7c53db898 + languageName: node + linkType: hard + +"webdriverio@npm:9.28.0": + version: 9.28.0 + resolution: "webdriverio@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.11.30" + "@types/sinonjs__fake-timers": "npm:^8.1.5" + "@wdio/config": "npm:9.28.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/protocols": "npm:9.28.0" + "@wdio/repl": "npm:9.16.2" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + archiver: "npm:^7.0.1" + aria-query: "npm:^5.3.0" + cheerio: "npm:^1.0.0-rc.12" + css-shorthand-properties: "npm:^1.1.1" + css-value: "npm:^0.0.1" + grapheme-splitter: "npm:^1.0.4" + htmlfy: "npm:^0.8.1" + is-plain-obj: "npm:^4.1.0" + jszip: "npm:^3.10.1" + lodash.clonedeep: "npm:^4.5.0" + lodash.zip: "npm:^4.2.0" + query-selector-shadow-dom: "npm:^1.0.1" + resq: "npm:^1.11.0" + rgb2hex: "npm:0.2.5" + serialize-error: "npm:^12.0.0" + urlpattern-polyfill: "npm:^10.0.0" + webdriver: "npm:9.28.0" + peerDependencies: + puppeteer-core: ">=22.x || <=24.x" + peerDependenciesMeta: + puppeteer-core: + optional: true + checksum: 10c0/cf2fa1c8963b1974787797ad33d22b231a900e3311d3367954646c57d8ac278a571820d3570faa269f233bce2ec1c3e5872c0a653b0c4c2700720578aa2ab9c0 + languageName: node + linkType: hard + +"webview-bundle-android-e2e@workspace:.": + version: 0.0.0-use.local + resolution: "webview-bundle-android-e2e@workspace:." + dependencies: + "@types/node": "npm:^25" + "@wvb-playground/testing": "npm:^0.0.0" + "@wvb-playground/webview-hacker-news": "npm:^0.0.0" + appium: "npm:^3.5.0" + execa: "npm:^9.5.2" + tinyglobby: "npm:^0.2.10" + typescript: "npm:6.0.3" + vitest: "npm:4.1.8" + webdriverio: "npm:9.28.0" + languageName: unknown + linkType: soft + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df + languageName: node + linkType: hard + +"which@npm:6.0.1, which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^7.0.0": + version: 7.0.0 + resolution: "which@npm:7.0.0" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/ca0b54f198f78bbc4b7c02e34bda8d335cb352e0adb4cbca1c37b1a957af3a879a82c4c27ca6525bc942f548d8b64f816ef6528360af9f3de55ffb9b979b620d + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + +"winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 + languageName: node + linkType: hard + +"winston@npm:3.19.0": + version: 3.19.0 + resolution: "winston@npm:3.19.0" + dependencies: + "@colors/colors": "npm:^1.6.0" + "@dabh/diagnostics": "npm:^2.0.8" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.7.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.9.0" + checksum: 10c0/341a8ccfb726120209d34e2466040e2ca72cadb1a3402c4fc90425facad002b81275675b4ab9b4432a624311bc47ef7c9fb7652c86fca454d2be2f2ee1882226 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrap-ansi@npm:^9.0.0": + version: 9.0.2 + resolution: "wrap-ansi@npm:9.0.2" + dependencies: + ansi-styles: "npm:^6.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/3305839b9a0d6fb930cb63a52f34d3936013d8b0682ff3ec133c9826512620f213800ffa19ea22904876d5b7e9a3c1f40682f03597d986a4ca881fa7b033688c + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"ws@npm:8.21.0, ws@npm:^8.8.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 + languageName: node + linkType: hard + +"xml-naming@npm:^0.1.0": + version: 0.1.0 + resolution: "xml-naming@npm:0.1.0" + checksum: 10c0/8c7614865361bcb7e53e3e091dac21c567e2b92d447919b2f072775aa9dcfc94a5255bd52fbaa0fd53c93513e53a23a6a835218ad2af512451dbc678392f85fe + languageName: node + linkType: hard + +"xmlbuilder@npm:^15.1.1": + version: 15.1.1 + resolution: "xmlbuilder@npm:15.1.1" + checksum: 10c0/665266a8916498ff8d82b3d46d3993913477a254b98149ff7cff060d9b7cc0db7cf5a3dae99aed92355254a808c0e2e3ec74ad1b04aa1061bdb8dfbea26c18b8 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:2.9.0": + version: 2.9.0 + resolution: "yaml@npm:2.9.0" + bin: + yaml: bin.mjs + checksum: 10c0/f340718df45e97a9551b9bf9dac61c80050bc464513b710debfb5067c380c8472e3b67809cffacb4ab5ffb5e66ef9310816c88b05f371cec60abfedd8c88e0a2 + languageName: node + linkType: hard + +"yargs-parser@npm:22.0.0, yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" + dependencies: + cliui: "npm:^9.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + string-width: "npm:^7.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yauzl@npm:3.3.1": + version: 3.3.1 + resolution: "yauzl@npm:3.3.1" + dependencies: + buffer-crc32: "npm:~0.2.3" + pend: "npm:~1.2.0" + checksum: 10c0/e396b070abb0c528cd4df3b86907142f72e09d5bc1edac262cebbff5b045e3091528a5e54e10a9a7209b031ba94bdcb1ad1ec6d85eecd69ad428bcb4a5c914ae + languageName: node + linkType: hard + +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.2.1": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 10c0/36d4793e9cf7060f9da543baf67c55e354f4862c8d3d34de1a1b1d7c382d44171315cc54abf84d8900b8113d742b830108a1434f4898fb244f9b7e8426d4b8f5 + languageName: node + linkType: hard + +"yoctocolors@npm:^2.1.1": + version: 2.1.2 + resolution: "yoctocolors@npm:2.1.2" + checksum: 10c0/b220f30f53ebc2167330c3adc86a3c7f158bcba0236f6c67e25644c3188e2571a6014ffc1321943bb619460259d3d27eb4c9cc58c2d884c1b195805883ec7066 + languageName: node + linkType: hard + +"zip-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "zip-stream@npm:6.0.1" + dependencies: + archiver-utils: "npm:^5.0.0" + compress-commons: "npm:^6.0.2" + readable-stream: "npm:^4.0.0" + checksum: 10c0/50f2fb30327fb9d09879abf7ae2493705313adf403e794b030151aaae00009162419d60d0519e807673ec04d442e140c8879ca14314df0a0192de3b233e8f28b + languageName: node + linkType: hard + +"zip-stream@npm:^7.0.2": + version: 7.0.5 + resolution: "zip-stream@npm:7.0.5" + dependencies: + compress-commons: "npm:^7.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/e1669e17031c3c7243cb9014eacfaa66f4cd2e0d613a57dbee9caf7122ae869f8b2ea2e5891b5d9eee2897060c01db048b9b2a544ba83e227f6c162905282e48 + languageName: node + linkType: hard diff --git a/gradle.properties b/gradle.properties index 377538c..15050e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,3 +3,10 @@ org.gradle.configuration-cache=true +# Give the daemon enough heap/metaspace for AGP + Kotlin; the defaults +# (512m heap / 384m metaspace) intermittently OOM and fail tasks spuriously. +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8 + +# Required by the androidx.webkit dependency (optional service-worker interception). +android.useAndroidX=true + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b76ec8a..f0ee802 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,14 +3,21 @@ [versions] android-gradle-plugin = "8.10.1" +androidx-annotation = "1.8.1" +androidx-webkit = "1.12.1" jna = "5.17.0" kotlin = "2.3.21" kotlinx-coroutines = "1.10.2" [libraries] -jna = { module = "net.java.dev.jna:jna", version.ref = "jna" } +androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "androidx-annotation" } +androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "androidx-webkit" } +# JNA is declared inline in lib/build.gradle.kts as "...:jna:@aar" (the +# Android AAR variant); only the version below is referenced from the catalog. kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } [plugins] +android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" } android-library = { id = "com.android.library", version.ref = "android-gradle-plugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } \ No newline at end of file diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index c68780d..7aef0ec 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } android { - namespace = "dev.wvb.jvm" + namespace = "dev.wvb" compileSdk = 35 defaultConfig { @@ -30,6 +30,8 @@ android { } dependencies { - implementation(libs.jna) + implementation("net.java.dev.jna:jna:${libs.versions.jna.get()}@aar") implementation(libs.kotlinx.coroutines.core) + implementation(libs.androidx.annotation) + implementation(libs.androidx.webkit) } diff --git a/lib/lint.xml b/lib/lint.xml new file mode 100644 index 0000000..c512edb --- /dev/null +++ b/lib/lint.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/lib/src/main/kotlin/dev/wvb/Conversions.kt b/lib/src/main/kotlin/dev/wvb/Conversions.kt new file mode 100644 index 0000000..328c355 --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/Conversions.kt @@ -0,0 +1,185 @@ +package dev.wvb + +import android.webkit.WebResourceResponse +import java.io.ByteArrayInputStream + +/** + * Maps a [android.webkit.WebResourceRequest.getMethod] string to the FFI [HttpMethod]. + * + * Defaults to [HttpMethod.GET] for unknown or missing methods, mirroring the + * other platform integrations. + */ +internal fun httpMethodFrom(method: String?): HttpMethod = + when (method?.uppercase()) { + "GET" -> HttpMethod.GET + "HEAD" -> HttpMethod.HEAD + "OPTIONS" -> HttpMethod.OPTIONS + "POST" -> HttpMethod.POST + "PUT" -> HttpMethod.PUT + "PATCH" -> HttpMethod.PATCH + "DELETE" -> HttpMethod.DELETE + "TRACE" -> HttpMethod.TRACE + "CONNECT" -> HttpMethod.CONNECT + else -> HttpMethod.GET + } + +/** + * Splits a `Content-Type` value into a bare MIME type and a charset, e.g. + * `"text/html; charset=utf-8"` -> `("text/html", "utf-8")`. + * + * [WebResourceResponse] takes the MIME type and encoding as separate arguments, + * so the charset must be peeled off the `Content-Type` header. + */ +internal fun parseContentType(contentType: String?): Pair { + if (contentType.isNullOrBlank()) return null to null + val parts = contentType.split(';') + val mime = parts.first().trim().ifEmpty { null } + var charset: String? = null + for (i in 1 until parts.size) { + val attr = parts[i].trim() + if (attr.startsWith("charset=", ignoreCase = true)) { + charset = attr.substring("charset=".length).trim().trim('"').ifEmpty { null } + } + } + return mime to charset +} + +/** + * A non-empty HTTP reason phrase for [status]. + * + * [WebResourceResponse] throws `IllegalArgumentException` when the reason phrase + * is empty, so this never returns an empty string: unknown codes fall back to a + * generic, code-derived phrase. + */ +internal fun reasonPhrase(status: Int): String = + when (status) { + 200 -> "OK" + 201 -> "Created" + 202 -> "Accepted" + 204 -> "No Content" + 206 -> "Partial Content" + 301 -> "Moved Permanently" + 302 -> "Found" + 303 -> "See Other" + 304 -> "Not Modified" + 307 -> "Temporary Redirect" + 308 -> "Permanent Redirect" + 400 -> "Bad Request" + 401 -> "Unauthorized" + 403 -> "Forbidden" + 404 -> "Not Found" + 405 -> "Method Not Allowed" + 406 -> "Not Acceptable" + 409 -> "Conflict" + 410 -> "Gone" + 416 -> "Range Not Satisfiable" + 500 -> "Internal Server Error" + 501 -> "Not Implemented" + 502 -> "Bad Gateway" + 503 -> "Service Unavailable" + else -> "Status $status" + } + +/** + * The MIME type used when a response carries no usable `Content-Type`. Bundle + * entries always set one; this only guards the rare header-less case. + */ +private const val DEFAULT_MIME_TYPE = "application/octet-stream" + +/** Header name (lowercased) for the `Content-Type` peeled into mime/encoding. */ +private const val HEADER_CONTENT_TYPE = "content-type" + +/** Header name (lowercased) reset to `0` for body-less responses. */ +private const val HEADER_CONTENT_LENGTH = "content-length" + +/** + * Headers dropped before handing the response to the WebView (lowercased): + * - `content-type` is supplied via the separate mime/encoding arguments; + * - `content-encoding` would make the WebView expect to decode an + * already-decoded body (it does not gunzip the stream), corrupting rendering; + * - `transfer-encoding`/`connection` are hop-by-hop framing headers. + */ +private val STRIPPED_HEADERS = setOf( + HEADER_CONTENT_TYPE, + "content-encoding", + "transfer-encoding", + "connection", +) + +/** + * `true` for HTTP statuses [WebResourceResponse] can represent. + * + * The constructor throws `IllegalArgumentException` for codes below `100`, above + * `599`, or in the redirect range `300..399` (which includes `304 Not Modified`). + * Such responses are surfaced as a `502` instead of crashing the render thread. + */ +private fun isRepresentableStatus(code: Int): Boolean = + code in 100..299 || code in 400..599 + +/** + * Converts an FFI [HttpResponse] into a [WebResourceResponse] that the WebView + * can render. + * + * - Unrepresentable statuses (redirects/`304`, out-of-range) become a `502`; the + * reason phrase is always a non-empty ASCII string (both are crash sources). + * - `Content-Type` is split into the MIME type and encoding arguments; it and the + * encoding/framing headers are dropped from [WebResourceResponse.responseHeaders]. + * - `Content-Length` is set authoritatively to the served byte count (never the + * handler's value), so a stale length — e.g. a HEAD `200` that kept the file + * size — cannot make the WebView hang waiting for bytes that never arrive. + * `Content-Range` is preserved verbatim, so `206` media seeking keeps working; + * `204`/`1xx` are served body-less. + */ +internal fun HttpResponse.toWebResourceResponse(): WebResourceResponse { + val statusCode = status.toInt() + if (!isRepresentableStatus(statusCode)) { + return synthesizedResponse(502, "unsupported HTTP status $statusCode") + } + + val contentType = headers.entries + .firstOrNull { it.key.equals(HEADER_CONTENT_TYPE, ignoreCase = true) } + ?.value + val (mimeFromHeader, encoding) = parseContentType(contentType) + val mimeType = mimeFromHeader ?: DEFAULT_MIME_TYPE + + val bodyless = statusCode == 204 || statusCode in 100..199 + val payload = if (bodyless) ByteArray(0) else body + + val responseHeaders = LinkedHashMap() + for ((key, value) in headers) { + val lower = key.lowercase() + if (lower in STRIPPED_HEADERS) continue + if (lower == HEADER_CONTENT_LENGTH) continue // set authoritatively below + responseHeaders[key] = value + } + responseHeaders["Content-Length"] = payload.size.toString() + + return WebResourceResponse( + mimeType, + encoding, + statusCode, + reasonPhrase(statusCode), + responseHeaders, + ByteArrayInputStream(payload), + ) +} + +/** + * A plain-text error response surfaced to the WebView when a handler throws, + * mirroring the Tauri integration's 500 fallback. Returning a response (rather + * than `null`) keeps the failure inside the bundle origin instead of leaking the + * request to the network. + */ +internal fun errorWebResourceResponse(error: Throwable): WebResourceResponse = + synthesizedResponse(500, "webview bundle error: ${error.message ?: error.toString()}") + +/** A plain-text [WebResourceResponse] with [status] and [message] as the body. */ +private fun synthesizedResponse(status: Int, message: String): WebResourceResponse = + WebResourceResponse( + "text/plain", + "utf-8", + status, + reasonPhrase(status), + LinkedHashMap(), + ByteArrayInputStream(message.toByteArray(Charsets.UTF_8)), + ) diff --git a/lib/src/main/kotlin/dev/wvb/Source.kt b/lib/src/main/kotlin/dev/wvb/Source.kt new file mode 100644 index 0000000..af8a7dc --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/Source.kt @@ -0,0 +1,169 @@ +package dev.wvb + +import android.content.Context +import java.io.File +import java.io.FileNotFoundException +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicLong + +/** + * Options for building a [BundleSource] with sensible Android defaults. + * + * Every field is optional and falls back to an app-private directory when + * omitted: + * - [builtinDir] -> `/wvb/builtin` — the read-only bundles shipped with + * the app. The native source reads real files, so APK `assets` are copied here + * first (see [builtinAssetsDir] / [installBuiltinBundlesFromAssets]). + * - [remoteDir] -> `/wvb/remote` — the writable directory holding + * bundles downloaded at runtime. + * + * @property builtinAssetsDir when non-null, the APK `assets/` + * directory is extracted into [builtinDir] when the source is built. Set to + * `null` to disable extraction (e.g. when you populate [builtinDir] yourself). + */ +public data class SourceOptions( + val builtinDir: String? = null, + val remoteDir: String? = null, + val builtinManifestFilepath: String? = null, + val remoteManifestFilepath: String? = null, + val builtinAssetsDir: String? = "bundles", +) + +/** `/wvb/builtin` — the read-only directory for bundles shipped with the app. */ +public fun defaultBuiltinDir(context: Context): String = + File(context.filesDir, "wvb/builtin").absolutePath + +/** `/wvb/remote` — the writable directory for bundles downloaded at runtime. */ +public fun defaultRemoteDir(context: Context): String = + File(context.filesDir, "wvb/remote").absolutePath + +/** + * Builds a [BundleSource] from [options], filling in default directories, copying + * bundled assets into the builtin dir, and creating the writable remote dir. + * + * Performs file I/O (asset extraction, `mkdirs`); prefer building off the main + * thread when shipping large builtin bundles. + */ +public fun makeBundleSource(context: Context, options: SourceOptions = SourceOptions()): BundleSource { + val builtinDir = options.builtinDir ?: defaultBuiltinDir(context) + val remoteDir = options.remoteDir ?: defaultRemoteDir(context) + + File(builtinDir).mkdirs() + File(remoteDir).mkdirs() + + options.builtinAssetsDir?.let { assetDir -> + installBuiltinBundlesFromAssets(context, assetDir, builtinDir) + } + + return BundleSource( + BundleSourceConfig( + builtinDir = builtinDir, + remoteDir = remoteDir, + builtinManifestFilepath = options.builtinManifestFilepath, + remoteManifestFilepath = options.remoteManifestFilepath, + ), + ) +} + +/** Per-destination locks serializing concurrent same-process extraction. */ +private val extractionLocks = ConcurrentHashMap() + +/** Source of unique temp-file suffixes (combined with the pid for cross-process uniqueness). */ +private val tmpCounter = AtomicLong(0) + +/** + * Copies bundles shipped in the APK `assets/[assetDir]` (default `bundles/`) into + * [builtinDir] so the native [BundleSource] can read them as real files. The + * directory tree (the manifest plus every `.wvb`) is copied recursively as an + * additive overlay — files removed from the assets in a later app version are + * **not** deleted from [builtinDir]; clear it yourself for a clean slate. + * + * Idempotent: a file is copied only when missing or a different size, so repeat + * launches are cheap. No-op when the asset directory does not exist. Returns the + * destination [builtinDir]. Throws [java.io.IOException] on a genuine copy failure + * (e.g. the disk is full). + * + * Concurrency-safe: same-process callers targeting the same [builtinDir] are + * serialized, and each file is written to a unique temp and atomically renamed, so + * concurrent extractions (multiple threads, or multiple processes sharing the + * directory) and concurrent readers always observe a complete file — never a torn + * or interleaved one. + */ +public fun installBuiltinBundlesFromAssets( + context: Context, + assetDir: String = "bundles", + builtinDir: String? = null, +): String { + val destRoot = builtinDir ?: defaultBuiltinDir(context) + // Serialize same-process extraction per destination so concurrent constructors + // don't redo each other's work; cross-process safety comes from the unique + // temp + atomic rename in copyAssetFile. + val lock = extractionLocks.getOrPut(File(destRoot).absolutePath) { Any() } + synchronized(lock) { + copyAssetTree(context, assetDir.trim('/'), File(destRoot)) + } + return destRoot +} + +/** + * Recursively copies an asset directory into [dest] (additive overlay), copying + * changed files only; never deletes existing destination entries. + */ +private fun copyAssetTree(context: Context, assetPath: String, dest: File) { + // `list` returns the children of a directory, or an empty array for a file + // (and for an empty directory, which bundle dirs never are). A genuine + // IOException is allowed to propagate rather than be silently treated as "no + // children". + val children = context.assets.list(assetPath) ?: emptyArray() + + if (children.isEmpty()) { + copyAssetFile(context, assetPath, dest) + return + } + + dest.mkdirs() + for (child in children) { + val childAsset = if (assetPath.isEmpty()) child else "$assetPath/$child" + copyAssetTree(context, childAsset, File(dest, child)) + } +} + +/** + * Copies a single asset file to [dest] when missing or a different size. + * + * The asset stream's [java.io.InputStream.available] reports the full uncompressed + * length up front (true for `AssetManager` streams, compressed or not), so it is + * compared against the already-extracted file's length to skip unchanged copies. + * The bytes are written to a **unique** sibling temp and atomically renamed, so a + * process killed mid-copy — or a concurrent extraction from another thread or + * process — cannot leave a torn destination (the temp name carries the pid and a + * counter, so concurrent copies never share one). A path that turns out not to be + * a readable file (e.g. an empty asset directory) is skipped; a real + * [java.io.IOException] propagates. + */ +private fun copyAssetFile(context: Context, assetPath: String, dest: File) { + val input = try { + context.assets.open(assetPath) + } catch (_: FileNotFoundException) { + return // not a readable file (e.g. an empty asset directory) — benign skip + } + input.use { stream -> + val incomingSize = stream.available().toLong() + if (dest.isFile && dest.length() == incomingSize) return + dest.parentFile?.mkdirs() + val tmp = File( + dest.parentFile, + "${dest.name}.${android.os.Process.myPid()}.${tmpCounter.getAndIncrement()}.tmp", + ) + try { + tmp.outputStream().use { output -> stream.copyTo(output) } + // renameTo over an existing destination is an atomic replace on the + // app's filesystem; fall back to a copy only in the rare failure case. + if (!tmp.renameTo(dest)) { + tmp.copyTo(dest, overwrite = true) + } + } finally { + tmp.delete() + } + } +} diff --git a/lib/src/main/kotlin/dev/wvb/WebViewBundle.kt b/lib/src/main/kotlin/dev/wvb/WebViewBundle.kt new file mode 100644 index 0000000..c68ef65 --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/WebViewBundle.kt @@ -0,0 +1,248 @@ +package dev.wvb + +import android.content.Context +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import kotlinx.coroutines.runBlocking + +/** Remote endpoint configuration for [WebViewBundleUpdaterConfig]. */ +public data class WebViewBundleRemoteConfig( + /** The base URL of the remote server, e.g. `"https://bundles.example.com"`. */ + val endpoint: String, +) + +/** + * Updater configuration for [WebViewBundleConfig]. + * + * When present, [WebViewBundle] builds a [Remote] from [remote] and an [Updater] + * wired to the source, both exposed on the instance. + */ +public data class WebViewBundleUpdaterConfig( + val remote: WebViewBundleRemoteConfig, + /** Release channel (e.g. `"stable"`, `"beta"`). */ + val channel: String? = null, + val integrityPolicy: IntegrityPolicy? = null, + val signatureVerifier: SignatureVerifierOptions? = null, +) + +/** + * High-level configuration for [WebViewBundle]. + * + * @property protocols the protocols to register, evaluated in order (first whose + * matcher accepts the host serves the request). [WebViewBundleProtocol.bundle] + * matches every host, so register it last. See [WebViewBundleProtocol.bundle] + * and [WebViewBundleProtocol.local]. + * @property source bundle source options. Defaults to app-private directories and + * extracts builtin bundles from the APK `assets`. + * @property updater when set, a [Remote] and [Updater] are created and exposed. + * @property onError invoked when a registered protocol fails to serve a request; + * called on the WebView's request thread. + */ +// Not a `data class`: the function-typed [onError] has reference identity, which +// would give generated equals/hashCode/copy surprising, unstable semantics. +public class WebViewBundleConfig( + public val protocols: List, + public val source: SourceOptions = SourceOptions(), + public val updater: WebViewBundleUpdaterConfig? = null, + public val onError: ((Throwable) -> Unit)? = null, +) + +/** A registered protocol paired with its FFI request handler. */ +private class RegisteredProtocol( + val protocol: WebViewBundleProtocol, + val handle: suspend (HttpMethod, String, Map?) -> HttpResponse, + val closeable: AutoCloseable, +) + +/** + * Serves webview-bundle resources to an Android [WebView]. + * + * Android `WebView` only treats `https` origins as first-class, so — unlike the + * iOS integration's custom URL scheme — requests are intercepted by **host**: + * each [WebViewBundleProtocol] owns a set of `https` hosts, and a matching + * request is resolved from the bundle [source] (or proxied to a local server) + * instead of hitting the network. The bundle name is the first label of the + * request host, e.g. `https://app.wvb/index.html` -> bundle `app`. + * + * ```kotlin + * val wvb = WebViewBundle(context, WebViewBundleConfig( + * protocols = listOf(WebViewBundleProtocol.bundle()), + * )) + * wvb.install(webView) + * webView.loadUrl("https://app.wvb/") + * ``` + * + * Keep a reference for the lifetime of the web view; it owns the native handlers. + * Tear down in order — `webView.destroy()` first, then [close] — to release the + * underlying FFI resources. + */ +public class WebViewBundle private constructor( + /** The bundle source requests are served from. */ + public val source: BundleSource, + /** The remote endpoint, when an [WebViewBundleUpdaterConfig] was provided. */ + public val remote: Remote?, + /** The updater, when an [WebViewBundleUpdaterConfig] was provided. */ + public val updater: Updater?, + private val protocols: List, + private val onError: ((Throwable) -> Unit)?, +) : AutoCloseable { + + /** + * Resolves [request] against the registered protocols, or returns `null` when + * no protocol owns the request host (so the WebView loads it normally). + * + * Intended to be called from [WebViewClient.shouldInterceptRequest], which the + * WebView invokes on a background thread; this blocks on the suspending FFI + * handler. A handler failure is reported to [onError] and surfaced as a `500` + * response rather than leaking the request to the network. + */ + public fun handleRequest(request: WebResourceRequest): WebResourceResponse? { + val url = request.url ?: return null + if (!url.scheme.equals("https", ignoreCase = true)) return null + val rawHost = url.host ?: return null + // Hosts are case-insensitive, but the bundle name / local lookup downstream + // is not, so canonicalize the host (only) to lowercase before dispatch. + val host = rawHost.lowercase() + val registered = protocols.firstOrNull { it.protocol.matches(host) } ?: return null + + val method = httpMethodFrom(request.method) + val headers = request.requestHeaders?.takeIf { it.isNotEmpty() } + val uri = if (rawHost == host) { + url.toString() + } else { + val authority = if (url.port >= 0) "$host:${url.port}" else host + url.buildUpon().encodedAuthority(authority).build().toString() + } + + return try { + val response = runBlocking { registered.handle(method, uri, headers) } + response.toWebResourceResponse() + } catch (error: Throwable) { + // Build the fail-closed response first, then report: a throwing + // onError must never suppress it or escape onto the WebView thread. + val response = errorWebResourceResponse(error) + runCatching { onError?.invoke(error) } + response + } + } + + /** + * A [WebViewClient] that serves the registered bundles, optionally forwarding + * its other callbacks to [delegate]. Assign it to [WebView.setWebViewClient]. + * + * Low-level seam for callers that manage the [WebView] themselves; [install] + * is the high-level entry point. + */ + public fun createWebViewClient(delegate: WebViewClient? = null): WebViewClient = + WebViewBundleClient(this, delegate) + + /** + * Wires [webView] to serve the registered bundles. + * + * By default this applies the recommended WebView settings (JavaScript, DOM + * storage, mixed-content and file-access hardening), installs a bundle-serving + * [WebViewClient], and routes Service Worker requests through the bundle. + * Customize or opt out of any of these via the [configure] lambda — see + * [InstallOptions]: + * + * ```kotlin + * wvb.install(webView) // sensible defaults + * wvb.install(webView) { + * delegate = myWebViewClient + * webContentsDebuggingEnabled = BuildConfig.DEBUG + * installServiceWorker = false + * configureWebView = { it.settings.userAgentString = "MyApp" } + * } + * ``` + */ + public fun install(webView: WebView, configure: InstallOptions.() -> Unit = {}) { + val options = InstallOptions().apply(configure) + options.applySettings(webView) + webView.webViewClient = createWebViewClient(options.delegate) + if (options.installServiceWorker) { + installServiceWorkerClient() + } + options.configureWebView?.invoke(webView) + } + + /** + * Releases the native handlers and the source, remote, and updater handles. + * + * Call after `webView.destroy()` has returned, so the WebView can no longer + * dispatch [handleRequest]. Closing while a request is still in flight is safe + * — no use-after-free — but the racing request fails closed with a `500` + * rather than serving the resource, because its FFI handle is destroyed. + */ + override fun close() { + protocols.forEach { runCatching { it.closeable.close() } } + runCatching { updater?.close() } + runCatching { remote?.close() } + runCatching { source.close() } + } + + public companion object { + /** + * Builds a [WebViewBundle] from a high-level [WebViewBundleConfig]. + * + * @throws Exception if the source cannot be built (e.g. builtin assets fail + * to extract) or a native handle cannot be created (e.g. an invalid remote + * endpoint); any handles already allocated are released before the + * exception propagates. + */ + public operator fun invoke(context: Context, config: WebViewBundleConfig): WebViewBundle { + val source = makeBundleSource(context, config.source) + + var remote: Remote? = null + var updater: Updater? = null + val registered = mutableListOf() + try { + config.updater?.let { updaterConfig -> + val createdRemote = Remote(updaterConfig.remote.endpoint) + remote = createdRemote // assign before Updater(), so a throw there still closes it + updater = Updater( + source, + createdRemote, + UpdaterOptions( + channel = updaterConfig.channel, + integrityPolicy = updaterConfig.integrityPolicy, + signatureVerifier = updaterConfig.signatureVerifier, + ), + ) + } + + config.protocols.forEach { protocol -> + registered += when (protocol) { + is WebViewBundleProtocol.Bundle -> { + val handler = BundleUrlHandler(source) + RegisteredProtocol(protocol, handler::handle, handler) + } + is WebViewBundleProtocol.Local -> { + // Lowercase the host keys to match the case-insensitive + // matcher and the lowercased request host. + val handler = LocalUrlHandler(protocol.hosts.mapKeys { it.key.lowercase() }) + RegisteredProtocol(protocol, handler::handle, handler) + } + } + } + } catch (error: Throwable) { + registered.forEach { runCatching { it.closeable.close() } } + runCatching { updater?.close() } + runCatching { remote?.close() } + runCatching { source.close() } + throw error + } + + return WebViewBundle(source, remote, updater, registered, config.onError) + } + } +} + +/** Builds a [WebViewBundle] from a high-level [WebViewBundleConfig]. */ +public fun webViewBundle(context: Context, config: WebViewBundleConfig): WebViewBundle = + WebViewBundle(context, config) + +/** Short alias for [webViewBundle]. */ +public fun wvb(context: Context, config: WebViewBundleConfig): WebViewBundle = + WebViewBundle(context, config) diff --git a/lib/src/main/kotlin/dev/wvb/WebViewBundleClient.kt b/lib/src/main/kotlin/dev/wvb/WebViewBundleClient.kt new file mode 100644 index 0000000..d325ca0 --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/WebViewBundleClient.kt @@ -0,0 +1,128 @@ +package dev.wvb + +import android.graphics.Bitmap +import android.net.http.SslError +import android.os.Build +import android.webkit.ClientCertRequest +import android.webkit.HttpAuthHandler +import android.webkit.RenderProcessGoneDetail +import android.webkit.SslErrorHandler +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.annotation.RequiresApi + +/** + * A [WebViewClient] that serves webview-bundle resources by intercepting requests + * to the registered protocol hosts. + * + * Obtained via [WebViewBundle.install] or [WebViewBundle.createWebViewClient] — + * never constructed directly. Requests the bundle owns are served from + * [WebViewBundle.handleRequest]; unhandled requests and a fixed set of common + * callbacks are forwarded to the optional [delegate]: `shouldInterceptRequest`, + * `shouldOverrideUrlLoading`, `onPageStarted`, `onPageCommitVisible`, + * `onPageFinished`, `onLoadResource`, `doUpdateVisitedHistory`, `onReceivedError`, + * `onReceivedHttpError`, `onReceivedSslError`, `onReceivedHttpAuthRequest`, + * `onReceivedClientCertRequest`, and `onRenderProcessGone`. + * + * Any **other** [WebViewClient] override on the delegate is not invoked — the + * framework dispatches to this class's concrete methods. If you need one, implement + * your own [WebViewClient] and call [WebViewBundle.handleRequest] from + * `shouldInterceptRequest`. + */ +internal class WebViewBundleClient( + private val owner: WebViewBundle, + private val delegate: WebViewClient? = null, +) : WebViewClient() { + + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest, + ): WebResourceResponse? = + owner.handleRequest(request) ?: delegate?.shouldInterceptRequest(view, request) + + // --- delegation of the commonly-overridden callbacks --------------------- + // The framework dispatches to concrete overrides, so each forwarded callback + // must be spelled out. The bundle itself only needs shouldInterceptRequest; + // these simply preserve a wrapped client's behavior. The `delegate?.x() ?: + // super.x()` form runs the delegate when present (its non-null/Unit result + // suppresses super) and the default otherwise. + + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean = + delegate?.shouldOverrideUrlLoading(view, request) + ?: super.shouldOverrideUrlLoading(view, request) + + override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { + delegate?.onPageStarted(view, url, favicon) ?: super.onPageStarted(view, url, favicon) + } + + override fun onPageCommitVisible(view: WebView, url: String?) { + delegate?.onPageCommitVisible(view, url) ?: super.onPageCommitVisible(view, url) + } + + override fun onPageFinished(view: WebView, url: String?) { + delegate?.onPageFinished(view, url) ?: super.onPageFinished(view, url) + } + + override fun onLoadResource(view: WebView, url: String?) { + delegate?.onLoadResource(view, url) ?: super.onLoadResource(view, url) + } + + override fun doUpdateVisitedHistory(view: WebView, url: String?, isReload: Boolean) { + delegate?.doUpdateVisitedHistory(view, url, isReload) + ?: super.doUpdateVisitedHistory(view, url, isReload) + } + + override fun onReceivedError( + view: WebView, + request: WebResourceRequest, + error: WebResourceError, + ) { + delegate?.onReceivedError(view, request, error) ?: super.onReceivedError(view, request, error) + } + + override fun onReceivedHttpError( + view: WebView, + request: WebResourceRequest, + errorResponse: WebResourceResponse, + ) { + delegate?.onReceivedHttpError(view, request, errorResponse) + ?: super.onReceivedHttpError(view, request, errorResponse) + } + + // Security-sensitive callbacks: without forwarding, a delegate's TLS/auth + // decision would be silently dropped and the (secure) default applied. + + override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) { + delegate?.onReceivedSslError(view, handler, error) + ?: super.onReceivedSslError(view, handler, error) + } + + override fun onReceivedHttpAuthRequest( + view: WebView, + handler: HttpAuthHandler, + host: String?, + realm: String?, + ) { + delegate?.onReceivedHttpAuthRequest(view, handler, host, realm) + ?: super.onReceivedHttpAuthRequest(view, handler, host, realm) + } + + override fun onReceivedClientCertRequest(view: WebView, request: ClientCertRequest) { + delegate?.onReceivedClientCertRequest(view, request) + ?: super.onReceivedClientCertRequest(view, request) + } + + // Boolean return: use an explicit null check, not elvis, so a delegate + // returning `false` (handled, don't kill the process) is honored. The + // framework only dispatches this on API 26+, so the API-26 calls are safe. + @RequiresApi(Build.VERSION_CODES.O) + override fun onRenderProcessGone(view: WebView, detail: RenderProcessGoneDetail): Boolean = + if (delegate != null) { + delegate.onRenderProcessGone(view, detail) + } else { + super.onRenderProcessGone(view, detail) + } +} diff --git a/lib/src/main/kotlin/dev/wvb/WebViewBundleProtocol.kt b/lib/src/main/kotlin/dev/wvb/WebViewBundleProtocol.kt new file mode 100644 index 0000000..0240118 --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/WebViewBundleProtocol.kt @@ -0,0 +1,133 @@ +package dev.wvb + +/** + * Configures which request hosts a [WebViewBundleProtocol.Bundle] **passes through + * to the network** instead of serving from the bundle. + * + * A bundle protocol handles every `https` host by default — like the core, the + * bundle name is the first host label (`https://app.wvb/` -> bundle `app`). Use + * this builder to carve out external origins the page talks to (APIs, CDNs, + * analytics), so those reach the real network instead of being resolved to a + * (missing) bundle. Hosts are matched case-insensitively. + * + * Obtained via the `bundle { ... }` builder; never constructed directly. + */ +public class BundlePassthrough internal constructor() { + private val exactHosts = mutableSetOf() + private val domainSuffixes = mutableListOf() + private val predicates = mutableListOf<(String) -> Boolean>() + + /** Pass requests to this exact host through to the network, e.g. `"example.com"`. */ + public fun passthrough(host: String) { + exactHosts += host.trim().lowercase() + } + + /** + * Pass requests to any host under [domain] through to the network — `domain = + * "example.com"` matches `example.com` and `cdn.example.com`. + */ + public fun passthroughDomain(domain: String) { + val normalized = domain.trim().trim('.').lowercase() + require(normalized.isNotEmpty()) { "passthrough domain must not be empty" } + domainSuffixes += normalized + } + + /** Pass requests whose host satisfies [predicate] through to the network. */ + public fun passthrough(predicate: (host: String) -> Boolean) { + predicates += predicate + } + + internal fun shouldPassthrough(host: String): Boolean { + val lower = host.lowercase() + if (lower in exactHosts) return true + if (domainSuffixes.any { lower == it || lower.endsWith(".$it") }) return true + return predicates.any { it(host) } + } +} + +/** + * Binds `https` hosts served inside a `WebView` to a webview-bundle request + * handler. + * + * Android `WebView` only treats `https` origins as first-class, so — unlike iOS's + * custom URL scheme — a protocol is selected by the request **host**. A matching + * request is resolved from the bundle source (for [Bundle]) or proxied to a local + * server (for [Local]); everything else falls through to the network. The bundle + * name is the first label of the request host, e.g. `https://app.wvb/index.html` + * -> bundle `app`, path `/index.html`. Hosts are matched case-insensitively. + * + * Protocols are evaluated in registration order (first whose matcher accepts the + * host serves it). [bundle] matches **every** host by default, so register it + * **last**, after any [local] or otherwise-scoped protocols, or it will shadow + * them. + * + * Use the [WebViewBundleProtocol.bundle] and [WebViewBundleProtocol.local] + * factories to construct instances. + */ +public sealed class WebViewBundleProtocol { + /** Returns `true` if this protocol should serve a request to [host]. */ + internal abstract fun matches(host: String): Boolean + + /** + * Serves entries from the bundle source, backed by an FFI [BundleUrlHandler]. + * + * Handles every `https` host (bundle name = first host label) except those the + * optional [passthrough] sends to the network. + */ + public class Bundle internal constructor( + private val passthrough: BundlePassthrough?, + ) : WebViewBundleProtocol() { + override fun matches(host: String): Boolean = + passthrough == null || !passthrough.shouldPassthrough(host) + } + + /** + * Proxies requests to local HTTP servers, backed by an FFI [LocalUrlHandler]. + * + * [hosts] maps a full request host to a local base URL, e.g. + * `mapOf("app.wvb" to "http://10.0.2.2:3000")`. The key is matched against the + * entire request host (case-insensitive). + * + * On the Android emulator the host machine's `localhost` is reachable at + * `10.0.2.2`, and cleartext `http` to it requires a network security config. + */ + public class Local internal constructor( + internal val hosts: Map, + ) : WebViewBundleProtocol() { + private val keys = hosts.keys.map { it.lowercase() }.toSet() + override fun matches(host: String): Boolean = host.lowercase() in keys + } + + public companion object { + /** + * A [Bundle] protocol that serves **every** `https` host from the bundle + * source (bundle name = first host label). Register it last, as it matches + * all hosts. + */ + public fun bundle(): Bundle = Bundle(null) + + /** + * A [Bundle] protocol that serves every `https` host **except** the ones + * the [passthrough] builder sends to the network: + * + * ```kotlin + * WebViewBundleProtocol.bundle { + * passthrough("example.com") // exact host + * passthroughDomain("googleapis.com") // host + subdomains + * passthrough { it.endsWith(".cdn.net") } + * } + * ``` + * + * To instead serve only a specific domain, invert it with a predicate, e.g. + * `bundle { passthrough { host -> !host.endsWith(".wvb") } }`. + */ + public fun bundle(passthrough: BundlePassthrough.() -> Unit): Bundle = + Bundle(BundlePassthrough().apply(passthrough)) + + /** + * A [Local] dev-proxy protocol mapping full request hosts to local base + * URLs, e.g. `local(mapOf("app.wvb" to "http://10.0.2.2:3000"))`. + */ + public fun local(hosts: Map): Local = Local(hosts) + } +} diff --git a/lib/src/main/kotlin/dev/wvb/WebViewSetup.kt b/lib/src/main/kotlin/dev/wvb/WebViewSetup.kt new file mode 100644 index 0000000..2cc703e --- /dev/null +++ b/lib/src/main/kotlin/dev/wvb/WebViewSetup.kt @@ -0,0 +1,102 @@ +package dev.wvb + +import android.annotation.SuppressLint +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.webkit.ServiceWorkerClientCompat +import androidx.webkit.ServiceWorkerControllerCompat +import androidx.webkit.WebViewFeature + +/** + * Configuration for [WebViewBundle.install], applied to the [WebView] before it + * starts loading. + * + * Sensible defaults make a typical SPA bundle work out of the box; override any + * field in the `install(webView) { ... }` lambda, or set + * [applyRecommendedSettings] to `false` and configure the WebView yourself. The + * [configureWebView] hook runs last as an escape hatch for anything not exposed + * here. + * + * @property delegate a [WebViewClient] whose callbacks are preserved; the + * bundle-serving client wraps it. + * @property applyRecommendedSettings apply the WebView settings below. Set `false` + * to leave [WebView.getSettings] untouched. + * @property javaScriptEnabled SPA bundles need this; defaults `true` (the platform + * default is `false`). + * @property domStorageEnabled enable DOM storage; defaults `true` (platform + * default is `false`). + * @property mixedContentMode the bundle origin is always `https`, so the default + * forbids mixed content. + * @property allowFileAccess / [allowContentAccess] hardened off by default. + * @property webContentsDebuggingEnabled enable `chrome://inspect` process-wide; + * gate on a debug build. + * @property installServiceWorker route Service Worker requests through the bundle + * (see [installServiceWorkerClient]); defaults `true`. + * @property configureWebView final hook to customize the [WebView] after the + * options above are applied. + */ +public class InstallOptions { + public var delegate: WebViewClient? = null + public var applyRecommendedSettings: Boolean = true + public var javaScriptEnabled: Boolean = true + public var domStorageEnabled: Boolean = true + public var mixedContentMode: Int = WebSettings.MIXED_CONTENT_NEVER_ALLOW + public var allowFileAccess: Boolean = false + public var allowContentAccess: Boolean = false + public var webContentsDebuggingEnabled: Boolean = false + public var installServiceWorker: Boolean = true + public var configureWebView: ((WebView) -> Unit)? = null + + @SuppressLint("SetJavaScriptEnabled") + internal fun applySettings(webView: WebView) { + if (!applyRecommendedSettings) return + webView.settings.apply { + javaScriptEnabled = this@InstallOptions.javaScriptEnabled + domStorageEnabled = this@InstallOptions.domStorageEnabled + mixedContentMode = this@InstallOptions.mixedContentMode + allowFileAccess = this@InstallOptions.allowFileAccess + allowContentAccess = this@InstallOptions.allowContentAccess + @Suppress("DEPRECATION") + allowFileAccessFromFileURLs = false + @Suppress("DEPRECATION") + allowUniversalAccessFromFileURLs = false + } + if (webContentsDebuggingEnabled) { + WebView.setWebContentsDebuggingEnabled(true) + } + } +} + +/** + * Routes Service Worker network requests through this bundle's request handler. + * + * Service Workers fetch resources off the document's network stack, so they + * **bypass** [android.webkit.WebViewClient.shouldInterceptRequest]: a bundle that + * registers a Service Worker would otherwise see its worker requests escape to the + * network. This installs an `androidx.webkit` Service Worker client that delegates + * to [WebViewBundle.handleRequest], mirroring the main interceptor. + * + * Called automatically by [WebViewBundle.install] unless + * [InstallOptions.installServiceWorker] is `false`. The Service Worker controller + * is **process-global**: this replaces any Service Worker client previously set in + * the process, so the last instance to install wins. Returns `true` when + * installed, or `false` when the WebView implementation does not support Service + * Worker interception. + */ +public fun WebViewBundle.installServiceWorkerClient(): Boolean { + if (!WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_BASIC_USAGE) || + !WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST) + ) { + return false + } + ServiceWorkerControllerCompat.getInstance().setServiceWorkerClient( + object : ServiceWorkerClientCompat() { + override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? = + handleRequest(request) + }, + ) + return true +} diff --git a/lib/src/main/kotlin/dev/wvb/wvb_ffi.kt b/lib/src/main/kotlin/dev/wvb/wvb_ffi.kt index cd8d9a6..f024b2b 100644 --- a/lib/src/main/kotlin/dev/wvb/wvb_ffi.kt +++ b/lib/src/main/kotlin/dev/wvb/wvb_ffi.kt @@ -703,26 +703,54 @@ internal object IntegrityCheckingUniffiLib { ): Short external fun uniffi_wvb_ffi_checksum_method_remote_list_bundles( ): Short - external fun uniffi_wvb_ffi_checksum_method_bundlesource_bundles_map( + external fun uniffi_wvb_ffi_checksum_method_bundlesource_fetch_builtin_bundle( ): Short - external fun uniffi_wvb_ffi_checksum_method_bundlesource_fetch( + external fun uniffi_wvb_ffi_checksum_method_bundlesource_fetch_bundle( ): Short external fun uniffi_wvb_ffi_checksum_method_bundlesource_fetch_descriptor( ): Short - external fun uniffi_wvb_ffi_checksum_method_bundlesource_filepath( + external fun uniffi_wvb_ffi_checksum_method_bundlesource_fetch_remote_bundle( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_get_builtin_bundle_filepath( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_get_remote_bundle_filepath( ): Short external fun uniffi_wvb_ffi_checksum_method_bundlesource_list_bundles( ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_load_builtin_metadata( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_load_descriptor( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_load_remote_metadata( + ): Short external fun uniffi_wvb_ffi_checksum_method_bundlesource_load_version( ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_prune_remote_bundles( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_remote_retained_versions( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_remove_remote_bundle( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_resolve_filepath( + ): Short + external fun uniffi_wvb_ffi_checksum_method_bundlesource_unload_descriptor( + ): Short external fun uniffi_wvb_ffi_checksum_method_bundlesource_update_version( ): Short external fun uniffi_wvb_ffi_checksum_method_bundlesource_write_remote_bundle( ): Short + external fun uniffi_wvb_ffi_checksum_method_loadeddescriptor_descriptor( + ): Short + external fun uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data( + ): Short + external fun uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data_checksum( + ): Short external fun uniffi_wvb_ffi_checksum_method_updater_download_update( ): Short external fun uniffi_wvb_ffi_checksum_method_updater_get_update( ): Short + external fun uniffi_wvb_ffi_checksum_method_updater_install( + ): Short external fun uniffi_wvb_ffi_checksum_method_updater_list_remotes( ): Short external fun uniffi_wvb_ffi_checksum_constructor_bundlebuilder_new( @@ -853,22 +881,52 @@ external fun uniffi_wvb_ffi_fn_free_bundlesource(`handle`: Long,uniffi_out_err: ): Unit external fun uniffi_wvb_ffi_fn_constructor_bundlesource_new(`config`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, ): Long -external fun uniffi_wvb_ffi_fn_method_bundlesource_bundles_map(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, -): RustBuffer.ByValue -external fun uniffi_wvb_ffi_fn_method_bundlesource_fetch(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +external fun uniffi_wvb_ffi_fn_method_bundlesource_fetch_builtin_bundle(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_fetch_bundle(`ptr`: Long,`bundleName`: RustBuffer.ByValue, ): Long external fun uniffi_wvb_ffi_fn_method_bundlesource_fetch_descriptor(`ptr`: Long,`bundleName`: RustBuffer.ByValue, ): Long -external fun uniffi_wvb_ffi_fn_method_bundlesource_filepath(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +external fun uniffi_wvb_ffi_fn_method_bundlesource_fetch_remote_bundle(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, ): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_get_builtin_bundle_filepath(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, +): RustBuffer.ByValue +external fun uniffi_wvb_ffi_fn_method_bundlesource_get_remote_bundle_filepath(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, +): RustBuffer.ByValue external fun uniffi_wvb_ffi_fn_method_bundlesource_list_bundles(`ptr`: Long, ): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_load_builtin_metadata(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_load_descriptor(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_load_remote_metadata(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, +): Long external fun uniffi_wvb_ffi_fn_method_bundlesource_load_version(`ptr`: Long,`bundleName`: RustBuffer.ByValue, ): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_prune_remote_bundles(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_remote_retained_versions(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_remove_remote_bundle(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_resolve_filepath(`ptr`: Long,`bundleName`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_bundlesource_unload_descriptor(`ptr`: Long,`bundleName`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, +): Byte external fun uniffi_wvb_ffi_fn_method_bundlesource_update_version(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, ): Long external fun uniffi_wvb_ffi_fn_method_bundlesource_write_remote_bundle(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue,`bundle`: Long,`metadata`: RustBuffer.ByValue, ): Long +external fun uniffi_wvb_ffi_fn_clone_loadeddescriptor(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, +): Long +external fun uniffi_wvb_ffi_fn_free_loadeddescriptor(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, +): Unit +external fun uniffi_wvb_ffi_fn_method_loadeddescriptor_descriptor(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, +): Long +external fun uniffi_wvb_ffi_fn_method_loadeddescriptor_get_data(`ptr`: Long,`path`: RustBuffer.ByValue, +): Long +external fun uniffi_wvb_ffi_fn_method_loadeddescriptor_get_data_checksum(`ptr`: Long,`path`: RustBuffer.ByValue, +): Long external fun uniffi_wvb_ffi_fn_clone_updater(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, ): Long external fun uniffi_wvb_ffi_fn_free_updater(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, @@ -879,6 +937,8 @@ external fun uniffi_wvb_ffi_fn_method_updater_download_update(`ptr`: Long,`bundl ): Long external fun uniffi_wvb_ffi_fn_method_updater_get_update(`ptr`: Long,`bundleName`: RustBuffer.ByValue, ): Long +external fun uniffi_wvb_ffi_fn_method_updater_install(`ptr`: Long,`bundleName`: RustBuffer.ByValue,`version`: RustBuffer.ByValue, +): Long external fun uniffi_wvb_ffi_fn_method_updater_list_remotes(`ptr`: Long, ): Long external fun uniffi_wvb_ffi_fn_func_read_bundle(`filepath`: RustBuffer.ByValue, @@ -1056,7 +1116,7 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if (lib.uniffi_wvb_ffi_checksum_method_bundledescriptor_header() != 28740.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_wvb_ffi_checksum_method_bundledescriptor_index() != 38468.toShort()) { + if (lib.uniffi_wvb_ffi_checksum_method_bundledescriptor_index() != 45942.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_wvb_ffi_checksum_method_bundledescriptor_index_entries() != 42039.toShort()) { @@ -1098,36 +1158,78 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if (lib.uniffi_wvb_ffi_checksum_method_remote_list_bundles() != 28549.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_bundles_map() != 6856.toShort()) { + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch_builtin_bundle() != 33213.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch() != 7423.toShort()) { + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch_bundle() != 38812.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch_descriptor() != 6993.toShort()) { + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch_descriptor() != 28723.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_filepath() != 64084.toShort()) { + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_fetch_remote_bundle() != 44933.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_get_builtin_bundle_filepath() != 17928.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_get_remote_bundle_filepath() != 23450.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_list_bundles() != 34449.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_load_builtin_metadata() != 4913.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_load_descriptor() != 30101.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_load_remote_metadata() != 61273.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_load_version() != 32808.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_prune_remote_bundles() != 48913.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_remote_retained_versions() != 47892.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_remove_remote_bundle() != 4825.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_resolve_filepath() != 55355.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_unload_descriptor() != 36116.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_update_version() != 52326.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_wvb_ffi_checksum_method_bundlesource_write_remote_bundle() != 49447.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_wvb_ffi_checksum_method_loadeddescriptor_descriptor() != 52553.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data() != 27083.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data_checksum() != 38729.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_wvb_ffi_checksum_method_updater_download_update() != 45642.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_wvb_ffi_checksum_method_updater_get_update() != 5468.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_wvb_ffi_checksum_method_updater_install() != 28133.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_wvb_ffi_checksum_method_updater_list_remotes() != 35179.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -2308,9 +2410,10 @@ public interface BundleDescriptorInterface { * Returns an [`Index`] view backed by the full bundle. * * # Panics - * Panics when called on a descriptor obtained via `BundleSource::fetch_descriptor`, - * because that variant holds only metadata and has no data section. - * Use `BundleSource::fetch` instead when data access is required. + * Panics when called on a metadata-only descriptor (obtained via + * `BundleSource::fetch_descriptor` or `LoadedDescriptor::descriptor`), because + * those variants have no data section. Use `BundleSource::fetch_bundle` instead + * when data access is required. */ fun `index`(): Index @@ -2465,9 +2568,10 @@ open class BundleDescriptor: Disposable, AutoCloseable, BundleDescriptorInterfac * Returns an [`Index`] view backed by the full bundle. * * # Panics - * Panics when called on a descriptor obtained via `BundleSource::fetch_descriptor`, - * because that variant holds only metadata and has no data section. - * Use `BundleSource::fetch` instead when data access is required. + * Panics when called on a metadata-only descriptor (obtained via + * `BundleSource::fetch_descriptor` or `LoadedDescriptor::descriptor`), because + * those variants have no data section. Use `BundleSource::fetch_bundle` instead + * when data access is required. */override fun `index`(): Index { return FfiConverterTypeIndex.lift( callWithHandle { @@ -2636,26 +2740,92 @@ public object FfiConverterTypeBundleDescriptor: FfiConverter> + /** + * Loads the full builtin bundle for `bundle_name` at `version`, bypassing the + * remote source and version resolution. + */ + suspend fun `fetchBuiltinBundle`(`bundleName`: kotlin.String, `version`: kotlin.String): Bundle /** * Loads the full bundle (header + index + data) for `bundle_name`. */ - suspend fun `fetch`(`bundleName`: kotlin.String): Bundle + suspend fun `fetchBundle`(`bundleName`: kotlin.String): Bundle /** * Loads only the header and index for `bundle_name`, skipping the data section. * The returned descriptor does not support [`BundleDescriptor::index`]; use - * [`fetch`](BundleSource::fetch) when entry data is needed. + * [`fetch`](BundleSource::fetch_bundle) when entry data is needed. */ suspend fun `fetchDescriptor`(`bundleName`: kotlin.String): BundleDescriptor - suspend fun `filepath`(`bundleName`: kotlin.String): kotlin.String + /** + * Loads the full remote bundle for `bundle_name` at `version`, bypassing the + * builtin source and version resolution. + */ + suspend fun `fetchRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String): Bundle + + /** + * Resolves the on-disk path of the builtin bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + fun `getBuiltinBundleFilepath`(`bundleName`: kotlin.String, `version`: kotlin.String): kotlin.String + + /** + * Resolves the on-disk path of the remote bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + fun `getRemoteBundleFilepath`(`bundleName`: kotlin.String, `version`: kotlin.String): kotlin.String suspend fun `listBundles`(): List + /** + * Loads the manifest metadata for the builtin bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ + suspend fun `loadBuiltinMetadata`(`bundleName`: kotlin.String, `version`: kotlin.String): BundleManifestMetadata? + + /** + * Loads (and caches) the descriptor for the current version of `bundle_name`. + * Concurrent calls for the same bundle share a single load (single-flight) and + * return the cached descriptor until the active version changes or + * [`unload_descriptor`](BundleSource::unload_descriptor) is called. + */ + suspend fun `loadDescriptor`(`bundleName`: kotlin.String): LoadedDescriptor + + /** + * Loads the manifest metadata for the remote bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ + suspend fun `loadRemoteMetadata`(`bundleName`: kotlin.String, `version`: kotlin.String): BundleManifestMetadata? + suspend fun `loadVersion`(`bundleName`: kotlin.String): BundleSourceVersion? + /** + * Removes every staged remote version except the retained set (current and + * previous). Returns the versions that were removed. + */ + suspend fun `pruneRemoteBundles`(`bundleName`: kotlin.String): List + + /** + * Returns the remote versions that pruning retains (the current and previous). + */ + suspend fun `remoteRetainedVersions`(`bundleName`: kotlin.String): List + + /** + * Removes a single staged remote bundle version: drops its manifest entry and + * deletes its file from disk. Returns `true` if the entry existed. + */ + suspend fun `removeRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String): kotlin.Boolean + + suspend fun `resolveFilepath`(`bundleName`: kotlin.String): kotlin.String + + /** + * Drops the cached descriptor for `bundle_name`, if present. Already-returned + * [`LoadedDescriptor`] handles keep working; the next [`load_descriptor`] + * reloads from disk. Returns `true` if a cached descriptor was removed. + */ + fun `unloadDescriptor`(`bundleName`: kotlin.String): kotlin.Boolean + suspend fun `updateVersion`(`bundleName`: kotlin.String, `version`: kotlin.String) suspend fun `writeRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String, `bundle`: Bundle, `metadata`: BundleManifestMetadata) @@ -2773,18 +2943,30 @@ open class BundleSource: Disposable, AutoCloseable, BundleSourceInterface } } - override fun `bundlesMap`(): Map> { - return FfiConverterMapStringSequenceTypeListBundleItem.lift( - callWithHandle { - uniffiRustCall() { _status -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_bundles_map( - it, - _status) -} - } + + /** + * Loads the full builtin bundle for `bundle_name` at `version`, bypassing the + * remote source and version resolution. + */ + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `fetchBuiltinBundle`(`bundleName`: kotlin.String, `version`: kotlin.String) : Bundle { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_fetch_builtin_bundle( + uniffiHandle, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_u64(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_u64(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_u64(future) }, + // lift function + { FfiConverterTypeBundle.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, ) } - /** @@ -2792,10 +2974,10 @@ open class BundleSource: Disposable, AutoCloseable, BundleSourceInterface */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") - override suspend fun `fetch`(`bundleName`: kotlin.String) : Bundle { + override suspend fun `fetchBundle`(`bundleName`: kotlin.String) : Bundle { return uniffiRustCallAsync( callWithHandle { uniffiHandle -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_fetch( + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_fetch_bundle( uniffiHandle, FfiConverterString.lower(`bundleName`), ) @@ -2814,7 +2996,7 @@ open class BundleSource: Disposable, AutoCloseable, BundleSourceInterface /** * Loads only the header and index for `bundle_name`, skipping the data section. * The returned descriptor does not support [`BundleDescriptor::index`]; use - * [`fetch`](BundleSource::fetch) when entry data is needed. + * [`fetch`](BundleSource::fetch_bundle) when entry data is needed. */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") @@ -2837,27 +3019,67 @@ open class BundleSource: Disposable, AutoCloseable, BundleSourceInterface } + /** + * Loads the full remote bundle for `bundle_name` at `version`, bypassing the + * builtin source and version resolution. + */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") - override suspend fun `filepath`(`bundleName`: kotlin.String) : kotlin.String { + override suspend fun `fetchRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String) : Bundle { return uniffiRustCallAsync( callWithHandle { uniffiHandle -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_filepath( + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_fetch_remote_bundle( uniffiHandle, - FfiConverterString.lower(`bundleName`), + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), ) }, - { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, - { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, - { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_u64(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_u64(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_u64(future) }, // lift function - { FfiConverterString.lift(it) }, + { FfiConverterTypeBundle.lift(it) }, // Error FFI converter Exception.ErrorHandler, ) } + /** + * Resolves the on-disk path of the builtin bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + @Throws(Exception::class)override fun `getBuiltinBundleFilepath`(`bundleName`: kotlin.String, `version`: kotlin.String): kotlin.String { + return FfiConverterString.lift( + callWithHandle { + uniffiRustCallWithError(Exception) { _status -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_get_builtin_bundle_filepath( + it, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`),_status) +} + } + ) + } + + + + /** + * Resolves the on-disk path of the remote bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + @Throws(Exception::class)override fun `getRemoteBundleFilepath`(`bundleName`: kotlin.String, `version`: kotlin.String): kotlin.String { + return FfiConverterString.lift( + callWithHandle { + uniffiRustCallWithError(Exception) { _status -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_get_remote_bundle_filepath( + it, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`),_status) +} + } + ) + } + + + @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") override suspend fun `listBundles`() : List { @@ -2879,95 +3101,285 @@ open class BundleSource: Disposable, AutoCloseable, BundleSourceInterface } + /** + * Loads the manifest metadata for the builtin bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") - override suspend fun `loadVersion`(`bundleName`: kotlin.String) : BundleSourceVersion? { + override suspend fun `loadBuiltinMetadata`(`bundleName`: kotlin.String, `version`: kotlin.String) : BundleManifestMetadata? { return uniffiRustCallAsync( callWithHandle { uniffiHandle -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_load_version( + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_load_builtin_metadata( uniffiHandle, - FfiConverterString.lower(`bundleName`), + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), ) }, { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, // lift function - { FfiConverterOptionalTypeBundleSourceVersion.lift(it) }, + { FfiConverterOptionalTypeBundleManifestMetadata.lift(it) }, // Error FFI converter Exception.ErrorHandler, ) } + /** + * Loads (and caches) the descriptor for the current version of `bundle_name`. + * Concurrent calls for the same bundle share a single load (single-flight) and + * return the cached descriptor until the active version changes or + * [`unload_descriptor`](BundleSource::unload_descriptor) is called. + */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") - override suspend fun `updateVersion`(`bundleName`: kotlin.String, `version`: kotlin.String) { + override suspend fun `loadDescriptor`(`bundleName`: kotlin.String) : LoadedDescriptor { return uniffiRustCallAsync( callWithHandle { uniffiHandle -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_update_version( + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_load_descriptor( uniffiHandle, - FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), + FfiConverterString.lower(`bundleName`), ) }, - { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_void(future, callback, continuation) }, - { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_void(future, continuation) }, - { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_void(future) }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_u64(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_u64(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_u64(future) }, // lift function - { Unit }, - + { FfiConverterTypeLoadedDescriptor.lift(it) }, // Error FFI converter Exception.ErrorHandler, ) } + /** + * Loads the manifest metadata for the remote bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ @Throws(Exception::class) @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") - override suspend fun `writeRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String, `bundle`: Bundle, `metadata`: BundleManifestMetadata) { + override suspend fun `loadRemoteMetadata`(`bundleName`: kotlin.String, `version`: kotlin.String) : BundleManifestMetadata? { return uniffiRustCallAsync( callWithHandle { uniffiHandle -> - UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_write_remote_bundle( + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_load_remote_metadata( uniffiHandle, - FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`),FfiConverterTypeBundle.lower(`bundle`),FfiConverterTypeBundleManifestMetadata.lower(`metadata`), + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), ) }, - { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_void(future, callback, continuation) }, - { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_void(future, continuation) }, - { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_void(future) }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, // lift function - { Unit }, - + { FfiConverterOptionalTypeBundleManifestMetadata.lift(it) }, // Error FFI converter Exception.ErrorHandler, ) } + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `loadVersion`(`bundleName`: kotlin.String) : BundleSourceVersion? { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_load_version( + uniffiHandle, + FfiConverterString.lower(`bundleName`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, + // lift function + { FfiConverterOptionalTypeBundleSourceVersion.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, + ) + } - + /** + * Removes every staged remote version except the retained set (current and + * previous). Returns the versions that were removed. + */ + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `pruneRemoteBundles`(`bundleName`: kotlin.String) : List { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_prune_remote_bundles( + uniffiHandle, + FfiConverterString.lower(`bundleName`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, + // lift function + { FfiConverterSequenceString.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, + ) + } - /** - * @suppress + * Returns the remote versions that pruning retains (the current and previous). */ - companion object - -} - - -/** - * @suppress - */ -public object FfiConverterTypeBundleSource: FfiConverter { - override fun lower(value: BundleSource): Long { - return value.uniffiCloneHandle() + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `remoteRetainedVersions`(`bundleName`: kotlin.String) : List { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_remote_retained_versions( + uniffiHandle, + FfiConverterString.lower(`bundleName`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, + // lift function + { FfiConverterSequenceString.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, + ) } - override fun lift(value: Long): BundleSource { - return BundleSource(UniffiWithHandle, value) + + /** + * Removes a single staged remote bundle version: drops its manifest entry and + * deletes its file from disk. Returns `true` if the entry existed. + */ + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `removeRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String) : kotlin.Boolean { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_remove_remote_bundle( + uniffiHandle, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_i8(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_i8(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_i8(future) }, + // lift function + { FfiConverterBoolean.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, + ) + } + + + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `resolveFilepath`(`bundleName`: kotlin.String) : kotlin.String { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_resolve_filepath( + uniffiHandle, + FfiConverterString.lower(`bundleName`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_rust_buffer(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_rust_buffer(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_rust_buffer(future) }, + // lift function + { FfiConverterString.lift(it) }, + // Error FFI converter + Exception.ErrorHandler, + ) + } + + + /** + * Drops the cached descriptor for `bundle_name`, if present. Already-returned + * [`LoadedDescriptor`] handles keep working; the next [`load_descriptor`] + * reloads from disk. Returns `true` if a cached descriptor was removed. + */override fun `unloadDescriptor`(`bundleName`: kotlin.String): kotlin.Boolean { + return FfiConverterBoolean.lift( + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_unload_descriptor( + it, + FfiConverterString.lower(`bundleName`),_status) +} + } + ) + } + + + + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `updateVersion`(`bundleName`: kotlin.String, `version`: kotlin.String) { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_update_version( + uniffiHandle, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_void(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_void(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + Exception.ErrorHandler, + ) + } + + + @Throws(Exception::class) + @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE") + override suspend fun `writeRemoteBundle`(`bundleName`: kotlin.String, `version`: kotlin.String, `bundle`: Bundle, `metadata`: BundleManifestMetadata) { + return uniffiRustCallAsync( + callWithHandle { uniffiHandle -> + UniffiLib.uniffi_wvb_ffi_fn_method_bundlesource_write_remote_bundle( + uniffiHandle, + FfiConverterString.lower(`bundleName`),FfiConverterString.lower(`version`),FfiConverterTypeBundle.lower(`bundle`),FfiConverterTypeBundleManifestMetadata.lower(`metadata`), + ) + }, + { future, callback, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_poll_void(future, callback, continuation) }, + { future, continuation -> UniffiLib.ffi_wvb_ffi_rust_future_complete_void(future, continuation) }, + { future -> UniffiLib.ffi_wvb_ffi_rust_future_free_void(future) }, + // lift function + { Unit }, + + // Error FFI converter + Exception.ErrorHandler, + ) + } + + + + + + + + + /** + * @suppress + */ + companion object + +} + + +/** + * @suppress + */ +public object FfiConverterTypeBundleSource: FfiConverter { + override fun lower(value: BundleSource): Long { + return value.uniffiCloneHandle() + } + + override fun lift(value: Long): BundleSource { + return BundleSource(UniffiWithHandle, value) } override fun read(buf: ByteBuffer): BundleSource { @@ -3248,17 +3660,321 @@ public object FfiConverterTypeBundleUrlHandler: FfiConverter