diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 02d7b43..139ef09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,7 @@ on: push: branches: - feat.windows.support + - feat/whisper.migration tags: - 'v*' workflow_dispatch: @@ -70,6 +71,13 @@ jobs: node-version: '24.1.0' cache: 'pnpm' + - name: Install CUDA Toolkit + if: matrix.os == 'windows' + uses: Jimver/cuda-toolkit@v0.2.15 + with: + cuda: '12.4.1' + method: 'network' + - name: Log Node.js architecture and platform run: | echo "=== Node.js Process Information ===" @@ -78,8 +86,24 @@ jobs: echo "" - name: Install dependencies + env: + GGML_NATIVE: OFF # ensure postinstall builds avoid i8mm on CI runners run: pnpm install --frozen-lockfile + - name: Build whisper wrapper JS + run: pnpm --filter @amical/whisper-wrapper build + + - name: Build whisper native binaries + env: + GGML_NATIVE: OFF # CI mac runners lack i8mm support; keep CPU features conservative here + run: pnpm --filter @amical/whisper-wrapper build:native + + - name: Build whisper native binaries (cuda) + if: matrix.os == 'windows' + env: + GGML_NATIVE: OFF + run: pnpm --filter @amical/whisper-wrapper build:native:cuda + - name: Download Node.js binaries working-directory: apps/desktop run: pnpm download-node @@ -218,4 +242,4 @@ jobs: artifacts/windows-x64/*.exe artifacts/windows-x64/*.nupkg env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 19a7007..c8086cd 100644 --- a/.gitignore +++ b/.gitignore @@ -21,11 +21,20 @@ coverage # Vercel .vercel +# CMake-js cache +.cmake-js/ +**/.cmake-js/ + +# Tool helpers +.home/ +**/.home/ + # Build Outputs .next/ out/ build dist +packages/whisper-wrapper/native/ # Debug @@ -41,6 +50,7 @@ CLAUDE.md .local .claude amical.db +AGENTS.md # Temp files /tmp diff --git a/.gitmodules b/.gitmodules index 8790108..262b915 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "packages/smart-whisper/whisper.cpp"] - path = packages/smart-whisper/whisper.cpp - url = https://github.com/ggerganov/whisper.cpp.git \ No newline at end of file +[submodule "packages/whisper-wrapper/whisper.cpp"] + path = packages/whisper-wrapper/whisper.cpp + url = https://github.com/ggerganov/whisper.cpp.git diff --git a/apps/desktop/forge.config.ts b/apps/desktop/forge.config.ts index 6c239b0..8f5a1ad 100644 --- a/apps/desktop/forge.config.ts +++ b/apps/desktop/forge.config.ts @@ -40,7 +40,7 @@ export const EXTERNAL_DEPENDENCIES = [ "libsql", "onnxruntime-node", "workerpool", - "@amical/smart-whisper", + "@amical/whisper-wrapper", // Add any other native modules you need here ]; @@ -160,6 +160,24 @@ const config: ForgeConfig = { } } + // Prune heavy native sources that trigger MAX_PATH on Windows packages + const whisperWrapperPath = join( + localNodeModules, + "@amical", + "whisper-wrapper", + ); + const whisperPruneTargets = [ + join(whisperWrapperPath, "whisper.cpp"), + join(whisperWrapperPath, "build"), + join(whisperWrapperPath, ".cmake-js"), + ]; + for (const target of whisperPruneTargets) { + if (existsSync(target)) { + console.log(`Pruning ${target} from packaged output`); + rmSync(target, { recursive: true, force: true }); + } + } + // Second pass: Replace any symlinks with dereferenced copies console.log("Checking for symlinks in copied dependencies..."); for (const dep of nativeModuleDependenciesToPackage) { @@ -318,7 +336,7 @@ const config: ForgeConfig = { packagerConfig: { asar: { unpack: - "{*.node,*.dylib,*.so,*.dll,*.metal,**/node_modules/@amical/smart-whisper/**,**/whisper.cpp/**,**/.vite/build/whisper-worker-fork.js,**/node_modules/jest-worker/**,**/onnxruntime-node/bin/**}", + "{*.node,*.dylib,*.so,*.dll,*.metal,**/node_modules/@amical/whisper-wrapper/**,**/whisper.cpp/**,**/.vite/build/whisper-worker-fork.js,**/node_modules/jest-worker/**,**/onnxruntime-node/bin/**}", }, name: "Amical", executableName: "Amical", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 3fc7f9a..c389ba8 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -81,7 +81,7 @@ "dependencies": { "@ai-sdk/openai": "^1.3.22", "@amical/eslint-config": "workspace:*", - "@amical/smart-whisper": "workspace:*", + "@amical/whisper-wrapper": "workspace:*", "@amical/types": "workspace:*", "@amical/y-libsql": "workspace:*", "@dnd-kit/core": "^6.3.1", diff --git a/apps/desktop/src/main/main.ts b/apps/desktop/src/main/main.ts index 0ba88fb..29f2d04 100644 --- a/apps/desktop/src/main/main.ts +++ b/apps/desktop/src/main/main.ts @@ -2,21 +2,7 @@ import dotenv from "dotenv"; dotenv.config(); import { app } from "electron"; -import * as path from "path"; -// Set GGML_METAL_PATH_RESOURCES before any other imports -// This ensures @amical/smart-whisper can find its resources when unpacked from asar -if (app.isPackaged) { - // Point to the unpacked whisper.cpp directory - process.env.GGML_METAL_PATH_RESOURCES = path.join( - process.resourcesPath, - "app.asar.unpacked", - "node_modules", - "@amical", - "smart-whisper", - "whisper.cpp", - ); -} import started from "electron-squirrel-startup"; import { AppManager } from "./core/app-manager"; import { updateElectronApp } from "update-electron-app"; diff --git a/apps/desktop/src/pipeline/providers/transcription/simple-fork-wrapper.ts b/apps/desktop/src/pipeline/providers/transcription/simple-fork-wrapper.ts index 750502d..22e1496 100644 --- a/apps/desktop/src/pipeline/providers/transcription/simple-fork-wrapper.ts +++ b/apps/desktop/src/pipeline/providers/transcription/simple-fork-wrapper.ts @@ -44,7 +44,6 @@ export class SimpleForkWrapper { const workerEnv: any = { ...process.env, ELECTRON_RUN_AS_NODE: "1", - GGML_METAL_PATH_RESOURCES: process.env.GGML_METAL_PATH_RESOURCES, NODE_OPTIONS: "--max-old-space-size=8192", }; diff --git a/apps/desktop/src/pipeline/providers/transcription/whisper-provider.ts b/apps/desktop/src/pipeline/providers/transcription/whisper-provider.ts index 9b3e61f..98ecd24 100644 --- a/apps/desktop/src/pipeline/providers/transcription/whisper-provider.ts +++ b/apps/desktop/src/pipeline/providers/transcription/whisper-provider.ts @@ -57,6 +57,21 @@ export class WhisperProvider implements TranscriptionProvider { await this.initializeWhisper(); } + async getBindingInfo(): Promise<{ path: string; type: string } | null> { + if (!this.workerWrapper) { + return null; + } + try { + return await this.workerWrapper.exec<{ + path: string; + type: string; + } | null>("getBindingInfo", []); + } catch (error) { + logger.transcription.warn("Failed to get binding info:", error); + return null; + } + } + async transcribe( params: TranscribeParams & { flush?: boolean }, ): Promise { @@ -119,7 +134,7 @@ export class WhisperProvider implements TranscriptionProvider { `Starting transcription of ${aggregatedAudio.length} samples (${((aggregatedAudio.length / this.SAMPLE_RATE) * 1000).toFixed(0)}ms)`, ); - // Transcribe using smart-whisper + // Transcribe using the local Whisper wrapper if (!this.workerWrapper) { throw new Error("Worker wrapper is not initialized"); } @@ -137,7 +152,7 @@ export class WhisperProvider implements TranscriptionProvider { initial_prompt: initialPrompt, suppress_blank: true, suppress_non_speech_tokens: true, - no_timestamps: true, + no_timestamps: false, }, ]); @@ -302,7 +317,7 @@ export class WhisperProvider implements TranscriptionProvider { await this.workerWrapper.exec("initializeModel", [modelPath]); } catch (error) { logger.transcription.error(`Failed to initialize:`, error); - throw new Error(`Failed to initialize smart-whisper: ${error}`); + throw new Error(`Failed to initialize whisper wrapper: ${error}`); } } diff --git a/apps/desktop/src/pipeline/providers/transcription/whisper-worker-fork.ts b/apps/desktop/src/pipeline/providers/transcription/whisper-worker-fork.ts index 67bc5f0..e1ece3a 100644 --- a/apps/desktop/src/pipeline/providers/transcription/whisper-worker-fork.ts +++ b/apps/desktop/src/pipeline/providers/transcription/whisper-worker-fork.ts @@ -1,5 +1,19 @@ // Worker process entry point for fork -import { Whisper } from "@amical/smart-whisper"; +import { Whisper, getLoadedBindingInfo } from "@amical/whisper-wrapper"; + +// Type definitions for IPC communication +interface WorkerMessage { + id: number; + method: string; + args: unknown[]; +} + +interface SerializedFloat32Array { + __type: "Float32Array"; + data: number[]; +} + +type MethodArg = SerializedFloat32Array | unknown; // Simple console-based logging for worker process const logger = { @@ -29,7 +43,6 @@ const methods = { whisperInstance = null; } - const { Whisper } = await import("@amical/smart-whisper"); whisperInstance = new Whisper(modelPath, { gpu: true }); try { await whisperInstance.load(); @@ -71,8 +84,17 @@ const methods = { ); const transcription = await result; + logger.transcription.debug( + `Transcription segments: ${Array.isArray(transcription) ? transcription.length : "?"}`, + ); + if (Array.isArray(transcription)) { + logger.transcription.debug( + `First segment preview: ${transcription[0]?.text ?? ""}`, + ); + } + return transcription - .map((segment) => segment.text) + .map((segment: { text: string }) => segment.text) .join(" ") .trim(); }, @@ -84,23 +106,39 @@ const methods = { currentModelPath = null; } }, + + getBindingInfo(): { path: string; type: string } | null { + return getLoadedBindingInfo(); + }, }; // Handle messages from parent process -process.on("message", async (message: any) => { +process.on("message", async (message: WorkerMessage) => { const { id, method, args } = message; try { // Deserialize Float32Array from IPC - const deserializedArgs = args.map((arg: any) => { - if (arg && arg.__type === "Float32Array" && Array.isArray(arg.data)) { - return new Float32Array(arg.data); + const deserializedArgs = args.map((arg: MethodArg) => { + if ( + arg && + typeof arg === "object" && + "__type" in arg && + arg.__type === "Float32Array" + ) { + const serialized = arg as SerializedFloat32Array; + if (Array.isArray(serialized.data)) { + return new Float32Array(serialized.data); + } } return arg; }); if (method in methods) { - const result = await (methods as any)[method](...deserializedArgs); + const methodName = method as keyof typeof methods; + const fn = methods[methodName] as ( + ...args: unknown[] + ) => Promise; + const result = await fn(...deserializedArgs); process.send!({ id, result }); } else { process.send!({ id, error: `Unknown method: ${method}` }); diff --git a/apps/desktop/src/pipeline/providers/transcription/whisper-worker.ts b/apps/desktop/src/pipeline/providers/transcription/whisper-worker.ts index 69f9b71..2b6da3a 100644 --- a/apps/desktop/src/pipeline/providers/transcription/whisper-worker.ts +++ b/apps/desktop/src/pipeline/providers/transcription/whisper-worker.ts @@ -1,5 +1,5 @@ // This file contains just the Whisper-specific operations that need to run in a separate process -import { Whisper } from "@amical/smart-whisper"; +import { Whisper } from "@amical/whisper-wrapper"; // Simple console-based logging for worker process const logger = { @@ -27,7 +27,6 @@ export async function initializeModel(modelPath: string): Promise { whisperInstance = null; } - const { Whisper } = await import("@amical/smart-whisper"); whisperInstance = new Whisper(modelPath, { gpu: true }); try { await whisperInstance.load(); @@ -57,7 +56,7 @@ export async function transcribeAudio( const transcription = await result; return transcription - .map((segment) => segment.text) + .map((segment: { text: string }) => segment.text) .join(" ") .trim(); } diff --git a/apps/desktop/src/services/telemetry-service.ts b/apps/desktop/src/services/telemetry-service.ts index acbe26a..a4eebe5 100644 --- a/apps/desktop/src/services/telemetry-service.ts +++ b/apps/desktop/src/services/telemetry-service.ts @@ -9,6 +9,7 @@ export interface TranscriptionMetrics { session_id?: string; model_id: string; model_preloaded?: boolean; + whisper_native_binding?: string; total_duration_ms?: number; recording_duration_ms?: number; processing_duration_ms?: number; diff --git a/apps/desktop/src/services/transcription-service.ts b/apps/desktop/src/services/transcription-service.ts index c0b7711..e437d33 100644 --- a/apps/desktop/src/services/transcription-service.ts +++ b/apps/desktop/src/services/transcription-service.ts @@ -417,10 +417,22 @@ export class TranscriptionService { const audioDurationSeconds = session.context.sharedData.audioMetadata?.duration; + // Get native binding info if using local whisper + let whisperNativeBinding: string | undefined; + if (this.whisperProvider && "getBindingInfo" in this.whisperProvider) { + const bindingInfo = await this.whisperProvider.getBindingInfo(); + whisperNativeBinding = bindingInfo?.type; + logger.transcription.info( + "whisper native binding used", + whisperNativeBinding, + ); + } + this.telemetryService.trackTranscriptionCompleted({ session_id: sessionId, model_id: selectedModel!, model_preloaded: this.modelWasPreloaded, + whisper_native_binding: whisperNativeBinding, total_duration_ms: totalDuration || 0, recording_duration_ms: recordingDuration, processing_duration_ms: processingDuration, diff --git a/apps/desktop/vite.main.config.mts b/apps/desktop/vite.main.config.mts index fe823c1..ce51f91 100644 --- a/apps/desktop/vite.main.config.mts +++ b/apps/desktop/vite.main.config.mts @@ -29,7 +29,7 @@ export default defineConfig({ entryFileNames: "[name].js", }, external: [ - "@amical/smart-whisper", + "@amical/whisper-wrapper", "@libsql/client", "@libsql/darwin-arm64", "@libsql/darwin-x64", @@ -51,7 +51,7 @@ export default defineConfig({ optimizeDeps: { exclude: [ "better-sqlite3", - "smart-whisper", + "@amical/whisper-wrapper", "drizzle-orm", "@libsql/client", ], diff --git a/package.json b/package.json index 5455113..761ae52 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,13 @@ "keytar", "protobufjs", "sharp", - "smart-whisper", + "@amical/whisper-wrapper", "drizzle-orm/libsql" ], "onlyBuiltDependencies": [ "electron", "electron-winstaller", - "smart-whisper", + "@amical/whisper-wrapper", "drizzle-orm/libsql", "@libsql", "macos-alias", diff --git a/packages/smart-whisper/.gitignore b/packages/smart-whisper/.gitignore deleted file mode 100644 index 39898cc..0000000 --- a/packages/smart-whisper/.gitignore +++ /dev/null @@ -1,64 +0,0 @@ -# Dependencies -node_modules/ - -# Build outputs -build/ -*.node -bin/ - -# TypeScript outputs -dist/ -# Keep the build configuration file -!dist/build.js -*.tsbuildinfo - -# Native compilation artifacts -*.o -*.a -*.so -*.dylib -*.dll -*.lib -*.exp -*.ilk -*.pdb - -# Logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# OS files -.DS_Store -Thumbs.db -desktop.ini - -# IDE files -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# Environment variables -.env -.env.local -.env.*.local - -# Test coverage -coverage/ -*.lcov -.nyc_output/ - -# Temporary files -tmp/ -temp/ -*.tmp - -# whisper.cpp build artifacts (if any get generated) -whisper.cpp/build/ -whisper.cpp/*.o -whisper.cpp/**/*.o \ No newline at end of file diff --git a/packages/smart-whisper/WHISPER_CPP_VERSION b/packages/smart-whisper/WHISPER_CPP_VERSION deleted file mode 100644 index 0dbf45b..0000000 --- a/packages/smart-whisper/WHISPER_CPP_VERSION +++ /dev/null @@ -1,10 +0,0 @@ -# Whisper.cpp Version Information - -Repository: https://github.com/ggerganov/whisper.cpp -Commit: 2ef717b293fe93872cc3a03ca77942936a281959 -Date: November 2024 -Description: whisper : add large-v3-turbo (#2440) - -This file tracks the exact version of whisper.cpp used in this package. -To update whisper.cpp, replace the contents of the whisper.cpp directory -with a new version and update this file accordingly. \ No newline at end of file diff --git a/packages/smart-whisper/binding.gyp b/packages/smart-whisper/binding.gyp deleted file mode 100644 index bfc86db..0000000 --- a/packages/smart-whisper/binding.gyp +++ /dev/null @@ -1,37 +0,0 @@ -{ - 'variables' : { - 'openssl_fips': '', - }, - "targets": [ - { - "target_name": "smart-whisper", - "sources": [ - "src/binding/binding.cc", - "src/binding/common.cc", - "src/binding/model.cc", - "src/binding/transcribe.cc", - " void, - ): void; - - /** - * Release the memory of the model, it will be unusable after this. - * @param handle The handle to the model. - * @param callback A callback that will be called when the model is freed. - */ - export declare function free(handle: Handle, callback: () => void): void; - - /** - * Transcribe a PCM buffer. - * @param handle The handle to the model. - * @param pcm The PCM buffer. - * @param params The parameters to use for transcription. - * @param finish A callback that will be called when the transcription is finished. - * @param progress A callback that will be called when a new result is available. - */ - export declare function transcribe< - Format extends TranscribeFormat, - TokenTimestamp extends boolean, - >( - handle: Handle, - pcm: Float32Array, - params: Partial>, - finish: (results: TranscribeResult[]) => void, - progress: (result: TranscribeResult) => void, - ): void; - - export declare class WhisperModel { - private _ctx; - constructor(handle: Handle); - get handle(): Handle | null; - get freed(): boolean; - /** - * Release the memory of the model, it will be unusable after this. - * It's safe to call this multiple times, but it will only free the model once. - */ - free(): Promise; - /** - * Load a model from a whisper weights file. - * @param file The path to the whisper weights file. - * @param gpu Whether to use the GPU or not. - * @returns A promise that resolves to a {@link WhisperModel}. - */ - static load(file: string, gpu?: boolean): Promise; - } -} - -/** - * The native binding for the underlying C++ addon. - */ -export const binding: typeof Binding = module; diff --git a/packages/smart-whisper/src/binding/binding.cc b/packages/smart-whisper/src/binding/binding.cc deleted file mode 100644 index 4fb59c8..0000000 --- a/packages/smart-whisper/src/binding/binding.cc +++ /dev/null @@ -1,18 +0,0 @@ -#include - -#include "common.h" -#include "model.h" -#include "transcribe.h" - -Napi::Object Init(Napi::Env env, Napi::Object exports) { - exports.Set("transcribe", Napi::Function::New(env, Transcribe)); - WhisperModel::Init(env, exports); - - if (IsProduction(env.Global())) { - whisper_log_set([](ggml_log_level level, const char *text, void *user_data) {}, nullptr); - } - - return exports; -} - -NODE_API_MODULE(whisper, Init) diff --git a/packages/smart-whisper/src/binding/common.cc b/packages/smart-whisper/src/binding/common.cc deleted file mode 100644 index 4150054..0000000 --- a/packages/smart-whisper/src/binding/common.cc +++ /dev/null @@ -1,16 +0,0 @@ -#include "common.h" - -Napi::Promise PromiseWorker::Promise() { return promise.Promise(); } - -bool IsProduction(const Napi::Object global_env) { - Napi::Object process = global_env.Get("process").As(); - Napi::Object env = process.Get("env").As(); - Napi::Value node_env = env.Get("NODE_ENV"); - - if (!node_env.IsString()) { - return false; - } - - Napi::String node_env_str = node_env.As(); - return node_env_str.Utf8Value() == "production"; -} diff --git a/packages/smart-whisper/src/binding/common.h b/packages/smart-whisper/src/binding/common.h deleted file mode 100644 index 471f797..0000000 --- a/packages/smart-whisper/src/binding/common.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _GUARD_SW_COMMON_H -#define _GUARD_SW_COMMON_H - -#ifndef NAPI_VERSION -// Support Node.js 16+ -#define NAPI_VERSION 8 -#endif -#include - -class PromiseWorker : public Napi::AsyncWorker { - public: - PromiseWorker(Napi::Env &env) : AsyncWorker(env), promise(Napi::Promise::Deferred::New(env)) {} - - Napi::Promise Promise(); - - protected: - Napi::Promise::Deferred promise; -}; - -bool IsProduction(const Napi::Object global_env); - -#endif diff --git a/packages/smart-whisper/src/binding/model.cc b/packages/smart-whisper/src/binding/model.cc deleted file mode 100644 index 902f888..0000000 --- a/packages/smart-whisper/src/binding/model.cc +++ /dev/null @@ -1,145 +0,0 @@ -#include "model.h" - -class LoadModelWorker : public PromiseWorker { - public: - LoadModelWorker(Napi::Env &env, const std::string &model_path, - struct whisper_context_params params) - : PromiseWorker(env), model_path(model_path), params(params) {} - - void Execute() override { - context = whisper_init_from_file_with_params_no_state(model_path.c_str(), params); - if (context == nullptr) { - SetError("Failed to initialize whisper context"); - } - whisper_print_timings(context); - } - - void OnOK() override { - Napi::HandleScope scope(Env()); - auto handle = Napi::External::New(Env(), context); - auto constructor = Env().GetInstanceData(); - auto model = constructor->New({handle}); - - promise.Resolve(model); - } - - private: - std::string model_path; - struct whisper_context_params params; - whisper_context *context; -}; - -class FreeModelWorker : public PromiseWorker { - public: - FreeModelWorker(Napi::Env &env, whisper_context *context) - : PromiseWorker(env), context(context) {} - - void Execute() override { whisper_free(context); } - - void OnOK() override { - Napi::HandleScope scope(Env()); - promise.Resolve(Env().Undefined()); - } - - private: - whisper_context *context; -}; - -Napi::Object WhisperModel::Init(Napi::Env env, Napi::Object exports) { - Napi::Function func = DefineClass( - env, "WhisperModel", - { - StaticMethod<&WhisperModel::Load>( - "load", static_cast(napi_writable | napi_configurable)), - InstanceMethod<&WhisperModel::Free>( - "free", static_cast(napi_writable | napi_configurable)), - InstanceAccessor( - "freed", &WhisperModel::GetFreed, nullptr, - static_cast(napi_enumerable | napi_configurable)), - InstanceAccessor( - "handle", &WhisperModel::GetHandle, nullptr, - static_cast(napi_enumerable | napi_configurable)), - }); - - auto constructor = new Napi::FunctionReference(); - *constructor = Napi::Persistent(func); - env.SetInstanceData(constructor); - - exports.Set("WhisperModel", func); - return exports; -} - -WhisperModel::WhisperModel(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) { - Napi::Env env = info.Env(); - Napi::HandleScope scope(env); - - if (info.Length() != 1) { - Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException(); - return; - } - - whisper_context *context = info[0].As>().Data(); - this->context = context; -} - -void WhisperModel::Finalize(Napi::Env env) { - if (context != nullptr) { - whisper_free(context); - context = nullptr; - } -} - -Napi::Value WhisperModel::Load(const Napi::CallbackInfo &info) { - Napi::Env env = info.Env(); - - if (info.Length() < 1 || info.Length() > 2) { - Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException(); - return env.Null(); - } - - std::string model_path = info[0].As(); - - whisper_context_params params; - params.use_gpu = info.Length() == 2 ? info[1].As() : true; - - auto worker = new LoadModelWorker(env, model_path, params); - worker->Queue(); - - return worker->Promise(); -} - -Napi::Value WhisperModel::Free(const Napi::CallbackInfo &info) { - Napi::Env env = info.Env(); - - if (info.Length() != 0) { - Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException(); - return env.Null(); - } - - if (context == nullptr) { - auto deferred = Napi::Promise::Deferred::New(env); - deferred.Resolve(env.Undefined()); - return deferred.Promise(); - } else { - auto worker = new FreeModelWorker(env, context); - context = nullptr; - worker->Queue(); - return worker->Promise(); - } -} - -Napi::Value WhisperModel::GetFreed(const Napi::CallbackInfo &info) { - Napi::Env env = info.Env(); - - return Napi::Boolean::New(env, context == nullptr); -} - -Napi::Value WhisperModel::GetHandle(const Napi::CallbackInfo &info) { - Napi::Env env = info.Env(); - - if (context == nullptr) { - return env.Null(); - } - - return Napi::External::New(env, context); -} diff --git a/packages/smart-whisper/src/binding/model.h b/packages/smart-whisper/src/binding/model.h deleted file mode 100644 index 2f1fdc2..0000000 --- a/packages/smart-whisper/src/binding/model.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _GUARD_SW_MODEL_H -#define _GUARD_SW_MODEL_H - -#include "common.h" -#include "whisper.h" - -class WhisperModel : public Napi::ObjectWrap { - public: - static Napi::Object Init(Napi::Env env, Napi::Object exports); - - WhisperModel(const Napi::CallbackInfo &info); - void Finalize(Napi::Env env); - - private: - whisper_context *context; - static Napi::Value Load(const Napi::CallbackInfo &info); - Napi::Value Free(const Napi::CallbackInfo &info); - Napi::Value GetFreed(const Napi::CallbackInfo &info); - Napi::Value GetHandle(const Napi::CallbackInfo &info); -}; - -#endif diff --git a/packages/smart-whisper/src/binding/transcribe.cc b/packages/smart-whisper/src/binding/transcribe.cc deleted file mode 100644 index 9fc0781..0000000 --- a/packages/smart-whisper/src/binding/transcribe.cc +++ /dev/null @@ -1,358 +0,0 @@ -#include "transcribe.h" - -struct smart_whisper_transcribe_params { - const char* format; -}; - -struct whisper_full_params whisper_full_params_from_js(Napi::Object o) { - struct whisper_full_params params = - whisper_full_default_params(whisper_sampling_strategy::WHISPER_SAMPLING_BEAM_SEARCH); - - if (o.Has("strategy")) { - params.strategy = static_cast( - o.Get("strategy").As().Int32Value()); - } - if (o.Has("n_threads")) { - params.n_threads = o.Get("n_threads").As(); - } - if (o.Has("n_max_text_ctx")) { - params.n_max_text_ctx = o.Get("n_max_text_ctx").As(); - } - if (o.Has("offset_ms")) { - params.offset_ms = o.Get("offset_ms").As(); - } - if (o.Has("duration_ms")) { - params.duration_ms = o.Get("duration_ms").As(); - } - - if (o.Has("translate")) { - params.translate = o.Get("translate").As(); - } - if (o.Has("no_context")) { - params.no_context = o.Get("no_context").As(); - } - if (o.Has("no_timestamps")) { - params.no_timestamps = o.Get("no_timestamps").As(); - } - if (o.Has("single_segment")) { - params.single_segment = o.Get("single_segment").As(); - } - if (o.Has("print_special")) { - params.print_special = o.Get("print_special").As(); - } - if (o.Has("print_progress")) { - params.print_progress = o.Get("print_progress").As(); - } - if (o.Has("print_realtime")) { - params.print_realtime = o.Get("print_realtime").As(); - } - if (o.Has("print_timestamps")) { - params.print_timestamps = o.Get("print_timestamps").As(); - } - - if (o.Has("token_timestamps")) { - params.token_timestamps = o.Get("token_timestamps").As(); - } - if (o.Has("thold_pt")) { - params.thold_pt = o.Get("thold_pt").As(); - } - if (o.Has("thold_ptsum")) { - params.thold_ptsum = o.Get("thold_ptsum").As(); - } - if (o.Has("max_len")) { - params.max_len = o.Get("max_len").As(); - } - if (o.Has("split_on_word")) { - params.split_on_word = o.Get("split_on_word").As(); - } - if (o.Has("max_tokens")) { - params.max_tokens = o.Get("max_tokens").As(); - } - - if (o.Has("debug_mode")) { - params.debug_mode = o.Get("debug_mode").As(); - } - if (o.Has("audio_ctx")) { - params.audio_ctx = o.Get("audio_ctx").As(); - } - - if (o.Has("tdrz_enable")) { - params.tdrz_enable = o.Get("tdrz_enable").As(); - } - - if (o.Has("initial_prompt") && o.Get("initial_prompt").IsString()) { - std::string initial_prompt = o.Get("initial_prompt").As().Utf8Value(); - params.initial_prompt = strdup(initial_prompt.c_str()); - } else { - params.initial_prompt = nullptr; - } - - if (o.Has("language") && o.Get("language").IsString()) { - std::string language = o.Get("language").As().Utf8Value(); - params.language = strdup(language.c_str()); - } else { - params.language = strdup("auto"); - } - - if (o.Has("suppress_blank") && o.Get("suppress_blank").IsBoolean()) { - params.suppress_blank = o.Get("suppress_blank").As(); - } - if (o.Has("suppress_non_speech_tokens") && o.Get("suppress_non_speech_tokens").IsBoolean()) { - params.suppress_non_speech_tokens = o.Get("suppress_non_speech_tokens").As(); - } - - if (o.Has("temperature")) { - params.temperature = o.Get("temperature").As(); - } - if (o.Has("max_initial_ts")) { - params.max_initial_ts = o.Get("max_initial_ts").As(); - } - if (o.Has("length_penalty")) { - params.length_penalty = o.Get("length_penalty").As(); - } - - if (o.Has("temperature_inc")) { - params.temperature_inc = o.Get("temperature_inc").As(); - } - if (o.Has("entropy_thold")) { - params.entropy_thold = o.Get("entropy_thold").As(); - } - if (o.Has("logprob_thold")) { - params.logprob_thold = o.Get("logprob_thold").As(); - } - if (o.Has("no_speech_thold")) { - params.no_speech_thold = o.Get("no_speech_thold").As(); - } - - if (o.Has("best_of")) { - params.greedy.best_of = o.Get("best_of").As(); - } - - if (o.Has("beam_size")) { - params.beam_search.beam_size = o.Get("beam_size").As(); - } - - return params; -} - -struct smart_whisper_transcribe_params smart_whisper_transcribe_params_from_js(Napi::Object o) { - struct smart_whisper_transcribe_params params; - - if (o.Has("format") && o.Get("format").IsString()) { - std::string format = o.Get("format").As().Utf8Value(); - params.format = strdup(format.c_str()); - } else { - params.format = strdup("simple"); - } - - return params; -} - -class TranscribeWorker : public Napi::AsyncProgressQueueWorker { - public: - TranscribeWorker(whisper_context* context, const float* samples, int n_samples, - struct whisper_full_params params, - struct smart_whisper_transcribe_params smart_params, - Napi::Function& finish_callback, Napi::Function& progress_callback) - : AsyncProgressQueueWorker(finish_callback), - context(context), - samples(samples), - n_samples(n_samples), - params(params), - smart_params(smart_params) { - this->progress_callback.Reset(progress_callback, 1); - state = nullptr; - } - - ~TranscribeWorker() { - delete[] samples; - // whisper_free_params(¶ms); will lead to a double free - if (params.initial_prompt != nullptr) { - free((void*)params.initial_prompt); - } - if (params.language != nullptr) { - free((void*)params.language); - } - if (state != nullptr) { - whisper_free_state(state); - } - - free((void*)smart_params.format); - } - - void Execute(const ExecutionProgress& progress) override { - state = whisper_init_state(context); - - params.new_segment_callback = [](struct whisper_context* ctx, struct whisper_state* state, - int n_new, void* user_data) { - const ExecutionProgress& progress = *(ExecutionProgress*)user_data; - - const int i = whisper_full_n_segments_from_state(state) - 1; - progress.Send(&i, 1); - }; - params.new_segment_callback_user_data = (void*)&progress; - - int err = whisper_full_with_state(context, state, params, samples, n_samples); - if (err != 0) { - SetError("whisper_full operation failed"); - } - } - - void OnProgress(const int* data, size_t _count) override { - Napi::HandleScope scope(Env()); - - if (this->progress_callback.IsEmpty()) { - return; - } - - int i = (*data); - - Napi::Object segment = Napi::Object::New(Env()); - segment.Set("from", Napi::Number::New( - Env(), whisper_full_get_segment_t0_from_state(state, i) * 10)); - segment.Set( - "to", Napi::Number::New(Env(), whisper_full_get_segment_t1_from_state(state, i) * 10)); - segment.Set("text", - Napi::String::New(Env(), whisper_full_get_segment_text_from_state(state, i))); - - if (strcmp(smart_params.format, "detail") == 0) { - float confidence = 0, min_p = 1, max_p = 0; - int skips = 0; - int tokens = whisper_full_n_tokens_from_state(state, i); - Napi::Array tokens_array = Napi::Array::New(Env(), tokens); - for (int j = 0; j < tokens; j++) { - auto token = whisper_full_get_token_data_from_state(state, i, j); - Napi::Object token_object = Napi::Object::New(Env()); - token_object.Set("text", - Napi::String::New(Env(), whisper_full_get_token_text_from_state( - context, state, i, j))); - token_object.Set("id", Napi::Number::New(Env(), token.id)); - token_object.Set("p", Napi::Number::New(Env(), token.p)); - tokens_array.Set(j, token_object); - - if (token.id > whisper_token_eot(context)) { - skips++; - continue; - } - confidence += token.p; - min_p = std::min(min_p, token.p); - max_p = std::max(max_p, token.p); - } - - if (tokens > 2) { - confidence = (confidence - min_p - max_p) / (tokens - 2 - skips); - } else { - confidence = confidence / (tokens - skips); - } - - segment.Set( - "lang", - Napi::String::New(Env(), whisper_lang_str(whisper_full_lang_id_from_state(state)))); - segment.Set("confidence", Napi::Number::New(Env(), confidence)); - segment.Set("tokens", tokens_array); - } - - this->progress_callback.Call({segment}); - } - - void OnOK() override { - Napi::HandleScope scope(Env()); - - int n_segments = whisper_full_n_segments_from_state(state); - Napi::Array segments = Napi::Array::New(Env(), n_segments); - for (int i = 0; i < n_segments; i++) { - Napi::Object segment = Napi::Object::New(Env()); - segment.Set("from", Napi::Number::New( - Env(), whisper_full_get_segment_t0_from_state(state, i) * 10)); - segment.Set("to", Napi::Number::New( - Env(), whisper_full_get_segment_t1_from_state(state, i) * 10)); - segment.Set("text", Napi::String::New( - Env(), whisper_full_get_segment_text_from_state(state, i))); - - if (strcmp(smart_params.format, "detail") == 0) { - float confidence = 0, min_p = 1, max_p = 0; - int skips = 0; - int tokens = whisper_full_n_tokens_from_state(state, i); - Napi::Array tokens_array = Napi::Array::New(Env(), tokens); - for (int j = 0; j < tokens; j++) { - auto token = whisper_full_get_token_data_from_state(state, i, j); - Napi::Object token_object = Napi::Object::New(Env()); - token_object.Set( - "text", Napi::String::New(Env(), whisper_full_get_token_text_from_state( - context, state, i, j))); - token_object.Set("id", Napi::Number::New(Env(), token.id)); - token_object.Set("p", Napi::Number::New(Env(), token.p)); - if (params.token_timestamps) { - token_object.Set("from", Napi::Number::New(Env(), token.t0 * 10)); - token_object.Set("to", Napi::Number::New(Env(), token.t1 * 10)); - } - - tokens_array.Set(j, token_object); - - if (token.id > whisper_token_eot(context)) { - skips++; - continue; - } - confidence += token.p; - min_p = std::min(min_p, token.p); - max_p = std::max(max_p, token.p); - } - - if (tokens - skips > 2) { - confidence = (confidence - min_p - max_p) / (tokens - skips - 2); - } else if (tokens - skips > 0) { - confidence = confidence / (tokens - skips); - } - - segment.Set("lang", - Napi::String::New( - Env(), whisper_lang_str(whisper_full_lang_id_from_state(state)))); - segment.Set("confidence", Napi::Number::New(Env(), confidence)); - segment.Set("tokens", tokens_array); - } - - segments.Set(i, segment); - } - - Callback().Call({segments}); - } - - private: - whisper_context* context; - whisper_state* state; - const float* samples; - int n_samples; - struct whisper_full_params params; - struct smart_whisper_transcribe_params smart_params; - Napi::FunctionReference progress_callback; -}; - -Napi::Value Transcribe(const Napi::CallbackInfo& info) { - Napi::Env env = info.Env(); - - if (info.Length() != 5) { - Napi::TypeError::New(env, "Wrong number of arguments").ThrowAsJavaScriptException(); - return env.Null(); - } - - whisper_context* context = info[0].As>().Data(); - - Napi::Float32Array pcm = info[1].As(); - float* samples = new float[pcm.ElementLength()]; - memcpy(samples, pcm.Data(), pcm.ByteLength()); - - int n_samples = static_cast(pcm.ElementLength()); - - Napi::Object params = info[2].As(); - auto whisper_params = whisper_full_params_from_js(params); - auto smart_params = smart_whisper_transcribe_params_from_js(params); - - Napi::Function finish_callback = info[3].As(); - Napi::Function progress_callback = info[4].As(); - - auto worker = new TranscribeWorker(context, samples, n_samples, whisper_params, smart_params, - finish_callback, progress_callback); - worker->Queue(); - - return env.Undefined(); -} diff --git a/packages/smart-whisper/src/binding/transcribe.h b/packages/smart-whisper/src/binding/transcribe.h deleted file mode 100644 index 332d9dd..0000000 --- a/packages/smart-whisper/src/binding/transcribe.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _GUARD_SW_TRANSCRIBE_H -#define _GUARD_SW_TRANSCRIBE_H - -#include "common.h" -#include "whisper.h" - -Napi::Value Transcribe(const Napi::CallbackInfo& info); - -#endif diff --git a/packages/smart-whisper/src/build.ts b/packages/smart-whisper/src/build.ts deleted file mode 100644 index 3d851d3..0000000 --- a/packages/smart-whisper/src/build.ts +++ /dev/null @@ -1,97 +0,0 @@ -import os from "node:os"; -import { execSync } from "node:child_process"; - -type ComputeBackend = "cpu" | "accelerate" | "metal" | "clblast" | "openblas"; - -const cfg = config(); - -export const sources = cfg.sources.join(" "); -export const defines = cfg.defines.join(" "); -export const libraries = cfg.libraries.join(" "); - -function config(): { - sources: string[]; - defines: string[]; - libraries: string[]; -} { - if (process.env.BYOL) { - return { - sources: [], - defines: [], - libraries: [process.env.BYOL], - }; - } - - const COMPUTE_BACKEND: ComputeBackend = - (process.env.COMPUTE_BACKEND as ComputeBackend | undefined) ?? - infer_backend(); - - const cfg = { - sources: [ - "whisper.cpp/src/whisper.cpp", - "whisper.cpp/ggml/src/ggml.c", - "whisper.cpp/ggml/src/ggml-alloc.c", - "whisper.cpp/ggml/src/ggml-backend.c", - "whisper.cpp/ggml/src/ggml-quants.c", - "whisper.cpp/ggml/src/ggml-aarch64.c", - ] as string[], - defines: [] as string[], - libraries: [] as string[], - }; - - switch (COMPUTE_BACKEND) { - case "accelerate": { - cfg.defines.push("GGML_USE_ACCELERATE"); - - cfg.libraries.push('"-framework Foundation"'); - cfg.libraries.push('"-framework Accelerate"'); - break; - } - case "metal": { - cfg.sources.push("whisper.cpp/ggml/src/ggml-metal.m"); - - cfg.defines.push("GGML_USE_ACCELERATE"); - cfg.defines.push("GGML_USE_METAL"); - - cfg.libraries.push('"-framework Foundation"'); - cfg.libraries.push('"-framework Accelerate"'); - cfg.libraries.push('"-framework Metal"'); - cfg.libraries.push('"-framework MetalKit"'); - break; - } - case "openblas": { - cfg.defines.push("GGML_USE_OPENBLAS"); - - cfg.libraries.push("-lopenblas"); - break; - } - default: { - } - } - - return cfg; -} - -function infer_backend(): ComputeBackend { - let backend: ComputeBackend = "cpu"; - - try { - if (os.platform() === "darwin") { - backend = "accelerate"; - if (os.arch() === "arm64") { - backend = "metal"; - } - } else if (os.platform() === "linux") { - const has_libopenblas = !!execSync("ldconfig -p | grep libopenblas") - .toString() - .trim(); - if (has_libopenblas) { - backend = "openblas"; - } - } - } catch { - // if anything goes wrong, just use the default cpu backend - } - - return backend; -} diff --git a/packages/smart-whisper/src/index.ts b/packages/smart-whisper/src/index.ts deleted file mode 100644 index 9c0ded3..0000000 --- a/packages/smart-whisper/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./binding"; -export * from "./model"; -export * from "./transcribe"; -export * from "./types"; -export * from "./whisper"; - -export * as manager from "./model-manager"; diff --git a/packages/smart-whisper/src/model-manager/index.ts b/packages/smart-whisper/src/model-manager/index.ts deleted file mode 100644 index d0dc41a..0000000 --- a/packages/smart-whisper/src/model-manager/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import path from "node:path"; -import fs from "node:fs"; -import os from "node:os"; -import { Readable } from "node:stream"; -import type { ReadableStream } from "node:stream/web"; - -const root = path.join(os.homedir(), ".smart-whisper"); -const models = path.join(root, "models"); -const ext = ".bin"; - -fs.mkdirSync(models, { recursive: true }); - -const BASE_MODELS_URL = - "https://huggingface.co/ggerganov/whisper.cpp/resolve/main"; - -/** - * MODELS is an object that contains the URLs of different ggml whisper models. - * Each model is represented by a key-value pair, where the key is the model name - * and the value is the URL of the model. - */ -export const MODELS = { - tiny: `${BASE_MODELS_URL}/ggml-tiny.bin`, - "tiny.en": `${BASE_MODELS_URL}/ggml-tiny.en.bin`, - small: `${BASE_MODELS_URL}/ggml-small.bin`, - "small.en": `${BASE_MODELS_URL}/ggml-small.en.bin`, - base: `${BASE_MODELS_URL}/ggml-base.bin`, - "base.en": `${BASE_MODELS_URL}/ggml-base.en.bin`, - medium: `${BASE_MODELS_URL}/ggml-medium.bin`, - "medium.en": `${BASE_MODELS_URL}/ggml-medium.en.bin`, - "large-v1": `${BASE_MODELS_URL}/ggml-large-v1.bin`, - "large-v2": `${BASE_MODELS_URL}/ggml-large-v2.bin`, - "large-v3": `${BASE_MODELS_URL}/ggml-large-v3.bin`, - "large-v3-turbo": `${BASE_MODELS_URL}/ggml-large-v3-turbo.bin`, -} as const; - -export type ModelName = keyof typeof MODELS | (string & {}); - -/** - * Downloads a ggml whisper model from a specified URL or shorthand. - * - * @param model - The model to download, specified either as a key of the {@link MODELS} object or as a URL. - * @returns A promise that resolves to the name of the downloaded model. - * @throws An error if the model URL or shorthand is invalid, or if the model fails to download. - */ -export async function download(model: ModelName): Promise { - let url = "", - name = ""; - if (model in MODELS) { - url = MODELS[model as keyof typeof MODELS]; - name = model; - } else { - try { - url = new URL(model).href; - name = new URL(url).pathname.split("/").pop() ?? ""; - } catch {} - } - - if (!url) { - throw new Error(`Invalid model URL or shorthand: ${model}`); - } - - if (!name) { - throw new Error(`Failed to parse model name: ${url}`); - } - - if (check(name)) { - return name; - } - - const res = await fetch(url); - if (!res.ok || !res.body) { - throw new Error(`Failed to download model: ${res.statusText}`); - } - - const stream = fs.createWriteStream( - path.join(models, name.endsWith(ext) ? name : name + ext), - ); - Readable.fromWeb(res.body as ReadableStream).pipe(stream); - - return new Promise((resolve) => stream.on("finish", () => resolve(name))); -} - -/** - * Removes a locally downloaded model. - * @param model - The name of the model to remove. - */ -export function remove(model: ModelName): void { - if (check(model)) { - fs.unlinkSync(path.join(models, model + ext)); - } -} - -/** - * Retrieves a list of model names that are available locally. - * @returns An array of model names. - */ -export function list(): ModelName[] { - const files = fs.readdirSync(models).filter((file) => file.endsWith(ext)); - return files.map((file) => file.slice(0, -ext.length)); -} - -/** - * Checks if a model exists. - * @param model - The name of the model. - * @returns True if the model exists, false otherwise. - */ -export function check(model: ModelName): boolean { - return fs.existsSync(path.join(models, model + ext)); -} - -/** - * Resolves the absolute path of a model. - * @param model - The name of the model. - * @returns The resolved path of the model. - * @throws Error if the model is not found. - */ -export function resolve(model: ModelName): string { - if (check(model)) { - return path.join(models, model + ext); - } else { - throw new Error(`Model not found: ${model}`); - } -} - -export const dir = { root, models }; diff --git a/packages/smart-whisper/src/model.ts b/packages/smart-whisper/src/model.ts deleted file mode 100644 index df296a8..0000000 --- a/packages/smart-whisper/src/model.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { binding } from "./binding"; - -export class WhisperModel extends binding.WhisperModel {} diff --git a/packages/smart-whisper/src/transcribe.ts b/packages/smart-whisper/src/transcribe.ts deleted file mode 100644 index 376e2f5..0000000 --- a/packages/smart-whisper/src/transcribe.ts +++ /dev/null @@ -1,114 +0,0 @@ -import EventEmitter from "node:events"; -import type { WhisperModel } from "./model"; -import { TranscribeFormat, TranscribeParams, TranscribeResult } from "./types"; -import { binding } from "./binding"; - -export class TranscribeTask< - Format extends TranscribeFormat, - TokenTimestamp extends boolean, -> extends EventEmitter { - private _model: WhisperModel; - private _result: Promise[]> | null = - null; - - /** - * You should not construct this class directly, use {@link TranscribeTask.run} instead. - */ - constructor(model: WhisperModel) { - super(); - this._model = model; - } - - get model(): WhisperModel { - return this._model; - } - - /** - * A promise that resolves to the result of the transcription task. - */ - get result(): Promise[]> { - if (this._result === null) { - throw new Error("Task has not been started"); - } - return this._result; - } - - private async _run( - pcm: Float32Array, - params: Partial>, - ): Promise[]> { - return new Promise((resolve) => { - const handle = this.model.handle; - if (!handle) { - throw new Error("Model has been freed"); - } - - binding.transcribe( - handle, - pcm, - params, - (results) => { - this.emit("finish"); - resolve(results); - }, - (result) => { - this.emit("transcribed", result); - }, - ); - }); - } - - static async run< - Format extends TranscribeFormat, - TokenTimestamp extends boolean, - >( - model: WhisperModel, - pcm: Float32Array, - params: Partial>, - ): Promise> { - if (model.freed) { - throw new Error("Model has been freed"); - } - - const task = new TranscribeTask(model); - task._result = task._run(pcm, params); - - return task; - } - - on( - event: "finish", - listener: (results: TranscribeResult[]) => void, - ): this; - on( - event: "transcribed", - listener: (result: TranscribeResult) => void, - ): this; - on(event: string, listener: (...args: any[]) => void): this { - return super.on(event, listener); - } - - once( - event: "finish", - listener: (results: TranscribeResult[]) => void, - ): this; - once( - event: "transcribed", - listener: (result: TranscribeResult) => void, - ): this; - once(event: string, listener: (...args: any[]) => void): this { - return super.once(event, listener); - } - - off( - event: "finish", - listener: (results: TranscribeResult[]) => void, - ): this; - off( - event: "transcribed", - listener: (result: TranscribeResult) => void, - ): this; - off(event: string, listener: (...args: any[]) => void): this { - return super.off(event, listener); - } -} diff --git a/packages/smart-whisper/src/types.ts b/packages/smart-whisper/src/types.ts deleted file mode 100644 index a1c627d..0000000 --- a/packages/smart-whisper/src/types.ts +++ /dev/null @@ -1,104 +0,0 @@ -export enum WhisperSamplingStrategy { - WHISPER_SAMPLING_GREEDY, - WHISPER_SAMPLING_BEAM_SEARCH, -} - -export type TranscribeFormat = "simple" | "detail"; - -/** - * See {@link https://github.com/ggerganov/whisper.cpp/blob/00b7a4be02ca82d53ac69dd2dd438c16e2af7658/whisper.h#L433C19-L433C19} for details. - */ -export interface TranscribeParams< - Format extends TranscribeFormat = TranscribeFormat, - TokenTimestamp extends boolean = false, -> { - strategy: WhisperSamplingStrategy; - n_threads: number; - n_max_text_ctx: number; - offset_ms: number; - duration_ms: number; - - translate: boolean; - no_context: boolean; - no_timestamps: boolean; - single_segment: boolean; - print_special: boolean; - print_progress: boolean; - print_realtime: boolean; - print_timestamps: boolean; - - token_timestamps: TokenTimestamp; - thold_pt: number; - thold_ptsum: number; - max_len: number; - split_on_word: boolean; - max_tokens: number; - - speed_up: boolean; - debug_mode: boolean; - audio_ctx: number; - - tdrz_enable: boolean; - - initial_prompt: string; - - /** - * Language code, e.g. "en", "de", "fr", "es", "it", "nl", "pt", "ru", "tr", "uk", "pl", "sv", "cs", "zh", "ja", "ko" - */ - language: string; - - suppress_blank: boolean; - suppress_non_speech_tokens: boolean; - - temperature: number; - max_initial_ts: number; - length_penalty: number; - - temperature_inc: number; - entropy_thold: number; - logprob_thold: number; - no_speech_thold: number; - - best_of: number; - - beam_size: number; - - format: Format; -} - -export interface TranscribeSimpleResult { - from: number; - to: number; - text: string; -} - -/** - * Represents a detailed result of transcription. - */ -export interface TranscribeDetailedResult - extends TranscribeSimpleResult { - /** The detected spoken language. */ - lang: string; - /** The confidence level of the transcription, calculated by the average probability of the tokens. */ - confidence: number; - /** The tokens generated during the transcription process. */ - tokens: { - /** The text of the token, for CJK languages, due to the BPE encoding, the token text may not be readable. */ - text: string; - /** The ID of the token. */ - id: number; - /** The probability of the token. */ - p: number; - /** The start timestamp of the token, in milliseconds. Only available when `token_timestamps` of {@link TranscribeParams} is `true`. */ - from: TokenTimestamp extends true ? number : undefined; - /** The end timestamp of the token, in milliseconds. Only available when `token_timestamps` of {@link TranscribeParams} is `true`. */ - to: TokenTimestamp extends true ? number : undefined; - }[]; -} - -export type TranscribeResult< - Format extends TranscribeFormat = TranscribeFormat, - TokenTimestamp extends boolean = boolean, -> = Format extends "simple" - ? TranscribeSimpleResult - : TranscribeDetailedResult; diff --git a/packages/smart-whisper/src/whisper.ts b/packages/smart-whisper/src/whisper.ts deleted file mode 100644 index fad4071..0000000 --- a/packages/smart-whisper/src/whisper.ts +++ /dev/null @@ -1,148 +0,0 @@ -import type { - TranscribeFormat, - TranscribeParams, - TranscribeResult, -} from "./types"; -import { WhisperModel } from "./model"; -import { TranscribeTask } from "./transcribe"; - -export interface WhisperConfig { - /** - * Time in seconds to wait before offloading the model if it's not being used. - */ - offload: number; - - /** - * Whether to use the GPU or not. - */ - gpu: boolean; -} - -/** - * The Whisper class is responsible for managing the lifecycle and operations of whisper model. - * It handles the loading and offloading of the model, managing transcription tasks, and configuring model parameters. - */ -export class Whisper { - private _file: string; - private _available: WhisperModel | null = null; - private _loading: Promise | null = null; - private _tasks: Promise[] = []; - private _config: WhisperConfig; - private _offload_timer: NodeJS.Timeout | null = null; - - /** - * Constructs a new Whisper instance with a specified model file and configuration. - * @param file - The path to the Whisper model file. - * @param config - Optional configuration for the Whisper instance. - */ - constructor(file: string, config: Partial = {}) { - this._file = file; - this._config = { - offload: 300, - gpu: true, - ...config, - }; - } - - get file(): string { - return this._file; - } - - set file(file: string) { - this._file = file; - } - - get config(): WhisperConfig { - return this._config; - } - - get tasks(): Promise[] { - return this._tasks; - } - - reset_offload_timer(): void { - this.clear_offload_timer(); - this._offload_timer = setTimeout(() => { - this.free(); - }, this.config.offload * 1000); - } - - private clear_offload_timer(): void { - if (this._offload_timer !== null) { - clearTimeout(this._offload_timer); - this._offload_timer = null; - } - } - - async model(): Promise { - if (this._available === null) { - return this.load(); - } - this.reset_offload_timer(); - return Promise.resolve(this._available); - } - - /** - * Loads the whisper model asynchronously. - * If the model is already being loaded, returns the existing one. - * - * You don't need to call this method directly, it's called automatically if necessary when you call {@link Whisper.transcribe}. - * - * @returns A Promise that resolves to the loaded model. - */ - async load(): Promise { - if (this._loading !== null) { - return this._loading; - } - - const model = WhisperModel.load(this.file, this.config.gpu); - this._loading = model; - this._available = await model; - this._loading = null; - this.reset_offload_timer(); - return this._available; - } - - /** - * Transcribes the given PCM audio data using the Whisper model. - * @param pcm - The mono 16k PCM audio data to transcribe. - * @param params - Optional parameters for transcription. - * @returns A promise that resolves to the result of the transcription task. - */ - async transcribe< - Format extends TranscribeFormat, - TokenTimestamp extends boolean, - >( - pcm: Float32Array, - params: Partial> = {}, - ): Promise> { - const model = await this.model(); - const task = await TranscribeTask.run( - model, - pcm, - params, - ); - this._tasks.push(task.result); - return task; - } - - async free(): Promise { - if (this._available === null) { - return; - } - const model = this._available; - this._available = null; - this.clear_offload_timer(); - await Promise.all(this.tasks); - await model.free(); - } -} - -/** - * Here's a life cycle diagram of a model: - * | Method | (0) Not Available | (1) Loading | (2) Available | (3) Freeing | (0) Not Available | - * |------------|-------------------|-------------|---------------|-------------|-------------------| - * | load | V | - | - | - | V | - * | free | - | - | wait tasks, V | - | - | - * | transcribe | load | load | V | load | load | - */ diff --git a/packages/smart-whisper/tsconfig.json b/packages/smart-whisper/tsconfig.json deleted file mode 100644 index 045803e..0000000 --- a/packages/smart-whisper/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@amical/typescript-config/base.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"], - "types": ["node"] -} diff --git a/packages/smart-whisper/tsup.config.ts b/packages/smart-whisper/tsup.config.ts deleted file mode 100644 index 9f67551..0000000 --- a/packages/smart-whisper/tsup.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "tsup"; -import { readFileSync, writeFileSync } from "node:fs"; - -export default defineConfig({ - entry: ["src/index.ts", "src/build.ts"], - outDir: "dist", - dts: true, - async onSuccess() { - // replace `#include "ggml-common.h" in whisper.cpp/ggml/src/ggml-metal.metal with full content - const metal = readFileSync( - "whisper.cpp/ggml/src/ggml-metal.metal", - "utf-8", - ); - const common = readFileSync("whisper.cpp/ggml/src/ggml-common.h", "utf-8"); - const replaced = metal.replace(/#include "ggml-common.h"/, common); - writeFileSync("whisper.cpp/ggml/src/ggml-metal.metal", replaced); - }, -}); diff --git a/packages/smart-whisper/whisper.cpp b/packages/smart-whisper/whisper.cpp deleted file mode 160000 index 2ef717b..0000000 --- a/packages/smart-whisper/whisper.cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2ef717b293fe93872cc3a03ca77942936a281959 diff --git a/packages/whisper-wrapper/README.md b/packages/whisper-wrapper/README.md new file mode 100644 index 0000000..c4e78ba --- /dev/null +++ b/packages/whisper-wrapper/README.md @@ -0,0 +1,91 @@ +# @amical/whisper-wrapper + +This package wraps the `whisper.cpp` Node addon so the desktop app can call into +Whisper from a forked worker process. The build and runtime layers are tuned for +the desktop pipeline; the notes below capture the important knobs and the +reasoning behind them. + +## Build workflow + +- `pnpm install` (postinstall) runs `bin/build-addon.js` via CMake.js and drops + the resulting `whisper.node` into `native//`. +- `pnpm --filter @amical/whisper-wrapper build:native` rebuilds the default + variants for this platform (Metal + CPU on macOS, CPU elsewhere). +- `pnpm --filter @amical/whisper-wrapper build:native:cuda` builds an extra + `win32-x64-cuda` binary alongside the regular `win32-x64` fallback. Install + the CUDA toolkit (12.x tested) before running it. +- Every macOS build is ad-hoc signed (`codesign -s -`) so Electron/Node can load + it without crashing. +- Each variant is produced as a _single_ `.node` binary. We force static + libraries (`GGML_STATIC=ON`, `BUILD_SHARED_LIBS=OFF`) so all ggml/whisper + code is linked directly into the addon—no sidecar `.dylib/.dll` files ship + at runtime. +- The full CMake build directory is deleted after each variant so Electron + Forge/Squirrel never sees the long `CMakeFiles/...` paths that blew past + Windows’ MAX_PATH limit during packaging. + +## GPU/CPU fallback + +`resolveBinding()` in `src/loader.ts` no longer throws if the first candidate +fails. `loadBinding()` walks the list: + +1. `platform-arch-metal` +2. `platform-arch-openblas` +3. `platform-arch-cuda` +4. `platform-arch` +5. `cpu-fallback` + +If `require()` raises `ERR_DLOPEN_FAILED` (missing runtime, wrong driver, etc.) +it logs a warning and tries the next candidate. That lets us ship CUDA/Metal +binaries alongside CPU ones without breaking installs that lack the GPU stack. + +## GGML_NATIVE on macOS arm64 + +GitHub’s hosted macOS runners expose `i8mm` but clang refuses to emit the +`vmmlaq_s32` intrinsic when `-mcpu=native` is passed, so the build dies in +`ggml-cpu/arch/arm/quants.c`. CI therefore exports `GGML_NATIVE=OFF` before +calling the build scripts. Locally you can flip it back on if your toolchain +supports those instructions: + +```bash +GGML_NATIVE=ON pnpm --filter @amical/whisper-wrapper build:native +``` + +Leave it off in CI unless you control the runner. + +## Custom targets + +`WHISPER_TARGETS` lets you override which variants to build. The value is a +comma-separated list of directory names that should map to `native/`. +Examples: + +```bash +WHISPER_TARGETS="linux-x64-gnu" pnpm --filter @amical/whisper-wrapper build:native +WHISPER_TARGETS="win32-x64-cuda,win32-x64" pnpm --filter @amical/whisper-wrapper build:native +``` + +Absent overrides the script builds the Metal variant (on macOS) followed by the +plain CPU build. + +## Runtime API + +`src/index.ts` exposes a minimal class that mirrors the desktop worker protocol: + +- `new Whisper(modelPath, { gpu?: boolean })` +- `await whisper.load()` (no-op placeholder) +- `await whisper.transcribe(audioOrNull, options)` +- `await whisper.free()` + +If you pass `null` (and a `fname_inp` in `options`) the addon reads the audio +file directly, matching the CLI smoke tests. + +## Local expectations + +- `whisper.cpp` is tracked as a submodule under `packages/whisper-wrapper/`. +- `cmake-js` / `node` / `pnpm` must be installed (the workspace root sets the + required versions). +- The build creates `.cmake-js/` and `.home/` caches inside the package; they’re + ignored in git. + +For any tweaks (new build targets, additional fallbacks, etc.) update this file +so the CI configuration stays discoverable. diff --git a/packages/whisper-wrapper/WHISPER_CPP_VERSION b/packages/whisper-wrapper/WHISPER_CPP_VERSION new file mode 100644 index 0000000..12751ca --- /dev/null +++ b/packages/whisper-wrapper/WHISPER_CPP_VERSION @@ -0,0 +1 @@ +v1.7.6 diff --git a/packages/whisper-wrapper/addon/CMakeLists.txt b/packages/whisper-wrapper/addon/CMakeLists.txt new file mode 100644 index 0000000..c5a8ef5 --- /dev/null +++ b/packages/whisper-wrapper/addon/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.20) +project(whisper_node LANGUAGES C CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +add_definitions(-DNAPI_VERSION=8) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../whisper.cpp/cmake") + +set(WHISPER_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../whisper.cpp") + +set(WHISPER_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(WHISPER_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +set(WHISPER_BUILD_SERVER OFF CACHE BOOL "" FORCE) +set(WHISPER_CURL OFF CACHE BOOL "" FORCE) +set(WHISPER_SDL2 OFF CACHE BOOL "" FORCE) +set(WHISPER_FFMPEG OFF CACHE BOOL "" FORCE) +set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) +set(GGML_STATIC ON CACHE BOOL "" FORCE) +set(GGML_SHARED OFF CACHE BOOL "" FORCE) + +add_subdirectory(${WHISPER_CPP_DIR} whispercpp EXCLUDE_FROM_ALL) + +find_package(Threads REQUIRED) + +set(ADDON_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/addon.cpp + ${WHISPER_CPP_DIR}/examples/common.cpp + ${WHISPER_CPP_DIR}/examples/common-ggml.cpp + ${WHISPER_CPP_DIR}/examples/common-whisper.cpp + ${WHISPER_CPP_DIR}/examples/grammar-parser.cpp +) + +add_library(whisper_node SHARED ${ADDON_SOURCES}) +set_target_properties(whisper_node PROPERTIES PREFIX "" SUFFIX ".node" OUTPUT_NAME "whisper") + +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_compile_options(whisper_node PRIVATE -Wall -Wextra -Wno-unused-parameter) +endif() + +set_target_properties(whisper_node PROPERTIES + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON) + +# CMake-js variables +if (DEFINED CMAKE_JS_INC) + string(REPLACE ";" " " TMP_CMAKE_JS_INC "${CMAKE_JS_INC}") +endif() +if (DEFINED CMAKE_JS_LIB) + string(REPLACE ";" " " TMP_CMAKE_JS_LIB "${CMAKE_JS_LIB}") +endif() + +if (DEFINED TMP_CMAKE_JS_INC) + separate_arguments(TMP_CMAKE_JS_INC) + foreach(INC ${TMP_CMAKE_JS_INC}) + target_include_directories(whisper_node PRIVATE "${INC}") + endforeach() +endif() + +if (DEFINED TMP_CMAKE_JS_LIB) + separate_arguments(TMP_CMAKE_JS_LIB) +endif() + +# Include directories +target_include_directories(whisper_node PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${WHISPER_CPP_DIR}/include + ${WHISPER_CPP_DIR}/ggml/include + ${WHISPER_CPP_DIR}/examples +) + +# Link libraries +if (DEFINED TMP_CMAKE_JS_LIB) + target_link_libraries(whisper_node PRIVATE ${TMP_CMAKE_JS_LIB}) +endif() + +target_link_libraries(whisper_node PRIVATE whisper Threads::Threads) + +# On macOS we need to allow undefined symbols for node addon +if (APPLE) + target_link_options(whisper_node PRIVATE "-undefined" "dynamic_lookup") +endif() diff --git a/packages/whisper-wrapper/addon/addon.cpp b/packages/whisper-wrapper/addon/addon.cpp new file mode 100644 index 0000000..ce1cd6e --- /dev/null +++ b/packages/whisper-wrapper/addon/addon.cpp @@ -0,0 +1,455 @@ +#include "napi.h" + +#include "whisper.h" +#include "common.h" +#include "common-whisper.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +struct WhisperHandle { + std::mutex mutex; + whisper_context* ctx = nullptr; + bool freed = false; +}; + +struct TokenData { + std::string text; + int id = 0; + float p = 0.0f; + int from_ms = -1; + int to_ms = -1; +}; + +struct SegmentData { + int from_ms = 0; + int to_ms = 0; + std::string text; + float confidence = 0.0f; + std::string language; + std::vector tokens; +}; + +struct FullParamConfig { + whisper_full_params params; + std::string initial_prompt; + std::string language; + bool detailed = false; + bool token_timestamps = false; +}; + +FullParamConfig parse_full_params(const Napi::Env env, const Napi::Object& options) { + FullParamConfig cfg; + cfg.params = whisper_full_default_params(WHISPER_SAMPLING_GREEDY); + + if (options.Has("strategy")) { + cfg.params.strategy = static_cast( + options.Get("strategy").As().Int32Value()); + } + if (options.Has("n_threads")) { + cfg.params.n_threads = options.Get("n_threads").As().Int32Value(); + } + if (options.Has("n_max_text_ctx")) { + cfg.params.n_max_text_ctx = options.Get("n_max_text_ctx").As().Int32Value(); + } + if (options.Has("offset_ms")) { + cfg.params.offset_ms = options.Get("offset_ms").As().Int32Value(); + } + if (options.Has("duration_ms")) { + cfg.params.duration_ms = options.Get("duration_ms").As().Int32Value(); + } + + if (options.Has("translate")) { + cfg.params.translate = options.Get("translate").As().Value(); + } + if (options.Has("no_context")) { + cfg.params.no_context = options.Get("no_context").As().Value(); + } + if (options.Has("no_timestamps")) { + cfg.params.no_timestamps = options.Get("no_timestamps").As().Value(); + } + if (options.Has("single_segment")) { + cfg.params.single_segment = options.Get("single_segment").As().Value(); + } + if (options.Has("print_special")) { + cfg.params.print_special = options.Get("print_special").As().Value(); + } + if (options.Has("print_progress")) { + cfg.params.print_progress = options.Get("print_progress").As().Value(); + } else { + cfg.params.print_progress = false; + } + if (options.Has("print_realtime")) { + cfg.params.print_realtime = options.Get("print_realtime").As().Value(); + } + if (options.Has("print_timestamps")) { + cfg.params.print_timestamps = options.Get("print_timestamps").As().Value(); + } + + if (options.Has("token_timestamps")) { + cfg.params.token_timestamps = options.Get("token_timestamps").As().Value(); + } + cfg.token_timestamps = cfg.params.token_timestamps; + + if (options.Has("thold_pt")) { + cfg.params.thold_pt = options.Get("thold_pt").As(); + } + if (options.Has("thold_ptsum")) { + cfg.params.thold_ptsum = options.Get("thold_ptsum").As(); + } + if (options.Has("max_len")) { + cfg.params.max_len = options.Get("max_len").As().Int32Value(); + } + if (options.Has("split_on_word")) { + cfg.params.split_on_word = options.Get("split_on_word").As().Value(); + } + if (options.Has("max_tokens")) { + cfg.params.max_tokens = options.Get("max_tokens").As().Int32Value(); + } + + if (options.Has("debug_mode")) { + cfg.params.debug_mode = options.Get("debug_mode").As().Value(); + } + if (options.Has("audio_ctx")) { + cfg.params.audio_ctx = options.Get("audio_ctx").As().Int32Value(); + } + + if (options.Has("tdrz_enable")) { + cfg.params.tdrz_enable = options.Get("tdrz_enable").As().Value(); + } + + if (options.Has("initial_prompt") && options.Get("initial_prompt").IsString()) { + cfg.initial_prompt = options.Get("initial_prompt").As(); + } + + if (options.Has("language") && options.Get("language").IsString()) { + cfg.language = options.Get("language").As(); + } else { + cfg.language = "auto"; + } + + if (options.Has("suppress_blank")) { + cfg.params.suppress_blank = options.Get("suppress_blank").As().Value(); + } + if (options.Has("suppress_non_speech_tokens")) { + cfg.params.suppress_nst = options.Get("suppress_non_speech_tokens").As().Value(); + } + + if (options.Has("temperature")) { + cfg.params.temperature = options.Get("temperature").As(); + } + if (options.Has("max_initial_ts")) { + cfg.params.max_initial_ts = options.Get("max_initial_ts").As().Int32Value(); + } + if (options.Has("length_penalty")) { + cfg.params.length_penalty = options.Get("length_penalty").As(); + } + + if (options.Has("temperature_inc")) { + cfg.params.temperature_inc = options.Get("temperature_inc").As(); + } + if (options.Has("entropy_thold")) { + cfg.params.entropy_thold = options.Get("entropy_thold").As(); + } + if (options.Has("logprob_thold")) { + cfg.params.logprob_thold = options.Get("logprob_thold").As(); + } + if (options.Has("no_speech_thold")) { + cfg.params.no_speech_thold = options.Get("no_speech_thold").As(); + } + + if (options.Has("best_of")) { + cfg.params.greedy.best_of = options.Get("best_of").As().Int32Value(); + } + if (options.Has("beam_size")) { + cfg.params.beam_search.beam_size = options.Get("beam_size").As().Int32Value(); + if (cfg.params.beam_search.beam_size > 1) { + cfg.params.strategy = WHISPER_SAMPLING_BEAM_SEARCH; + } + } + + if (options.Has("prompt") && options.Get("prompt").IsString() && cfg.initial_prompt.empty()) { + cfg.initial_prompt = options.Get("prompt").As(); + } + + if (options.Has("format") && options.Get("format").IsString()) { + std::string format = options.Get("format").As(); + std::transform(format.begin(), format.end(), format.begin(), ::tolower); + cfg.detailed = (format == "detail"); + } + + if (options.Has("detect_language")) { + cfg.params.detect_language = options.Get("detect_language").As().Value(); + } + + if (cfg.language.empty()) { + cfg.language = "auto"; + } + + return cfg; +} + +Napi::External wrap_handle(Napi::Env env, WhisperHandle* handle) { + return Napi::External::New( + env, + handle, + [](Napi::Env /*env*/, WhisperHandle* ptr) { + if (!ptr) return; + std::lock_guard guard(ptr->mutex); + if (!ptr->freed && ptr->ctx) { + whisper_free(ptr->ctx); + ptr->ctx = nullptr; + ptr->freed = true; + } + delete ptr; + }); +} + +WhisperHandle* unwrap_handle(const Napi::CallbackInfo& info, size_t index) { + if (info.Length() <= index || !info[index].IsExternal()) { + throw Napi::TypeError::New(info.Env(), "Invalid context handle"); + } + return info[index].As>().Data(); +} + +std::vector extract_audio(const Napi::Env env, const Napi::Object& options) { + std::vector pcmf32; + if (options.Has("audio") && options.Get("audio").IsTypedArray()) { + Napi::Float32Array array = options.Get("audio").As(); + pcmf32.resize(array.ElementLength()); + std::copy(array.Data(), array.Data() + array.ElementLength(), pcmf32.begin()); + } + return pcmf32; +} + +std::vector extract_files(const Napi::Object& options) { + std::vector files; + if (options.Has("fname_inp")) { + const auto value = options.Get("fname_inp"); + if (value.IsString()) { + files.emplace_back(value.As()); + } + } + return files; +} + +Napi::Value init_model(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 1 || !info[0].IsObject()) { + throw Napi::TypeError::New(env, "Expected init options object"); + } + + auto options = info[0].As(); + if (!options.Has("model") || !options.Get("model").IsString()) { + throw Napi::TypeError::New(env, "Missing 'model' path"); + } + + std::string model = options.Get("model").As(); + bool use_gpu = true; + if (options.Has("gpu")) { + use_gpu = options.Get("gpu").As(); + } else if (options.Has("use_gpu")) { + use_gpu = options.Get("use_gpu").As(); + } + + bool flash_attn = false; + if (options.Has("flash_attn")) { + flash_attn = options.Get("flash_attn").As(); + } + + whisper_context_params cparams = whisper_context_default_params(); + cparams.use_gpu = use_gpu; + cparams.flash_attn = flash_attn; + + whisper_context* ctx = whisper_init_from_file_with_params(model.c_str(), cparams); + if (ctx == nullptr) { + throw Napi::Error::New(env, "Failed to initialize whisper context"); + } + + auto* handle = new WhisperHandle(); + handle->ctx = ctx; + + return wrap_handle(env, handle); +} + +Napi::Value free_model(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + WhisperHandle* handle = unwrap_handle(info, 0); + + std::lock_guard guard(handle->mutex); + if (!handle->freed && handle->ctx) { + whisper_free(handle->ctx); + handle->ctx = nullptr; + handle->freed = true; + } + + return env.Undefined(); +} + +Napi::Array build_segments(const Napi::Env env, + whisper_context* ctx, + const FullParamConfig& cfg, + const std::vector& pcmf32, + const std::vector>& pcmf32s) { + const int n_segments = whisper_full_n_segments(ctx); + Napi::Array segments = Napi::Array::New(env, n_segments); + + const std::string detected_language = whisper_lang_str(whisper_full_lang_id(ctx)); + + for (int i = 0; i < n_segments; ++i) { + SegmentData segment; + segment.from_ms = whisper_full_get_segment_t0(ctx, i) * 10; + segment.to_ms = whisper_full_get_segment_t1(ctx, i) * 10; + segment.text = whisper_full_get_segment_text(ctx, i); + + if (cfg.detailed) { + const int n_tokens = whisper_full_n_tokens(ctx, i); + segment.tokens.reserve(n_tokens); + + float confidence_sum = 0.0f; + float min_p = 1.0f; + float max_p = 0.0f; + int valid_tokens = 0; + + for (int j = 0; j < n_tokens; ++j) { + whisper_token_data token = whisper_full_get_token_data(ctx, i, j); + + TokenData token_data; + token_data.text = whisper_full_get_token_text(ctx, i, j); + token_data.id = token.id; + token_data.p = token.p; + if (cfg.token_timestamps) { + token_data.from_ms = token.t0 * 10; + token_data.to_ms = token.t1 * 10; + } + + segment.tokens.push_back(std::move(token_data)); + + if (token.id > whisper_token_eot(ctx)) { + continue; + } + + confidence_sum += token.p; + min_p = std::min(min_p, token.p); + max_p = std::max(max_p, token.p); + ++valid_tokens; + } + + if (valid_tokens > 2) { + segment.confidence = + (confidence_sum - min_p - max_p) / static_cast(valid_tokens - 2); + } else if (valid_tokens > 0) { + segment.confidence = confidence_sum / static_cast(valid_tokens); + } else { + segment.confidence = 0.0f; + } + + segment.language = detected_language; + } + + Napi::Object jsSegment = Napi::Object::New(env); + jsSegment.Set("from", Napi::Number::New(env, segment.from_ms)); + jsSegment.Set("to", Napi::Number::New(env, segment.to_ms)); + jsSegment.Set("text", Napi::String::New(env, segment.text)); + + if (cfg.detailed) { + jsSegment.Set("lang", Napi::String::New(env, segment.language)); + jsSegment.Set("confidence", Napi::Number::New(env, segment.confidence)); + + Napi::Array jsTokens = Napi::Array::New(env, segment.tokens.size()); + for (size_t t = 0; t < segment.tokens.size(); ++t) { + const TokenData& token = segment.tokens[t]; + Napi::Object jsToken = Napi::Object::New(env); + jsToken.Set("text", Napi::String::New(env, token.text)); + jsToken.Set("id", Napi::Number::New(env, token.id)); + jsToken.Set("p", Napi::Number::New(env, token.p)); + if (cfg.token_timestamps) { + jsToken.Set("from", Napi::Number::New(env, token.from_ms)); + jsToken.Set("to", Napi::Number::New(env, token.to_ms)); + } + jsTokens.Set(t, jsToken); + } + + jsSegment.Set("tokens", jsTokens); + } + + segments.Set(i, jsSegment); + } + + return segments; +} + +Napi::Value full_transcribe(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 2 || !info[1].IsObject()) { + throw Napi::TypeError::New(env, "Expected arguments (handle, options)"); + } + + WhisperHandle* handle = unwrap_handle(info, 0); + if (handle->freed || handle->ctx == nullptr) { + throw Napi::Error::New(env, "Model has been freed"); + } + + auto options = info[1].As(); + + std::vector pcmf32 = extract_audio(env, options); + std::vector> pcmf32s; + std::vector files = extract_files(options); + + if (pcmf32.empty()) { + if (files.empty()) { + throw Napi::Error::New(env, "No audio provided (audio buffer or fname_inp required)"); + } + if (!::read_audio_data(files[0], pcmf32, pcmf32s, false)) { + throw Napi::Error::New(env, "Failed to read input audio file"); + } + } + + FullParamConfig cfg = parse_full_params(env, options); + + if (cfg.language.empty()) { + cfg.language = "auto"; + } + + cfg.params.language = cfg.language.c_str(); + cfg.params.initial_prompt = cfg.initial_prompt.empty() ? nullptr : cfg.initial_prompt.c_str(); + + int n_processors = 1; + if (options.Has("n_processors")) { + n_processors = std::max(1, options.Get("n_processors").As().Int32Value()); + } + + std::lock_guard guard(handle->mutex); + + int result = whisper_full_parallel( + handle->ctx, + cfg.params, + pcmf32.data(), + static_cast(pcmf32.size()), + n_processors); + + if (result != 0) { + throw Napi::Error::New(env, "whisper_full_parallel failed"); + } + + return build_segments(env, handle->ctx, cfg, pcmf32, pcmf32s); +} + +} // namespace + +Napi::Object InitAll(Napi::Env env, Napi::Object exports) { + exports.Set("init", Napi::Function::New(env, init_model)); + exports.Set("full", Napi::Function::New(env, full_transcribe)); + exports.Set("free", Napi::Function::New(env, free_model)); + return exports; +} + +NODE_API_MODULE(whisper, InitAll) diff --git a/packages/whisper-wrapper/addon/package.json b/packages/whisper-wrapper/addon/package.json new file mode 100644 index 0000000..a6e6acd --- /dev/null +++ b/packages/whisper-wrapper/addon/package.json @@ -0,0 +1,9 @@ +{ + "name": "@amical/whisper-node-addon", + "private": true, + "binary": { + "napi_versions": [ + 8 + ] + } +} diff --git a/packages/whisper-wrapper/bin/build-addon.js b/packages/whisper-wrapper/bin/build-addon.js new file mode 100644 index 0000000..5dbd13a --- /dev/null +++ b/packages/whisper-wrapper/bin/build-addon.js @@ -0,0 +1,296 @@ +#!/usr/bin/env node +/* + * build-addon.js + * -------------------------------------------------- + * Compiles the whisper.cpp Node addon (examples/addon.node) for the current + * platform/arch with acceleration flags, then places the resulting + * `whisper.node` binary in native//. + * + * NOTE: This is an initial scaffold. It expects the whisper.cpp sources to be + * vendored at `./whisper.cpp` (git submodule or manual copy). You can refine + * the build flags as needed. + */ + +const { execSync } = require("child_process"); +const path = require("path"); +const fs = require("fs"); + +function run(cmd, opts = {}) { + console.log(`[build-addon] ${cmd}`); + execSync(cmd, { stdio: "inherit", ...opts }); +} + +const pkgDir = path.resolve(__dirname, ".."); +const addonDir = path.join(pkgDir, "addon"); +const whisperDir = path.join(pkgDir, "whisper.cpp"); + +if (!fs.existsSync(addonDir) || !fs.existsSync(whisperDir)) { + console.error( + "whisper.cpp sources not found. Please add them to packages/whisper-wrapper/whisper.cpp", + ); + process.exit(1); +} + +const buildDir = path.join(pkgDir, "build"); +if (!fs.existsSync(buildDir)) fs.mkdirSync(buildDir); + +const cacheDir = path.join(pkgDir, ".cmake-js"); +if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir); + +const homeDir = path.join(pkgDir, ".home"); +if (!fs.existsSync(homeDir)) fs.mkdirSync(homeDir); + +function resolveLibExecutable(env, arch) { + const archDir = arch === "ia32" ? "x86" : arch === "arm64" ? "arm64" : "x64"; + const hostDir = arch === "ia32" ? "Hostx86" : "Hostx64"; + const candidates = []; + + const addIfExists = (candidate) => { + if (candidate && fs.existsSync(candidate) && !candidates.includes(candidate)) { + candidates.push(candidate); + } + }; + + try { + const whereOutput = execSync("where lib.exe", { + env, + stdio: ["ignore", "pipe", "ignore"], + }) + .toString() + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); + for (const line of whereOutput) { + addIfExists(line); + } + } catch (err) { + // ignore when lib.exe is not on PATH; fall back to manual probing + } + + const probeVersionedDir = (dir) => { + if (!dir || !fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) return; + const entries = fs + .readdirSync(dir, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: "base" })); + for (const entry of entries) { + const candidate = path.join(dir, entry, "bin", hostDir, archDir, "lib.exe"); + if (fs.existsSync(candidate)) { + addIfExists(candidate); + break; + } + } + }; + + const probeInstallDir = (installDir) => { + if (!installDir) return; + if (fs.existsSync(installDir) && fs.statSync(installDir).isFile()) { + addIfExists(installDir); + return; + } + + const directCandidate = path.join(installDir, "bin", hostDir, archDir, "lib.exe"); + addIfExists(directCandidate); + + const toolsDir = path.join(installDir, "Tools", "MSVC"); + probeVersionedDir(toolsDir); + }; + + probeInstallDir(env.VCToolsInstallDir); + probeInstallDir(env.VCINSTALLDIR); + probeInstallDir(env.VSINSTALLDIR && path.join(env.VSINSTALLDIR, "VC")); + probeVersionedDir("C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC"); + probeVersionedDir("C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC"); + probeVersionedDir("C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC"); + probeVersionedDir("C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC"); + + return candidates[0] || null; +} + +function ensureWindowsNodeImportLib(buildVariantDir, arch, env) { + if (process.platform !== "win32") return; + + const nodeImportLib = path.join(buildVariantDir, "node.lib"); + if (fs.existsSync(nodeImportLib)) return; + + let headersPackageJson; + try { + headersPackageJson = require.resolve("node-api-headers/package.json", { + paths: [pkgDir], + }); + } catch (err) { + throw new Error( + "node-api-headers package not found; cannot generate node.lib on Windows", + ); + } + + const defPath = path.join(path.dirname(headersPackageJson), "def", "node_api.def"); + if (!fs.existsSync(defPath)) { + throw new Error(`node_api.def not found at ${defPath}`); + } + + const machineMap = { x64: "X64", ia32: "X86", arm64: "ARM64" }; + const machine = machineMap[arch] || "X64"; + + const libExecutable = resolveLibExecutable(env, arch); + if (!libExecutable) { + throw new Error( + "Unable to locate lib.exe. Ensure the Visual Studio Build Tools are installed and vcvarsall has been applied.", + ); + } + + console.log( + `[build-addon] Generating node import library using ${libExecutable} for ${machine} into ${nodeImportLib}`, + ); + try { + run(`"${libExecutable}" /def:"${defPath}" /machine:${machine} /out:"${nodeImportLib}"`, { + env, + }); + } catch (error) { + const message = + "Failed to generate node import library. Ensure Visual Studio build tools are installed."; + if (error instanceof Error) { + error.message = `${message}\n${error.message}`; + throw error; + } + throw new Error(message); + } +} + +function variantFromName(name, platform, arch) { + const envOverrides = {}; + if (name === "cpu-fallback") { + return { name, env: envOverrides }; + } + + if (!name.includes("-")) { + // expand shorthand like "metal" to full name + name = `${platform}-${arch}-${name}`; + } else if (!name.startsWith(platform)) { + console.warn( + `[build-addon] Warning: variant '${name}' does not match current platform (${platform}), skipping.`, + ); + return null; + } + + if (name.includes("-metal")) { + envOverrides.GGML_METAL = "1"; + envOverrides.GGML_USE_ACCELERATE = "1"; + } + if (name.includes("-openblas")) { + envOverrides.GGML_OPENBLAS = "1"; + envOverrides.GGML_BLAS = "1"; + } + if (name.includes("-cuda")) { + envOverrides.GGML_CUDA = "1"; + } + if (name.startsWith("darwin-")) { + envOverrides.GGML_USE_ACCELERATE = envOverrides.GGML_USE_ACCELERATE || "1"; + } + + return { name, env: envOverrides }; +} + +function computeVariants(platform, arch) { + const overrides = (process.env.WHISPER_TARGETS || "") + .split(",") + .map((v) => v.trim()) + .filter(Boolean); + + const result = []; + + if (overrides.length > 0) { + for (const override of overrides) { + const variant = variantFromName(override, platform, arch); + if (variant) result.push(variant); + } + return result; + } + + if (platform === "darwin") { + const metal = variantFromName(`${platform}-${arch}-metal`, platform, arch); + if (metal) result.push(metal); + } + + const primary = variantFromName(`${platform}-${arch}`, platform, arch); + if (primary) result.push(primary); + + return result; +} + +const { platform, arch } = process; +const variants = computeVariants(platform, arch); + +if (variants.length === 0) { + console.warn("[build-addon] No variants requested, building default cpu-fallback."); + const fallback = variantFromName("cpu-fallback", platform, arch); + if (fallback) variants.push(fallback); +} + +for (const variant of variants) { + const buildVariantDir = path.join(buildDir, variant.name.replace(/[\\/]/g, "_")); + fs.rmSync(buildVariantDir, { recursive: true, force: true }); + fs.mkdirSync(buildVariantDir, { recursive: true }); + + const env = { + ...process.env, + CMAKE_JS_CACHE: cacheDir, + HOME: homeDir, + CMAKE_JS_NODE_DIR: path.resolve(process.execPath, "..", ".."), + ...variant.env, + }; + + console.log(`[build-addon] Building variant ${variant.name}`); + + ensureWindowsNodeImportLib(buildVariantDir, arch, env); + + const cmakeParts = [ + "npx cmake-js compile", + `-O "${buildVariantDir}"`, + "-B Release", + `-d "${addonDir}"`, + "-T whisper_node", + "--CD node_runtime=node", + ]; + + const propagateCMakeBool = (key) => { + const value = env[key]; + if (typeof value === "string" && value.length > 0) { + cmakeParts.push(`--CD${key}=${value}`); + } + }; + + propagateCMakeBool("GGML_NATIVE"); + + run(cmakeParts.join(" "), { + cwd: addonDir, + env, + }); + + const builtBinary = path.join(buildVariantDir, "Release", "whisper.node"); + if (!fs.existsSync(builtBinary)) { + throw new Error(`Build succeeded but whisper.node not found for variant ${variant.name}`); + } + + const targetDir = path.join(pkgDir, "native", variant.name); + fs.mkdirSync(targetDir, { recursive: true }); + fs.copyFileSync(builtBinary, path.join(targetDir, "whisper.node")); + console.log(`[build-addon] copied to native/${variant.name}/whisper.node`); + + if (platform === "darwin") { + const targetBinary = path.join(targetDir, "whisper.node"); + try { + run(`codesign --force --sign - "${targetBinary}"`); + console.log("[build-addon] codesigned", targetBinary); + } catch (err) { + console.warn( + `[build-addon] warning: codesign failed for ${targetBinary}: ${err.message}`, + ); + } + } + + // Remove intermediate build artifacts to keep the package footprint small and avoid + // extremely long CMake-generated paths that break Windows packaging tools. + fs.rmSync(buildVariantDir, { recursive: true, force: true }); +} diff --git a/packages/whisper-wrapper/package.json b/packages/whisper-wrapper/package.json new file mode 100644 index 0000000..4e0041f --- /dev/null +++ b/packages/whisper-wrapper/package.json @@ -0,0 +1,33 @@ +{ + "name": "@amical/whisper-wrapper", + "version": "0.0.0", + "private": true, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist", + "native", + "src", + "addon" + ], + "binary": { + "napi_versions": [ + 8 + ] + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "postinstall": "node ./bin/build-addon.js", + "build:native": "node ./scripts/build-native.js", + "build:native:cuda": "node ./scripts/build-native.js --cuda" + }, + "dependencies": { + "cmake-js": "^7.3.1", + "minimatch": "10.0.3", + "node-api-headers": "^1.5.0" + }, + "devDependencies": { + "@amical/typescript-config": "workspace:*", + "typescript": "^5.8.3" + } +} diff --git a/packages/whisper-wrapper/scripts/build-native.js b/packages/whisper-wrapper/scripts/build-native.js new file mode 100755 index 0000000..57c7dfb --- /dev/null +++ b/packages/whisper-wrapper/scripts/build-native.js @@ -0,0 +1,19 @@ +#!/usr/bin/env node +const { execSync } = require("node:child_process"); +const path = require("node:path"); + +function build(targets) { + const baseEnv = { ...process.env }; + baseEnv.WHISPER_TARGETS = targets.join(","); + execSync("node ./bin/build-addon.js", { + cwd: path.join(__dirname, ".."), + stdio: "inherit", + env: baseEnv, + }); +} + +if (process.argv.includes("--cuda")) { + build(["win32-x64-cuda", "win32-x64"]); +} else { + build([]); +} diff --git a/packages/whisper-wrapper/scripts/test-addon.js b/packages/whisper-wrapper/scripts/test-addon.js new file mode 100644 index 0000000..712ba32 --- /dev/null +++ b/packages/whisper-wrapper/scripts/test-addon.js @@ -0,0 +1,160 @@ +#!/usr/bin/env node +// Quick smoke-test runner for the whisper.cpp Node addon build. +// +// Usage: +// node scripts/test-addon.js [--model /path/to/model.bin] [--audio /path/to/audio.wav] +// +// If no flags are provided the script will grab the first *.bin model from +// "~/Library/Application Support/amical/models" and the bundled jfk sample. + +const fs = require("node:fs"); +const os = require("node:os"); +const path = require("node:path"); + +function resolveBinding() { + const nativeRoot = path.resolve(__dirname, "..", "native"); + const { platform, arch } = process; + const candidates = [ + `${platform}-${arch}-metal`, + `${platform}-${arch}-openblas`, + `${platform}-${arch}-cuda`, + `${platform}-${arch}`, + "cpu-fallback", + ]; + + for (const dir of candidates) { + const bindingPath = path.join(nativeRoot, dir, "whisper.node"); + if (fs.existsSync(bindingPath)) { + return bindingPath; + } + } + + throw new Error( + `Unable to locate a whisper.node binary for ${platform}-${arch}. ` + + `Expected one of: ${candidates.join(", ")}`, + ); +} + +function defaultModelPath() { + const modelsDir = path.join( + os.homedir(), + "Library", + "Application Support", + "amical", + "models", + ); + + if (!fs.existsSync(modelsDir)) { + throw new Error( + `Model directory not found at ${modelsDir}. Pass --model to override.`, + ); + } + + const candidates = fs + .readdirSync(modelsDir) + .filter((f) => f.toLowerCase().endsWith(".bin")) + .map((name) => { + const fullPath = path.join(modelsDir, name); + const stats = fs.statSync(fullPath); + return { name, fullPath, size: stats.size }; + }) + .sort((a, b) => - a.size + b.size); + + if (candidates.length === 0) { + throw new Error( + `No .bin model files found in ${modelsDir}. Pass --model to override.`, + ); + } + + return candidates[0].fullPath; +} + +function defaultAudioPath() { + const audio = path.resolve( + __dirname, + "..", + "whisper.cpp", + "samples", + "jfk.wav", + ); + + if (!fs.existsSync(audio)) { + throw new Error( + `Sample audio not found at ${audio}. Pass --audio to override.`, + ); + } + + return audio; +} + +function parseArgs() { + const args = process.argv.slice(2); + const options = {}; + + for (const arg of args) { + if (!arg.startsWith("--")) continue; + const [key, value] = arg.slice(2).split("="); + if (!value) { + throw new Error(`Flag '${arg}' must be provided as --${key}=`); + } + options[key] = value; + } + + return options; +} + +async function main() { + const opts = parseArgs(); + const modelPath = path.resolve(opts.model || defaultModelPath()); + const audioPath = path.resolve(opts.audio || defaultAudioPath()); + + if (!fs.existsSync(modelPath)) { + throw new Error(`Model file not found at ${modelPath}`); + } + if (!fs.existsSync(audioPath)) { + throw new Error(`Audio file not found at ${audioPath}`); + } + + const bindingPath = resolveBinding(); + console.log(`> Using addon: ${bindingPath}`); + console.log(`> Using model: ${modelPath}`); + console.log(`> Using audio: ${audioPath}`); + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const binding = require(bindingPath); + + if (typeof binding.init !== "function" || + typeof binding.full !== "function" || + typeof binding.free !== "function") { + throw new Error(`Addon at ${bindingPath} does not expose init/full/free APIs.`); + } + + const handle = binding.init({ model: modelPath, gpu: true }); + try { + const segments = binding.full(handle, { + fname_inp: audioPath, + language: "en", + no_timestamps: false, + suppress_blank: true, + suppress_non_speech_tokens: true, + }); + + console.log("Transcription segments:\n"); + for (const segment of segments) { + const from = typeof segment.from === "number" ? segment.from : "?"; + const to = typeof segment.to === "number" ? segment.to : "?"; + console.log(` [${from} -> ${to}] ${segment.text}`); + } + + console.log("\nDone."); + } finally { + binding.free(handle); + } + + +} + +main().catch((err) => { + console.error("Test run failed:", err); + process.exitCode = 1; +}); diff --git a/packages/whisper-wrapper/src/index.ts b/packages/whisper-wrapper/src/index.ts new file mode 100644 index 0000000..b8fb288 --- /dev/null +++ b/packages/whisper-wrapper/src/index.ts @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +import { loadBinding, getLoadedBindingInfo } from "./loader"; + +const binding = loadBinding(); + +export interface WhisperOptions { + gpu?: boolean; +} + +export { getLoadedBindingInfo } from "./loader"; + +export class Whisper { + private ctx: any; + + constructor( + private modelPath: string, + _opts?: WhisperOptions, + ) { + this.ctx = binding.init({ model: modelPath }); + } + + async load(): Promise { + return; + } + + async transcribe( + audio: Float32Array | null, + options: Record, + ): Promise<{ result: Promise> }> { + const payload = + audio instanceof Float32Array ? { audio, ...options } : options; + const segments = binding.full(this.ctx, payload); + return { result: Promise.resolve(segments) }; + } + + async free(): Promise { + binding.free(this.ctx); + } + + static getBindingInfo(): { path: string; type: string } | null { + return getLoadedBindingInfo(); + } +} diff --git a/packages/whisper-wrapper/src/loader.ts b/packages/whisper-wrapper/src/loader.ts new file mode 100644 index 0000000..5132ca8 --- /dev/null +++ b/packages/whisper-wrapper/src/loader.ts @@ -0,0 +1,106 @@ +import path from "node:path"; +import fs from "node:fs"; + +const GPU_FIRST_CANDIDATES = ["metal", "openblas", "cuda"] as const; + +function candidateDirs(platform: string, arch: string): string[] { + return [ + ...GPU_FIRST_CANDIDATES.map((tag) => `${platform}-${arch}-${tag}`), + `${platform}-${arch}`, + "cpu-fallback", + ]; +} + +function bindingPathFor(dir: string): string { + return path.join(__dirname, "..", "native", dir, "whisper.node"); +} + +function isLoadableError(error: unknown): boolean { + return ( + !!error && + typeof error === "object" && + "code" in error && + (error as NodeJS.ErrnoException).code === "ERR_DLOPEN_FAILED" + ); +} + +export function resolveBinding(): string { + const { platform, arch } = process; + for (const dir of candidateDirs(platform, arch)) { + const candidate = bindingPathFor(dir); + if (fs.existsSync(candidate)) { + return candidate; + } + } + throw new Error( + `No suitable whisper.node binary found for ${platform}-${arch}`, + ); +} + +let loadedBindingInfo: { path: string; type: string } | null = null; + +export function getLoadedBindingInfo(): { path: string; type: string } | null { + return loadedBindingInfo; +} + +export function loadBinding(): any { + const { platform, arch } = process; + const attempted: string[] = []; + let lastLoadError: unknown = null; + + for (const dir of candidateDirs(platform, arch)) { + const candidate = bindingPathFor(dir); + if (!fs.existsSync(candidate)) { + continue; + } + + attempted.push(candidate); + try { + const mod = require(candidate); + if (attempted.length > 1) { + console.warn( + `[whisper-wrapper] loaded fallback binary: ${candidate} (attempted ${attempted.length} candidates)`, + ); + } + + // Store the loaded binding info + const bindingType = dir.includes("-cuda") + ? "cuda" + : dir.includes("-metal") + ? "metal" + : dir.includes("-openblas") + ? "openblas" + : dir === "cpu-fallback" + ? "cpu-fallback" + : "cpu"; + loadedBindingInfo = { + path: candidate, + type: bindingType, + }; + + return mod; + } catch (error) { + if (isLoadableError(error)) { + console.warn( + `[whisper-wrapper] failed to load ${candidate}: ${(error as Error).message}. Trying next candidate...`, + ); + lastLoadError = error; + continue; + } + + throw error; + } + } + + if (lastLoadError) { + const error = new Error( + `Unable to load whisper.node for ${platform}-${arch}. Attempted: ${attempted.join(", ")}`, + { cause: lastLoadError }, + ); + throw error; + } + + throw new Error( + `No suitable whisper.node binary found for ${platform}-${arch}`, + ); +} diff --git a/packages/whisper-wrapper/tsconfig.json b/packages/whisper-wrapper/tsconfig.json new file mode 100644 index 0000000..4616a2f --- /dev/null +++ b/packages/whisper-wrapper/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +} diff --git a/packages/whisper-wrapper/whisper.cpp b/packages/whisper-wrapper/whisper.cpp new file mode 160000 index 0000000..a8d002c --- /dev/null +++ b/packages/whisper-wrapper/whisper.cpp @@ -0,0 +1 @@ +Subproject commit a8d002cfd879315632a579e73f0148d06959de36 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0889d4e..049049d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,12 +30,12 @@ importers: '@amical/eslint-config': specifier: workspace:* version: link:../../packages/eslint-config - '@amical/smart-whisper': - specifier: workspace:* - version: link:../../packages/smart-whisper '@amical/types': specifier: workspace:* version: link:../../packages/types + '@amical/whisper-wrapper': + specifier: workspace:* + version: link:../../packages/whisper-wrapper '@amical/y-libsql': specifier: workspace:* version: link:../../packages/y-libsql @@ -550,67 +550,6 @@ importers: packages/native-helpers/windows-helper: {} - packages/smart-whisper: - dependencies: - minimatch: - specifier: 10.0.3 - version: 10.0.3 - node-addon-api: - specifier: ^8.5.0 - version: 8.5.0 - devDependencies: - '@amical/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@types/node': - specifier: ^24.3.0 - version: 24.3.0 - tsup: - specifier: ^8.5.0 - version: 8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.4)(typescript@5.8.3)(yaml@2.8.1) - typescript: - specifier: ^5.8.2 - version: 5.8.3 - - packages/smart-whisper/whisper.cpp/bindings/javascript: {} - - packages/smart-whisper/whisper.cpp/examples/addon.node: - devDependencies: - cmake-js: - specifier: ^7.1.1 - version: 7.3.1 - jest: - specifier: ^29.4.0 - version: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - node-addon-api: - specifier: ^5.0.0 - version: 5.1.0 - - packages/smart-whisper/whisper.cpp/examples/wchess/wchess.wasm/chessboardjs-1.0.0/js/chessboard-1.0.0: - dependencies: - jquery: - specifier: '>=3.4.1' - version: 3.7.1 - devDependencies: - csso: - specifier: 3.5.1 - version: 3.5.1 - fs-plus: - specifier: 3.1.1 - version: 3.1.1 - kidif: - specifier: 1.1.0 - version: 1.1.0 - mustache: - specifier: 2.3.0 - version: 2.3.0 - standard: - specifier: 10.0.2 - version: 10.0.2 - uglify-js: - specifier: 3.6.0 - version: 3.6.0 - packages/types: dependencies: minimatch: @@ -678,6 +617,27 @@ importers: specifier: 5.8.2 version: 5.8.2 + packages/whisper-wrapper: + dependencies: + cmake-js: + specifier: ^7.3.1 + version: 7.3.1 + minimatch: + specifier: 10.0.3 + version: 10.0.3 + node-api-headers: + specifier: ^1.5.0 + version: 1.5.0 + devDependencies: + '@amical/typescript-config': + specifier: workspace:* + version: link:../typescript-config + typescript: + specifier: ^5.8.3 + version: 5.8.3 + + packages/whisper-wrapper/addon: {} + packages/y-libsql: dependencies: '@libsql/client': @@ -977,91 +937,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} @@ -1106,9 +987,6 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -2135,76 +2013,10 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2479,10 +2291,6 @@ packages: '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@pkgr/core@0.2.9': resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3274,12 +3082,6 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.0.5': resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} engines: {node: '>=18.0.0'} @@ -3763,18 +3565,6 @@ packages: resolution: {integrity: sha512-TmY25GmxzgX+395Fwl/F0te6S4RHdJtYl1QjZr+wlxVvKJ0IBOACpnpAvnLM3dpTgXuQukGtSWcRz7Zi9mZqcQ==} hasBin: true - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -3826,9 +3616,6 @@ packages: '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -3901,9 +3688,6 @@ packages: '@types/split2@4.2.3': resolution: {integrity: sha512-59OXIlfUsi2k++H6CHgUQKEb2HKRokUA39HY1i1dS8/AIcqVjtAAFdf8u+HxTWK/4FUHMJQlKSZ4I6irCBJ1Zw==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -4014,9 +3798,6 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-jsx@3.0.1: - resolution: {integrity: sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -4030,16 +3811,6 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@3.3.0: - resolution: {integrity: sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@5.7.4: - resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -4085,14 +3856,6 @@ packages: react: optional: true - ajv-keywords@1.5.1: - resolution: {integrity: sha512-vuBv+fm2s6cqUyey2A7qYcvsik+GMDJsw8BARP2sDE76cqmaZVarsvHf7Vx6VJ0Xk8gLl+u3MoAPf6gKzJefeA==} - peerDependencies: - ajv: '>=4.10.0' - - ajv@4.11.8: - resolution: {integrity: sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4100,10 +3863,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@1.4.0: - resolution: {integrity: sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==} - engines: {node: '>=0.10.0'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4112,14 +3871,6 @@ packages: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} engines: {node: '>=12'} - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4128,10 +3879,6 @@ packages: resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -4140,10 +3887,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -4220,10 +3963,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.find@2.2.3: - resolution: {integrity: sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==} - engines: {node: '>= 0.4'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -4294,37 +4033,9 @@ packages: axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - babel-code-frame@6.26.0: - resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} - babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} - peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -4403,9 +4114,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -4418,21 +4126,11 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@1.1.1: - resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} - engines: {node: '>=0.10.0'} - bumpp@10.2.3: resolution: {integrity: sha512-nsFBZACxuBVu6yzDSaZZaWpX5hTQ+++9WtYkmO+0Bd3cpSq0Mzvqw5V83n+fOyRj3dYuZRFCQf5Z9NNfZj+Rnw==} engines: {node: '>=18'} hasBin: true - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4477,14 +4175,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caller-path@0.1.0: - resolution: {integrity: sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==} - engines: {node: '>=0.10.0'} - - callsites@0.2.0: - resolution: {integrity: sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==} - engines: {node: '>=0.10.0'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -4492,14 +4182,6 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - caniuse-lite@1.0.30001736: resolution: {integrity: sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==} @@ -4510,10 +4192,6 @@ packages: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4533,10 +4211,6 @@ packages: change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -4585,16 +4259,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - circular-json@0.3.3: - resolution: {integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==} - deprecated: CircularJSON is in maintenance only, flatted is its successor. - citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -4602,10 +4269,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - cli-cursor@1.0.2: - resolution: {integrity: sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==} - engines: {node: '>=0.10.0'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -4622,9 +4285,6 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-width@2.2.1: - resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -4665,20 +4325,9 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - collection-utils@1.0.1: resolution: {integrity: sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==} @@ -4738,10 +4387,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -4771,13 +4416,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} @@ -4800,10 +4438,6 @@ packages: constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} - contains-path@0.1.0: - resolution: {integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==} - engines: {node: '>=0.10.0'} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -4851,18 +4485,10 @@ packages: core-js-pure@3.45.1: resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -4888,19 +4514,11 @@ packages: resolution: {integrity: sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==} engines: {node: '>= 0.8'} - css-tree@1.0.0-alpha.29: - resolution: {integrity: sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==} - engines: {node: '>=0.10.0'} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - csso@3.5.1: - resolution: {integrity: sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==} - engines: {node: '>=0.10.0'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4953,10 +4571,6 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -4980,10 +4594,6 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - debug-log@1.0.1: - resolution: {integrity: sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA==} - engines: {node: '>=0.10.0'} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5036,14 +4646,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -5051,10 +4653,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -5077,9 +4675,6 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - deglob@2.1.1: - resolution: {integrity: sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==} - del@5.1.0: resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} engines: {node: '>=8'} @@ -5125,10 +4720,6 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -5144,10 +4735,6 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -5163,10 +4750,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@1.5.0: - resolution: {integrity: sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==} - engines: {node: '>=0.10.0'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -5358,10 +4941,6 @@ packages: embla-carousel@8.6.0: resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - emoji-picker-react@4.13.3: resolution: {integrity: sha512-aZaxCI72oUQfvZtYuQ9RaYLEwmH3GVgAr5SEeB97Y7gWL06zJ4VTuSl8rAMVY7GNmd0tf/EQ1W2SDuXTl0q9AA==} engines: {node: '>=10'} @@ -5448,30 +5027,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-map@0.1.5: - resolution: {integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==} - - es6-set@0.1.6: - resolution: {integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==} - engines: {node: '>=0.12'} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -5509,10 +5067,6 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -5526,10 +5080,6 @@ packages: engines: {node: '>=6.0'} hasBin: true - escope@3.6.0: - resolution: {integrity: sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==} - engines: {node: '>=0.4.0'} - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -5542,24 +5092,6 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-standard-jsx@4.0.1: - resolution: {integrity: sha512-6XxcwOm22JWEVrDTxhkh/M9Qv5FCNPHKDGh4LPmWnFj4MDuNs7iXZatahYghIcMw5mkVMadLl7KFAWH/EOIeAA==} - peerDependencies: - eslint: '>=3.19.0' - eslint-plugin-react: '>=6.10.3' - - eslint-config-standard@10.2.1: - resolution: {integrity: sha512-UkFojTV1o0GOe1edOEiuI5ccYLJSuNngtqSeClNzhsmG8KPJ+7mRxgtp2oYhqZAK/brlXMoCd+VgXViE0AfyKw==} - peerDependencies: - eslint: '>=3.19.0' - eslint-plugin-import: '>=2.2.0' - eslint-plugin-node: '>=4.2.2' - eslint-plugin-promise: '>=3.5.0' - eslint-plugin-standard: '>=3.0.0' - - eslint-import-resolver-node@0.2.3: - resolution: {integrity: sha512-HI8ShtDIy7gON76Nr3bu4zl0DuCLPo1Fud9P2lltOQKeiAS2r5/o/l3y+V8HJ1cDLFSz+tHu7/V9fI5jirwlbw==} - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -5584,16 +5116,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.2.0: - resolution: {integrity: sha512-8HLeIYzOH4eltevxf+iC9Dtz/91yaeOqtlba5srcpQWLrv57F5NNG1RNLqAbpWJWDD4BxKuKjUveJY9W6Tbswg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: 2.x - 3.x - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -5604,12 +5126,6 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-node@4.2.3: - resolution: {integrity: sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: '>=3.1.0' - eslint-plugin-only-warn@1.1.0: resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} engines: {node: '>=6'} @@ -5628,33 +5144,18 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-promise@3.5.0: - resolution: {integrity: sha512-kqXN7i1wfx5j7XuFVzuX4W3XDCEyNDsbd+O5NXWIl+zTSP510rKn2Xk8OO6JhM1ivXbkse0tQf6jjSTLS58Prg==} - engines: {node: '>=4'} - eslint-plugin-react-hooks@5.2.0: resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@6.10.3: - resolution: {integrity: sha512-vFfMSxJynKlgOhIVjhlZyibVUg442Aiv3482XPkgdYV90T8nD2QvxGXILZGwZHYMQ/l+A/De14O9D0qjDelSrg==} - engines: {node: '>=0.10'} - peerDependencies: - eslint: ^2.0.0 || ^3.0.0 - eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-standard@3.0.1: - resolution: {integrity: sha512-JyT7wqVYlaHxnljWMT7CKa0R1QDQqArTi6g8kYnexTHHuK7x3Vg//kCepnoTgdT9x/kDbSluXMhJgjBvgVRLlQ==} - peerDependencies: - eslint: '>=3.19.0' - eslint-plugin-turbo@2.5.6: resolution: {integrity: sha512-KUDE23aP2JV8zbfZ4TeM1HpAXzMM/AYG/bJam7P4AalUxas8Pd/lS/6R3p4uX91qJcH1LwL4h0ED48nDe8KorQ==} peerDependencies: @@ -5673,12 +5174,6 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@3.19.0: - resolution: {integrity: sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==} - engines: {node: '>=4'} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@9.33.0: resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5689,18 +5184,10 @@ packages: jiti: optional: true - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@3.5.4: - resolution: {integrity: sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==} - engines: {node: '>=0.10.0'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -5714,10 +5201,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -5757,9 +5240,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -5782,26 +5262,14 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - exit-hook@1.1.1: - resolution: {integrity: sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==} - engines: {node: '>=0.10.0'} - exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} @@ -5816,9 +5284,6 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -5866,9 +5331,6 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -5885,18 +5347,10 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - figures@1.7.0: - resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} - engines: {node: '>=0.10.0'} - figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@2.0.0: - resolution: {integrity: sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==} - engines: {node: '>=0.10.0'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -5921,35 +5375,17 @@ packages: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - flairup@1.0.0: resolution: {integrity: sha512-IKlE+pNvL2R+kVL1kEhUYqRxVqeFnjiIvHWDMLFXNaqyUdFXQM2wte44EfMYJNHkW16X991t2Zg8apKkhv7OBA==} - flat-cache@1.3.4: - resolution: {integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==} - engines: {node: '>=0.10.0'} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -6051,9 +5487,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-plus@3.1.1: - resolution: {integrity: sha512-Se2PJdOWXqos1qVTkvqqjb0CSnfBnwwD+pq+z4ksT+e97mEShod/hrNg0TRCCsXPbJzcIq+NuzQhigunMWMJUA==} - fs-temp@1.2.1: resolution: {integrity: sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==} @@ -6170,18 +5603,10 @@ packages: resolution: {integrity: sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==} engines: {node: '>= 4.0'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@5.0.1: - resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} - engines: {node: '>=0.12.0'} - get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -6229,19 +5654,11 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} hasBin: true - glob@7.0.0: - resolution: {integrity: sha512-Fa+aQV0FFMU4/Jg5mquHjv5DikTujeAWOpbGa9lsG2Qa+ehYxbGN3cCY/T+C+jAS8gKBnYN2MbrdNm0UCAcp7w==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -6267,10 +5684,6 @@ packages: resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} - globals@9.18.0: - resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} - engines: {node: '>=0.10.0'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -6324,10 +5737,6 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -6358,10 +5767,6 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -6395,9 +5800,6 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -6454,9 +5856,6 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@3.3.10: - resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -6479,11 +5878,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} engines: {node: '>=0.10.0'} @@ -6525,9 +5919,6 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - inquirer@0.12.0: - resolution: {integrity: sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==} - inquirer@7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} @@ -6544,10 +5935,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - interpret@3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} @@ -6630,14 +6017,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -6646,10 +6025,6 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} @@ -6718,9 +6093,6 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-resolvable@1.1.0: - resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -6775,9 +6147,6 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -6795,30 +6164,6 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - iterall@1.1.3: resolution: {integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==} @@ -6826,162 +6171,28 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - jiti@2.5.1: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} - js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-stringify@1.0.2: resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} - js-tokens@3.0.2: - resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7001,12 +6212,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -7016,10 +6221,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.3.0: - resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} - engines: {node: '>= 0.4'} - json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -7046,9 +6247,6 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -7056,10 +6254,6 @@ packages: jstransformer@1.0.0: resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} - jsx-ast-utils@1.4.1: - resolution: {integrity: sha512-0LwSmMlQjjUdXsdlyYhEfBJCn2Chm0zgUBmfmf1++KUULh+JOdlzrZfiwe2zmlVJx44UF+KX/B/odBoeK9hxmw==} - engines: {node: '>=4.0'} - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -7074,29 +6268,14 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kidif@1.1.0: - resolution: {integrity: sha512-QmAHSkWEYssexdqWQshtfEd/AGeJAXHuV1pu607ePgNwwSf2X6fuIzUJsLtKbUQ/ak0pokdwDr8ocZ9sygKhTg==} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -7175,13 +6354,6 @@ packages: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listr2@7.0.2: resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} engines: {node: '>=16.0.0'} @@ -7190,14 +6362,6 @@ packages: resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} engines: {node: '>=4'} - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loadware@2.0.0: resolution: {integrity: sha512-PD5Yn9VFr7RTJLvIx/CBRALvE+PATUDoEedCcik49Te30LK4qU39DZPV3oxhhF9ql9NKg3kwL+kyf0NqnX9e/g==} @@ -7205,10 +6369,6 @@ packages: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -7216,9 +6376,6 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.cond@4.5.2: - resolution: {integrity: sha512-RWjUhzGbzG/KfDwk+onqdXvrsNv47G9UCMJgSKalPTSqJQyxZhQophG9jgqLf+15TIbZ5a/yG2YKOWsH3dVy9A==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -7232,9 +6389,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -7267,9 +6421,6 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} @@ -7298,10 +6449,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -7309,9 +6456,6 @@ packages: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} @@ -7379,9 +6523,6 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdn-data@1.1.4: - resolution: {integrity: sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==} - media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -7634,9 +6775,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -7655,14 +6793,6 @@ packages: murmur-32@0.2.0: resolution: {integrity: sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==} - mustache@2.3.0: - resolution: {integrity: sha512-IgZ/cCHtDG1ft0vdDV9wrlNz20SvbUu2ECoDF6dhk2ZtedLNy1Kehy4oFlzmHPxcUQmVZuXYS2j+d0NkaEjTXQ==} - engines: {npm: '>=1.4.0'} - hasBin: true - - mute-stream@0.0.5: - resolution: {integrity: sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==} - mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -7715,9 +6845,6 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@15.3.1: resolution: {integrity: sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -7752,13 +6879,6 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - node-addon-api@8.5.0: - resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} - engines: {node: ^18 || ^20 || >= 21} - node-api-headers@1.5.0: resolution: {integrity: sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ==} @@ -7790,9 +6910,6 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} @@ -7837,10 +6954,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} deprecated: This package is no longer supported. - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - nypm@0.6.1: resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} engines: {node: ^14.16.0 || >=16.10.0} @@ -7892,10 +7005,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@1.1.0: - resolution: {integrity: sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==} - engines: {node: '>=0.10.0'} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -7925,10 +7034,6 @@ packages: zod: optional: true - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -7941,10 +7046,6 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -7973,10 +7074,6 @@ packages: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -7985,10 +7082,6 @@ packages: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -8005,10 +7098,6 @@ packages: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} @@ -8050,14 +7139,6 @@ packages: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -8071,10 +7152,6 @@ packages: path-equal@1.2.5: resolution: {integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==} - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -8087,9 +7164,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} @@ -8101,10 +7175,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -8158,51 +7228,13 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkg-conf@2.1.0: - resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} - engines: {node: '>=4'} - - pkg-config@1.1.1: - resolution: {integrity: sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==} - engines: {node: '>=0.10'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - pkg-up@1.0.0: - resolution: {integrity: sha512-L+d849d9lz20hnRpUnWBRXOh+mAvygQpK7UuXiw+6QbPwL55RVgl+G+V936wCzs/6J7fj0pvgLY9OknZ+FqaNA==} - engines: {node: '>=0.10.0'} - plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} - pluralize@1.2.1: - resolution: {integrity: sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -8211,24 +7243,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss-selector-parser@7.1.0: resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} @@ -8255,10 +7269,6 @@ packages: engines: {node: '>=10'} hasBin: true - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -8272,25 +7282,14 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - proc-log@2.0.1: resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - progress@1.1.8: - resolution: {integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==} - engines: {node: '>=0.4.0'} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -8313,10 +7312,6 @@ packages: promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -8377,9 +7372,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -8524,9 +7516,6 @@ packages: resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} engines: {node: '>=4'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -8547,9 +7536,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - readline2@1.0.1: - resolution: {integrity: sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==} - recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -8564,10 +7550,6 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} @@ -8647,10 +7629,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-uncached@1.0.3: - resolution: {integrity: sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==} - engines: {node: '>=0.10.0'} - resedit@2.0.3: resolution: {integrity: sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==} engines: {node: '>=14', npm: '>=7'} @@ -8658,29 +7636,13 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@1.0.1: - resolution: {integrity: sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -8697,10 +7659,6 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@1.0.1: - resolution: {integrity: sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==} - engines: {node: '>=0.10.0'} - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -8725,11 +7683,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -8752,9 +7705,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-async@0.1.0: - resolution: {integrity: sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==} - run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -8762,9 +7712,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rx-lite@3.1.2: - resolution: {integrity: sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==} - rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -8776,9 +7723,6 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -8813,10 +7757,6 @@ packages: semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - semver@5.3.0: - resolution: {integrity: sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==} - hasBin: true - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -8920,11 +7860,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shelljs@0.7.8: - resolution: {integrity: sha512-/YF5Uk8hcwi7ima04ppkbA4RaRMdPMBfwAvAf8sufYOxsJRtbdoBsT8vGvlb+799BrlGdYrd+oczIA2eN2JdWA==} - engines: {node: '>=0.11.0'} - hasBin: true - shiki@3.11.0: resolution: {integrity: sha512-VgKumh/ib38I1i3QkMn6mAQA6XjjQubqaAYhfge71glAll0/4xnt8L2oSuC45Qcr/G5Kbskj4RliMQddGmy/Og==} @@ -8963,9 +7898,6 @@ packages: simplex-noise@4.0.3: resolution: {integrity: sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -8974,10 +7906,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@0.0.4: - resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==} - engines: {node: '>=0.10.0'} - slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -9025,16 +7953,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -9043,11 +7964,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -9077,21 +7993,9 @@ packages: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - standard-engine@7.0.0: - resolution: {integrity: sha512-d/NYzmZxQRxbcoCqlbI9gEMPYq7TLsU6Ywpki54xhedEd0GC4G02j1B7mlexb7HovqRtAtcUPTLQx2MnCO/uyA==} - - standard@10.0.2: - resolution: {integrity: sha512-NiEPy0kaa7yufaPsMT63a7MvTzfRyFrSItcTKYS4I9oFskgpQy0hXL0oOxbr836O7kTKgaxLZiv5lZmBWZRffg==} - engines: {node: '>=4'} - hasBin: true - statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -9122,21 +8026,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - string-to-stream@3.0.1: resolution: {integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==} - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -9164,23 +8056,12 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9197,10 +8078,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -9243,11 +8120,6 @@ packages: babel-plugin-macros: optional: true - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -9264,10 +8136,6 @@ packages: resolution: {integrity: sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==} engines: {node: '>=18'} - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -9306,9 +8174,6 @@ packages: resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} engines: {node: '>=12.17'} - table@3.8.3: - resolution: {integrity: sha512-RZuzIOtzFbprLCE0AXhkI0Xi42ZJLZhCC+qkwuMLf/Vjz3maWpA8gz1qMdbmNoI9cOROT2Am/DxeRyXenrL11g==} - tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} @@ -9338,13 +8203,6 @@ packages: resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} engines: {node: '>=6.0.0'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -9377,9 +8235,6 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} @@ -9408,9 +8263,6 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - tn1150@0.1.0: resolution: {integrity: sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==} engines: {node: '>=0.12'} @@ -9436,13 +8288,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -9459,9 +8304,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -9489,25 +8331,6 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - tsup@8.5.0: - resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - tsx@4.20.4: resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} engines: {node: '>=18.0.0'} @@ -9553,18 +8376,10 @@ packages: tw-animate-css@1.3.7: resolution: {integrity: sha512-lvLb3hTIpB5oGsk8JmLoAjeCHV58nKa2zHYn8yWOoG5JJusH3bhJlF2DLAZ/5NmJ+jyH3ssiAx/2KmbhavJy/A==} - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -9581,9 +8396,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -9600,9 +8412,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.40.0: resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -9654,12 +8463,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - underscore-plus@1.7.0: - resolution: {integrity: sha512-A3BEzkeicFLnr+U/Q3EyWwJAQPbA19mtZZ4h+lLq3ttm9kn8WC4R3YpuJZEXmWdLjYP47Zc8aLZm9kwdv+zzvA==} - - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -9689,9 +8492,6 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -9796,10 +8596,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - user-home@2.0.0: - resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} - engines: {node: '>=0.10.0'} - username@5.1.0: resolution: {integrity: sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==} engines: {node: '>=8'} @@ -9822,10 +8618,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -9899,9 +8691,6 @@ packages: walk@2.3.15: resolution: {integrity: sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==} - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -9916,18 +8705,12 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -10004,14 +8787,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - write@0.2.1: - resolution: {integrity: sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==} - engines: {node: '>=0.10.0'} - ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -10758,86 +9533,11 @@ snapshots: dependencies: '@babel/types': 7.28.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -10902,8 +9602,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@bcoe/v8-coverage@0.2.3': {} - '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 @@ -11903,169 +10601,10 @@ snapshots: dependencies: minipass: 7.1.2 - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.3.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.30 - '@types/node': 24.3.0 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.30 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.28.3 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.30 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 @@ -12368,9 +10907,6 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@pkgjs/parseargs@0.11.0': - optional: true - '@pkgr/core@0.2.9': {} '@poppinss/colors@4.1.5': @@ -13177,14 +11713,6 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.5': dependencies: '@smithy/types': 4.3.2 @@ -13818,27 +12346,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.2 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.28.2 - '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 @@ -13896,10 +12403,6 @@ snapshots: '@types/minimatch': 6.0.0 '@types/node': 24.3.0 - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 24.3.0 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -13980,8 +12483,6 @@ snapshots: dependencies: '@types/node': 24.3.0 - '@types/stack-utils@2.0.3': {} - '@types/through@0.0.33': dependencies: '@types/node': 24.3.0 @@ -14121,10 +12622,6 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@3.0.1: - dependencies: - acorn: 3.3.0 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -14135,10 +12632,6 @@ snapshots: dependencies: acorn: 8.15.0 - acorn@3.3.0: {} - - acorn@5.7.4: {} - acorn@7.4.1: {} acorn@8.14.0: {} @@ -14176,15 +12669,6 @@ snapshots: optionalDependencies: react: 19.1.1 - ajv-keywords@1.5.1(ajv@4.11.8): - dependencies: - ajv: 4.11.8 - - ajv@4.11.8: - dependencies: - co: 4.6.0 - json-stable-stringify: 1.3.0 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -14194,8 +12678,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@1.4.0: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -14204,16 +12686,10 @@ snapshots: dependencies: type-fest: 1.4.0 - ansi-regex@2.1.1: {} - - ansi-regex@3.0.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.0: {} - ansi-styles@2.2.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -14222,8 +12698,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} ansis@4.1.0: {} @@ -14299,14 +12773,6 @@ snapshots: array-union@2.1.0: {} - array.prototype.find@2.2.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -14378,7 +12844,8 @@ snapshots: dependencies: tslib: 2.8.1 - async@1.5.2: {} + async@1.5.2: + optional: true asynckit@0.4.0: {} @@ -14398,12 +12865,6 @@ snapshots: transitivePeerDependencies: - debug - babel-code-frame@6.26.0: - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - babel-dead-code-elimination@1.0.10: dependencies: '@babel/core': 7.28.3 @@ -14413,61 +12874,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.28.3) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - - babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) - - babel-preset-jest@29.6.3(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) - babel-walk@3.0.0-canary-5: dependencies: '@babel/types': 7.28.2 @@ -14553,10 +12959,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.3) - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - buffer-crc32@0.2.13: {} buffer-from@1.1.2: {} @@ -14571,8 +12973,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@1.1.1: {} - bumpp@10.2.3: dependencies: ansis: 4.1.0 @@ -14589,11 +12989,6 @@ snapshots: transitivePeerDependencies: - magicast - bundle-require@5.1.0(esbuild@0.25.9): - dependencies: - esbuild: 0.25.9 - load-tsconfig: 0.2.5 - busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -14669,12 +13064,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - caller-path@0.1.0: - dependencies: - callsites: 0.2.0 - - callsites@0.2.0: {} - callsites@3.1.0: {} camel-case@3.0.0: @@ -14682,10 +13071,6 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - caniuse-lite@1.0.30001736: {} ccount@2.0.1: {} @@ -14694,14 +13079,6 @@ snapshots: dependencies: chalk: 4.1.2 - chalk@1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -14741,8 +13118,6 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 - char-regex@1.0.2: {} - character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -14785,24 +13160,16 @@ snapshots: ci-info@3.9.0: {} - circular-json@0.3.3: {} - citty@0.1.6: dependencies: consola: 3.4.2 - cjs-module-lexer@1.4.3: {} - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 clean-stack@2.2.0: {} - cli-cursor@1.0.2: - dependencies: - restore-cursor: 1.0.1 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -14818,8 +13185,6 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - cli-width@2.2.1: {} - cli-width@3.0.0: {} client-only@0.0.1: {} @@ -14876,14 +13241,8 @@ snapshots: - '@types/react' - '@types/react-dom' - co@4.6.0: {} - - code-point-at@1.1.0: {} - collapse-white-space@2.1.0: {} - collect-v8-coverage@1.0.2: {} - collection-utils@1.0.1: {} color-convert@0.5.3: @@ -14939,9 +13298,8 @@ snapshots: commander@11.1.0: {} - commander@2.20.3: {} - - commander@4.1.1: {} + commander@2.20.3: + optional: true commander@5.1.0: {} @@ -14971,15 +13329,6 @@ snapshots: concat-map@0.0.1: {} - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - confbox@0.1.8: {} - confbox@0.2.2: {} connect-redis@7.1.1(express-session@1.18.2): @@ -15000,8 +13349,6 @@ snapshots: '@babel/parser': 7.28.3 '@babel/types': 7.28.2 - contains-path@0.1.0: {} - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -15035,28 +13382,11 @@ snapshots: core-js-pure@3.45.1: {} - core-util-is@1.0.3: {} - cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - create-jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-require@1.1.1: {} cross-dirname@0.1.0: {} @@ -15089,17 +13419,8 @@ snapshots: tsscmp: 1.0.6 uid-safe: 2.1.5 - css-tree@1.0.0-alpha.29: - dependencies: - mdn-data: 1.1.4 - source-map: 0.5.7 - cssesc@3.0.0: {} - csso@3.5.1: - dependencies: - css-tree: 1.0.0-alpha.29 - csstype@3.1.3: {} csurf@1.11.0: @@ -15147,11 +13468,6 @@ snapshots: d3-timer@3.0.1: {} - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: {} @@ -15176,8 +13492,6 @@ snapshots: date-fns@4.1.0: {} - debug-log@1.0.1: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -15208,14 +13522,10 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.6.0: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} - deepmerge@4.3.1: {} - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -15242,15 +13552,6 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - deglob@2.1.1: - dependencies: - find-root: 1.1.0 - glob: 7.2.3 - ignore: 3.3.10 - pkg-config: 1.1.1 - run-parallel: 1.2.0 - uniq: 1.0.1 - del@5.1.0: dependencies: globby: 10.0.2 @@ -15284,8 +13585,6 @@ snapshots: detect-libc@2.0.4: {} - detect-newline@3.1.0: {} - detect-node-es@1.1.0: {} detect-node@2.1.0: {} @@ -15301,8 +13600,6 @@ snapshots: diff-match-patch@1.0.5: {} - diff-sequences@29.6.3: {} - diff@4.0.2: {} diff@8.0.2: {} @@ -15316,11 +13613,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@1.5.0: - dependencies: - esutils: 2.0.3 - isarray: 1.0.0 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -15481,8 +13773,6 @@ snapshots: embla-carousel@8.6.0: {} - emittery@0.13.1: {} - emoji-picker-react@4.13.3(react@19.1.1): dependencies: flairup: 1.0.0 @@ -15642,51 +13932,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - es6-error@4.1.1: {} - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-map@0.1.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-set: 0.1.6 - es6-symbol: 3.1.4 - event-emitter: 0.3.5 - - es6-set@0.1.6: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - event-emitter: 0.3.5 - type: 2.7.3 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -15796,8 +14043,6 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -15810,13 +14055,6 @@ snapshots: optionalDependencies: source-map: 0.6.1 - escope@3.6.0: - dependencies: - es6-map: 0.1.5 - es6-weak-map: 2.0.3 - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)): dependencies: eslint: 9.33.0(jiti@2.5.1) @@ -15825,27 +14063,6 @@ snapshots: dependencies: eslint: 9.33.0(jiti@2.5.1) - eslint-config-standard-jsx@4.0.1(eslint-plugin-react@6.10.3(eslint@3.19.0))(eslint@3.19.0): - dependencies: - eslint: 3.19.0 - eslint-plugin-react: 6.10.3(eslint@3.19.0) - - eslint-config-standard@10.2.1(eslint-plugin-import@2.2.0(eslint@3.19.0))(eslint-plugin-node@4.2.3(eslint@3.19.0))(eslint-plugin-promise@3.5.0)(eslint-plugin-standard@3.0.1(eslint@3.19.0))(eslint@3.19.0): - dependencies: - eslint: 3.19.0 - eslint-plugin-import: 2.2.0(eslint@3.19.0) - eslint-plugin-node: 4.2.3(eslint@3.19.0) - eslint-plugin-promise: 3.5.0 - eslint-plugin-standard: 3.0.1(eslint@3.19.0) - - eslint-import-resolver-node@0.2.3: - dependencies: - debug: 2.6.9 - object-assign: 4.1.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -15854,15 +14071,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.2.3)(eslint@3.19.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - eslint: 3.19.0 - eslint-import-resolver-node: 0.2.3 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): dependencies: debug: 3.2.7 @@ -15872,24 +14080,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.2.0(eslint@3.19.0): - dependencies: - builtin-modules: 1.1.1 - contains-path: 0.1.0 - debug: 2.6.9 - doctrine: 1.5.0 - eslint: 3.19.0 - eslint-import-resolver-node: 0.2.3 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.2.3)(eslint@3.19.0) - has: 1.0.4 - lodash.cond: 4.5.2 - minimatch: 3.1.2 - pkg-up: 1.0.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.32.0(eslint@9.33.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 @@ -15917,15 +14107,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-node@4.2.3(eslint@3.19.0): - dependencies: - eslint: 3.19.0 - ignore: 3.3.10 - minimatch: 3.1.2 - object-assign: 4.1.1 - resolve: 1.22.10 - semver: 5.3.0 - eslint-plugin-only-warn@1.1.0: {} eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(prettier@3.6.2): @@ -15937,21 +14118,10 @@ snapshots: optionalDependencies: eslint-config-prettier: 9.1.2(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-promise@3.5.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.33.0(jiti@2.5.1)): dependencies: eslint: 9.33.0(jiti@2.5.1) - eslint-plugin-react@6.10.3(eslint@3.19.0): - dependencies: - array.prototype.find: 2.2.3 - doctrine: 1.5.0 - eslint: 3.19.0 - has: 1.0.4 - jsx-ast-utils: 1.4.1 - object.assign: 4.1.7 - eslint-plugin-react@7.37.5(eslint@9.33.0(jiti@2.5.1)): dependencies: array-includes: 3.1.9 @@ -15974,10 +14144,6 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-standard@3.0.1(eslint@3.19.0): - dependencies: - eslint: 3.19.0 - eslint-plugin-turbo@2.5.6(eslint@9.33.0(jiti@2.5.1))(turbo@2.5.6): dependencies: dotenv: 16.0.3 @@ -15993,46 +14159,6 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@3.19.0: - dependencies: - babel-code-frame: 6.26.0 - chalk: 1.1.3 - concat-stream: 1.6.2 - debug: 2.6.9 - doctrine: 2.1.0 - escope: 3.6.0 - espree: 3.5.4 - esquery: 1.6.0 - estraverse: 4.3.0 - esutils: 2.0.3 - file-entry-cache: 2.0.0 - glob: 7.2.3 - globals: 9.18.0 - ignore: 3.3.10 - imurmurhash: 0.1.4 - inquirer: 0.12.0 - is-my-json-valid: 2.20.6 - is-resolvable: 1.1.0 - js-yaml: 3.14.1 - json-stable-stringify: 1.3.0 - levn: 0.3.0 - lodash: 4.17.21 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - path-is-inside: 1.0.2 - pluralize: 1.2.1 - progress: 1.1.8 - require-uncached: 1.0.3 - shelljs: 0.7.8 - strip-bom: 3.0.0 - strip-json-comments: 2.0.1 - table: 3.8.3 - text-table: 0.2.0 - user-home: 2.0.0 - transitivePeerDependencies: - - supports-color - eslint@9.33.0(jiti@2.5.1): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) @@ -16075,24 +14201,12 @@ snapshots: transitivePeerDependencies: - supports-color - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@3.5.4: - dependencies: - acorn: 5.7.4 - acorn-jsx: 3.0.1 - esprima@4.0.1: {} esquery@1.6.0: @@ -16103,8 +14217,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-util-attach-comments@3.0.0: @@ -16150,11 +14262,6 @@ snapshots: etag@1.8.1: {} - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -16185,22 +14292,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - exit-hook@1.1.1: {} - exit-hook@2.2.1: {} - exit@0.1.2: {} - expand-template@2.0.3: {} - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - exponential-backoff@3.1.2: {} express-session@1.18.2: @@ -16254,10 +14349,6 @@ snapshots: exsolve@1.0.7: {} - ext@1.7.0: - dependencies: - type: 2.7.3 - extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -16314,10 +14405,6 @@ snapshots: dependencies: reusify: 1.1.0 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -16331,20 +14418,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - figures@1.7.0: - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@2.0.0: - dependencies: - flat-cache: 1.3.4 - object-assign: 4.1.1 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -16377,42 +14454,17 @@ snapshots: dependencies: array-back: 3.1.0 - find-root@1.1.0: {} - - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - find-up@2.1.0: dependencies: locate-path: 2.0.0 - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: - dependencies: - magic-string: 0.30.17 - mlly: 1.7.4 - rollup: 4.47.1 - flairup@1.0.0: {} - flat-cache@1.3.4: - dependencies: - circular-json: 0.3.3 - graceful-fs: 4.2.11 - rimraf: 2.6.3 - write: 0.2.1 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -16524,13 +14576,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs-plus@3.1.1: - dependencies: - async: 1.5.2 - mkdirp: 0.5.6 - rimraf: 2.7.1 - underscore-plus: 1.7.0 - fs-temp@1.2.1: dependencies: random-path: 0.1.2 @@ -16671,10 +14716,12 @@ snapshots: generate-function@2.3.1: dependencies: is-property: 1.0.2 + optional: true generate-object-property@1.2.0: dependencies: is-property: 1.0.2 + optional: true gensync@1.0.0-beta.2: {} @@ -16710,15 +14757,11 @@ snapshots: transitivePeerDependencies: - supports-color - get-package-type@0.1.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@5.0.1: {} - get-stream@4.1.0: dependencies: pump: 3.0.3 @@ -16774,15 +14817,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@11.0.3: dependencies: foreground-child: 3.3.1 @@ -16792,14 +14826,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.0.0: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -16834,8 +14860,6 @@ snapshots: globals@16.3.0: {} - globals@9.18.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -16919,10 +14943,6 @@ snapshots: optionalDependencies: uglify-js: 3.6.0 - has-ansi@2.0.0: - dependencies: - ansi-regex: 2.1.1 - has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -16945,8 +14965,6 @@ snapshots: has-unicode@2.0.1: {} - has@1.0.4: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -17028,8 +15046,6 @@ snapshots: hosted-git-info@2.8.9: {} - html-escaper@2.0.2: {} - html-void-elements@3.0.0: {} http-cache-semantics@4.2.0: {} @@ -17107,8 +15123,6 @@ snapshots: ieee754@1.2.1: {} - ignore@3.3.10: {} - ignore@5.3.2: {} ignore@7.0.5: {} @@ -17123,11 +15137,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - imul@1.0.1: optional: true @@ -17157,22 +15166,6 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - inquirer@0.12.0: - dependencies: - ansi-escapes: 1.4.0 - ansi-regex: 2.1.1 - chalk: 1.1.3 - cli-cursor: 1.0.2 - cli-width: 2.2.1 - figures: 1.7.0 - lodash: 4.17.21 - readline2: 1.0.1 - run-async: 0.1.0 - rx-lite: 3.1.2 - string-width: 1.0.2 - strip-ansi: 3.0.1 - through: 2.3.8 - inquirer@7.3.3: dependencies: ansi-escapes: 4.3.2 @@ -17217,8 +15210,6 @@ snapshots: internmap@2.0.3: {} - interpret@1.4.0: {} - interpret@3.1.1: {} ioredis@5.7.0: @@ -17309,18 +15300,10 @@ snapshots: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - - is-fullwidth-code-point@2.0.0: {} - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} - is-generator-fn@2.1.0: {} - is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 @@ -17344,7 +15327,8 @@ snapshots: is-map@2.0.3: {} - is-my-ip-valid@1.0.1: {} + is-my-ip-valid@1.0.1: + optional: true is-my-json-valid@2.20.6: dependencies: @@ -17353,6 +15337,7 @@ snapshots: is-my-ip-valid: 1.0.1 jsonpointer: 5.0.1 xtend: 4.0.2 + optional: true is-negative-zero@2.0.3: {} @@ -17371,7 +15356,8 @@ snapshots: is-promise@2.2.2: {} - is-property@1.0.2: {} + is-property@1.0.2: + optional: true is-reference@1.2.1: dependencies: @@ -17384,8 +15370,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-resolvable@1.1.0: {} - is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -17432,8 +15416,6 @@ snapshots: is-what@4.1.16: {} - isarray@1.0.0: {} - isarray@2.0.5: {} isbinaryfile@4.0.10: {} @@ -17444,47 +15426,6 @@ snapshots: isomorphic.js@0.2.5: {} - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - iterall@1.1.3: {} iterator.prototype@1.1.5: @@ -17496,277 +15437,10 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 - jest-changed-files@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.6.0 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): - dependencies: - '@babel/core': 7.28.3 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.3) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 24.3.0 - ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.8.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 - - jest-each@29.7.0: - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 24.3.0 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - jest-util: 29.7.0 - - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 - - jest-regex-util@29.6.3: {} - - jest-resolve-dependencies@29.7.0: - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - jest-resolve@29.7.0: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.10 - resolve.exports: 2.0.3 - slash: 3.0.0 - - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.28.3 - '@babel/generator': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/types': 7.28.2 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.3) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -17776,26 +15450,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-validate@29.7.0: - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - - jest-watcher@29.7.0: - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.3.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - jest-worker@29.7.0: dependencies: '@types/node': 24.3.0 @@ -17803,30 +15457,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.3.0)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jiti@2.5.1: {} - joycon@3.1.1: {} - - jquery@3.7.1: {} - js-base64@3.7.8: {} js-stringify@1.0.2: {} - js-tokens@3.0.2: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -17842,24 +15478,12 @@ snapshots: json-buffer@3.0.1: {} - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.3.0: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - isarray: 2.0.5 - jsonify: 0.0.1 - object-keys: 1.1.1 - json-stringify-safe@5.0.1: {} json5@1.0.2: @@ -17886,17 +15510,14 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonify@0.0.1: {} - - jsonpointer@5.0.1: {} + jsonpointer@5.0.1: + optional: true jstransformer@1.0.0: dependencies: is-promise: 2.2.2 promise: 7.3.1 - jsx-ast-utils@1.4.1: {} - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -17915,23 +15536,10 @@ snapshots: dependencies: json-buffer: 3.0.1 - kidif@1.1.0: - dependencies: - glob: 7.0.0 - kind-of@6.0.3: {} - kleur@3.0.3: {} - kleur@4.1.5: {} - leven@3.1.0: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -18001,10 +15609,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - listr2@7.0.2: dependencies: cli-truncate: 3.1.0 @@ -18021,15 +15625,6 @@ snapshots: pify: 2.3.0 strip-bom: 3.0.0 - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - - load-tsconfig@0.2.5: {} - loadware@2.0.0: dependencies: app-module-path: 2.2.0 @@ -18039,18 +15634,12 @@ snapshots: p-locate: 2.0.0 path-exists: 3.0.0 - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.camelcase@4.3.0: {} - lodash.cond@4.5.2: {} - lodash.defaults@4.2.0: {} lodash.get@4.4.2: {} @@ -18059,8 +15648,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash@4.17.21: {} log-symbols@3.0.0: @@ -18094,8 +15681,6 @@ snapshots: lowercase-keys@2.0.0: {} - lru-cache@10.4.3: {} - lru-cache@11.1.0: {} lru-cache@5.1.1: @@ -18121,10 +15706,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-dir@4.0.0: - dependencies: - semver: 7.7.2 - make-error@1.3.6: {} make-fetch-happen@10.2.1: @@ -18149,10 +15730,6 @@ snapshots: - bluebird - supports-color - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 @@ -18330,8 +15907,6 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - mdn-data@1.1.4: {} - media-typer@0.3.0: {} mem@4.3.0: @@ -18735,13 +16310,6 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.4: - dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 - moment@2.30.1: {} motion-dom@12.23.12: @@ -18761,10 +16329,6 @@ snapshots: imul: 1.0.1 optional: true - mustache@2.3.0: {} - - mute-stream@0.0.5: {} - mute-stream@0.0.8: {} mz@2.7.0: @@ -18803,8 +16367,6 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next-tick@1.1.0: {} - next@15.3.1(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@next/env': 15.3.1 @@ -18843,10 +16405,6 @@ snapshots: node-addon-api@4.3.0: {} - node-addon-api@5.1.0: {} - - node-addon-api@8.5.0: {} - node-api-headers@1.5.0: {} node-api-version@0.2.1: @@ -18871,8 +16429,6 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-int64@0.4.0: {} - node-machine-id@1.1.12: {} node-plop@0.26.3: @@ -18928,8 +16484,6 @@ snapshots: gauge: 5.0.2 set-blocking: 2.0.0 - number-is-nan@1.0.1: {} - nypm@0.6.1: dependencies: citty: 0.1.6 @@ -18992,8 +16546,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@1.1.0: {} - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -19029,15 +16581,6 @@ snapshots: transitivePeerDependencies: - encoding - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -19070,8 +16613,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-homedir@1.0.2: {} - os-tmpdir@1.0.2: {} own-keys@1.0.1: @@ -19092,10 +16633,6 @@ snapshots: dependencies: p-try: 1.0.0 - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -19104,10 +16641,6 @@ snapshots: dependencies: p-limit: 1.3.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -19122,8 +16655,6 @@ snapshots: p-try@1.0.0: {} - p-try@2.2.0: {} - pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 @@ -19181,18 +16712,6 @@ snapshots: dependencies: error-ex: 1.3.2 - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parseurl@1.3.3: {} pascal-case@2.0.1: @@ -19206,29 +16725,18 @@ snapshots: path-equal@1.2.5: {} - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - path-exists@3.0.0: {} path-exists@4.0.0: {} path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} - path-key@2.0.1: {} path-key@3.1.1: {} path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-scurry@2.0.0: dependencies: lru-cache: 11.1.0 @@ -19264,68 +16772,22 @@ snapshots: pify@2.3.0: {} - pify@3.0.0: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - - pirates@4.0.7: {} - - pkg-conf@2.1.0: - dependencies: - find-up: 2.1.0 - load-json-file: 4.0.0 - - pkg-config@1.1.1: - dependencies: - debug-log: 1.0.1 - find-root: 1.1.0 - xtend: 4.0.2 - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - pkg-types@2.3.0: dependencies: confbox: 0.2.2 exsolve: 1.0.7 pathe: 2.0.3 - pkg-up@1.0.0: - dependencies: - find-up: 1.1.2 - plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.11 base64-js: 1.5.1 xmlbuilder: 15.1.1 - pluralize@1.2.1: {} - pluralize@8.0.0: {} possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.4)(yaml@2.8.1): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 2.5.1 - postcss: 8.5.6 - tsx: 4.20.4 - yaml: 2.8.1 - postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 @@ -19366,8 +16828,6 @@ snapshots: tar-fs: 2.1.3 tunnel-agent: 0.6.0 - prelude-ls@1.1.2: {} - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -19376,20 +16836,10 @@ snapshots: prettier@3.6.2: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - proc-log@2.0.1: {} - process-nextick-args@2.0.1: {} - process@0.11.10: {} - progress@1.1.8: {} - progress@2.0.3: {} promise-inflight@1.0.1: {} @@ -19405,11 +16855,6 @@ snapshots: dependencies: asap: 2.0.6 - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -19512,8 +16957,6 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.1.0: {} - qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -19706,16 +17149,6 @@ snapshots: normalize-package-data: 2.5.0 path-type: 2.0.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -19744,12 +17177,6 @@ snapshots: readdirp@4.1.2: {} - readline2@1.0.1: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - mute-stream: 0.0.5 - recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -19775,10 +17202,6 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 - rechoir@0.6.2: - dependencies: - resolve: 1.22.10 - rechoir@0.8.0: dependencies: resolve: 1.22.10 @@ -19920,31 +17343,16 @@ snapshots: require-directory@2.1.1: {} - require-uncached@1.0.3: - dependencies: - caller-path: 0.1.0 - resolve-from: 1.0.1 - resedit@2.0.3: dependencies: pe-library: 1.0.1 resolve-alpn@1.2.1: {} - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@1.0.1: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.3: {} - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -19966,11 +17374,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - restore-cursor@1.0.1: - dependencies: - exit-hook: 1.1.1 - onetime: 1.1.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -19990,10 +17393,7 @@ snapshots: rimraf@2.6.3: dependencies: glob: 7.2.3 - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 + optional: true rimraf@3.0.2: dependencies: @@ -20041,18 +17441,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.47.1 fsevents: 2.3.3 - run-async@0.1.0: - dependencies: - once: 1.4.0 - run-async@2.4.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rx-lite@3.1.2: {} - rxjs@6.6.7: dependencies: tslib: 1.14.1 @@ -20069,8 +17463,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -20103,8 +17495,6 @@ snapshots: semver-compare@1.0.0: {} - semver@5.3.0: {} - semver@5.7.2: {} semver@6.3.1: {} @@ -20303,12 +17693,6 @@ snapshots: shebang-regex@3.0.0: {} - shelljs@0.7.8: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - shiki@3.11.0: dependencies: '@shikijs/core': 3.11.0 @@ -20366,14 +17750,10 @@ snapshots: simplex-noise@4.0.3: {} - sisteransi@1.0.5: {} - slash@3.0.0: {} slash@5.1.0: {} - slice-ansi@0.0.4: {} - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -20449,26 +17829,15 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.5.7: {} - source-map@0.6.1: {} source-map@0.7.6: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} spdx-correct@3.2.0: @@ -20495,36 +17864,8 @@ snapshots: dependencies: minipass: 3.3.6 - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - standard-as-callback@2.1.0: {} - standard-engine@7.0.0: - dependencies: - deglob: 2.1.1 - get-stdin: 5.0.1 - minimist: 1.2.8 - pkg-conf: 2.1.0 - - standard@10.0.2: - dependencies: - eslint: 3.19.0 - eslint-config-standard: 10.2.1(eslint-plugin-import@2.2.0(eslint@3.19.0))(eslint-plugin-node@4.2.3(eslint@3.19.0))(eslint-plugin-promise@3.5.0)(eslint-plugin-standard@3.0.1(eslint@3.19.0))(eslint@3.19.0) - eslint-config-standard-jsx: 4.0.1(eslint-plugin-react@6.10.3(eslint@3.19.0))(eslint@3.19.0) - eslint-plugin-import: 2.2.0(eslint@3.19.0) - eslint-plugin-node: 4.2.3(eslint@3.19.0) - eslint-plugin-promise: 3.5.0 - eslint-plugin-react: 6.10.3(eslint@3.19.0) - eslint-plugin-standard: 3.0.1(eslint@3.19.0) - standard-engine: 7.0.0 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - statuses@1.5.0: {} statuses@2.0.1: {} @@ -20547,26 +17888,10 @@ snapshots: streamsearch@1.1.0: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - string-to-stream@3.0.1: dependencies: readable-stream: 3.6.2 - string-width@1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -20623,10 +17948,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -20636,14 +17957,6 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -20656,8 +17969,6 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - strip-eof@1.0.0: {} strip-final-newline@2.0.0: {} @@ -20685,16 +17996,6 @@ snapshots: client-only: 0.0.1 react: 19.1.1 - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - sudo-prompt@9.2.1: {} sumchecker@3.0.1: @@ -20709,8 +18010,6 @@ snapshots: supports-color@10.2.0: {} - supports-color@2.0.0: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -20747,15 +18046,6 @@ snapshots: array-back: 6.2.2 wordwrapjs: 5.1.0 - table@3.8.3: - dependencies: - ajv: 4.11.8 - ajv-keywords: 1.5.1(ajv@4.11.8) - chalk: 1.1.3 - lodash: 4.17.21 - slice-ansi: 0.0.4 - string-width: 2.1.1 - tailwind-merge@3.3.1: {} tailwindcss@4.1.12: {} @@ -20801,14 +18091,6 @@ snapshots: rimraf: 2.6.3 optional: true - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -20834,8 +18116,6 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} - tinyexec@1.0.1: {} tinyglobby@0.2.14: @@ -20870,8 +18150,6 @@ snapshots: tmp@0.2.5: optional: true - tmpl@1.0.5: {} - tn1150@0.1.0: dependencies: unorm: 1.6.0 @@ -20892,12 +18170,6 @@ snapshots: tr46@0.0.3: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} trim-repeated@1.0.0: @@ -20910,8 +18182,6 @@ snapshots: dependencies: typescript: 5.8.3 - ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -20961,34 +18231,6 @@ snapshots: tsscmp@1.0.6: {} - tsup@8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.4)(typescript@5.8.3)(yaml@2.8.1): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.9) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.1 - esbuild: 0.25.9 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.4)(yaml@2.8.1) - resolve-from: 5.0.0 - rollup: 4.47.1 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.6 - typescript: 5.8.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsx@4.20.4: dependencies: esbuild: 0.25.9 @@ -21029,16 +18271,10 @@ snapshots: tw-animate-css@1.3.7: {} - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.13.1: {} type-fest@0.21.3: {} @@ -21050,8 +18286,6 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type@2.7.3: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -21085,8 +18319,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedarray@0.0.6: {} - typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.8.3): dependencies: '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.33.0(jiti@2.5.1))(typescript@5.8.3) @@ -21116,6 +18348,7 @@ snapshots: dependencies: commander: 2.20.3 source-map: 0.6.1 + optional: true uid-safe@2.1.5: dependencies: @@ -21128,12 +18361,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - underscore-plus@1.7.0: - dependencies: - underscore: 1.13.7 - - underscore@1.13.7: {} - undici-types@5.26.5: {} undici-types@6.21.0: {} @@ -21172,8 +18399,6 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - uniq@1.0.1: {} - unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 @@ -21280,10 +18505,6 @@ snapshots: dependencies: react: 19.1.1 - user-home@2.0.0: - dependencies: - os-homedir: 1.0.2 - username@5.1.0: dependencies: execa: 1.0.0 @@ -21299,12 +18520,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.30 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -21372,10 +18587,6 @@ snapshots: dependencies: foreachasync: 3.0.0 - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -21386,8 +18597,6 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - webpack-virtual-modules@0.6.2: {} whatwg-url@5.0.0: @@ -21395,12 +18604,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -21513,15 +18716,6 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write@0.2.1: - dependencies: - mkdirp: 0.5.6 - ws@8.17.1: {} ws@8.18.0: {} @@ -21530,7 +18724,8 @@ snapshots: xmlbuilder@15.1.1: {} - xtend@4.0.2: {} + xtend@4.0.2: + optional: true y18n@5.0.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d654604..316caf7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ packages: - "apps/*" - "packages/*" - "packages/**" + - "!packages/**/whisper.cpp/**"