diff --git a/.changeset/tired-keys-tell.md b/.changeset/tired-keys-tell.md new file mode 100644 index 0000000..a28ae10 --- /dev/null +++ b/.changeset/tired-keys-tell.md @@ -0,0 +1,12 @@ +--- +"@mixedbread/cli": minor +--- + +Add intelligent shell completion for vector store names + +- **Dynamic completions**: Tab completion now suggests vector store names in commands like `mxbai vs sync [TAB]`, `mxbai vs upload [TAB]`, etc. +- **Multi-key support**: Completions work seamlessly with multiple API keys, showing stores for the current default key +- **New command**: `mxbai completion refresh` to manually refresh the completion cache + +Breaking changes: +- Removed undocumented `vector-store` alias (use `vs` instead) diff --git a/CLAUDE.md b/CLAUDE.md index 3e9e8cf..a75a1c6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -104,5 +104,4 @@ export MXBAI_API_KEY="your-api-key" - File upload with processing strategies (high_quality, fast, auto) - Git-based and hash-based sync capabilities - Manifest-based bulk uploads via YAML configuration -- Support for aliases and configuration management -``` \ No newline at end of file +- Support for aliases and configuration management \ No newline at end of file diff --git a/packages/cli/README.md b/packages/cli/README.md index f601680..ea8b52a 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -17,6 +17,9 @@ mxbai config keys add mxb_xxxxx work # Or use environment variable export MXBAI_API_KEY=mxb_xxxxx +# Install shell completion for better experience (optional but recommended) +mxbai completion install + ## Check available commands and their options mxbai --help @@ -94,6 +97,7 @@ mxbai vs upload "My Documents" --manifest upload-manifest.yaml - `mxbai completion install` - Install shell completion - Options: `--shell ` (manually specify shell: bash, zsh, fish, pwsh) - `mxbai completion uninstall` - Uninstall shell completion +- `mxbai completion refresh` - Refresh completion cache for vector store names ## Features @@ -301,7 +305,9 @@ mxbai config keys set-default personal ## Shell Completion -The CLI supports tab completion for commands and subcommands. To set up completion: +The CLI supports intelligent tab completion for commands, subcommands, and **vector store names**. + +### Installation ```bash # Install completion (auto-detects your shell) @@ -325,6 +331,34 @@ After installation, restart your shell or reload your shell configuration: - **fish**: Completion is ready to use (fish auto-loads completions) - **pwsh**: `. $PROFILE` or restart terminal +### Dynamic Vector Store Name Completion + +The CLI provides intelligent tab completion for vector store names in commands: + +```bash +# Tab completion shows your vector store names +mxbai vs get [TAB] # Shows: store1 store2 my-docs ... +mxbai vs delete [TAB] # Shows: store1 store2 my-docs ... +mxbai vs sync [TAB] # Shows: store1 store2 my-docs ... +mxbai vs upload [TAB] # Shows: store1 store2 my-docs ... + +# Also works with files subcommands +mxbai vs files list [TAB] # Shows: store1 store2 my-docs ... +``` + +**How it works:** +- Vector store names are cached locally for instant completion (no API latency) +- Cache updates automatically when you create, update, delete, or list vector stores +- Supports multiple API keys - completions show stores for your current default key +- Manual refresh available: `mxbai completion refresh` + +**Cache management:** +- Caches up to 50 most recent vector store names per API key +- Cache location follows your config directory: + - Linux/Unix: `~/.config/mixedbread/completion-cache.json` + - macOS: `~/Library/Application Support/mixedbread/completion-cache.json` + - Windows: `%APPDATA%\mixedbread\completion-cache.json` + ## Global Options All commands support these global options: @@ -450,6 +484,7 @@ src/ │ └── index.ts ├── utils/ # Shared utilities │ ├── client.ts # API client setup +│ ├── completion-cache.ts # Shell completion cache management │ ├── config.ts # Configuration management │ ├── git.ts # Git integration utilities │ ├── global-options.ts # Common CLI options diff --git a/packages/cli/package.json b/packages/cli/package.json index c87c5c8..475209f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -58,6 +58,7 @@ "glob": "^10.4.5", "inquirer": "^9.2.23", "mime-types": "^3.0.1", + "minimatch": "^10.0.3", "ora": "^8.0.1", "p-limit": "^6.2.0", "yaml": "^2.4.5", @@ -74,6 +75,7 @@ "jest": "^29.4.0", "mock-fs": "^5.5.0", "ts-jest": "^29.1.0", + "ts-node": "^10.9.2", "tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.8/tsc-multi.tgz", "typescript": "5.8.3" } diff --git a/packages/cli/src/commands/completion.ts b/packages/cli/src/commands/completion.ts index 7289b7c..e87a565 100644 --- a/packages/cli/src/commands/completion.ts +++ b/packages/cli/src/commands/completion.ts @@ -8,6 +8,19 @@ import { } from "@pnpm/tabtab"; import chalk from "chalk"; import { Command } from "commander"; +import ora from "ora"; +import { + getCurrentKeyName, + getStoresForCompletion, + refreshAllCaches, +} from "../utils/completion-cache"; +import { + addGlobalOptions, + BaseGlobalOptionsSchema, + type GlobalOptions, + mergeCommandOptions, + parseOptions, +} from "../utils/global-options"; const SUPPORTED_SHELLS = ["bash", "zsh", "fish", "pwsh"] as const; export type SupportedShell = (typeof SUPPORTED_SHELLS)[number]; @@ -128,7 +141,6 @@ export function createCompletionCommand(): Command { } } catch (error) { console.error(chalk.red("✗"), "Error installing completion:", error); - process.exit(1); } }); @@ -146,10 +158,35 @@ export function createCompletionCommand(): Command { ); } catch (error) { console.error(chalk.red("✗"), "Error uninstalling completion:", error); - process.exit(1); } }); + const refreshCommand = addGlobalOptions( + new Command("refresh").description( + "Refresh completion cache for all API keys" + ) + ); + + refreshCommand.action(async (options: GlobalOptions) => { + const mergedOptions = mergeCommandOptions(refreshCommand, options); + const parsedOptions = parseOptions(BaseGlobalOptionsSchema, { + ...mergedOptions, + }); + const spinner = ora("Refreshing completion cache...").start(); + + try { + await refreshAllCaches(parsedOptions); + spinner.succeed("Completion cache refreshed successfully"); + } catch (error) { + spinner.fail("Failed to refresh completion cache"); + if (error instanceof Error) { + console.error(chalk.red("✗"), error.message); + } + } + }); + + completionCommand.addCommand(refreshCommand); + // Show help without error exit code when no subcommand provided completionCommand.action(() => { completionCommand.help(); @@ -182,8 +219,33 @@ export function createCompletionServerCommand(): Command { ); } + // Vector store name completions + const STORE_NAME_COMMANDS = [ + "get", + "delete", + "update", + "sync", + "upload", + "search", + "qa", + ]; + + if (STORE_NAME_COMMANDS.includes(env.prev)) { + const words = env.line.trim().split(/\s+/); + // Check if previous word is "vs" + if (words.length >= 3 && words[words.length - 2] === "vs") { + const keyName = getCurrentKeyName(); + if (keyName) { + const stores = getStoresForCompletion(keyName); + if (stores.length > 0) { + return log(stores, shell, console.log); + } + } + } + } + // Vector store completions - if (env.prev === "vs" || env.prev === "vector-store") { + if (env.prev === "vs") { return log( [ "create", @@ -206,11 +268,29 @@ export function createCompletionServerCommand(): Command { if (env.prev === "files") { // Check if we're in "mxbai vs files " context const words = env.line.trim().split(/\s+/); + if (words.length >= 3 && words[1] === "vs") { + return log(["list", "get", "delete"], shell, console.log); + } + } + + // Vector store name completions for files subcommands + const FILES_SUBCOMMANDS = ["list", "get", "delete"]; + if (FILES_SUBCOMMANDS.includes(env.prev)) { + const words = env.line.trim().split(/\s+/); + // Check for "mxbai vs files [subcommand] " context if ( - words.length >= 3 && - (words[1] === "vs" || words[1] === "vector-store") + words.length >= 4 && + words[1] === "vs" && + words[2] === "files" && + FILES_SUBCOMMANDS.includes(words[3]) ) { - return log(["list", "get", "delete"], shell, console.log); + const keyName = getCurrentKeyName(); + if (keyName) { + const stores = getStoresForCompletion(keyName); + if (stores.length > 0) { + return log(stores, shell, console.log); + } + } } } @@ -233,7 +313,7 @@ export function createCompletionServerCommand(): Command { // Completion completions if (env.prev === "completion") { - return log(["install", "uninstall"], shell, console.log); + return log(["install", "uninstall", "refresh"], shell, console.log); } }); diff --git a/packages/cli/src/commands/config/keys.ts b/packages/cli/src/commands/config/keys.ts index 228432e..0018cfb 100644 --- a/packages/cli/src/commands/config/keys.ts +++ b/packages/cli/src/commands/config/keys.ts @@ -2,12 +2,24 @@ import chalk from "chalk"; import { Command } from "commander"; import inquirer from "inquirer"; import { z } from "zod"; +import { createClient } from "../../utils/client"; +import { + clearCacheForKey, + refreshCacheForKey, +} from "../../utils/completion-cache"; import { isMxbaiAPIKey, loadConfig, outputAvailableKeys, saveConfig, } from "../../utils/config"; +import { + addGlobalOptions, + BaseGlobalOptionsSchema, + type GlobalOptions, + mergeCommandOptions, + parseOptions, +} from "../../utils/global-options"; const RemoveKeySchema = z.object({ name: z.string().min(1, { message: '"name" is required' }), @@ -15,12 +27,19 @@ const RemoveKeySchema = z.object({ }); export function createKeysCommand(): Command { - const keysCommand = new Command("keys").description("Manage API keys"); + const keysCommand = addGlobalOptions( + new Command("keys").description("Manage API keys") + ); keysCommand .command("add [name]") .description("Add a new API key") - .action(async (key: string, name?: string) => { + .action(async (key: string, name?: string, options?: GlobalOptions) => { + const mergedOptions = mergeCommandOptions(keysCommand, options); + const parsedOptions = parseOptions(BaseGlobalOptionsSchema, { + ...mergedOptions, + }); + if (!isMxbaiAPIKey(key)) { console.error(chalk.red("✗"), 'API key must start with "mxb_"'); return; @@ -75,6 +94,13 @@ export function createKeysCommand(): Command { chalk.green("✓"), `API key "${name}" saved and set as default` ); + + // Populate completion cache for the new key + const client = createClient({ + apiKey: key, + baseURL: parsedOptions.baseURL, + }); + refreshCacheForKey(name, client); }); keysCommand @@ -139,6 +165,9 @@ export function createKeysCommand(): Command { // Remove the key delete config.api_keys[parsedOptions.name]; + // Clear completion cache for the removed key + clearCacheForKey(parsedOptions.name); + // If this was the default, clear it and warn if (isDefault) { if (config.defaults) { @@ -174,7 +203,12 @@ export function createKeysCommand(): Command { keysCommand .command("set-default ") .description("Set the default API key") - .action((name: string) => { + .action(async (name: string, options: GlobalOptions) => { + const mergedOptions = mergeCommandOptions(keysCommand, options); + const parsedOptions = parseOptions(BaseGlobalOptionsSchema, { + ...mergedOptions, + }); + const config = loadConfig(); if (!config.api_keys?.[name]) { @@ -194,6 +228,13 @@ export function createKeysCommand(): Command { saveConfig(config); console.log(chalk.green("✓"), `"${name}" set as default API key`); + + // Refresh cache for the newly set default key + const client = createClient({ + apiKey: config.api_keys[name], + baseURL: parsedOptions.baseURL, + }); + refreshCacheForKey(name, client); }); // Show help when no subcommand provided diff --git a/packages/cli/src/commands/vector-store/create.ts b/packages/cli/src/commands/vector-store/create.ts index 5619e9e..8be6f4d 100644 --- a/packages/cli/src/commands/vector-store/create.ts +++ b/packages/cli/src/commands/vector-store/create.ts @@ -3,6 +3,10 @@ import { Command } from "commander"; import ora, { type Ora } from "ora"; import { z } from "zod"; import { createClient } from "../../utils/client"; +import { + getCurrentKeyName, + updateCacheAfterCreate, +} from "../../utils/completion-cache"; import { addGlobalOptions, extendGlobalOptions, @@ -83,6 +87,12 @@ export function createCreateCommand(): Command { }, parsedOptions.format ); + + // Update completion cache with the new store + const keyName = getCurrentKeyName(); + if (keyName) { + updateCacheAfterCreate(keyName, vectorStore.name); + } } catch (error) { spinner?.fail("Failed to create vector store"); if (error instanceof Error) { diff --git a/packages/cli/src/commands/vector-store/delete.ts b/packages/cli/src/commands/vector-store/delete.ts index a770022..bd05598 100644 --- a/packages/cli/src/commands/vector-store/delete.ts +++ b/packages/cli/src/commands/vector-store/delete.ts @@ -4,6 +4,10 @@ import inquirer from "inquirer"; import ora, { type Ora } from "ora"; import { z } from "zod"; import { createClient } from "../../utils/client"; +import { + getCurrentKeyName, + updateCacheAfterDelete, +} from "../../utils/completion-cache"; import { addGlobalOptions, extendGlobalOptions, @@ -72,6 +76,12 @@ export function createDeleteCommand(): Command { spinner.succeed( `Vector store "${vectorStore.name}" deleted successfully` ); + + // Update completion cache by removing the deleted store + const keyName = getCurrentKeyName(); + if (keyName) { + updateCacheAfterDelete(keyName, vectorStore.name); + } } catch (error) { spinner?.fail("Failed to delete vector store"); if (error instanceof Error) { diff --git a/packages/cli/src/commands/vector-store/index.ts b/packages/cli/src/commands/vector-store/index.ts index 9ac9ea9..f3c3ab4 100644 --- a/packages/cli/src/commands/vector-store/index.ts +++ b/packages/cli/src/commands/vector-store/index.ts @@ -11,9 +11,7 @@ import { createUpdateCommand } from "./update"; import { createUploadCommand } from "./upload"; export function createVectorStoreCommand(): Command { - const vsCommand = new Command("vs") - .alias("vector-store") - .description("Manage vector stores"); + const vsCommand = new Command("vs").description("Manage vector stores"); // Add subcommands vsCommand.addCommand(createListCommand()); diff --git a/packages/cli/src/commands/vector-store/list.ts b/packages/cli/src/commands/vector-store/list.ts index 10a93e0..30a3710 100644 --- a/packages/cli/src/commands/vector-store/list.ts +++ b/packages/cli/src/commands/vector-store/list.ts @@ -3,6 +3,10 @@ import { Command } from "commander"; import ora, { type Ora } from "ora"; import { z } from "zod"; import { createClient } from "../../utils/client"; +import { + getCurrentKeyName, + refreshCacheForKey, +} from "../../utils/completion-cache"; import { addGlobalOptions, extendGlobalOptions, @@ -87,6 +91,12 @@ export function createListCommand(): Command { `Found ${formatCountWithSuffix(vectorStores.length, "vector store")}` ); formatOutput(formattedData, parsedOptions.format); + + // Update completion cache with the fetched stores + const keyName = getCurrentKeyName(); + if (keyName) { + refreshCacheForKey(keyName, client); + } } catch (error) { spinner?.fail("Failed to load vector stores"); if (error instanceof Error) { diff --git a/packages/cli/src/commands/vector-store/update.ts b/packages/cli/src/commands/vector-store/update.ts index fc49e76..87fb2d9 100644 --- a/packages/cli/src/commands/vector-store/update.ts +++ b/packages/cli/src/commands/vector-store/update.ts @@ -4,6 +4,10 @@ import { Command } from "commander"; import ora, { type Ora } from "ora"; import { z } from "zod"; import { createClient } from "../../utils/client"; +import { + getCurrentKeyName, + updateCacheAfterUpdate, +} from "../../utils/completion-cache"; import { addGlobalOptions, extendGlobalOptions, @@ -118,6 +122,18 @@ export function createUpdateCommand(): Command { }, parsedOptions.format ); + + // Update completion cache if the name was changed + if (vectorStore.name !== updatedVectorStore.name) { + const keyName = getCurrentKeyName(); + if (keyName) { + updateCacheAfterUpdate( + keyName, + vectorStore.name, + updatedVectorStore.name + ); + } + } } catch (error) { spinner?.fail("Failed to update vector store"); if (error instanceof Error) { diff --git a/packages/cli/src/utils/completion-cache.ts b/packages/cli/src/utils/completion-cache.ts new file mode 100644 index 0000000..b55f65d --- /dev/null +++ b/packages/cli/src/utils/completion-cache.ts @@ -0,0 +1,188 @@ +import { randomBytes } from "node:crypto"; +import { + existsSync, + mkdirSync, + readdirSync, + readFileSync, + renameSync, + unlinkSync, + writeFileSync, +} from "node:fs"; +import { join } from "node:path"; +import type { Mixedbread } from "@mixedbread/sdk"; +import { createClient } from "./client"; +import { getConfigDir, loadConfig } from "./config"; + +interface CompletionCache { + version: string; + stores: Record; +} + +const CACHE_VERSION = "1.0"; +const MAX_STORES = 50; + +const CACHE_FILE = join(getConfigDir(), "completion-cache.json"); + +function loadCache(): CompletionCache { + try { + if (existsSync(CACHE_FILE)) { + const data = JSON.parse(readFileSync(CACHE_FILE, "utf-8")); + if (data.version === CACHE_VERSION) { + return data; + } + } + } catch { + // Silent fail - return empty cache + } + + return { + version: CACHE_VERSION, + stores: {}, + }; +} + +function saveCache(cache: CompletionCache): void { + try { + const configDir = getConfigDir(); + if (!existsSync(configDir)) { + mkdirSync(configDir, { recursive: true }); + } + + // Atomic write: write to temp file, then rename + const tempFile = `${CACHE_FILE}.${randomBytes(6).toString("hex")}.tmp`; + writeFileSync(tempFile, JSON.stringify(cache, null, 2)); + renameSync(tempFile, CACHE_FILE); + } catch { + try { + // Clean up temp file if it exists + const tempFiles = readdirSync(getConfigDir()).filter( + (f: string) => + f.startsWith("completion-cache.json.") && f.endsWith(".tmp") + ); + tempFiles.forEach((f: string) => { + unlinkSync(join(getConfigDir(), f)); + }); + } catch { + // Ignore cleanup errors + } + } +} + +export function getCurrentKeyName(): string | null { + const config = loadConfig(); + const defaultKeyName = config.defaults?.api_key; + + if (!defaultKeyName) { + return null; + } + + // Validate that the key still exists + if (!config.api_keys?.[defaultKeyName]) { + return null; + } + + return defaultKeyName; +} + +export function getStoresForCompletion(keyName: string): string[] { + const cache = loadCache(); + return cache.stores[keyName] || []; +} + +export async function refreshCacheForKey( + keyName: string, + client: Mixedbread +): Promise { + try { + const response = await client.vectorStores.list({ + limit: MAX_STORES, + }); + + const storeNames = response.data.map((vs) => vs.name); + + const cache = loadCache(); + cache.stores[keyName] = storeNames; + saveCache(cache); + } catch { + // Keep existing cache on error + } +} + +export async function refreshAllCaches(options: { + baseURL?: string; +}): Promise { + const config = loadConfig(); + + if (!config.api_keys) { + throw new Error("No API keys found"); + } + + for (const keyName of Object.keys(config.api_keys)) { + const client = createClient({ + apiKey: config.api_keys[keyName], + baseURL: options.baseURL, + }); + + await refreshCacheForKey(keyName, client); + } +} + +export function updateCacheAfterCreate( + keyName: string, + storeName: string +): void { + const cache = loadCache(); + if (!cache.stores[keyName]) { + cache.stores[keyName] = []; + } + + if ( + !cache.stores[keyName].includes(storeName) && + cache.stores[keyName].length < MAX_STORES + ) { + // Add if not already present and under limit + cache.stores[keyName].push(storeName); + saveCache(cache); + } +} + +export function updateCacheAfterUpdate( + keyName: string, + oldName: string, + newName: string +): void { + const cache = loadCache(); + if (!cache.stores[keyName]) { + return; + } + + const index = cache.stores[keyName].indexOf(oldName); + if (index !== -1) { + cache.stores[keyName][index] = newName; + saveCache(cache); + } +} + +export function updateCacheAfterDelete( + keyName: string, + storeName: string +): void { + const cache = loadCache(); + if (!cache.stores[keyName]) { + return; + } + + const index = cache.stores[keyName].indexOf(storeName); + if (index !== -1) { + cache.stores[keyName].splice(index, 1); + saveCache(cache); + } +} + +export function clearCacheForKey(keyName: string): void { + const cache = loadCache(); + if (cache.stores[keyName]) { + delete cache.stores[keyName]; + saveCache(cache); + } +} diff --git a/packages/cli/src/utils/config.ts b/packages/cli/src/utils/config.ts index c7247e2..be1513b 100644 --- a/packages/cli/src/utils/config.ts +++ b/packages/cli/src/utils/config.ts @@ -66,7 +66,7 @@ export const CLIConfigSchema = z.object({ export type CLIConfig = z.infer; -function getConfigDir(): string { +export function getConfigDir(): string { if (process.env.MXBAI_CONFIG_PATH) { return process.env.MXBAI_CONFIG_PATH; } diff --git a/packages/cli/src/utils/git.ts b/packages/cli/src/utils/git.ts index 8a2e66a..bd75306 100644 --- a/packages/cli/src/utils/git.ts +++ b/packages/cli/src/utils/git.ts @@ -1,7 +1,7 @@ import { exec } from "node:child_process"; import path from "node:path"; import { promisify } from "node:util"; -import minimatch from "minimatch"; +import { minimatch } from "minimatch"; const execAsync = promisify(exec); diff --git a/packages/cli/tests/commands/completion.test.ts b/packages/cli/tests/commands/completion.test.ts index 4277d5c..af93be4 100644 --- a/packages/cli/tests/commands/completion.test.ts +++ b/packages/cli/tests/commands/completion.test.ts @@ -35,9 +35,28 @@ jest.mock("chalk", () => ({ }, })); +// Mock ora +jest.mock("ora", () => ({ + __esModule: true, + default: jest.fn(), +})); + +// Mock completion-cache module +jest.mock("../../src/utils/completion-cache", () => ({ + getCurrentKeyName: jest.fn(() => "test-key"), + getStoresForCompletion: jest.fn(() => ["store1", "store2"]), + refreshAllCaches: jest.fn(() => Promise.resolve()), + refreshCacheForKey: jest.fn(() => Promise.resolve()), + updateCacheAfterCreate: jest.fn(), + updateCacheAfterUpdate: jest.fn(), + updateCacheAfterDelete: jest.fn(), + clearCacheForKey: jest.fn(), +})); + // Mock path module jest.mock("node:path", () => ({ basename: jest.fn((path: string) => path.split("/").pop()), + join: jest.fn((...args: string[]) => args.join("/")), })); describe("Completion Commands", () => { @@ -111,13 +130,14 @@ describe("Completion Commands", () => { expect(command.description()).toBe("Manage shell completion"); }); - it("should have install and uninstall subcommands", () => { + it("should have install, uninstall, and refresh subcommands", () => { const command = createCompletionCommand(); const subcommands = command.commands; - expect(subcommands).toHaveLength(2); + expect(subcommands).toHaveLength(3); expect(subcommands.map((cmd) => cmd.name())).toContain("install"); expect(subcommands.map((cmd) => cmd.name())).toContain("uninstall"); + expect(subcommands.map((cmd) => cmd.name())).toContain("refresh"); }); it("should show help when no subcommand is provided", async () => { @@ -258,9 +278,8 @@ describe("Completion Commands", () => { mockInstall.mockRejectedValueOnce(new Error(errorMessage)); const command = createCompletionCommand(); - const result = await parseCommand(command, ["install"]); + await parseCommand(command, ["install"]); - expect(result.exitCode).toBe(1); expect(mockConsoleOutput.errors).toContainEqual( expect.stringContaining("Error installing completion") ); @@ -343,14 +362,86 @@ describe("Completion Commands", () => { mockUninstall.mockRejectedValueOnce(new Error(errorMessage)); const command = createCompletionCommand(); - const result = await parseCommand(command, ["uninstall"]); + await parseCommand(command, ["uninstall"]); - expect(result.exitCode).toBe(1); expect(mockConsoleOutput.errors).toContainEqual( expect.stringContaining("Error uninstalling completion") ); }); }); + + describe("refresh subcommand", () => { + let mockRefreshAllCaches: jest.MockedFunction< + typeof import("../../src/utils/completion-cache").refreshAllCaches + >; + let mockSpinner: { + start: jest.MockedFunction<(text?: string) => unknown>; + succeed: jest.MockedFunction<(text?: string) => unknown>; + fail: jest.MockedFunction<(text?: string) => unknown>; + }; + + beforeEach(() => { + const completionCache = jest.mocked( + require("../../src/utils/completion-cache") + ); + mockRefreshAllCaches = completionCache.refreshAllCaches; + + // Setup ora mock + mockSpinner = { + start: jest.fn().mockReturnThis(), + succeed: jest.fn().mockReturnThis(), + fail: jest.fn().mockReturnThis(), + }; + const ora = require("ora").default; + (ora as jest.MockedFunction).mockImplementation( + () => mockSpinner + ); + }); + + it("should refresh completion cache successfully", async () => { + mockRefreshAllCaches.mockResolvedValue(undefined); + + const command = createCompletionCommand(); + await parseCommand(command, ["refresh"]); + + expect(mockRefreshAllCaches).toHaveBeenCalled(); + expect(mockSpinner.start).toHaveBeenCalled(); + expect(mockSpinner.succeed).toHaveBeenCalledWith( + "Completion cache refreshed successfully" + ); + }); + + it("should handle refresh errors gracefully", async () => { + const errorMessage = "No API keys found"; + mockRefreshAllCaches.mockRejectedValue(new Error(errorMessage)); + + const command = createCompletionCommand(); + await parseCommand(command, ["refresh"]); + + expect(mockSpinner.fail).toHaveBeenCalledWith( + "Failed to refresh completion cache" + ); + expect(mockConsoleOutput.errors).toContainEqual( + expect.stringContaining(errorMessage) + ); + }); + + it("should have global options", () => { + const command = createCompletionCommand(); + const refreshCommand = command.commands.find( + (cmd) => cmd.name() === "refresh" + ); + + expect(refreshCommand).toBeDefined(); + const options = refreshCommand?.options; + expect(options).toBeDefined(); + + const hasBaseURLOption = options?.some( + (opt) => opt.long === "--base-url" + ); + expect(hasBaseURLOption).toBe(true); + }); + }); }); describe("createCompletionServerCommand", () => { @@ -449,29 +540,132 @@ describe("Completion Commands", () => { console.log ); }); + }); - it("should provide vector store completions for 'vector-store' command", async () => { + describe("vector store name completions", () => { + beforeEach(() => { + const completionCache = jest.mocked( + require("../../src/utils/completion-cache") + ); + completionCache.getCurrentKeyName.mockReturnValue("test-key"); + completionCache.getStoresForCompletion.mockReturnValue([ + "store1", + "store2", + "store3", + ]); + }); + + it("should provide store name completions for vs commands that need a store name", async () => { + // Test a representative command - the logic is the same for all mockParseEnv.mockReturnValue({ complete: true, - words: 2, + words: 3, point: 0, - line: "mxbai vector-store ", + line: "mxbai vs get ", partial: "", - last: "vector-store", + last: "get", lastPartial: "", - prev: "vector-store", + prev: "get", }); - mockGetShellFromEnv.mockReturnValue("fish"); + mockGetShellFromEnv.mockReturnValue("bash"); const command = createCompletionServerCommand(); await parseCommand(command, []); expect(mockLog).toHaveBeenCalledWith( - vectorStoreCommands, - "fish", + ["store1", "store2", "store3"], + "bash", console.log ); }); + + it("should not provide store names if no key is set", async () => { + const completionCache = jest.mocked( + require("../../src/utils/completion-cache") + ); + completionCache.getCurrentKeyName.mockReturnValue(null); + + mockParseEnv.mockReturnValue({ + complete: true, + words: 3, + point: 0, + line: "mxbai vs get ", + partial: "", + last: "get", + lastPartial: "", + prev: "get", + }); + mockGetShellFromEnv.mockReturnValue("bash"); + + const command = createCompletionServerCommand(); + await parseCommand(command, []); + + expect(mockLog).not.toHaveBeenCalled(); + }); + + it("should not provide store names if cache is empty", async () => { + const completionCache = jest.mocked( + require("../../src/utils/completion-cache") + ); + completionCache.getCurrentKeyName.mockReturnValue("test-key"); + completionCache.getStoresForCompletion.mockReturnValue([]); + + mockParseEnv.mockReturnValue({ + complete: true, + words: 3, + point: 0, + line: "mxbai vs sync ", + partial: "", + last: "sync", + lastPartial: "", + prev: "sync", + }); + mockGetShellFromEnv.mockReturnValue("zsh"); + + const command = createCompletionServerCommand(); + await parseCommand(command, []); + + expect(mockLog).not.toHaveBeenCalled(); + }); + + it("should not provide store names for non-vs commands", async () => { + mockParseEnv.mockReturnValue({ + complete: true, + words: 3, + point: 0, + line: "mxbai config get ", + partial: "", + last: "get", + lastPartial: "", + prev: "get", + }); + mockGetShellFromEnv.mockReturnValue("bash"); + + const command = createCompletionServerCommand(); + await parseCommand(command, []); + + expect(mockLog).not.toHaveBeenCalled(); + }); + + it("should not provide store names for commands that don't need them", async () => { + // Test that list and create don't get store name completions + mockParseEnv.mockReturnValue({ + complete: true, + words: 3, + point: 0, + line: "mxbai vs list ", + partial: "", + last: "list", + lastPartial: "", + prev: "list", + }); + mockGetShellFromEnv.mockReturnValue("bash"); + + const command = createCompletionServerCommand(); + await parseCommand(command, []); + + expect(mockLog).not.toHaveBeenCalled(); + }); }); describe("files subcommand completions", () => { @@ -500,16 +694,25 @@ describe("Completion Commands", () => { ); }); - it("should provide files completions for 'mxbai vector-store files' context", async () => { + it("should provide store name completions for 'mxbai vs files list' context", async () => { + const completionCache = jest.mocked( + require("../../src/utils/completion-cache") + ); + completionCache.getCurrentKeyName.mockReturnValue("test-key"); + completionCache.getStoresForCompletion.mockReturnValue([ + "store1", + "store2", + ]); + mockParseEnv.mockReturnValue({ complete: true, - words: 3, + words: 4, point: 0, - line: "mxbai vector-store files ", + line: "mxbai vs files list ", partial: "", - last: "files", + last: "list", lastPartial: "", - prev: "files", + prev: "list", }); mockGetShellFromEnv.mockReturnValue("bash"); @@ -517,13 +720,13 @@ describe("Completion Commands", () => { await parseCommand(command, []); expect(mockLog).toHaveBeenCalledWith( - filesCommands, + ["store1", "store2"], "bash", console.log ); }); - it("should not provide files completions for non-vector-store contexts", async () => { + it("should not provide files completions for non-vs contexts", async () => { mockParseEnv.mockReturnValue({ complete: true, words: 2, @@ -655,7 +858,7 @@ describe("Completion Commands", () => { await parseCommand(command, []); expect(mockLog).toHaveBeenCalledWith( - ["install", "uninstall"], + ["install", "uninstall", "refresh"], "bash", console.log ); @@ -763,7 +966,7 @@ describe("Completion Commands", () => { expect(serverCommand.name()).toBe("completion-server"); // Both commands should be separate and independent - expect(completionCommand.commands.length).toBe(2); // install, uninstall + expect(completionCommand.commands.length).toBe(3); // install, uninstall, refresh expect(serverCommand.commands.length).toBe(0); // no subcommands }); }); diff --git a/packages/cli/tests/setup.ts b/packages/cli/tests/setup.ts index 7063bc5..cd2d7ec 100644 --- a/packages/cli/tests/setup.ts +++ b/packages/cli/tests/setup.ts @@ -17,12 +17,23 @@ beforeEach(() => { afterEach(() => { // Clean up after each test jest.clearAllMocks(); + jest.restoreAllMocks(); + + // Clear all timers to prevent any pending operations + jest.clearAllTimers(); }); -afterAll(() => { +afterAll(async () => { // Restore original methods console.warn = originalConsoleWarn; console.error = originalConsoleError; console.log = originalConsoleLog; process.exit = originalProcessExit; + + // Final cleanup + jest.restoreAllMocks(); + jest.clearAllTimers(); + + // Small delay to allow any pending I/O operations to complete + await new Promise((resolve) => setTimeout(resolve, 100)); }); diff --git a/packages/cli/tests/utils/completion-cache.test.ts b/packages/cli/tests/utils/completion-cache.test.ts new file mode 100644 index 0000000..2655065 --- /dev/null +++ b/packages/cli/tests/utils/completion-cache.test.ts @@ -0,0 +1,544 @@ +import { existsSync, readFileSync } from "node:fs"; +import { join } from "node:path"; +import { + afterEach, + beforeEach, + describe, + expect, + it, + jest, +} from "@jest/globals"; +import type { Mixedbread } from "@mixedbread/sdk"; +import mockFs from "mock-fs"; +import { + clearCacheForKey, + getCurrentKeyName, + getStoresForCompletion, + refreshAllCaches, + refreshCacheForKey, + updateCacheAfterCreate, + updateCacheAfterDelete, + updateCacheAfterUpdate, +} from "../../src/utils/completion-cache"; + +// Mock createClient +jest.mock("../../src/utils/client", () => ({ + createClient: jest.fn(), +})); + +// Mock config module +jest.mock("../../src/utils/config", () => ({ + loadConfig: jest.fn(), + getConfigDir: jest.fn(() => "/test/.config/mixedbread"), +})); + +describe("Completion Cache", () => { + const configDir = "/test/.config/mixedbread"; + const cacheFile = join(configDir, "completion-cache.json"); + + let mockLoadConfig: jest.MockedFunction< + typeof import("../../src/utils/config").loadConfig + >; + let mockCreateClient: jest.MockedFunction< + typeof import("../../src/utils/client").createClient + >; + + beforeEach(async () => { + // Get mocked functions + const config = await import("../../src/utils/config"); + mockLoadConfig = config.loadConfig as jest.MockedFunction< + typeof config.loadConfig + >; + + const client = await import("../../src/utils/client"); + mockCreateClient = client.createClient as jest.MockedFunction< + typeof client.createClient + >; + + jest.clearAllMocks(); + }); + + afterEach(() => { + mockFs.restore(); + jest.clearAllMocks(); + }); + + describe("getCurrentKeyName", () => { + it("should return the default key name from config", () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + api_keys: { + work: "mxb_work123", + personal: "mxb_personal123", + }, + defaults: { + api_key: "work", + }, + }); + + const keyName = getCurrentKeyName(); + expect(keyName).toBe("work"); + }); + + it("should return null if no default key is set", () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + api_keys: { + work: "mxb_work123", + }, + defaults: {}, + }); + + const keyName = getCurrentKeyName(); + expect(keyName).toBeNull(); + }); + + it("should return null if default key doesn't exist in api_keys", () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + api_keys: { + work: "mxb_work123", + }, + defaults: { + api_key: "nonexistent", + }, + }); + + const keyName = getCurrentKeyName(); + expect(keyName).toBeNull(); + }); + + it("should return null if no api_keys exist", () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + defaults: { + api_key: "work", + }, + }); + + const keyName = getCurrentKeyName(); + expect(keyName).toBeNull(); + }); + }); + + describe("getStoresForCompletion", () => { + it("should return stores for a given key from cache", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1", "store2", "store3"], + personal: ["personal-store"], + }, + }), + }); + + const stores = getStoresForCompletion("work"); + expect(stores).toEqual(["store1", "store2", "store3"]); + }); + + it("should return empty array if key not in cache", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1"], + }, + }), + }); + + const stores = getStoresForCompletion("personal"); + expect(stores).toEqual([]); + }); + + it("should return empty array if cache file doesn't exist", () => { + mockFs({}); + + const stores = getStoresForCompletion("work"); + expect(stores).toEqual([]); + }); + + it("should return empty array if cache is invalid", () => { + mockFs({ + [cacheFile]: "invalid json", + }); + + const stores = getStoresForCompletion("work"); + expect(stores).toEqual([]); + }); + }); + + describe("refreshCacheForKey", () => { + it("should fetch and cache vector stores for a key", async () => { + mockFs({ + [configDir]: {}, + }); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockResolvedValue({ + data: [ + { id: "vs1", name: "store1" }, + { id: "vs2", name: "store2" }, + ], + }); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + await refreshCacheForKey("work", mockClient); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["store1", "store2"]); + expect(mockList).toHaveBeenCalledWith({ limit: 50 }); + }); + + it("should preserve existing cache for other keys", async () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + personal: ["personal-store"], + }, + }), + }); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockResolvedValue({ + data: [{ id: "vs1", name: "work-store" }], + }); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + await refreshCacheForKey("work", mockClient); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.personal).toEqual(["personal-store"]); + expect(cacheContent.stores.work).toEqual(["work-store"]); + }); + + it("should keep existing cache on API error", async () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["existing-store"], + }, + }), + }); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockRejectedValue(new Error("API Error")); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + await refreshCacheForKey("work", mockClient); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["existing-store"]); + }); + + it("should create cache directory if it doesn't exist", async () => { + mockFs({}); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockResolvedValue({ + data: [{ id: "vs1", name: "store1" }], + }); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + await refreshCacheForKey("work", mockClient); + + expect(existsSync(configDir)).toBe(true); + expect(existsSync(cacheFile)).toBe(true); + }); + }); + + describe("refreshAllCaches", () => { + it("should refresh cache for all API keys", async () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + api_keys: { + work: "mxb_work123", + personal: "mxb_personal123", + }, + }); + + mockFs({ + [configDir]: {}, + }); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockResolvedValueOnce({ + data: [{ id: "vs1", name: "work-store" }], + }) + .mockResolvedValueOnce({ + data: [{ id: "vs2", name: "personal-store" }], + }); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + mockCreateClient.mockReturnValue(mockClient); + + await refreshAllCaches({ baseURL: "https://api.example.com" }); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["work-store"]); + expect(cacheContent.stores.personal).toEqual(["personal-store"]); + expect(mockCreateClient).toHaveBeenCalledTimes(2); + }); + + it("should throw error if no API keys found", async () => { + mockLoadConfig.mockReturnValue({ + version: "1.0", + }); + + await expect(refreshAllCaches({})).rejects.toThrow("No API keys found"); + }); + }); + + describe("updateCacheAfterCreate", () => { + it("should add new store to cache", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["existing-store"], + }, + }), + }); + + updateCacheAfterCreate("work", "new-store"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toContain("new-store"); + expect(cacheContent.stores.work).toContain("existing-store"); + }); + + it("should not add duplicate stores", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["existing-store"], + }, + }), + }); + + updateCacheAfterCreate("work", "existing-store"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["existing-store"]); + }); + + it("should not exceed max stores limit", () => { + const stores = Array.from({ length: 50 }, (_, i) => `store${i}`); + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: stores, + }, + }), + }); + + updateCacheAfterCreate("work", "new-store"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work.length).toBe(50); + expect(cacheContent.stores.work).not.toContain("new-store"); + }); + + it("should initialize stores array if key doesn't exist", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: {}, + }), + }); + + updateCacheAfterCreate("work", "new-store"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["new-store"]); + }); + }); + + describe("updateCacheAfterUpdate", () => { + it("should rename store in cache", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["old-name", "other-store"], + }, + }), + }); + + updateCacheAfterUpdate("work", "old-name", "new-name"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["new-name", "other-store"]); + }); + + it("should handle non-existent store gracefully", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1", "store2"], + }, + }), + }); + + updateCacheAfterUpdate("work", "nonexistent", "new-name"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["store1", "store2"]); + }); + }); + + describe("updateCacheAfterDelete", () => { + it("should remove store from cache", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1", "store2", "store3"], + }, + }), + }); + + updateCacheAfterDelete("work", "store2"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["store1", "store3"]); + }); + + it("should handle non-existent store gracefully", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1", "store2"], + }, + }), + }); + + updateCacheAfterDelete("work", "nonexistent"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toEqual(["store1", "store2"]); + }); + }); + + describe("clearCacheForKey", () => { + it("should remove all stores for a key", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1", "store2"], + personal: ["personal-store"], + }, + }), + }); + + clearCacheForKey("work"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.work).toBeUndefined(); + expect(cacheContent.stores.personal).toEqual(["personal-store"]); + }); + + it("should only clear specified key", () => { + mockFs({ + [cacheFile]: JSON.stringify({ + version: "1.0", + stores: { + work: ["store1"], + personal: ["personal-store"], + }, + }), + }); + + clearCacheForKey("work"); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores.personal).toEqual(["personal-store"]); + expect(cacheContent.stores.work).toBeUndefined(); + }); + }); + + describe("concurrent operations", () => { + it("should handle concurrent cache updates", async () => { + mockFs({ + [configDir]: {}, + }); + + const mockList = jest + .fn< + (params: { + limit: number; + }) => Promise<{ data: Array<{ id: string; name: string }> }> + >() + .mockResolvedValue({ + data: [{ id: "vs1", name: "store1" }], + }); + const mockClient = { + vectorStores: { + list: mockList, + }, + } as unknown as Mixedbread; + + // Simulate concurrent writes + await Promise.all([ + refreshCacheForKey("work", mockClient), + refreshCacheForKey("personal", mockClient), + ]); + + const cacheContent = JSON.parse(readFileSync(cacheFile, "utf-8")); + expect(cacheContent.stores).toHaveProperty("work"); + expect(cacheContent.stores).toHaveProperty("personal"); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a03a2c6..c06022c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 2.29.5 turbo: specifier: ^2.5.4 - version: 2.5.4 + version: 2.5.5 typescript: specifier: 5.8.2 version: 5.8.2 @@ -25,13 +25,13 @@ importers: dependencies: '@mixedbread/sdk': specifier: ^0.19.0 - version: 0.19.0 + version: 0.19.1 '@pnpm/tabtab': specifier: ^0.5.4 version: 0.5.4 chalk: specifier: ^5.3.0 - version: 5.4.1 + version: 5.5.0 cli-table3: specifier: ^0.6.5 version: 0.6.5 @@ -40,7 +40,7 @@ importers: version: 12.1.0 dotenv: specifier: ^16.4.5 - version: 16.5.0 + version: 16.6.1 glob: specifier: ^10.4.5 version: 10.4.5 @@ -50,6 +50,9 @@ importers: mime-types: specifier: ^3.0.1 version: 3.0.1 + minimatch: + specifier: ^10.0.3 + version: 10.0.3 ora: specifier: ^8.0.1 version: 8.2.0 @@ -58,17 +61,17 @@ importers: version: 6.2.0 yaml: specifier: ^2.4.5 - version: 2.8.0 + version: 2.8.1 zod: specifier: ^3.25.56 - version: 3.25.67 + version: 3.25.76 devDependencies: '@jest/globals': specifier: ^30.0.2 - version: 30.0.2 + version: 30.0.5 '@types/inquirer': specifier: ^9.0.7 - version: 9.0.8 + version: 9.0.9 '@types/jest': specifier: ^29.4.0 version: 29.5.14 @@ -83,16 +86,19 @@ importers: version: 4.13.4 '@types/node': specifier: ^20.17.6 - version: 20.19.1 + version: 20.19.9 jest: specifier: ^29.4.0 - version: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + version: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) mock-fs: specifier: ^5.5.0 version: 5.5.0 ts-jest: specifier: ^29.1.0 - version: 29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.2)(@jest/types@30.0.1)(babel-jest@29.7.0(@babel/core@7.27.4))(jest-util@30.0.2)(jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.1(@babel/core@7.28.0)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.0))(jest-util@30.0.5)(jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)))(typescript@5.8.3) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) tsc-multi: specifier: https://github.com/stainless-api/tsc-multi/releases/download/v1.1.8/tsc-multi.tgz version: https://github.com/stainless-api/tsc-multi/releases/download/v1.1.8/tsc-multi.tgz(typescript@5.8.3) @@ -110,22 +116,26 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -152,12 +162,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.2': + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true @@ -252,20 +262,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -387,10 +397,18 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@inquirer/figures@1.0.12': - resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -424,32 +442,32 @@ packages: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/environment@30.0.2': - resolution: {integrity: sha512-hRLhZRJNxBiOhxIKSq2UkrlhMt3/zVFQOAi5lvS8T9I03+kxsbflwHJEF+eXEYXCrRGRhHwECT7CDk6DyngsRA==} + '@jest/environment@30.0.5': + resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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-utils@30.0.2': - resolution: {integrity: sha512-FHF2YdtFBUQOo0/qdgt+6UdBFcNPF/TkVzcc+4vvf8uaBzUlONytGBeeudufIHHW1khRfM1sBbRT1VCK7n/0dQ==} + '@jest/expect-utils@30.0.5': + resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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/expect@30.0.2': - resolution: {integrity: sha512-blWRFPjv2cVfh42nLG6L3xIEbw+bnuiZYZDl/BZlsNG/i3wKV6FpPZ2EPHguk7t5QpLaouIu+7JmYO4uBR6AOg==} + '@jest/expect@30.0.5': + resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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/fake-timers@30.0.2': - resolution: {integrity: sha512-jfx0Xg7l0gmphTY9UKm5RtH12BlLYj/2Plj6wXjVW5Era4FZKfXeIvwC67WX+4q8UCFxYS20IgnMcFBcEU0DtA==} + '@jest/fake-timers@30.0.5': + resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.0.1': @@ -460,8 +478,8 @@ packages: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/globals@30.0.2': - resolution: {integrity: sha512-DwTtus9jjbG7b6jUdkcVdptf0wtD1v153A+PVwWB/zFwXhqu6hhtSd+uq88jofMhmYPtkmPmVGUBRNCZEKXn+w==} + '@jest/globals@30.0.5': + resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': @@ -481,12 +499,12 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@30.0.1': - resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.0.1': - resolution: {integrity: sha512-6Dpv7vdtoRiISEFwYF8/c7LIvqXD7xDXtLPNzC2xqAfBznKip0MQM+rkseKwUPUpv2PJ7KW/YsnwWXrIL2xF+A==} + '@jest/snapshot-utils@30.0.5': + resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@29.6.3': @@ -505,38 +523,30 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@30.0.2': - resolution: {integrity: sha512-kJIuhLMTxRF7sc0gPzPtCDib/V9KwW3I2U25b+lYCYMVqHHSrcZopS8J8H+znx9yixuFv+Iozl8raLt/4MoxrA==} + '@jest/transform@30.0.5': + resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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} - '@jest/types@30.0.1': - resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} + '@jest/types@30.0.5': + resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -547,8 +557,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mixedbread/sdk@0.19.0': - resolution: {integrity: sha512-9GwTl2DcZld9QwAIsLuW0M64jeu95FBSAX28xdNcW5p/6Rj4J9c/bEJCZquKrDbIUAnAS+KM8HEKSbVE1wsUAA==} + '@mixedbread/sdk@0.19.1': + resolution: {integrity: sha512-vbpG07n74pct0U2LStKur7pZ4Ct9Wtzz3HZmNKgv+NWSj1qDpXjV7LW5eh4YT17JNQS1zSqi0xNgEPe6rPwksA==} hasBin: true '@nodelib/fs.scandir@2.1.5': @@ -567,8 +577,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@pnpm/tabtab@0.5.4': @@ -578,8 +588,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.34.37': - resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} + '@sinclair/typebox@0.34.38': + resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -611,14 +621,14 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/inquirer@9.0.8': - resolution: {integrity: sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==} + '@types/inquirer@9.0.9': + resolution: {integrity: sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -644,11 +654,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.1': - resolution: {integrity: sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==} - - '@types/node@24.0.4': - resolution: {integrity: sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==} + '@types/node@20.19.9': + resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -720,9 +727,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -741,10 +745,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -768,15 +772,15 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -805,15 +809,15 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001724: - resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + caniuse-lite@1.0.30001733: + resolution: {integrity: sha512-e4QKw/O2Kavj2VQTKZWrwzkt3IxOmIlU6ajRb6LP64LHpBo1J67k2Hi4Vu/TgJWsNtynurfS0uK3MaUTCPfu5Q==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + chalk@5.5.0: + resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: @@ -827,8 +831,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} cjs-module-lexer@1.4.3: @@ -946,20 +950,15 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.171: - resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} + electron-to-chromium@1.5.199: + resolution: {integrity: sha512-3gl0S7zQd88kCAZRO/DnxtBKuhMO4h0EaQIN3YgZfV6+pW+5+bf2AdQeHNESCoaQqo/gjGVYEf2YM4O5HJQqpQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1006,8 +1005,8 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - expect@30.0.2: - resolution: {integrity: sha512-YN9Mgv2mtTWXVmifQq3QT+ixCL/uLuLJw+fdp8MOjKqu8K3XQh3o5aulMM1tn+O2DdrWNxLZTeJsCY/VofUA0A==} + expect@30.0.5: + resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} extendable-error@0.1.7: @@ -1030,9 +1029,6 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1100,10 +1096,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1111,6 +1103,11 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1254,11 +1251,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1293,8 +1285,8 @@ packages: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-diff@30.0.2: - resolution: {integrity: sha512-2UjrNvDJDn/oHFpPrUTVmvYYDNeNtw2DlY3er8bI6vJJb9Fb35ycp/jFLd5RdV59tJ8ekVXX3o/nwPcscgXZJQ==} + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@29.7.0: @@ -1317,8 +1309,8 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.0.2: - resolution: {integrity: sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ==} + jest-haste-map@30.0.5: + resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-leak-detector@29.7.0: @@ -1329,24 +1321,24 @@ packages: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@30.0.2: - resolution: {integrity: sha512-1FKwgJYECR8IT93KMKmjKHSLyru0DqguThov/aWpFccC0wbiXGOxYEu7SScderBD7ruDOpl7lc5NG6w3oxKfaA==} + jest-matcher-utils@30.0.5: + resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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-message-util@30.0.2: - resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} + jest-message-util@30.0.5: + resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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-mock@30.0.2: - resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} + jest-mock@30.0.5: + resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-pnp-resolver@1.2.3: @@ -1386,16 +1378,16 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-snapshot@30.0.2: - resolution: {integrity: sha512-KeoHikoKGln3OlN7NS7raJ244nIVr2K46fBTNdfuxqYv2/g4TVyWDSO4fmk08YBJQMjs3HNfG1rlLfL/KA+nUw==} + jest-snapshot@30.0.5: + resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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-util@30.0.2: - resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} + jest-util@30.0.5: + resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-validate@29.7.0: @@ -1410,8 +1402,8 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@30.0.2: - resolution: {integrity: sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg==} + jest-worker@30.0.5: + resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest@29.7.0: @@ -1519,13 +1511,13 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1555,6 +1547,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -1671,8 +1666,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pify@4.0.1: @@ -1696,8 +1691,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@30.0.2: - resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} prompts@2.4.2: @@ -1887,8 +1882,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} term-size@2.2.1: @@ -1910,8 +1905,8 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-jest@29.4.0: - resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + ts-jest@29.4.1: + resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1962,38 +1957,38 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.4: - resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} + turbo-darwin-64@2.5.5: + resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.4: - resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} + turbo-darwin-arm64@2.5.5: + resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.4: - resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} + turbo-linux-64@2.5.5: + resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.4: - resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} + turbo-linux-arm64@2.5.5: + resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.4: - resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} + turbo-windows-64@2.5.5: + resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.4: - resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} + turbo-windows-arm64@2.5.5: + resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==} cpu: [arm64] os: [win32] - turbo@2.5.4: - resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} + turbo@2.5.5: + resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} hasBin: true type-detect@4.0.8: @@ -2011,18 +2006,21 @@ packages: typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} + hasBin: true typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2058,6 +2056,9 @@ packages: engines: {node: '>= 8'} hasBin: true + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -2088,8 +2089,8 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -2117,15 +2118,15 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zod@3.25.67: - resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@babel/code-frame@7.27.1': dependencies: @@ -2133,20 +2134,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.27.4': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.28.2 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -2155,35 +2156,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': + '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-globals@7.28.0': {} + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -2195,121 +2198,121 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.2': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 - '@babel/parser@7.27.5': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.2': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 - '@babel/traverse@7.27.4': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 debug: 4.4.1 - globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.6': + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -2499,9 +2502,14 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - optional: true - '@inquirer/figures@1.0.12': {} + '@inquirer/figures@1.0.13': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: @@ -2525,27 +2533,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 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@20.19.1)(typescript@5.8.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))': 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.0.4 + '@types/node': 20.19.9 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.0.4)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2572,21 +2580,21 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-mock: 29.7.0 - '@jest/environment@30.0.2': + '@jest/environment@30.0.5': dependencies: - '@jest/fake-timers': 30.0.2 - '@jest/types': 30.0.1 - '@types/node': 24.0.4 - jest-mock: 30.0.2 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.19.9 + jest-mock: 30.0.5 '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - '@jest/expect-utils@30.0.2': + '@jest/expect-utils@30.0.5': dependencies: '@jest/get-type': 30.0.1 @@ -2597,10 +2605,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/expect@30.0.2': + '@jest/expect@30.0.5': dependencies: - expect: 30.0.2 - jest-snapshot: 30.0.2 + expect: 30.0.5 + jest-snapshot: 30.0.5 transitivePeerDependencies: - supports-color @@ -2608,19 +2616,19 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/fake-timers@30.0.2': + '@jest/fake-timers@30.0.5': dependencies: - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.0.4 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 - jest-util: 30.0.2 + '@types/node': 20.19.9 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 '@jest/get-type@30.0.1': {} @@ -2633,18 +2641,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/globals@30.0.2': + '@jest/globals@30.0.5': dependencies: - '@jest/environment': 30.0.2 - '@jest/expect': 30.0.2 - '@jest/types': 30.0.1 - jest-mock: 30.0.2 + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/types': 30.0.5 + jest-mock: 30.0.5 transitivePeerDependencies: - supports-color '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-regex-util: 30.0.1 '@jest/reporters@29.7.0': @@ -2654,8 +2662,8 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 24.0.4 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 20.19.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -2680,20 +2688,20 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jest/schemas@30.0.1': + '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.37 + '@sinclair/typebox': 0.34.38 - '@jest/snapshot-utils@30.0.1': + '@jest/snapshot-utils@30.0.5': dependencies: - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -2713,9 +2721,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -2731,19 +2739,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/transform@30.0.2': + '@jest/transform@30.0.5': dependencies: - '@babel/core': 7.27.4 - '@jest/types': 30.0.1 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/core': 7.28.0 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 7.0.0 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: 30.0.2 + jest-haste-map: 30.0.5 jest-regex-util: 30.0.1 - jest-util: 30.0.2 + jest-util: 30.0.5 micromatch: 4.0.8 pirates: 4.0.7 slash: 3.0.0 @@ -2756,63 +2764,56 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.0.4 + '@types/node': 20.19.9 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jest/types@30.0.1': + '@jest/types@30.0.5': dependencies: '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.0.4 + '@types/node': 20.19.9 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.4': - optional: true - - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 - optional: true '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@mixedbread/sdk@0.19.0': {} + '@mixedbread/sdk@0.19.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2829,7 +2830,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.9': {} '@pnpm/tabtab@0.5.4': dependencies: @@ -2842,7 +2843,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.34.37': {} + '@sinclair/typebox@0.34.38': {} '@sinonjs/commons@3.0.1': dependencies: @@ -2856,44 +2857,40 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@tsconfig/node10@1.0.11': - optional: true + '@tsconfig/node10@1.0.11': {} - '@tsconfig/node12@1.0.11': - optional: true + '@tsconfig/node12@1.0.11': {} - '@tsconfig/node14@1.0.3': - optional: true + '@tsconfig/node14@1.0.3': {} - '@tsconfig/node16@1.0.4': - optional: true + '@tsconfig/node16@1.0.4': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 - '@types/inquirer@9.0.8': + '@types/inquirer@9.0.9': dependencies: '@types/through': 0.0.33 rxjs: 7.8.2 @@ -2919,23 +2916,19 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 '@types/node@12.20.55': {} - '@types/node@20.19.1': + '@types/node@20.19.9': dependencies: undici-types: 6.21.0 - '@types/node@24.0.4': - dependencies: - undici-types: 7.8.0 - '@types/stack-utils@2.0.3': {} '@types/through@0.0.33': dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 '@types/yargs-parser@21.0.3': {} @@ -2948,10 +2941,8 @@ snapshots: acorn-walk@8.3.4: dependencies: acorn: 8.15.0 - optional: true - acorn@8.15.0: - optional: true + acorn@8.15.0: {} aggregate-error@3.1.0: dependencies: @@ -2981,8 +2972,7 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: - optional: true + arg@4.1.3: {} argparse@1.0.10: dependencies: @@ -2990,15 +2980,13 @@ snapshots: array-union@2.1.0: {} - async@3.2.6: {} - - babel-jest@29.7.0(@babel/core@7.27.4): + babel-jest@29.7.0(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@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.27.4) + babel-preset-jest: 29.6.3(@babel/core@7.28.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3028,34 +3016,34 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - - babel-preset-jest@29.6.3(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 + '@types/babel__traverse': 7.28.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + + babel-preset-jest@29.6.3(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) balanced-match@1.0.2: {} @@ -3076,7 +3064,7 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3084,12 +3072,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.0: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001724 - electron-to-chromium: 1.5.171 + caniuse-lite: 1.0.30001733 + electron-to-chromium: 1.5.199 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs-logger@0.2.6: dependencies: @@ -3112,14 +3100,14 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001724: {} + caniuse-lite@1.0.30001733: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} + chalk@5.5.0: {} char-regex@1.0.2: {} @@ -3127,7 +3115,7 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.2.0: {} + ci-info@4.3.0: {} cjs-module-lexer@1.4.3: {} @@ -3175,13 +3163,13 @@ snapshots: convert-source-map@2.0.0: {} - create-jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): 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@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3190,8 +3178,7 @@ snapshots: - supports-color - ts-node - create-require@1.1.1: - optional: true + create-require@1.1.1: {} cross-spawn@7.0.6: dependencies: @@ -3217,22 +3204,17 @@ snapshots: diff-sequences@29.6.3: {} - diff@4.0.2: - optional: true + diff@4.0.2: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dotenv@16.5.0: {} + dotenv@16.6.1: {} eastasianwidth@0.2.0: {} - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.171: {} + electron-to-chromium@1.5.199: {} emittery@0.13.1: {} @@ -3279,14 +3261,14 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expect@30.0.2: + expect@30.0.5: dependencies: - '@jest/expect-utils': 30.0.2 + '@jest/expect-utils': 30.0.5 '@jest/get-type': 30.0.1 - jest-matcher-utils: 30.0.2 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 - jest-util: 30.0.2 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 extendable-error@0.1.7: {} @@ -3314,10 +3296,6 @@ snapshots: dependencies: bser: 2.1.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3385,8 +3363,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: {} - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3398,6 +3374,15 @@ snapshots: graceful-fs@4.2.11: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} hasown@2.0.2: @@ -3436,7 +3421,7 @@ snapshots: inquirer@9.3.7: dependencies: - '@inquirer/figures': 1.0.12 + '@inquirer/figures': 1.0.13 ansi-escapes: 4.3.2 cli-width: 4.1.0 external-editor: 3.1.0 @@ -3491,8 +3476,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -3501,8 +3486,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -3534,13 +3519,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -3553,7 +3531,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -3573,16 +3551,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3592,12 +3570,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.4) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3617,39 +3595,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.1 - ts-node: 10.9.2(@types/node@20.19.1)(typescript@5.8.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@24.0.4)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)): - dependencies: - '@babel/core': 7.27.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.4) - 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.0.4 - ts-node: 10.9.2(@types/node@20.19.1)(typescript@5.8.3) + '@types/node': 20.19.9 + ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -3661,12 +3608,12 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-diff@30.0.2: + jest-diff@30.0.5: dependencies: '@jest/diff-sequences': 30.0.1 '@jest/get-type': 30.0.1 chalk: 4.1.2 - pretty-format: 30.0.2 + pretty-format: 30.0.5 jest-docblock@29.7.0: dependencies: @@ -3685,7 +3632,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -3695,7 +3642,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.0.4 + '@types/node': 20.19.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -3707,16 +3654,16 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-haste-map@30.0.2: + jest-haste-map@30.0.5: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.4 + '@jest/types': 30.0.5 + '@types/node': 20.19.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 30.0.1 - jest-util: 30.0.2 - jest-worker: 30.0.2 + jest-util: 30.0.5 + jest-worker: 30.0.5 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: @@ -3734,12 +3681,12 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@30.0.2: + jest-matcher-utils@30.0.5: dependencies: '@jest/get-type': 30.0.1 chalk: 4.1.2 - jest-diff: 30.0.2 - pretty-format: 30.0.2 + jest-diff: 30.0.5 + pretty-format: 30.0.5 jest-message-util@29.7.0: dependencies: @@ -3753,29 +3700,29 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.0.2: + jest-message-util@30.0.5: dependencies: '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 30.0.2 + pretty-format: 30.0.5 slash: 3.0.0 stack-utils: 2.0.6 jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-util: 29.7.0 - jest-mock@30.0.2: + jest-mock@30.0.5: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.4 - jest-util: 30.0.2 + '@jest/types': 30.0.5 + '@types/node': 20.19.9 + jest-util: 30.0.5 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: @@ -3811,7 +3758,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -3839,7 +3786,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -3859,15 +3806,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@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.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -3882,49 +3829,49 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@30.0.2: + jest-snapshot@30.0.5: dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 - '@jest/expect-utils': 30.0.2 + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.2 + '@jest/expect-utils': 30.0.5 '@jest/get-type': 30.0.1 - '@jest/snapshot-utils': 30.0.1 - '@jest/transform': 30.0.2 - '@jest/types': 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + '@jest/snapshot-utils': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) chalk: 4.1.2 - expect: 30.0.2 + expect: 30.0.5 graceful-fs: 4.2.11 - jest-diff: 30.0.2 - jest-matcher-utils: 30.0.2 - jest-message-util: 30.0.2 - jest-util: 30.0.2 - pretty-format: 30.0.2 + jest-diff: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + pretty-format: 30.0.5 semver: 7.7.2 - synckit: 0.11.8 + synckit: 0.11.11 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@30.0.2: + jest-util@30.0.5: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.4 + '@jest/types': 30.0.5 + '@types/node': 20.19.9 chalk: 4.1.2 - ci-info: 4.2.0 + ci-info: 4.3.0 graceful-fs: 4.2.11 - picomatch: 4.0.2 + picomatch: 4.0.3 jest-validate@29.7.0: dependencies: @@ -3939,7 +3886,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.4 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -3948,25 +3895,25 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.0.2: + jest-worker@30.0.5: dependencies: - '@types/node': 24.0.4 + '@types/node': 20.19.9 '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.2 + jest-util: 30.0.5 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)): + jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4011,7 +3958,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 is-unicode-supported: 1.3.0 lru-cache@10.4.3: {} @@ -4049,17 +3996,17 @@ snapshots: mimic-function@5.0.1: {} - minimatch@3.1.2: + minimatch@10.0.3: dependencies: - brace-expansion: 1.1.12 + '@isaacs/brace-expansion': 5.0.0 - minimatch@5.1.6: + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -4075,6 +4022,8 @@ snapshots: natural-compare@1.4.0: {} + neo-async@2.6.2: {} + node-int64@0.4.0: {} node-releases@2.0.19: {} @@ -4111,7 +4060,7 @@ snapshots: ora@8.2.0: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -4189,7 +4138,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pify@4.0.1: {} @@ -4207,9 +4156,9 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-format@30.0.2: + pretty-format@30.0.5: dependencies: - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 @@ -4378,9 +4327,9 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.8: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.7 + '@pkgr/core': 0.2.9 term-size@2.2.1: {} @@ -4400,12 +4349,12 @@ snapshots: dependencies: is-number: 7.0.0 - ts-jest@29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.2)(@jest/types@30.0.1)(babel-jest@29.7.0(@babel/core@7.27.4))(jest-util@30.0.2)(jest@29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.1(@babel/core@7.28.0)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.0))(jest-util@30.0.5)(jest@29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 - ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3)) + handlebars: 4.7.8 + jest: 29.7.0(@types/node@20.19.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -4414,20 +4363,20 @@ snapshots: typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.27.4 - '@jest/transform': 30.0.2 - '@jest/types': 30.0.1 - babel-jest: 29.7.0(@babel/core@7.27.4) - jest-util: 30.0.2 + '@babel/core': 7.28.0 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 29.7.0(@babel/core@7.28.0) + jest-util: 30.0.5 - ts-node@10.9.2(@types/node@20.19.1)(typescript@5.8.3): + ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.1 + '@types/node': 20.19.9 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -4437,7 +4386,6 @@ snapshots: typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true tsc-multi@https://github.com/stainless-api/tsc-multi/releases/download/v1.1.8/tsc-multi.tgz(typescript@5.8.3): dependencies: @@ -4457,32 +4405,32 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.5.4: + turbo-darwin-64@2.5.5: optional: true - turbo-darwin-arm64@2.5.4: + turbo-darwin-arm64@2.5.5: optional: true - turbo-linux-64@2.5.4: + turbo-linux-64@2.5.5: optional: true - turbo-linux-arm64@2.5.4: + turbo-linux-arm64@2.5.5: optional: true - turbo-windows-64@2.5.4: + turbo-windows-64@2.5.5: optional: true - turbo-windows-arm64@2.5.4: + turbo-windows-arm64@2.5.5: optional: true - turbo@2.5.4: + turbo@2.5.5: optionalDependencies: - turbo-darwin-64: 2.5.4 - turbo-darwin-arm64: 2.5.4 - turbo-linux-64: 2.5.4 - turbo-linux-arm64: 2.5.4 - turbo-windows-64: 2.5.4 - turbo-windows-arm64: 2.5.4 + turbo-darwin-64: 2.5.5 + turbo-darwin-arm64: 2.5.5 + turbo-linux-64: 2.5.5 + turbo-linux-arm64: 2.5.5 + turbo-windows-64: 2.5.5 + turbo-windows-arm64: 2.5.5 type-detect@4.0.8: {} @@ -4494,28 +4442,28 @@ snapshots: typescript@5.8.3: {} - undici-types@6.21.0: {} + uglify-js@3.19.3: + optional: true - undici-types@7.8.0: {} + undici-types@6.21.0: {} universalify@0.1.2: {} untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 util-deprecate@1.0.2: {} - v8-compile-cache-lib@3.0.1: - optional: true + v8-compile-cache-lib@3.0.1: {} v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -4531,6 +4479,8 @@ snapshots: dependencies: isexe: 2.0.0 + wordwrap@1.0.0: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -4565,7 +4515,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -4579,8 +4529,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yn@3.1.1: - optional: true + yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -4588,4 +4537,4 @@ snapshots: yoctocolors-cjs@2.1.2: {} - zod@3.25.67: {} + zod@3.25.76: {}