From 4b258c77d46ce68ec0592575af209b6161ec3549 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Fri, 8 Nov 2024 10:45:28 +0100 Subject: [PATCH 01/21] fix: Prepare for release --- README.md | 174 ++++++------- eslint.config.mjs | 26 +- package.json | 9 +- src/chatGPT.ts | 233 +++--------------- src/cli.ts | 224 +---------------- src/commands/migrate/addMigrationCommand.ts | 32 +++ src/commands/migrate/migrateFiles.ts | 104 ++++++++ src/commands/status/addStatusCommand.ts | 22 ++ src/commands/upload/addUploadCommand.ts | 32 +++ src/common/checkGitClean.ts | 13 + src/migrationStatus.ts | 3 +- src/prompts/react/system.handlebars | 45 ++++ src/prompts/react/user.handlebars | 4 + src/promptsProvider.ts | 55 ++--- .../AzureResponseProvider.ts | 4 +- .../OpenAiResponseProvider.ts | 2 + src/responseProviders/getResponseProvider.ts | 2 +- src/responseProviders/responseFormat.tsx | 18 ++ src/saveAllKeys.ts | 18 +- src/test_files/test_file1.tsx | 109 -------- src/uploadKeysToTolgee.ts | 8 +- testsGpt/exampleFiles/simple.tsx.txt | 3 + testsGpt/exampleFiles/useTranslate.tsx.txt | 3 + testsGpt/gptResponses.test.ts | 40 +++ tsconfig.json | 10 +- 25 files changed, 507 insertions(+), 686 deletions(-) create mode 100644 src/commands/migrate/addMigrationCommand.ts create mode 100644 src/commands/migrate/migrateFiles.ts create mode 100644 src/commands/status/addStatusCommand.ts create mode 100644 src/commands/upload/addUploadCommand.ts create mode 100644 src/common/checkGitClean.ts create mode 100644 src/prompts/react/system.handlebars create mode 100644 src/prompts/react/user.handlebars create mode 100644 src/responseProviders/responseFormat.tsx delete mode 100644 src/test_files/test_file1.tsx create mode 100644 testsGpt/exampleFiles/simple.tsx.txt create mode 100644 testsGpt/exampleFiles/useTranslate.tsx.txt create mode 100644 testsGpt/gptResponses.test.ts diff --git a/README.md b/README.md index 50351b5..2157e09 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # AI Migration Tool -*Disclaimer: This tool is not released yet! It's in PoC state. Use at your own risk.* +_Disclaimer: This tool is not released yet! It's in PoC state. Use at your own risk._ This tool automates the process of migrating string literals in TypeScript and TSX files to localized keys using ChatGPT, compatible with both Azure OpenAI and OpenAI setups, and Tolgee. It tracks the migration status of each file, preventing duplicate processing, and uploads localization keys to Tolgee for translation management. @@ -21,12 +21,12 @@ localization keys to Tolgee for translation management. - [Installation](#installation) - [Environment Variables](#environment-variables) - [Usage](#usage) - - [CLI Commands](#cli-commands) + - [CLI Commands](#cli-commands) - [Modules](#modules) - - [File Finder](#1-file-finder-findfilests) - - [Migration Status](#2-migration-status-migrationStatusts) - - [ChatGPT Localization](#3-chatgpt-localization-chatgptts) - - [Tolgee Integration](#4-tolgee-integration-tolgeets) + - [File Finder](#1-file-finder-findfilests) + - [Migration Status](#2-migration-status-migrationStatusts) + - [ChatGPT Localization](#3-chatgpt-localization-chatgptts) + - [Tolgee Integration](#4-tolgee-integration-tolgeets) - [Testing](#testing) - [Error Handling](#error-handling) - [Conclusion](#conclusion) @@ -36,6 +36,7 @@ localization keys to Tolgee for translation management. ### Installation #### Option 1: Run Directly with `npx` + If you prefer not to install the tool globally, you can run it directly using `npx`: ```bash @@ -45,42 +46,42 @@ npx cli migrate [options] #### Option 2: Clone and Install Locally 1. **Clone the repository:** - + ```bash git clone https://github.com/tolgee/ai-migrator cd ai-migrator ``` - + 2. **Install the dependencies:** ```bash npm install ``` - + 3. **Set up environment variables:** Create a `.env` file in the root of the project and add your Azure OpenAI API key, endpoint, and deployment details. If you're using OpenAI directly instead of Azure, include the OpenAI API key and endpoint as well: - ```bash - # Azure OpenAI setup (if using Azure) - AZURE_OPENAI_API_KEY=your-azure-openai-api-key-here - AZURE_OPENAI_ENDPOINT=https://your-azure-endpoint-url - AZURE_OPENAI_DEPLOYMENT=gpt-4o - - # OpenAI setup (if using OpenAI directly) - OPENAI_API_KEY=your-openai-api-key-here - OPENAI_ENDPOINT=https://api.openai.com/v1/chat/completions - ``` - + ```bash + # Azure OpenAI setup (if using Azure) + AZURE_OPENAI_API_KEY=your-azure-openai-api-key-here + AZURE_OPENAI_ENDPOINT=https://your-azure-endpoint-url + AZURE_OPENAI_DEPLOYMENT=gpt-4o + + # OpenAI setup (if using OpenAI directly) + OPENAI_API_KEY=your-openai-api-key-here + OPENAI_ENDPOINT=https://api.openai.com/v1/chat/completions + ``` + 4. **Build the project:** This project is written in TypeScript, so you need to compile it to JavaScript before running the commands: - ```bash - npm run build - ``` + ```bash + npm run build + ``` 5. **Rebuild after changes:** Whenever you make changes to the TypeScript files, you need to rebuild the project by running: - ```bash - npm run build - ``` + ```bash + npm run build + ``` 6. **Run the tool:** After building the project, you can use the CLI as described in the [Usage](#usage) section.
@@ -90,12 +91,14 @@ npx cli migrate [options] For this tool, you can configure either Azure OpenAI or OpenAI directly. Set the appropriate environment variables based on the setup you're using. **For Azure OpenAI:** + - **AZURE_OPENAI_API_KEY:** The API key for OpenAI, required for interacting with the ChatGPT API. - **AZURE_OPENAI_ENDPOINT:** The endpoint URL for your Azure OpenAI instance, used to send API requests to Azure OpenAI. - **AZURE_OPENAI_DEPLOYMENT:** The name of the OpenAI model deployment in Azure, used to specify which model (e.g., gpt-4o) is being used. **For OpenAI:** + - **OPENAI_API_KEY:** The API key for OpenAI, required for accessing OpenAI’s ChatGPT API. - **OPENAI_ENDPOINT:** The endpoint URL for OpenAI, typically https://api.openai.com/v1/chat/completions. @@ -115,9 +118,9 @@ string literals with Tolgee’s `` component or `useTranslate` hook, and gene **Process Overview:** - 1. The project files are overwritten with new components. - 2. An `allKeys.json` file is generated and stored in the root of the project, containing the keys for localization. - 3. Users can then manually review or modify both the project files and the `allKeys.json` file. +1. The project files are overwritten with new components. +2. An `allKeys.json` file is generated and stored in the root of the project, containing the keys for localization. +3. Users can then manually review or modify both the project files and the `allKeys.json` file. **Usage** @@ -129,27 +132,27 @@ cli migrate [options] - `-p, --pattern `: Defines the file pattern to search for files to process. The default pattern is `src/**/*.tsx`. - - Example: + - Example: - ```bash - cli migrate --pattern "src/test_files/**/*.tsx" - ``` + ```bash + cli migrate --pattern "src/test_files/**/*.tsx" + ``` - `-u, --upload`: Automatically uploads the created localization keys to Tolgee. If this option is **not** provided, you can upload the keys manually in a separate step using the `upload-keys` command. - - Example: + - Example: - ```bash - cli migrate --upload - ``` + ```bash + cli migrate --upload + ``` - `-a, --appendixPath `: Specifies the path to a file containing custom instructions (prompt appendix) for ChatGPT. This allows you to provide additional context or guidelines for the migration process. - - Example: + - Example: - ```bash - cli migrate --appendixPath "./path/to/instructions.txt" - ``` + ```bash + cli migrate --appendixPath "./path/to/instructions.txt" + ``` **Examples:** @@ -170,13 +173,13 @@ cli migrate [options] ```bash cli migrate --appendixPath "./path/to/instructions.txt" ``` - + - Run the migration with a specific file pattern, automatically upload the keys, and use a custom prompt appendix: ```bash cli migrate --pattern "src/test_files/**/*.tsx" --upload --appendixPath "./path/to/instructions.txt" ``` - +
**Command:** `upload-keys` @@ -185,8 +188,8 @@ The `upload-keys` command allows you to upload the localization keys that were g **Process Overview:** - 1. Users **review and modify** the `allKeys.json` file and project files. - 2. Once ready, run the upload-keys` command to upload the finalized localization strings to the Tolgee platform. +1. Users **review and modify** the `allKeys.json` file and project files. +2. Once ready, run the upload-keys` command to upload the finalized localization strings to the Tolgee platform. **Usage** @@ -218,19 +221,19 @@ cli status [file] [options] - `[file]`: Specify a file path to check the migration status for that particular file. - - Example: + - Example: - ```bash - cli status src/test_files/App.tsx - ``` + ```bash + cli status src/test_files/App.tsx + ``` - `--all`: Show the entire migration status for all processed files. - - Example: + - Example: - ```bash - cli status --all - ``` + ```bash + cli status --all + ``` **Examples:** @@ -272,19 +275,19 @@ cli migrate ### Complete Workflow Example - 1. **Step 1:** Run the migration to process the files and generate `allKeys.json`. - - ```bash - cli migrate --pattern "src/test_files/**/*.tsx" - ``` +1. **Step 1:** Run the migration to process the files and generate `allKeys.json`. - 2. **Step 2:** Open the project files and `allKeys.json`, review and make any necessary updates or changes. + ```bash + cli migrate --pattern "src/test_files/**/*.tsx" + ``` - 3. **Step 3:** Once satisfied with the changes, upload the keys to the Tolgee platform: +2. **Step 2:** Open the project files and `allKeys.json`, review and make any necessary updates or changes. - ```bash - cli upload-keys - ``` +3. **Step 3:** Once satisfied with the changes, upload the keys to the Tolgee platform: + + ```bash + cli upload-keys + ```
@@ -298,10 +301,10 @@ returns a list of file paths that match the pattern. #### Example Usage: ```ts -import {findFiles} from './findFiles'; +import { findFiles } from "./findFiles"; -const files = await findFiles('src/**/*.tsx'); -console.log('Files found:', files); +const files = await findFiles("src/**/*.tsx"); +console.log("Files found:", files); ``` ### 2. Migration Status (`migrationStatus.ts`) @@ -317,17 +320,21 @@ status is used to track which files have already been processed, ensuring that e #### Example Usage: ```ts -import {loadMigrationStatus, updateMigrationStatus, checkMigrationStatus} from './migrationStatus'; +import { + loadMigrationStatus, + updateMigrationStatus, + checkMigrationStatus, +} from "./migrationStatus"; // Load the migration status const status = await loadMigrationStatus(); -console.log('Migration Status:', status); +console.log("Migration Status:", status); // After processing a file, update the status -await updateMigrationStatus('src/test_files/App.tsx', ['keyName1', 'keyName2']); +await updateMigrationStatus("src/test_files/App.tsx", ["keyName1", "keyName2"]); // Check the status of a specific file -await checkMigrationStatus('src/test_files/App.tsx'); +await checkMigrationStatus("src/test_files/App.tsx"); // Show the entire status await checkMigrationStatus("", true); @@ -342,13 +349,13 @@ function returns the updated file content and the list of created localization k #### Example Usage: ```ts -import {sendFileToChatGPT} from './chatGPT'; +import { sendFileToChatGPT } from "./chatGPT"; -const result = await sendFileToChatGPT('src/test_files/App.tsx'); -const {updatedContent, createdKeys} = result; +const result = await sendFileToChatGPT("src/test_files/App.tsx"); +const { updatedContent, createdKeys } = result; -console.log('Updated Content:', updatedContent); -console.log('Created Keys:', createdKeys); +console.log("Updated Content:", updatedContent); +console.log("Created Keys:", createdKeys); ``` #### Extracting Keys @@ -367,21 +374,21 @@ This module is responsible for uploading the keys from the `allKeys.json` file t #### Example Usage: ```ts -import { uploadKeysToTolgee } from './uploadKeysToTolgee'; +import { uploadKeysToTolgee } from "./uploadKeysToTolgee"; const keys = [ - { - keyName: 'menu.item.translation', - description: 'Menu item translation', - translations: { en: 'Translation' }, - }, + { + keyName: "menu.item.translation", + description: "Menu item translation", + translations: { en: "Translation" }, + }, ]; const result = await uploadKeysToTolgee(keys); if (result.success) { - console.log(result.message); // Logs: Keys uploaded successfully + console.log(result.message); // Logs: Keys uploaded successfully } else { - console.error(result.message); // Logs error message if upload fails + console.error(result.message); // Logs error message if upload fails } ``` @@ -400,6 +407,7 @@ npm test ``` You can also run specific test files: + ``` npm test tests/migrationStatus.test.ts ``` diff --git a/eslint.config.mjs b/eslint.config.mjs index 68a7586..5294757 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,17 +5,17 @@ import prettierConfig from "eslint-config-prettier"; import prettierPlugin from "eslint-plugin-prettier"; export default [ - {files: ["**/*.{js,mjs,cjs,ts}"]}, - {files: ["**/*.js"], languageOptions: {sourceType: "commonjs"}}, - {languageOptions: {globals: globals.browser}}, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, + { files: ["**/*.{js,mjs,cjs,ts}"] }, + { files: ["**/*.js"], languageOptions: { sourceType: "commonjs" } }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, - prettierConfig, - { - plugins: {prettier: prettierPlugin}, - rules: { - "prettier/prettier": "error", - }, - } -]; \ No newline at end of file + prettierConfig, + { + plugins: { prettier: prettierPlugin }, + rules: { + "prettier/prettier": "error", + }, + }, +]; diff --git a/package.json b/package.json index 8e6ddf1..4d6bb47 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "description": "AI migration tool for Tolgee", "main": "./src/cli.js", "bin": { - "cli": "./dist/src/cli.js" + "tolgee-migrator": "./dist/src/cli.js" }, "scripts": { "build": "tsc", "test": "jest", - "cli": "tsx src/cli.ts" + "cli": "tsx src/cli.ts", + "prettier": "prettier --write ." }, "keywords": [], "author": "", @@ -25,9 +26,11 @@ "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "glob": "^11.0.0", + "handlebars": "^4.7.8", "inquirer": "^12.0.0", + "openai": "^4.68.1", "tsx": "^4.19.1", - "openai": "^4.68.1" + "zod": "^3.23.8" }, "devDependencies": { "@babel/preset-typescript": "^7.25.7", diff --git a/src/chatGPT.ts b/src/chatGPT.ts index 530c0e7..5aaf521 100755 --- a/src/chatGPT.ts +++ b/src/chatGPT.ts @@ -1,20 +1,19 @@ import fsExtra from "fs-extra"; import { extractCreatedKeys } from "./keyExtractor"; import { getOpenAiResponse } from "./getOpenAiResponse"; +import { ChatGptResponse } from "./responseProviders/responseFormat"; const { promises: fs } = fsExtra; -export const FILE_CONTENTS_KEYWORD = "T components"; -export const KEYS_KEYWORD = "KEYS"; -// Define a type for the ChatGPT response structure -interface ChatGPTResponse { - updatedContent: string; - createdKeys: { - keyName: string; - description: string; - translations: { en: string }; - }[]; -} +// Function to send file content to ChatGPT for migration +export const sendFileToChatGPT = async ( + filePath: string, + promptAppendixPath?: string, +) => { + const fileContent = await fs.readFile(filePath, "utf-8"); + const promptAppendix = await loadPromptAppendix(promptAppendixPath); + return await requestCompleteResponse(fileContent, promptAppendix); +}; // Function to load prompt appendix from a file if path is provided async function loadPromptAppendix(filePath?: string): Promise { @@ -30,206 +29,32 @@ async function loadPromptAppendix(filePath?: string): Promise { } } -// // Helper function to check if keyListString is valid JSON -function isValidJson(keyListString: string): boolean { - const cleanedString = keyListString.replace(/\s|[\r\n]/g, ""); // Remove whitespace and newline characters - if (!cleanedString.trim()) { - return false; - } - - const openBraces = (cleanedString.match(/{/g) || []).length; - const closeBraces = (cleanedString.match(/}/g) || []).length; - - if (openBraces !== closeBraces) { - return false; - } - - try { - JSON.parse(cleanedString); - return true; - } catch { - return false; - } -} - -// Helper function to remove the redundant text -function removeCodeWrappings(responseText: string): string { - return responseText.replace(/```.*?\n([\s\S]*?)\n```/g, "$1").trim(); -} - -// Helper function to sanitize the JSON string before parsing -function sanitizeKeyListString(keyListString: string): string { - // Remove backticks, newline characters, and single-line comments (//...) - return keyListString - .replace(/```|[\r\n]/g, "") - .replace(/\/\/.*$/gm, "") - .trim(); -} - // Function to request a complete response with retries async function requestCompleteResponse( fileContent: string, promptAppendix: string, -): Promise< - { success: boolean; responseText: string; keyListString: string } | undefined -> { - const lines = fileContent.split("\n"); - const chunkSize = 20; - let completeResponse = ""; - const finalKeyEntries: Record = {}; // Accumulated keys +) { + const responseJson = await getOpenAiResponse({ + fileContent: fileContent, + promptAppendix, + }); + + if (!responseJson) { + throw new NoResponseError(); + } try { - for (let i = 0; i < lines.length; i += chunkSize) { - const chunk = lines.slice(i, i + chunkSize).join("\n"); - const responseText = await getOpenAiResponse({ - fileContent: chunk, - promptAppendix, - }); - - if (!responseText) { - console.warn("[chatGPT] No response received from OpenAI."); - return { success: false, keyListString: "", responseText: "" }; // Keep original file - } - - const cleanedResponseText = removeCodeWrappings(responseText); - console.log( - "[chatGPT] Full response with delimiters: ", - cleanedResponseText, - ); - - // Check and extract the T components section - const componentsPattern = new RegExp( - `${FILE_CONTENTS_KEYWORD}\\s*(.*?)\\s*(?=${KEYS_KEYWORD})`, - "s", - ); - const componentsMatch = componentsPattern.exec(cleanedResponseText); - if (componentsMatch) { - const extractedContent = componentsMatch[1].trim(); - if (!extractedContent) { - console.warn( - "[chatGPT] Warning: Content between delimiters is empty. Keeping original file.", - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file - } else { - completeResponse += extractedContent + "\n"; - } - } else { - console.warn( - "[chatGPT] Warning: Missing delimiter or incomplete content in response. Keeping original file.", - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file - } - - // Check and extract the KEYS section JSON content - const keysPattern = new RegExp(`${KEYS_KEYWORD}\\s*({.*?})\\s*$`, "s"); - const keysMatch = keysPattern.exec(cleanedResponseText); - if (keysMatch) { - const keyListString = sanitizeKeyListString(keysMatch[1]); - - try { - if (isValidJson(keyListString)) { - const keyEntries = JSON.parse(keyListString); - - // Append each key entry to the accumulated finalKeyEntries if valid - Object.assign(finalKeyEntries, keyEntries); - } else { - console.warn( - "[chatGPT] Warning: Key list is empty or invalid JSON. Keeping original file.", - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file - } - } catch (error) { - console.error( - "[chatGPT] Error: Failed to parse key entries. Keeping original file:", - error, - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file - } - } else { - console.warn( - "[chatGPT] Warning: KEYS section missing or incomplete. Keeping original file.", - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file - } + const response: ChatGptResponse = JSON.parse(responseJson); + return response; + } catch (e) { + if (e instanceof SyntaxError) { + console.log("[chatGPT] Error parsing response JSON:", responseJson); + responseJson } - - // Convert accumulated finalKeyEntries to JSON - const finalKeyListString = JSON.stringify(finalKeyEntries); - return { - success: true, - responseText: completeResponse, - keyListString: finalKeyListString, // Contains accumulated keys from all chunks - }; - } catch (error) { - console.error( - "[chatGPT] Error: Unexpected error in requestCompleteResponse. Keeping original file:", - error, - ); - return { success: false, keyListString: "", responseText: "" }; // Stop and keep original file } } -// Function to send file content to ChatGPT for migration -export const sendFileToChatGPT = async ( - filePath: string, - promptAppendixPath?: string, -): Promise<{ success: boolean; result: ChatGPTResponse }> => { - try { - // Read the file content from the provided file path - const fileContent = await fs.readFile(filePath, "utf-8"); - - // Load custom instructions from the prompt appendix file if path is provided - const promptAppendix = await loadPromptAppendix(promptAppendixPath); - - // Get a complete response with error handling - const response = await requestCompleteResponse(fileContent, promptAppendix); - - // Check if response is undefined or success is false - if (!response || !response.success) { - console.error( - "[chatGPT] Error: Failed to obtain a valid response from ChatGPT.", - ); - return { - success: false, - result: { updatedContent: "", createdKeys: [] }, - }; - } - - const { responseText, keyListString } = response; - - const fileContentWithComponents = responseText.trim(); - - // Parse the key list from the response - let createdKeys: { - keyName: string; - description: string; - translations: { en: string }; - }[] = []; - try { - createdKeys = extractCreatedKeys(keyListString); // Parse the list of keys - console.log("[chatGPT] Parsed created keys:", createdKeys); // Log the parsed list of keys - } catch (error) { - console.error( - "[chatGPT] Error: Failed to parse the list of keys from ChatGPT response.", - error, - ); - return { - success: false, - result: { updatedContent: "", createdKeys: [] }, - }; - } - - return { - success: true, - result: { - updatedContent: fileContentWithComponents, - createdKeys, - }, - }; - } catch (error) { - console.error( - `[chatGPT] Error: Error during ChatGPT request for ${filePath}: ${error}`, - ); - return { success: false, result: { updatedContent: "", createdKeys: [] } }; - } -}; +export class NoResponseError implements Error { + message: string = "No response from OpenAI"; + name: string = "NoResponseError"; +} diff --git a/src/cli.ts b/src/cli.ts index 378bb41..755fbe8 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,229 +1,17 @@ #!/usr/bin/env node import { Command } from "commander"; -import { findFiles } from "./findFiles"; -import { sendFileToChatGPT } from "./chatGPT"; -import { uploadKeysToTolgee } from "./uploadKeysToTolgee"; -import fsExtra from "fs-extra"; +import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; +import { addStatusCommand } from "./commands/status/addStatusCommand"; +import {addUploadCommand} from "./commands/upload/addUploadCommand"; -const { promises: fs } = fsExtra; -import { - checkMigrationStatus, - loadMigrationStatus, - updateMigrationStatus, -} from "./migrationStatus"; -import { saveKeys } from "./saveAllKeys"; -import { execSync } from "child_process"; - -type KeyObject = { - keyName: string; - description: string; - translations: { en: string }; -}; - -interface MigrationStatus { - [filePath: string]: { - migrated: boolean; - relevantKeys: string[]; - }; -} - -// Function to check if the Git working directory is clean -function checkGitClean(): boolean { - const result = execSync("git status --porcelain").toString().trim(); - if (result) { - console.error( - "[cli][checkGitClean] Migrator requires a clean git state. Please commit or stash changes before proceeding.", - ); - return false; - } - return true; -} - -// Function to process a single file -const processFile = async ( - file: string, - status: MigrationStatus, - allKeys: KeyObject[], - appendixPath?: string, -) => { - try { - const status = await loadMigrationStatus(); - - // Skip already processed files - if (status[file] && status[file].migrated) { - console.log( - `[cli][processFile] Skipping already processed file: ${file}`, - ); - return; - } - - // Send the file content to ChatGPT for localization - const { success, result } = await sendFileToChatGPT(file, appendixPath); - if (!success) { - console.error(`[cli][processFile] Migration failed for file: ${file}`); - - // Update migration status to indicate failure - await updateMigrationStatus(file, [], success); // Pass false to mark as not migrated - return; // Exit without saving file or updating migration status - } - - const { updatedContent, createdKeys } = result; - - // Overwrite the original file - await fs.writeFile(file, updatedContent, "utf8"); - console.log( - `[cli][processFile] File ${file} has been updated successfully.`, - ); - - // Get the relevant key names - const relevantKeys = createdKeys.map((key) => key.keyName); - - // Add created keys to the list for uploading to Tolgee - allKeys.push(...createdKeys); - - // Mark the file as processed and include relevant keys - await updateMigrationStatus(file, relevantKeys, success); - - // Save keys to file - await saveKeys(file, allKeys); - - console.log( - `[cli][processFile] Successfully processed and updated file: ${file}`, - ); - } catch (error) { - console.error(`[cli][processFile] Error processing file ${file}:`, error); - } -}; - -// Main function to handle file migration interactively -const migrateFiles = async ( - filePattern: string, - confirmUpload: boolean, - appendixPath?: string, -) => { - try { - // Check if the Git working directory is clean - if (!checkGitClean()) { - return; - } - - // Load migration status - const status = await loadMigrationStatus(); - - // Find the files to process - const files = await findFiles(filePattern); - - if (!files || files.length === 0) { - console.log("[cli][migrateFiles] No files found for the given pattern."); - return; - } - - console.log( - `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, - ); - - const allKeys: KeyObject[] = []; - - // Process each file sequentially - for (const file of files) { - await processFile(file, status, allKeys, appendixPath); - } - - // Upload the keys to Tolgee if there are any - if (confirmUpload && allKeys.length > 0) { - try { - await uploadKeysToTolgee(allKeys); - console.log( - "[cli][migrateFiles] Keys uploaded successfully to Tolgee.", - ); - } catch (error) { - console.error( - `[cli][migrateFiles] Error uploading keys to Tolgee: ${error}`, - ); - } - } else { - console.log("[cli][migrateFiles] Keys upload skipped."); - } - } catch (error) { - console.error( - `[cli][migrateFiles] Error during localization process: ${error}`, - ); - } -}; // Setup Commander CLI const program = new Command(); program.name("cli").usage("[command] [options]"); -// Migrate command -program - .command("migrate") - .description("Migrate files and upload keys to Tolgee") - .option( - "-p, --pattern ", - "File pattern to search for (e.g., src/**/*.tsx)", - "src/**/*.tsx", - ) - .option("-u, --upload", "Automatically upload created keys to Tolgee", false) - .option( - "-a, --appendixPath ", - "Path to file with custom prompt appendix", - ) - .action(async (options) => { - const { pattern, upload, appendixPath } = options; - try { - // Run the migration process - await migrateFiles(pattern, upload, appendixPath); - } catch (error) { - console.error("[cli][migrate command] Error during migration:", error); - } - }); - -// Status command -program - .command("status [file]") - .description( - "Check the migration status of a specific file or show the entire status with --all", - ) - .option("--all", "Show the entire migration status") - .action(async (file, options) => { - const { all } = options; - try { - await checkMigrationStatus(file, all); - } catch (error) { - console.error( - "[cli][status command] Error checking migration status:", - error, - ); - } - }); - -// Upload command -program - .command("upload-keys") - .description("Upload the localization strings to Tolgee") - .action(async () => { - try { - const keys = await fsExtra.readJson("allKeys.json"); - const result = await uploadKeysToTolgee(keys); - - if (result.success) { - console.log( - "[cli][upload command] Keys uploaded successfully to Tolgee..", - ); - } else { - console.log( - "[cli][upload command] Upload to Tolgee failed:", - result.message, - ); - } - } catch (error) { - console.error( - "[cli][upload command] Error uploading keys to Tolgee:", - error, - ); - } - }); +addMigrationCommand(program); +addStatusCommand(program) +addUploadCommand(program) program.parse(process.argv); // Parse the command-line arguments diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts new file mode 100644 index 0000000..586ac2e --- /dev/null +++ b/src/commands/migrate/addMigrationCommand.ts @@ -0,0 +1,32 @@ +import {Command} from "commander"; +import {migrateFiles} from "./migrateFiles"; + +export function addMigrationCommand(program: Command) { + // Migrate command + program + .command("migrate") + .description("Migrate files and upload keys to Tolgee") + .option( + "-p, --pattern ", + "File pattern to search for (e.g., src/**/*.tsx)", + "src/**/*.tsx", + ) + .option( + "-u, --upload", + "Automatically upload created keys to Tolgee", + false, + ) + .option( + "-a, --appendixPath ", + "Path to file with custom prompt appendix", + ) + .action(async (options) => { + const { pattern, upload, appendixPath } = options; + try { + // Run the migration process + await migrateFiles(pattern, upload, appendixPath); + } catch (error) { + console.error("[cli][migrate command] Error during migration:", error); + } + }); +} diff --git a/src/commands/migrate/migrateFiles.ts b/src/commands/migrate/migrateFiles.ts new file mode 100644 index 0000000..1c86467 --- /dev/null +++ b/src/commands/migrate/migrateFiles.ts @@ -0,0 +1,104 @@ +// Main function to handle file migration interactively +import {loadMigrationStatus, updateMigrationStatus} from "../../migrationStatus"; +import {findFiles} from "../../findFiles"; +import {saveKeys} from "../../saveAllKeys"; +import {checkGitClean} from "../../common/checkGitClean"; +import {sendFileToChatGPT} from "../../chatGPT"; +import fsExtra from "fs-extra"; + +const { promises: fs } = fsExtra; + +export const migrateFiles = async ( + filePattern: string, + confirmUpload: boolean, + appendixPath?: string, +) => { + try { + // Check if the Git working directory is clean + if (!checkGitClean()) { + return; + } + + // Find the files to process + const files = await findFiles(filePattern); + + if (!files || files.length === 0) { + console.log("[cli][migrateFiles] No files found for the given pattern."); + return; + } + + console.log( + `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, + ); + + // Process each file sequentially + //iterate over index and value + for (let index = 0; index < files.length; index++) { + const keysFilePath = files[index]; + console.log( + `[cli][migrateFiles] Processing file ${index + 1}/${files.length}: ${keysFilePath}`, + ); + const keys = await processFile(keysFilePath, appendixPath); + await saveKeys(keysFilePath, keys); + } + } catch (error) { + console.error( + `[cli][migrateFiles] Error during localization process: ${error}`, + ); + } +}; + +// Function to process a single file +const processFile = async ( + file: string, + appendixPath?: string, +) => { + const status = await loadMigrationStatus(); + + // Skip already processed files + if (status[file] && status[file].migrated) { + console.log( + `[cli][processFile] Skipping already processed file: ${file}`, + ); + return []; + } + + try { + // Send the file content to ChatGPT for localization + const result = await sendFileToChatGPT(file, appendixPath); + + const { newFileContents, keys } = result; + + if(keys.length === 0){ + console.log( + `[cli][processFile] No keys found in file: ${file}`, + ); + await updateMigrationStatus(file, [], false); + return []; + } + + // Overwrite the original file + await fs.writeFile(file, newFileContents, "utf8"); + console.log( + `[cli][processFile] File ${file} has been updated successfully.`, + ); + + // Get the relevant key names + const relevantKeys = keys.map((key) => key.name); + + // Mark the file as processed and include relevant keys + await updateMigrationStatus(file, relevantKeys, true); + + console.log( + `[cli][processFile] Successfully processed and updated file: ${file}`, + ); + + return keys; + } catch (e) { + console.error(`[cli][processFile] Migration failed for file: ${file}`, e); + + // Update migration status to indicate failure + await updateMigrationStatus(file, [], false); // Pass false to mark as not migrated + return []; + } +}; diff --git a/src/commands/status/addStatusCommand.ts b/src/commands/status/addStatusCommand.ts new file mode 100644 index 0000000..4382480 --- /dev/null +++ b/src/commands/status/addStatusCommand.ts @@ -0,0 +1,22 @@ +import { Command } from "commander"; +import {checkMigrationStatus} from "../../migrationStatus"; + +export function addStatusCommand(program: Command) { + program + .command("status [file]") + .description( + "Check the migration status of a specific file or show the entire status with --all", + ) + .option("--all", "Show the entire migration status") + .action(async (file, options) => { + const { all } = options; + try { + await checkMigrationStatus(file, all); + } catch (error) { + console.error( + "[cli][status command] Error checking migration status:", + error, + ); + } + }); +} diff --git a/src/commands/upload/addUploadCommand.ts b/src/commands/upload/addUploadCommand.ts new file mode 100644 index 0000000..a1b5ae8 --- /dev/null +++ b/src/commands/upload/addUploadCommand.ts @@ -0,0 +1,32 @@ +import {Command} from "commander"; +import fsExtra from "fs-extra"; +import {uploadKeysToTolgee} from "../../uploadKeysToTolgee"; + +export function addUploadCommand(program: Command){ + // Upload command + program + .command("upload-keys") + .description("Upload the localization strings to Tolgee") + .action(async () => { + try { + const keys = await fsExtra.readJson("allKeys.json"); + const result = await uploadKeysToTolgee(keys); + + if (result.success) { + console.log( + "[cli][upload command] Keys uploaded successfully to Tolgee..", + ); + } else { + console.log( + "[cli][upload command] Upload to Tolgee failed:", + result.message, + ); + } + } catch (error) { + console.error( + "[cli][upload command] Error uploading keys to Tolgee:", + error, + ); + } + }); +} diff --git a/src/common/checkGitClean.ts b/src/common/checkGitClean.ts new file mode 100644 index 0000000..74f25a7 --- /dev/null +++ b/src/common/checkGitClean.ts @@ -0,0 +1,13 @@ +// Function to check if the Git working directory is clean +import {execSync} from "child_process"; + +export function checkGitClean(): boolean { + const result = execSync("git status --porcelain").toString().trim(); + if (result) { + console.error( + "[cli][checkGitClean] Migrator requires a clean git state. Please commit or stash changes before proceeding.", + ); + return false; + } + return true; +} diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index 12b6fff..51e93f6 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -16,8 +16,7 @@ interface MigrationStatus { export const updateMigrationStatus = async ( filePath: string, relevantKeys: string[], - success: boolean - + success: boolean, ): Promise => { try { await fsExtra.ensureDir(TOLGEE_DIR); diff --git a/src/prompts/react/system.handlebars b/src/prompts/react/system.handlebars new file mode 100644 index 0000000..301509d --- /dev/null +++ b/src/prompts/react/system.handlebars @@ -0,0 +1,45 @@ +You are a localization assistant. Your task is to migrate React file content provided by the user for localization using @tolgee/react. +Follow these important rules: +- Content between delimiters in your response must not be empty! +- When there is text not suitable for translation, send that chunk of file content between the delimiters without translations and with an empty key list object in your response! +- **Only replace texts to translate**. Focus on replacing text in elements such as: + -
Some Text
+ - + - and other strings which will be rendered to the UI (anywhere) + - including document titles, placeholder attributes, alt texts, aria-labels, etc. +- **For standard strings, which can be replaced by component** + - should become +- **For attributes or non-component contexts** (like placeholder or window title), use t function : + - should become +- **Use T component only for suitable places. When the target needs string for some reason, use t function and add useTranslate hook to the component top. +- Import T or useTranslate it from @tolgee/react package. Import only what you need! Don't forget to use useTranslate, but use it only when required! +- Never keep default in the code (it's stored to the json files') + - e.g. Don't do `Save`, instead do `` + - e.g. Don't do `t('new-list-item-input-placeholder', 'New list item')`, instead do `t('new-list-item-input-placeholder')` +- **When generating key names**, ensure that each keyName is unique and descriptive, based on the original content. + The key name should reflect the purpose or content of the string. **Do not use generic key names like "translations" in JSON files.**. + - For example, "Share" should map to "share-button", "My cool app" should map to "app-title", and "Add item" button should map to "add-item-button". + - name keys semantically. e.g. for welcome message on homepage name it "home-welcome-message" +- **Do not process any content that is already wrapped with T component or t functions. +- Use dash "-" as the delimiter in the key names, don't use spaces or underscores. + - e.g. "App title" should be "app-title", not "app_title" +- Do not modify or translate string literals inside any console functions (like console.log, console.error, console.warn) and className/id. These should remain untouched. +- Generate a JSON structure that includes: + - "newFileContents" (with the updated React file content). + - "keys" (a JSON object with key names as keys and objects as values). + - Only return keys which you have used in the file, which are used in t function or T component + - Each object should have the following properties: + - "name" (the name of the key). + - "description" (based on the text's context). + - "default" (the original text). +- Don't escape characters to html entities, keep it as it is + - e.g. `'use client'` this is invalid beginning of the ts file, correct is 'use client' + - e.g. `import Logo from "../components/logo";` is also wrong +- Don't change any unrelated code - don't change the quoting or remove any comments or commented code + - e.g. unrelated changes from this: `Id<"boards">` to this: `Id<'boards'>` us not allowed +- Don't use any dynamic keys like, always use static key names, + - e.g. do this `{isCool ? : }` instead of this `` +- Don't try to translate dynamic strings + - e.g.
{tooltip}
, should be kept as it is. Only translate hardcoded strings +- If there is a probability that component won't accept component as prop, rather use t functions + - e.g. Don't do } />, instead do diff --git a/src/prompts/react/user.handlebars b/src/prompts/react/user.handlebars new file mode 100644 index 0000000..3e9eaa4 --- /dev/null +++ b/src/prompts/react/user.handlebars @@ -0,0 +1,4 @@ +Here is the file content that needs to be processed: +``` +{{fileContent}} +``` diff --git a/src/promptsProvider.ts b/src/promptsProvider.ts index cffa330..58d7a78 100644 --- a/src/promptsProvider.ts +++ b/src/promptsProvider.ts @@ -1,4 +1,6 @@ -import { FILE_CONTENTS_KEYWORD, KEYS_KEYWORD } from "./chatGPT"; +import Handlebars from "handlebars"; +import * as fs from "node:fs"; +import * as path from "node:path"; export function getPrompts({ fileContent, @@ -7,42 +9,33 @@ export function getPrompts({ fileContent: string; promptAppendix: string; }) { - const systemPrompt = `You are a localization assistant. Your task is to migrate React file content provided by the user for localization using @tolgee/react. Follow these important rules: - - Add the delimiter "${FILE_CONTENTS_KEYWORD}" at the very beginning of the file content I sent you and response and output file content without wrapping it as code. - - At the end of the file content, add the delimiter "${KEYS_KEYWORD}" followed by a JSON structure with the key names, descriptions, and translations. - - **Do not process any content that is already wrapped with T component or t functions. - - **Use T component only for suitable places. When the target needs string for some reason, use t function and add useTranslate hook to the component top. - - Content between delimiters in your response must not be empty! - - When there is text not suitable for translation, send that chunk of file content between the delimiters without translations and with an empty key list object in your response! - - - **Only replace tests to translate**. Focus on replacing text in elements such as: - -
Some Text
- - - - and other strings which will be rendered to the UI (anywhere) - - including document titles, placeholder attributes, alt texts, aria-labels, etc. - - **For attributes or non-component contexts** (like placeholder or window title), use t function : - - should become - - Neever keep default in the code (it's stored to the json files') - - **When generating key names**, ensure that each keyName is unique and descriptive, based on the original content. The key name should reflect the purpose or content of the string. **Do not use generic key names like "translations" in JSON files.**. - - For example, "Share" should map to "share-button", "App title" should map to "app-title", and "Add item" should map to "add-item". - - Do not modify or translate string literals inside any console functions (like console.log, console.error, console.warn) and className/id. These should remain untouched. - - Generate a JSON structure that includes: - - "name" (with underscores instead of dashes). - - "description" (based on the text's context). - - "translations" (with "en" containing the original text). - `; + const systemPrompt = getSystemPrompt(); // Append the promptAppendix if provided const completeSystemPrompt = promptAppendix ? `${systemPrompt}\n\nAdditional Instructions:\n${promptAppendix}` : systemPrompt; - const userPrompt = ` - Here is the file content that needs to be processed: - \`\`\` - ${fileContent} - \`\`\` - `; + const userPrompt = getUserPrompt({ fileContent }); return { completeSystemPrompt, userPrompt }; } + +function getPromptContents(fileName: string) { + return fs.readFileSync( + path.resolve(__dirname, "prompts", "react", fileName), + "utf8", + ); +} + +function getSystemPrompt() { + const systemTemplateRaw = getPromptContents("system.handlebars"); + const systemTemplate = Handlebars.compile(systemTemplateRaw); + return systemTemplate({}); +} + +function getUserPrompt(props: { fileContent: string }) { + const systemTemplateRaw = getPromptContents("user.handlebars"); + const systemTemplate = Handlebars.compile(systemTemplateRaw); + return systemTemplate(props); +} diff --git a/src/responseProviders/AzureResponseProvider.ts b/src/responseProviders/AzureResponseProvider.ts index 067662b..81173cc 100644 --- a/src/responseProviders/AzureResponseProvider.ts +++ b/src/responseProviders/AzureResponseProvider.ts @@ -1,6 +1,7 @@ import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; import { getPrompts } from "../promptsProvider"; import { AzureOpenAI } from "openai"; +import { chatGptResponseFormat } from "./responseFormat"; export function AzureResponseProvider(config: { apiVersion: string; @@ -23,6 +24,8 @@ export function AzureResponseProvider(config: { const response = await azureClient.chat.completions.create({ model: "gpt-4o", + response_format: chatGptResponseFormat, + temperature: 0, messages: [ { role: "system", @@ -33,7 +36,6 @@ export function AzureResponseProvider(config: { content: userPrompt, }, ], - max_tokens: 1024, }); // Extract the file content and keys separately from the response diff --git a/src/responseProviders/OpenAiResponseProvider.ts b/src/responseProviders/OpenAiResponseProvider.ts index dd5ff81..ac0c63b 100644 --- a/src/responseProviders/OpenAiResponseProvider.ts +++ b/src/responseProviders/OpenAiResponseProvider.ts @@ -1,6 +1,7 @@ import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; import { OpenAI } from "openai"; import { getPrompts } from "../promptsProvider"; +import { chatGptResponseFormat } from "./responseFormat"; export function OpenAiResponseProvider({ openAiApiKey, @@ -20,6 +21,7 @@ export function OpenAiResponseProvider({ const response = await openai.chat.completions.create( { model: "gpt-4o", + response_format: chatGptResponseFormat, messages: [ { role: "system", diff --git a/src/responseProviders/getResponseProvider.ts b/src/responseProviders/getResponseProvider.ts index bdaef9c..188f535 100644 --- a/src/responseProviders/getResponseProvider.ts +++ b/src/responseProviders/getResponseProvider.ts @@ -11,7 +11,7 @@ const azureEndpoint = process.env.AZURE_OPENAI_ENDPOINT; const openAiApiKey = process.env.OPENAI_API_KEY; const deployment = process.env.AZURE_OPENAI_DEPLOYMENT; -const apiVersion = "2023-03-15-preview"; +const apiVersion = "2024-10-01-preview"; type ApiProvider = "AZURE_OPENAI" | "OPENAI"; export function getResponseProvider(): ResponseProvider { diff --git a/src/responseProviders/responseFormat.tsx b/src/responseProviders/responseFormat.tsx new file mode 100644 index 0000000..06375de --- /dev/null +++ b/src/responseProviders/responseFormat.tsx @@ -0,0 +1,18 @@ +import {z} from "zod"; +import {zodResponseFormat} from "openai/helpers/zod"; + +const keySchema = z.object({ + name: z.string(), + description: z.string(), + default: z.string(), +}); + +const schema = z.object({ + newFileContents: z.string(), + keys: z.array(keySchema), +}); + +export const chatGptResponseFormat = zodResponseFormat(schema, "data"); + +export type ChatGptResponse = z.infer; +export type Key = z.infer; diff --git a/src/saveAllKeys.ts b/src/saveAllKeys.ts index 63cca11..f538c6d 100644 --- a/src/saveAllKeys.ts +++ b/src/saveAllKeys.ts @@ -1,25 +1,23 @@ import fsExtra from "fs-extra"; +import {Key} from "./responseProviders/responseFormat"; const TOLGEE_DIR = "./.tolgee"; const allKeysFilePath = `${TOLGEE_DIR}/allKeys.json`; -type KeyObject = { - keyName: string; - description: string; - translations: { en: string }; -}; // Function to save or append keys -export const saveKeys = async (filePath: string, keys: KeyObject[]) => { +export const saveKeys = async (filePath: string, keys: Key[]) => { try { - let allKeys: { [filePath: string]: KeyObject[] } = {}; + let allKeys: { [filePath: string]: Key[] } = {}; const fileExists = await fsExtra.pathExists(allKeysFilePath); if (fileExists) { try { allKeys = await fsExtra.readJson(allKeysFilePath); } catch (error) { - console.warn("[saveKeys] Warning: allKeys.json is empty or malformed. Initializing as empty object."); + console.warn( + "[saveKeys] Warning: allKeys.json is empty or malformed. Initializing as empty object.", + ); allKeys = {}; } } else { @@ -32,9 +30,9 @@ export const saveKeys = async (filePath: string, keys: KeyObject[]) => { allKeys[filePath] = keys; } else { // If file path exists, filter out keys that are already present - const existingKeys = allKeys[filePath].map((keyObj) => keyObj.keyName); + const existingKeys = allKeys[filePath].map((keyObj) => keyObj.name); const keysToAdd = keys.filter( - (key) => !existingKeys.includes(key.keyName), + (key) => !existingKeys.includes(key.name), ); // Only update if there are new keys to add diff --git a/src/test_files/test_file1.tsx b/src/test_files/test_file1.tsx deleted file mode 100644 index 11e03c5..0000000 --- a/src/test_files/test_file1.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import {FormEvent, useState, useEffect} from 'react'; -import {T, useTranslate} from '@tolgee/react'; - -import {Navbar} from './components/Navbar'; - -const getInitialItems = () => { - let items: string[] | undefined = undefined; - try { - items = JSON.parse(localStorage.getItem('tolgee-example-app-items') || ''); - } catch (e) { - // eslint-disable-next-line no-console - console.error( - 'Something went wrong while parsing stored items. Items are reset.' - ); - if (typeof localStorage !== 'undefined') { - localStorage.removeItem('tolgee-example-app-items'); - } - } - return items?.length - ? items - : ['Passport', 'Maps and directions', 'Travel guide']; -}; - -export const Todos = () => { - const {t} = useTranslate(); - - const [newItemValue, setNewItemValue] = useState(''); - const [items, setItems] = useState(getInitialItems()); - - const updateLocalstorage = (items: string[]) => { - localStorage.setItem('tolgee-example-app-items', JSON.stringify(items)); - }; - - const onAdd = (e: FormEvent) => { - e.preventDefault(); - const newItems = [...items, newItemValue]; - setItems(newItems); - updateLocalstorage(newItems); - setNewItemValue(''); - }; - - const onDelete = (index: number) => () => { - const newItems = items.filter((_, i) => i !== index); - setItems(newItems); - updateLocalstorage(newItems); - }; - - const onAction = (action: string) => () => { - alert('action: ' + action); - }; - - useEffect(() => { - window.document.title = "What to pack app"; - }, []); - - return ( -
-
- - - - - -
- -

- App title -

-
-
-
- setNewItemValue(e.target.value)} - placeholder={t({ - key: 'add-item-input-placeholder', - defaultValue: 'New list item', - })} - /> - -
-
- {items.map((item, i) => ( -
-
{item}
- -
- ))} -
-
- - -
-
-
-
- ); -}; diff --git a/src/uploadKeysToTolgee.ts b/src/uploadKeysToTolgee.ts index f034f97..4dc12aa 100755 --- a/src/uploadKeysToTolgee.ts +++ b/src/uploadKeysToTolgee.ts @@ -1,4 +1,5 @@ import axios from "axios"; +import { Key } from "./responseProviders/responseFormat"; interface KeyObject { keyName: string; @@ -12,13 +13,14 @@ interface TolgeeUploadResponse { } export const uploadKeysToTolgee = async ( - keys: KeyObject[], + keys: Key[], ): Promise => { try { const formattedKeys = keys.map((key) => ({ - keyName: key.keyName, + keyName: key.name, description: key.description, - translations: key.translations, // English as default translation + // TODO: Add support for different base language + translations: { en: key.default }, // English as default translation })); await axios.post("https://tolgee.io/api/import-keys-2", { diff --git a/testsGpt/exampleFiles/simple.tsx.txt b/testsGpt/exampleFiles/simple.tsx.txt new file mode 100644 index 0000000..98bf113 --- /dev/null +++ b/testsGpt/exampleFiles/simple.tsx.txt @@ -0,0 +1,3 @@ +export const WelcomeMessage = () => { + return
Welcome!
; +}; diff --git a/testsGpt/exampleFiles/useTranslate.tsx.txt b/testsGpt/exampleFiles/useTranslate.tsx.txt new file mode 100644 index 0000000..f6dcbe1 --- /dev/null +++ b/testsGpt/exampleFiles/useTranslate.tsx.txt @@ -0,0 +1,3 @@ +export const PasswordField = () => { + return ; +}; diff --git a/testsGpt/gptResponses.test.ts b/testsGpt/gptResponses.test.ts new file mode 100644 index 0000000..ab954fb --- /dev/null +++ b/testsGpt/gptResponses.test.ts @@ -0,0 +1,40 @@ +import { sendFileToChatGPT } from "../src/chatGPT"; +import * as path from "node:path"; + +describe("Chat GPT", () => { + it( + "correctly uses T component", + async () => { + const result = await sendFileToChatGPT( + path.resolve(__dirname + "/exampleFiles/simple.tsx.txt"), + ); + expect(result.keys).toHaveLength(1) + expect(result.keys[0].name).toBe("welcome-message") + expect(result.keys[0].description.length).toBeGreaterThan(10) + expect(result.keys[0].default).toBe("Welcome!") + expect(result.newFileContents).toBe("import { T } from '@tolgee/react';\n" + + "\n" + + "export const WelcomeMessage = () => {\n" + + " return
;\n" + + "};\n") + }, + 60 * 1000, + ); + + it( + "correctly uses useTranslate hook", + async () => { + const result = await sendFileToChatGPT( + path.resolve(__dirname + "/exampleFiles/useTranslate.tsx.txt"), + ); + expect(result.keys).toHaveLength(1) + expect(result.keys[0].name).toContain("password") + expect(result.keys[0].name).toContain("placeholder") + expect(result.keys[0].description.length).toBeGreaterThan(10) + expect(result.keys[0].default).toBe("New password") + expect(result.newFileContents).toContain("const { t } = useTranslate();") + expect(result.newFileContents).toContain("t('new-password-"); + }, + 60 * 1000, + ); +}); diff --git a/tsconfig.json b/tsconfig.json index 553ada8..269e239 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -118,12 +118,6 @@ /* Skip type checking all .d.ts files. */ "jsx": "react" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], - "exclude": [ - "src/migrated_files", - "src/test_files" - ] + "include": ["src/**/*.ts", "tests/**/*.ts"], + "exclude": ["src/migrated_files", "src/test_files"] } From fafde7ed55a78e0ced74bbce2e2588ddce9ae2de Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Fri, 8 Nov 2024 20:07:00 +0100 Subject: [PATCH 02/21] fix: get key upload working --- README.md | 125 +++++++++++++------- package.json | 1 + src/FilePaths.ts | 21 ++++ src/chatGPT.ts | 11 +- src/cli.ts | 12 +- src/commands/migrate/addMigrationCommand.ts | 9 +- src/commands/migrate/migrateFiles.ts | 18 +-- src/commands/upload/addUploadCommand.ts | 41 +++---- src/common/client/TolgeeProjectClient.ts | 93 +++++++++++++++ src/common/client/decodeApiKey.ts | 74 ++++++++++++ src/keyExtractor.ts | 63 ---------- src/migrationStatus.ts | 18 +-- src/saveAllKeys.ts | 13 +- src/uploadKeysToTolgee.ts | 55 +++------ src/utils/logger.ts | 27 +++++ 15 files changed, 365 insertions(+), 216 deletions(-) create mode 100644 src/FilePaths.ts create mode 100644 src/common/client/TolgeeProjectClient.ts create mode 100644 src/common/client/decodeApiKey.ts delete mode 100644 src/keyExtractor.ts create mode 100644 src/utils/logger.ts diff --git a/README.md b/README.md index 2157e09..d55ec9b 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ localization keys to Tolgee for translation management. If you prefer not to install the tool globally, you can run it directly using `npx`: ```bash -npx cli migrate [options] +npx tolgee-migrator migrate [options] ``` #### Option 2: Clone and Install Locally @@ -58,49 +58,45 @@ npx cli migrate [options] npm install ``` -3. **Set up environment variables:** Create a `.env` file in the root of the project and add your Azure OpenAI API key, endpoint, and deployment details. If you're using OpenAI directly instead of Azure, include the OpenAI API key and endpoint as well: - - ```bash - # Azure OpenAI setup (if using Azure) - AZURE_OPENAI_API_KEY=your-azure-openai-api-key-here - AZURE_OPENAI_ENDPOINT=https://your-azure-endpoint-url - AZURE_OPENAI_DEPLOYMENT=gpt-4o - - # OpenAI setup (if using OpenAI directly) - OPENAI_API_KEY=your-openai-api-key-here - OPENAI_ENDPOINT=https://api.openai.com/v1/chat/completions - ``` - -4. **Build the project:** This project is written in TypeScript, so you need to compile it to JavaScript before running +3. **Build the project:** This project is written in TypeScript, so you need to compile it to JavaScript before running the commands: ```bash npm run build ``` -5. **Rebuild after changes:** Whenever you make changes to the TypeScript files, you need to rebuild the project by +4. **Rebuild after changes:** Whenever you make changes to the TypeScript files, you need to rebuild the project by running: ```bash npm run build ``` -6. **Run the tool:** After building the project, you can use the CLI as described in the [Usage](#usage) section. +5. **Run the tool:** After building the project, you can use the CLI as described in the [Usage](#usage) section.
-### Environment Variables +### API Key and Endpoint Configuration -For this tool, you can configure either Azure OpenAI or OpenAI directly. Set the appropriate environment variables based on the setup you're using. +To configure the tool, provide either Azure OpenAI or OpenAI credentials through command-line arguments based on the setup you're using. **For Azure OpenAI:** -- **AZURE_OPENAI_API_KEY:** The API key for OpenAI, required for interacting with the ChatGPT API. -- **AZURE_OPENAI_ENDPOINT:** The endpoint URL for your Azure OpenAI instance, used to send API requests to Azure OpenAI. -- **AZURE_OPENAI_DEPLOYMENT:** The name of the OpenAI model deployment in Azure, used to specify which model (e.g., - gpt-4o) is being used. +- `--azure-api-key`: The API key for Azure OpenAI, required for interacting with the ChatGPT API. +- `--azure-endpoint`: The endpoint URL for your Azure OpenAI instance, used to send API requests to Azure OpenAI. **For OpenAI:** -- **OPENAI_API_KEY:** The API key for OpenAI, required for accessing OpenAI’s ChatGPT API. -- **OPENAI_ENDPOINT:** The endpoint URL for OpenAI, typically https://api.openai.com/v1/chat/completions. +- `--openai-api-key`: The API key for OpenAI, required for accessing OpenAI’s ChatGPT API. + +For example, when running a migration, pass these arguments to set the configuration: + +```bash +tolgee-migrator migrate --openai-api-key +``` + +Or, if using Azure OpenAI: + +```bash +tolgee-migrator migrate --azure-api-key --azure-endpoint +```
@@ -125,17 +121,26 @@ string literals with Tolgee’s `` component or `useTranslate` hook, and gene **Usage** ```bash -cli migrate [options] +tolgee-migrator migrate [options] ``` **Options** +- `-l, --log-level `: Sets the logging level. Available options are `error`, `warn`, `info`, `verbose`, and `debug`. Defaults to `info. + + - Example: + + ```bash + tolgee-migrator --log-level debug migrate --pattern "src/test_files/**/*.tsx" + ``` + + - `-p, --pattern `: Defines the file pattern to search for files to process. The default pattern is `src/**/*.tsx`. - Example: ```bash - cli migrate --pattern "src/test_files/**/*.tsx" + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" ``` - `-u, --upload`: Automatically uploads the created localization keys to Tolgee. If this option is **not** provided, you can upload the keys manually in a separate step using the `upload-keys` command. @@ -143,7 +148,7 @@ cli migrate [options] - Example: ```bash - cli migrate --upload + tolgee-migrator migrate --upload ``` - `-a, --appendixPath `: Specifies the path to a file containing custom instructions (prompt appendix) for ChatGPT. This allows you to provide additional context or guidelines for the migration process. @@ -151,33 +156,37 @@ cli migrate [options] - Example: ```bash - cli migrate --appendixPath "./path/to/instructions.txt" - ``` + tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" + ```- `--azure-api-key `: Specifies the Azure OpenAI API key. + +- `--azure-endpoint `: Specifies the Azure OpenAI endpoint URL. + +- `--openai-api-key `: Specifies the OpenAI API key. **Examples:** - Run the migration with the default file pattern and review the `allKeys.json` file before uploading: ```bash - cli migrate + tolgee-migrator migrate ``` - Run the migration for files in the `src/test_files/` directory and automatically upload the keys: ```bash - cli migrate --pattern "src/test_files/**/*.tsx" --upload + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload ``` - Run the migration with a custom prompt appendix for ChatGPT, using the default file pattern: ```bash - cli migrate --appendixPath "./path/to/instructions.txt" + tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" ``` - Run the migration with a specific file pattern, automatically upload the keys, and use a custom prompt appendix: ```bash - cli migrate --pattern "src/test_files/**/*.tsx" --upload --appendixPath "./path/to/instructions.txt" + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload --appendixPath "./path/to/instructions.txt" ```
@@ -194,7 +203,7 @@ The `upload-keys` command allows you to upload the localization keys that were g **Usage** ```bash -cli upload-keys +tolgee-migrator upload-keys ``` **Examples:** @@ -202,7 +211,7 @@ cli upload-keys - Upload keys from `allKeys.json` to Tolgee after reviewing and finalizing them: ```bash - cli upload-keys + tolgee-migrator upload-keys ```
@@ -214,7 +223,7 @@ The `status` command allows you to check the migration status of a specific file **Usage** ```bash -cli status [file] [options] +tolgee-migrator status [file] [options] ``` **Options** @@ -224,7 +233,7 @@ cli status [file] [options] - Example: ```bash - cli status src/test_files/App.tsx + tolgee-migrator status src/test_files/App.tsx ``` - `--all`: Show the entire migration status for all processed files. @@ -232,7 +241,7 @@ cli status [file] [options] - Example: ```bash - cli status --all + tolgee-migrator status --all ``` **Examples:** @@ -240,23 +249,47 @@ cli status [file] [options] - Check the migration status for a specific file: ```bash - cli status src/test_files/App.tsx + tolgee-migrator status src/test_files/App.tsx ``` - Show the entire migration status: ```bash - cli status --all + tolgee-migrator status --all ```
+**Verbose Logging with Log Levels** + +The `tolgee-migrator` CLI supports multiple logging levels to control output verbosity. + +- **Default Level (info)**: Displays important messages and errors only. Shows a progress bar indicating the number of files processed. +- **Verbose**: Displays additional information about each file currently being handled. +- **Debug**: Logs detailed information including full prompts and responses from ChatGPT for each file. + +To set the log level, use the `-l` or `--log-level` option: + +```bash +tolgee-migrator migrate --log-level debug +``` + +The available log levels are: + +- `error`: Only error messages. +- `warn`: Warning and error messages. +- `info`: Important messages, errors, and progress updates (default). +- `verbose`: Information about each file being processed. +- `debug`: Full output, including prompts and responses. + +
+ **Running the CLI** You can run the CLI directly using npx without global installation: ```bash -npx cli migrate +npx tolgee-migrator migrate ``` Or, for a more convenient setup, you can link the package globally using: @@ -268,17 +301,17 @@ npm link After linking, you can run the CLI globally: ```bash -cli migrate +tolgee-migrator migrate ```
### Complete Workflow Example -1. **Step 1:** Run the migration to process the files and generate `allKeys.json`. +1. **Step 1:** Run the migration to process the files , generate `allKeys.json`, and set the log level to `debug` to see all output. ```bash - cli migrate --pattern "src/test_files/**/*.tsx" + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --log-level debug --openai-api-key ``` 2. **Step 2:** Open the project files and `allKeys.json`, review and make any necessary updates or changes. @@ -286,7 +319,7 @@ cli migrate 3. **Step 3:** Once satisfied with the changes, upload the keys to the Tolgee platform: ```bash - cli upload-keys + tolgee-migrator upload-keys ```
diff --git a/package.json b/package.json index 4d6bb47..afd5d75 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "inquirer": "^12.0.0", "openai": "^4.68.1", "tsx": "^4.19.1", + "winston": "^3.16.0", "zod": "^3.23.8" }, "devDependencies": { diff --git a/src/FilePaths.ts b/src/FilePaths.ts new file mode 100644 index 0000000..7b648a2 --- /dev/null +++ b/src/FilePaths.ts @@ -0,0 +1,21 @@ +import * as path from "node:path"; + +function FilePaths(workingDir?: string) { + if (!workingDir) { + workingDir = process.cwd(); + } + + const storageDir = path.resolve(workingDir, ".tolgee"); + const allKeysFilePath = `${storageDir}/allKeys.json`; + const statusFilePath = `${storageDir}/migration-status.json`; + + return { + allKeysFilePath, + statusFilePath, + storageDir, + } +} + +export function getFilePaths(){ + return FilePaths(); +} diff --git a/src/chatGPT.ts b/src/chatGPT.ts index 5aaf521..6d7c9a8 100755 --- a/src/chatGPT.ts +++ b/src/chatGPT.ts @@ -1,5 +1,4 @@ import fsExtra from "fs-extra"; -import { extractCreatedKeys } from "./keyExtractor"; import { getOpenAiResponse } from "./getOpenAiResponse"; import { ChatGptResponse } from "./responseProviders/responseFormat"; @@ -21,11 +20,9 @@ async function loadPromptAppendix(filePath?: string): Promise { try { return await fs.readFile(filePath, "utf-8"); } catch (error) { - console.error( - `[chatGPT] Error: Failed to read prompt appendix from ${filePath}:`, - error, + throw new Error( + `[chatGPT] Error loading prompt appendix or path ${filePath}`, ); - return ""; } } @@ -48,9 +45,9 @@ async function requestCompleteResponse( return response; } catch (e) { if (e instanceof SyntaxError) { - console.log("[chatGPT] Error parsing response JSON:", responseJson); - responseJson + throw Error("[chatGPT] Error parsing response JSON"); } + throw e; } } diff --git a/src/cli.ts b/src/cli.ts index 755fbe8..87c0df6 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,17 +1,23 @@ #!/usr/bin/env node -import { Command } from "commander"; +import { Command, Option } from "commander"; import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; import { addStatusCommand } from "./commands/status/addStatusCommand"; -import {addUploadCommand} from "./commands/upload/addUploadCommand"; +import { addUploadCommand } from "./commands/upload/addUploadCommand"; +import { setLogLevel } from "./utils/logger"; // Setup Commander CLI const program = new Command(); program.name("cli").usage("[command] [options]"); - +// add log level option +program.addOption( + new Option("-l, --log-level ", "Set the log level").default("info"), +); addMigrationCommand(program); addStatusCommand(program) addUploadCommand(program) program.parse(process.argv); // Parse the command-line arguments + +setLogLevel(program.opts().logLevel); diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index 586ac2e..4b99157 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -11,20 +11,15 @@ export function addMigrationCommand(program: Command) { "File pattern to search for (e.g., src/**/*.tsx)", "src/**/*.tsx", ) - .option( - "-u, --upload", - "Automatically upload created keys to Tolgee", - false, - ) .option( "-a, --appendixPath ", "Path to file with custom prompt appendix", ) .action(async (options) => { - const { pattern, upload, appendixPath } = options; + const { pattern, appendixPath } = options; try { // Run the migration process - await migrateFiles(pattern, upload, appendixPath); + await migrateFiles(pattern, appendixPath); } catch (error) { console.error("[cli][migrate command] Error during migration:", error); } diff --git a/src/commands/migrate/migrateFiles.ts b/src/commands/migrate/migrateFiles.ts index 1c86467..60e63e7 100644 --- a/src/commands/migrate/migrateFiles.ts +++ b/src/commands/migrate/migrateFiles.ts @@ -5,12 +5,12 @@ import {saveKeys} from "../../saveAllKeys"; import {checkGitClean} from "../../common/checkGitClean"; import {sendFileToChatGPT} from "../../chatGPT"; import fsExtra from "fs-extra"; +import logger from "../../utils/logger"; const { promises: fs } = fsExtra; export const migrateFiles = async ( filePattern: string, - confirmUpload: boolean, appendixPath?: string, ) => { try { @@ -23,11 +23,11 @@ export const migrateFiles = async ( const files = await findFiles(filePattern); if (!files || files.length === 0) { - console.log("[cli][migrateFiles] No files found for the given pattern."); + logger.info("[cli][migrateFiles] No files found for the given pattern."); return; } - console.log( + logger.info( `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, ); @@ -35,7 +35,7 @@ export const migrateFiles = async ( //iterate over index and value for (let index = 0; index < files.length; index++) { const keysFilePath = files[index]; - console.log( + logger.info( `[cli][migrateFiles] Processing file ${index + 1}/${files.length}: ${keysFilePath}`, ); const keys = await processFile(keysFilePath, appendixPath); @@ -57,7 +57,7 @@ const processFile = async ( // Skip already processed files if (status[file] && status[file].migrated) { - console.log( + logger.info( `[cli][processFile] Skipping already processed file: ${file}`, ); return []; @@ -70,7 +70,7 @@ const processFile = async ( const { newFileContents, keys } = result; if(keys.length === 0){ - console.log( + logger.info( `[cli][processFile] No keys found in file: ${file}`, ); await updateMigrationStatus(file, [], false); @@ -79,7 +79,7 @@ const processFile = async ( // Overwrite the original file await fs.writeFile(file, newFileContents, "utf8"); - console.log( + logger.info( `[cli][processFile] File ${file} has been updated successfully.`, ); @@ -89,13 +89,13 @@ const processFile = async ( // Mark the file as processed and include relevant keys await updateMigrationStatus(file, relevantKeys, true); - console.log( + logger.info( `[cli][processFile] Successfully processed and updated file: ${file}`, ); return keys; } catch (e) { - console.error(`[cli][processFile] Migration failed for file: ${file}`, e); + logger.error(`[cli][processFile] Migration failed for file: ${file}`, e); // Update migration status to indicate failure await updateMigrationStatus(file, [], false); // Pass false to mark as not migrated diff --git a/src/commands/upload/addUploadCommand.ts b/src/commands/upload/addUploadCommand.ts index a1b5ae8..89ef31b 100644 --- a/src/commands/upload/addUploadCommand.ts +++ b/src/commands/upload/addUploadCommand.ts @@ -1,32 +1,21 @@ -import {Command} from "commander"; -import fsExtra from "fs-extra"; -import {uploadKeysToTolgee} from "../../uploadKeysToTolgee"; +import { Command, Option } from "commander"; +import { uploadKeysToTolgee } from "../../uploadKeysToTolgee"; +import { TolgeeProjectClient } from "../../common/client/TolgeeProjectClient"; -export function addUploadCommand(program: Command){ - // Upload command +export function addUploadCommand(program: Command) { program .command("upload-keys") .description("Upload the localization strings to Tolgee") - .action(async () => { - try { - const keys = await fsExtra.readJson("allKeys.json"); - const result = await uploadKeysToTolgee(keys); - - if (result.success) { - console.log( - "[cli][upload command] Keys uploaded successfully to Tolgee..", - ); - } else { - console.log( - "[cli][upload command] Upload to Tolgee failed:", - result.message, - ); - } - } catch (error) { - console.error( - "[cli][upload command] Error uploading keys to Tolgee:", - error, - ); - } + // TODO: Align with tolgee CLI + .addOption(new Option("-p, --projectId ", "Tolgee project ID")) + .addOption(new Option("-a, --apiKey ", "Tolgee API key")) + .addOption(new Option("-u, --apiUrl ", "Tolgee API URL")) + .action(async function (opts) { + const client = TolgeeProjectClient({ + projectId: opts["projectId"], + apiKey: opts["apiKey"], + apiUrl: opts["apiUrl"], + }); + await uploadKeysToTolgee(client); }); } diff --git a/src/common/client/TolgeeProjectClient.ts b/src/common/client/TolgeeProjectClient.ts new file mode 100644 index 0000000..1c2d8e3 --- /dev/null +++ b/src/common/client/TolgeeProjectClient.ts @@ -0,0 +1,93 @@ +import axios, { AxiosError, AxiosRequestConfig } from "axios"; +import { getProjectIdFromApiKey } from "./decodeApiKey"; + +export function TolgeeProjectClient(authProps: AuthProps) { + const headers = { + "X-API-Key": authProps.apiKey, + }; + + async function importKeys(keys: any) { + await request({ + url: getUrl({ ...authProps, projectEndpoint: "keys/import" }), + method: "POST", + data: { keys }, + headers, + }); + } + + async function getBaseLanguageTag() { + const response = await request({ + url: getUrl({ ...authProps, projectEndpoint: "" }), + method: "GET", + headers, + }); + + return response.data["baseLanguage"]["tag"]; + } + + return { + importKeys, + getBaseLanguageTag, + }; +} + +export type TolgeeProjectClientType = ReturnType; + +type AuthProps = { + apiKey: string; + apiUrl: string; + projectId: string | number; +}; + +function getUrl({ + apiUrl, + projectId, + apiKey, + projectEndpoint, +}: AuthProps & { projectEndpoint: string }) { + apiUrl = apiUrl || "https://app.tolgee.io"; + const baseUrl = new URL(apiUrl); + const origin = baseUrl.origin; + + // we can use passed projectId or try to get it from apiKey + projectId = getProjectId({ apiKey, passedProjectId: projectId }); + const endpointPath = projectEndpoint ? `/${projectEndpoint}` : ""; + return `${origin}/v2/projects/${projectId}${endpointPath}`; +} + +function getProjectId(props: { apiKey: string; passedProjectId: string | number }) { + if (props.passedProjectId) { + return props.passedProjectId; + } + + const fromApiKey = getProjectIdFromApiKey(props.apiKey); + + if (fromApiKey) { + return fromApiKey; + } + + throw new Error( + "Cannot determine project ID. Please provide it using projectId or Project API key", + ); +} + +async function request(request: AxiosRequestConfig) { + try { + return await axios.request(request); + } catch (e) { + if (e instanceof AxiosError) { + throw new ClientError(e); + } + throw e; + } +} + +class ClientError extends Error { + constructor(public error: AxiosError) { + const message = + `HTTP request failed with status ${error.status}\n` + + `Request: ${error.config?.method}: ${error.config?.url}\n` + + `Response Body: ${JSON.stringify(error.response?.data, null, 2)}`; + super(message); + } +} diff --git a/src/common/client/decodeApiKey.ts b/src/common/client/decodeApiKey.ts new file mode 100644 index 0000000..c60dbc4 --- /dev/null +++ b/src/common/client/decodeApiKey.ts @@ -0,0 +1,74 @@ +const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; + +function readChar(char: string) { + const idx = alphabet.indexOf(char); + + if (idx === -1) { + throw new Error('Invalid character found: ' + char); + } + + return idx; +} + +function arrayBufferToString(buffer: any) { + const bufView = new Uint8Array(buffer); + const length = bufView.length; + let result = ''; + let addition = Math.pow(2, 16) - 1; + + for (let i = 0; i < length; i += addition) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply( + null, + // @ts-ignore + bufView.subarray(i, i + addition) + ); + } + + return result; +} + +function base32Decode(input: string) { + input = input.toUpperCase(); + + const length = input.length; + + let bits = 0; + let value = 0; + + let index = 0; + const output = new Uint8Array(((length * 5) / 8) | 0); + + for (let i = 0; i < length; i++) { + value = (value << 5) | readChar(input[i]); + bits += 5; + + if (bits >= 8) { + output[index++] = (value >>> (bits - 8)) & 255; + bits -= 8; + } + } + + return arrayBufferToString(output.buffer); +} + +export function getProjectIdFromApiKey( + key: string | undefined +): number | undefined { + if (!key) { + return undefined; + } + try { + const [prefix, rest] = key.split('_'); + if (prefix === 'tgpak') { + const [projectId] = base32Decode(rest).split('_'); + return Number(projectId); + } + } catch { + // eslint-disable-next-line no-console + console.warn("Tolgee: Api key can't be parsed"); + } + return undefined; +} diff --git a/src/keyExtractor.ts b/src/keyExtractor.ts deleted file mode 100644 index de406b7..0000000 --- a/src/keyExtractor.ts +++ /dev/null @@ -1,63 +0,0 @@ -export interface CreatedKey { - keyName: string; - description: string; - translations: { en: string }; -} - -interface KeyDetails { - description: string; - translations: { en: string }; -} - -// Function to extract created keys from ChatGPT's response -export const extractCreatedKeys = (keyListString: string): CreatedKey[] => { - const createdKeys: CreatedKey[] = []; - - try { - // Remove single-line comments (// ...) from the JSON string - const sanitizedString = keyListString.replace(/\/\/.*$/gm, ""); - - // Check for unbalanced braces - const openBraces = (sanitizedString.match(/{/g) || []).length; - const closeBraces = (sanitizedString.match(/}/g) || []).length; - - // Add missing closing braces if needed - let finalString = sanitizedString; - if (openBraces > closeBraces) { - finalString += "}".repeat(openBraces - closeBraces); - console.warn("[keyExtractor] JSON was incomplete; added missing braces."); - } - - // Parse the JSON string - const keyObjects = JSON.parse(finalString); - - console.log("keyObjects", keyObjects); - - // Process each key-value pair in the object - for (const [keyName, keyDetails] of Object.entries(keyObjects)) { - const details = keyDetails as KeyDetails; // Type assertion - - // Validate the structure of each key details object - if ( - details && - typeof details === "object" && - typeof details.description === "string" && - details.translations && - typeof details.translations.en === "string" - ) { - // Push validated keys to the array - createdKeys.push({ - keyName, - description: details.description, - translations: { en: details.translations.en }, - }); - } else { - console.warn("Invalid key structure found for:", keyName); - } - } - } catch (error) { - console.error("[keyExtractor] Failed to parse JSON:", error); - } - - return createdKeys; -}; diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index 51e93f6..f142356 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -1,10 +1,9 @@ import fsExtra from "fs-extra"; +import { getFilePaths } from "./FilePaths"; +import logger from "./utils/logger"; const { promises: fs } = fsExtra; -const TOLGEE_DIR = "./.tolgee"; -const statusFilePath = `${TOLGEE_DIR}/migration-status.json`; - interface MigrationStatus { [filePath: string]: { migrated: boolean; @@ -19,7 +18,8 @@ export const updateMigrationStatus = async ( success: boolean, ): Promise => { try { - await fsExtra.ensureDir(TOLGEE_DIR); + const { storageDir, statusFilePath } = getFilePaths(); + await fsExtra.ensureDir(storageDir); const currentStatus = await loadMigrationStatus(); // Update the file status and relevant keys @@ -45,7 +45,7 @@ export const updateMigrationStatus = async ( // Function to load migration status export const loadMigrationStatus = async (): Promise => { try { - await fsExtra.ensureDir(TOLGEE_DIR); + const { statusFilePath } = getFilePaths(); // Check if the file exists before trying to load it const exists = await fsExtra.pathExists(statusFilePath); @@ -80,7 +80,7 @@ export const checkMigrationStatus = async ( if (showAll) { // Show the entire status file - console.log( + logger.info( "[migrationStatus][check] Complete migration status:", status, ); @@ -88,17 +88,17 @@ export const checkMigrationStatus = async ( // Check status for the specific file const fileStatus = status[filePath]; if (fileStatus) { - console.log( + logger.info( `[migrationStatus][check] Migration status for ${filePath}:`, fileStatus, ); } else { - console.log( + logger.info( `[migrationStatus][check] ${filePath} has not been migrated yet.`, ); } } else { - console.log( + logger.info( "[migrationStatus][check] Please provide a file to check its migration status or use the --all option to display the entire status.", ); } diff --git a/src/saveAllKeys.ts b/src/saveAllKeys.ts index f538c6d..a9dc8d9 100644 --- a/src/saveAllKeys.ts +++ b/src/saveAllKeys.ts @@ -1,14 +1,15 @@ import fsExtra from "fs-extra"; import {Key} from "./responseProviders/responseFormat"; +import { getFilePaths } from "./FilePaths"; -const TOLGEE_DIR = "./.tolgee"; -const allKeysFilePath = `${TOLGEE_DIR}/allKeys.json`; - +export type AllKeysFile = { [filePath: string]: Key[] } // Function to save or append keys export const saveKeys = async (filePath: string, keys: Key[]) => { + const { allKeysFilePath } = getFilePaths(); + try { - let allKeys: { [filePath: string]: Key[] } = {}; + let allKeys: AllKeysFile = {}; const fileExists = await fsExtra.pathExists(allKeysFilePath); if (fileExists) { @@ -31,9 +32,7 @@ export const saveKeys = async (filePath: string, keys: Key[]) => { } else { // If file path exists, filter out keys that are already present const existingKeys = allKeys[filePath].map((keyObj) => keyObj.name); - const keysToAdd = keys.filter( - (key) => !existingKeys.includes(key.name), - ); + const keysToAdd = keys.filter((key) => !existingKeys.includes(key.name)); // Only update if there are new keys to add if (keysToAdd.length > 0) { diff --git a/src/uploadKeysToTolgee.ts b/src/uploadKeysToTolgee.ts index 4dc12aa..519173d 100755 --- a/src/uploadKeysToTolgee.ts +++ b/src/uploadKeysToTolgee.ts @@ -1,46 +1,23 @@ -import axios from "axios"; import { Key } from "./responseProviders/responseFormat"; +import fsExtra from "fs-extra"; +import { getFilePaths } from "./FilePaths"; +import { AllKeysFile } from "./saveAllKeys"; +import { TolgeeProjectClientType } from "./common/client/TolgeeProjectClient"; -interface KeyObject { - keyName: string; - description: string; - translations: { en: string }; -} +export const uploadKeysToTolgee = async (client: TolgeeProjectClientType) => { + const { allKeysFilePath } = getFilePaths(); -interface TolgeeUploadResponse { - success: boolean; - message: string; -} + const keys = (await fsExtra.readJson(allKeysFilePath)) as AllKeysFile; -export const uploadKeysToTolgee = async ( - keys: Key[], -): Promise => { - try { - const formattedKeys = keys.map((key) => ({ - keyName: key.name, - description: key.description, - // TODO: Add support for different base language - translations: { en: key.default }, // English as default translation - })); + const allKeys = Object.values(keys).flat() as Key[]; - await axios.post("https://tolgee.io/api/import-keys-2", { - keys: formattedKeys, - }); + const baseLanguageTag = await client.getBaseLanguageTag(); - console.log("[uploadKeysToTolgee] Keys uploaded successfully to Tolgee."); - return { - success: true, - message: "Keys uploaded successfully", - }; - } catch (error) { - console.error( - `[uploadKeysToTolgee] Error uploading keys to Tolgee: ${error}`, - ); - const errorMessage = - error instanceof Error ? error.message : "Unknown error"; - return { - success: false, - message: `Failed to upload keys: ${errorMessage}`, - }; - } + const formattedKeys = allKeys.map((key) => ({ + name: key.name, + description: key.description, + translations: { [baseLanguageTag]: key.default }, // English as default translation + })); + + await client.importKeys(formattedKeys); }; diff --git a/src/utils/logger.ts b/src/utils/logger.ts new file mode 100644 index 0000000..fc33176 --- /dev/null +++ b/src/utils/logger.ts @@ -0,0 +1,27 @@ +import winston from "winston"; + +const logLevel = process.env.LOG_LEVEL || "info"; // Default to "info" + +const logger = winston.createLogger({ + level: logLevel, + format: winston.format.combine( + winston.format.colorize(), + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message }) => { + return `[${timestamp}] ${level}: ${message}`; + }), + ), + transports: [ + new winston.transports.Console({ + handleExceptions: true, + }), + ], +}); + +// Function to update the log level dynamically +export function setLogLevel(level: string) { + logger.level = level; + logger.info(`Log level set to ${level}`); +} + +export default logger; From 7388cb5a130da2915e69dbf99730fdd251162ef6 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sat, 9 Nov 2024 11:06:18 +0100 Subject: [PATCH 03/21] fix: Add custom presets --- .gitignore | 3 +- README.backup.md | 465 ++++++++++++++++++ README.md | 465 ------------------ src/FileProcessor.ts | 63 +++ src/PromptsProvider.ts | 28 ++ src/chatGPT.ts | 57 --- src/cli.ts | 18 +- src/commands/migrate/addMigrationCommand.ts | 48 +- src/commands/migrate/migrateFiles.ts | 48 +- src/getOpenAiResponse.ts | 7 - src/presets/PresetType.ts | 12 + src/presets/buildNativePreset.ts | 28 ++ .../react/system.handlebars | 0 .../react/user.handlebars | 0 src/program.ts | 20 + src/promptsProvider.ts | 41 -- .../AzureResponseProvider.ts | 28 +- .../OpenAiResponseProvider.ts | 8 +- ...eProvider.ts => createResponseProvider.ts} | 21 +- tests/fixtures/invalid-preset.js | 5 + tests/fixtures/my-preset.js | 5 + tests/presets.test.ts | 48 ++ testsGpt/gptResponses.test.ts | 41 +- 23 files changed, 803 insertions(+), 656 deletions(-) create mode 100644 README.backup.md create mode 100755 src/FileProcessor.ts create mode 100644 src/PromptsProvider.ts delete mode 100755 src/chatGPT.ts delete mode 100644 src/getOpenAiResponse.ts create mode 100644 src/presets/PresetType.ts create mode 100644 src/presets/buildNativePreset.ts rename src/{prompts => presets}/react/system.handlebars (100%) rename src/{prompts => presets}/react/user.handlebars (100%) create mode 100644 src/program.ts delete mode 100644 src/promptsProvider.ts rename src/responseProviders/{getResponseProvider.ts => createResponseProvider.ts} (70%) create mode 100644 tests/fixtures/invalid-preset.js create mode 100644 tests/fixtures/my-preset.js create mode 100644 tests/presets.test.ts diff --git a/.gitignore b/.gitignore index 32f731b..b454a87 100644 --- a/.gitignore +++ b/.gitignore @@ -32,5 +32,4 @@ package-lock.json *.swp # Ignore compiled TypeScript files -*.js -*.d.ts \ No newline at end of file +/dist diff --git a/README.backup.md b/README.backup.md new file mode 100644 index 0000000..d55ec9b --- /dev/null +++ b/README.backup.md @@ -0,0 +1,465 @@ +# AI Migration Tool + +_Disclaimer: This tool is not released yet! It's in PoC state. Use at your own risk._ + +This tool automates the process of migrating string literals in TypeScript and TSX files to localized keys using ChatGPT, compatible with both Azure OpenAI and OpenAI setups, and Tolgee. It tracks the migration status of each file, preventing duplicate processing, and uploads +localization keys to Tolgee for translation management. + +### Features + +- **File Discovery:** Finds `.tsx` files in your project directory based on a specified pattern. +- **ChatGPT Localization:** Uses ChatGPT, compatible with both Azure OpenAI and OpenAI setups, to replace string literals in React components with Tolgee's `` + component or `useTranslate` hook. +- **Migration Status Tracking:** Saves and loads the migration status from a JSON file, ensuring that files are + processed only once. +- **Tolgee Integration:** Uploads the created localization keys to the Tolgee platform via its REST API. + +
+ +### Table of Contents + +- [Installation](#installation) +- [Environment Variables](#environment-variables) +- [Usage](#usage) + - [CLI Commands](#cli-commands) +- [Modules](#modules) + - [File Finder](#1-file-finder-findfilests) + - [Migration Status](#2-migration-status-migrationStatusts) + - [ChatGPT Localization](#3-chatgpt-localization-chatgptts) + - [Tolgee Integration](#4-tolgee-integration-tolgeets) +- [Testing](#testing) +- [Error Handling](#error-handling) +- [Conclusion](#conclusion) + +
+ +### Installation + +#### Option 1: Run Directly with `npx` + +If you prefer not to install the tool globally, you can run it directly using `npx`: + +```bash +npx tolgee-migrator migrate [options] +``` + +#### Option 2: Clone and Install Locally + +1. **Clone the repository:** + + ```bash + git clone https://github.com/tolgee/ai-migrator + cd ai-migrator + ``` + +2. **Install the dependencies:** + + ```bash + npm install + ``` + +3. **Build the project:** This project is written in TypeScript, so you need to compile it to JavaScript before running + the + commands: + ```bash + npm run build + ``` +4. **Rebuild after changes:** Whenever you make changes to the TypeScript files, you need to rebuild the project by + running: + ```bash + npm run build + ``` +5. **Run the tool:** After building the project, you can use the CLI as described in the [Usage](#usage) section. + +
+ +### API Key and Endpoint Configuration + +To configure the tool, provide either Azure OpenAI or OpenAI credentials through command-line arguments based on the setup you're using. + +**For Azure OpenAI:** + +- `--azure-api-key`: The API key for Azure OpenAI, required for interacting with the ChatGPT API. +- `--azure-endpoint`: The endpoint URL for your Azure OpenAI instance, used to send API requests to Azure OpenAI. + +**For OpenAI:** + +- `--openai-api-key`: The API key for OpenAI, required for accessing OpenAI’s ChatGPT API. + +For example, when running a migration, pass these arguments to set the configuration: + +```bash +tolgee-migrator migrate --openai-api-key +``` + +Or, if using Azure OpenAI: + +```bash +tolgee-migrator migrate --azure-api-key --azure-endpoint +``` + +
+ +### Usage + +#### CLI Commands + +The AI Migration Tool provides a command-line interface for migrating string literals to localization keys and uploading +them to Tolgee. + +**Command:** `migrate` + +The `migrate` command processes `.tsx` files in the project directory, replaces +string literals with Tolgee’s `` component or `useTranslate` hook, and generates an `allKeys.json` file containing the created localization keys. + +**Process Overview:** + +1. The project files are overwritten with new components. +2. An `allKeys.json` file is generated and stored in the root of the project, containing the keys for localization. +3. Users can then manually review or modify both the project files and the `allKeys.json` file. + +**Usage** + +```bash +tolgee-migrator migrate [options] +``` + +**Options** + +- `-l, --log-level `: Sets the logging level. Available options are `error`, `warn`, `info`, `verbose`, and `debug`. Defaults to `info. + + - Example: + + ```bash + tolgee-migrator --log-level debug migrate --pattern "src/test_files/**/*.tsx" + ``` + + +- `-p, --pattern `: Defines the file pattern to search for files to process. The default pattern is `src/**/*.tsx`. + + - Example: + + ```bash + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" + ``` + +- `-u, --upload`: Automatically uploads the created localization keys to Tolgee. If this option is **not** provided, you can upload the keys manually in a separate step using the `upload-keys` command. + + - Example: + + ```bash + tolgee-migrator migrate --upload + ``` + +- `-a, --appendixPath `: Specifies the path to a file containing custom instructions (prompt appendix) for ChatGPT. This allows you to provide additional context or guidelines for the migration process. + + - Example: + + ```bash + tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" + ```- `--azure-api-key `: Specifies the Azure OpenAI API key. + +- `--azure-endpoint `: Specifies the Azure OpenAI endpoint URL. + +- `--openai-api-key `: Specifies the OpenAI API key. + +**Examples:** + +- Run the migration with the default file pattern and review the `allKeys.json` file before uploading: + + ```bash + tolgee-migrator migrate + ``` + +- Run the migration for files in the `src/test_files/` directory and automatically upload the keys: + + ```bash + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload + ``` + +- Run the migration with a custom prompt appendix for ChatGPT, using the default file pattern: + + ```bash + tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" + ``` + +- Run the migration with a specific file pattern, automatically upload the keys, and use a custom prompt appendix: + + ```bash + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload --appendixPath "./path/to/instructions.txt" + ``` + +
+ +**Command:** `upload-keys` + +The `upload-keys` command allows you to upload the localization keys that were generated and stored in the `allKeys.json` file to the Tolgee platform. This command is run after reviewing and updating the `allKeys.json` file or project files as needed. + +**Process Overview:** + +1. Users **review and modify** the `allKeys.json` file and project files. +2. Once ready, run the upload-keys` command to upload the finalized localization strings to the Tolgee platform. + +**Usage** + +```bash +tolgee-migrator upload-keys +``` + +**Examples:** + +- Upload keys from `allKeys.json` to Tolgee after reviewing and finalizing them: + + ```bash + tolgee-migrator upload-keys + ``` + +
+ +**Command:** `status` + +The `status` command allows you to check the migration status of a specific file or view the entire migration status. + +**Usage** + +```bash +tolgee-migrator status [file] [options] +``` + +**Options** + +- `[file]`: Specify a file path to check the migration status for that particular file. + + - Example: + + ```bash + tolgee-migrator status src/test_files/App.tsx + ``` + +- `--all`: Show the entire migration status for all processed files. + + - Example: + + ```bash + tolgee-migrator status --all + ``` + +**Examples:** + +- Check the migration status for a specific file: + + ```bash + tolgee-migrator status src/test_files/App.tsx + ``` + +- Show the entire migration status: + + ```bash + tolgee-migrator status --all + ``` + +
+ +**Verbose Logging with Log Levels** + +The `tolgee-migrator` CLI supports multiple logging levels to control output verbosity. + +- **Default Level (info)**: Displays important messages and errors only. Shows a progress bar indicating the number of files processed. +- **Verbose**: Displays additional information about each file currently being handled. +- **Debug**: Logs detailed information including full prompts and responses from ChatGPT for each file. + +To set the log level, use the `-l` or `--log-level` option: + +```bash +tolgee-migrator migrate --log-level debug +``` + +The available log levels are: + +- `error`: Only error messages. +- `warn`: Warning and error messages. +- `info`: Important messages, errors, and progress updates (default). +- `verbose`: Information about each file being processed. +- `debug`: Full output, including prompts and responses. + +
+ +**Running the CLI** + +You can run the CLI directly using npx without global installation: + +```bash +npx tolgee-migrator migrate +``` + +Or, for a more convenient setup, you can link the package globally using: + +```bash +npm link +``` + +After linking, you can run the CLI globally: + +```bash +tolgee-migrator migrate +``` + +
+ +### Complete Workflow Example + +1. **Step 1:** Run the migration to process the files , generate `allKeys.json`, and set the log level to `debug` to see all output. + + ```bash + tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --log-level debug --openai-api-key + ``` + +2. **Step 2:** Open the project files and `allKeys.json`, review and make any necessary updates or changes. + +3. **Step 3:** Once satisfied with the changes, upload the keys to the Tolgee platform: + + ```bash + tolgee-migrator upload-keys + ``` + +
+ +### Modules + +### 1. File Finder (`findFiles.ts`) + +This module uses `fast-glob` to find all files in the project directory based on a provided pattern. It +returns a list of file paths that match the pattern. + +#### Example Usage: + +```ts +import { findFiles } from "./findFiles"; + +const files = await findFiles("src/**/*.tsx"); +console.log("Files found:", files); +``` + +### 2. Migration Status (`migrationStatus.ts`) + +This module manages the migration status, saving, loading, and checking it from a JSON file (migration-status.json). The +status is used to track which files have already been processed, ensuring that each file is processed only once. + +- **updateMigrationStatus:** Saves the current migration status to a JSON file. +- **loadMigrationStatus:** Loads the migration status from the JSON file, creating the file if it doesn't exist. +- **checkMigrationStatus:** Checks the migration status of a specific file or displays the entire migration status if + requested. + +#### Example Usage: + +```ts +import { + loadMigrationStatus, + updateMigrationStatus, + checkMigrationStatus, +} from "./migrationStatus"; + +// Load the migration status +const status = await loadMigrationStatus(); +console.log("Migration Status:", status); + +// After processing a file, update the status +await updateMigrationStatus("src/test_files/App.tsx", ["keyName1", "keyName2"]); + +// Check the status of a specific file +await checkMigrationStatus("src/test_files/App.tsx"); + +// Show the entire status +await checkMigrationStatus("", true); +``` + +### 3. ChatGPT Localization (`chatGPT.ts`) + +This module communicates with ChatGPT, using either Azure OpenAI or OpenAI setup, to process `.tsx` file contents, primarily for React components. It sends the content of `.tsx` files +to ChatGPT, requesting that string literals be replaced with the Tolgee `` component or `useTranslate` hook. The +function returns the updated file content and the list of created localization keys. + +#### Example Usage: + +```ts +import { sendFileToChatGPT } from "./chatGPT"; + +const result = await sendFileToChatGPT("src/test_files/App.tsx"); +const { updatedContent, createdKeys } = result; + +console.log("Updated Content:", updatedContent); +console.log("Created Keys:", createdKeys); +``` + +#### Extracting Keys + +The `extractCreatedKeys` function parses the response from ChatGPT, using either Azure OpenAI or OpenAI setup, to extract localization keys, +descriptions, and translations. This allows for more robust handling of the response structure and ensures that the +correct format is returned. The key names, descriptions, and default values are returned as part of the final +localization setup. + +
+ +### 4. Tolgee Integration (`uploadKeysToTolgee.ts`) + +This module is responsible for uploading the keys from the `allKeys.json` file to the Tolgee platform. You can run this step manually after the migration process to ensure that all keys are finalized before uploading. + +#### Example Usage: + +```ts +import { uploadKeysToTolgee } from "./uploadKeysToTolgee"; + +const keys = [ + { + keyName: "menu.item.translation", + description: "Menu item translation", + translations: { en: "Translation" }, + }, +]; + +const result = await uploadKeysToTolgee(keys); +if (result.success) { + console.log(result.message); // Logs: Keys uploaded successfully +} else { + console.error(result.message); // Logs error message if upload fails +} +``` + +
+ +### Testing + +This project includes unit tests to ensure the functionality of each module, such as file discovery, migration status tracking, and Tolgee API integration. We use [Jest](https://jestjs.io/) as the testing framework. + +#### Running Tests + +To run all tests, use the following command: + +```bash +npm test +``` + +You can also run specific test files: + +``` +npm test tests/migrationStatus.test.ts +``` + +
+ +### Error Handling + +Each module includes error handling for improved reliability: + +- **File Finder:** Catches errors while reading the file system and throws meaningful messages. +- **Migration Status:** Logs errors if the migration status file cannot be read or written to. +- **ChatGPT Localization:** Throws errors when there is a failure during the ChatGPT API call. +- **Tolgee Integration:** Handles and logs errors that occur during the key upload process. +- **CLI Feedback:** The CLI informs the user about any files that fail to process or upload. Error messages will be + displayed directly in the CLI output, including details about which step failed (e.g., file reading, localization, key + upload). + +### Conclusion + +This tool automates the migration of string literals in TypeScript/TSX files to localized keys using ChatGPT, through either Azure OpenAI or OpenAI setup, and Tolgee. It is designed for ease of use, tracking migration status to prevent duplicate processing, and integration +with the Tolgee platform for seamless localization management. diff --git a/README.md b/README.md index d55ec9b..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,465 +0,0 @@ -# AI Migration Tool - -_Disclaimer: This tool is not released yet! It's in PoC state. Use at your own risk._ - -This tool automates the process of migrating string literals in TypeScript and TSX files to localized keys using ChatGPT, compatible with both Azure OpenAI and OpenAI setups, and Tolgee. It tracks the migration status of each file, preventing duplicate processing, and uploads -localization keys to Tolgee for translation management. - -### Features - -- **File Discovery:** Finds `.tsx` files in your project directory based on a specified pattern. -- **ChatGPT Localization:** Uses ChatGPT, compatible with both Azure OpenAI and OpenAI setups, to replace string literals in React components with Tolgee's `` - component or `useTranslate` hook. -- **Migration Status Tracking:** Saves and loads the migration status from a JSON file, ensuring that files are - processed only once. -- **Tolgee Integration:** Uploads the created localization keys to the Tolgee platform via its REST API. - -
- -### Table of Contents - -- [Installation](#installation) -- [Environment Variables](#environment-variables) -- [Usage](#usage) - - [CLI Commands](#cli-commands) -- [Modules](#modules) - - [File Finder](#1-file-finder-findfilests) - - [Migration Status](#2-migration-status-migrationStatusts) - - [ChatGPT Localization](#3-chatgpt-localization-chatgptts) - - [Tolgee Integration](#4-tolgee-integration-tolgeets) -- [Testing](#testing) -- [Error Handling](#error-handling) -- [Conclusion](#conclusion) - -
- -### Installation - -#### Option 1: Run Directly with `npx` - -If you prefer not to install the tool globally, you can run it directly using `npx`: - -```bash -npx tolgee-migrator migrate [options] -``` - -#### Option 2: Clone and Install Locally - -1. **Clone the repository:** - - ```bash - git clone https://github.com/tolgee/ai-migrator - cd ai-migrator - ``` - -2. **Install the dependencies:** - - ```bash - npm install - ``` - -3. **Build the project:** This project is written in TypeScript, so you need to compile it to JavaScript before running - the - commands: - ```bash - npm run build - ``` -4. **Rebuild after changes:** Whenever you make changes to the TypeScript files, you need to rebuild the project by - running: - ```bash - npm run build - ``` -5. **Run the tool:** After building the project, you can use the CLI as described in the [Usage](#usage) section. - -
- -### API Key and Endpoint Configuration - -To configure the tool, provide either Azure OpenAI or OpenAI credentials through command-line arguments based on the setup you're using. - -**For Azure OpenAI:** - -- `--azure-api-key`: The API key for Azure OpenAI, required for interacting with the ChatGPT API. -- `--azure-endpoint`: The endpoint URL for your Azure OpenAI instance, used to send API requests to Azure OpenAI. - -**For OpenAI:** - -- `--openai-api-key`: The API key for OpenAI, required for accessing OpenAI’s ChatGPT API. - -For example, when running a migration, pass these arguments to set the configuration: - -```bash -tolgee-migrator migrate --openai-api-key -``` - -Or, if using Azure OpenAI: - -```bash -tolgee-migrator migrate --azure-api-key --azure-endpoint -``` - -
- -### Usage - -#### CLI Commands - -The AI Migration Tool provides a command-line interface for migrating string literals to localization keys and uploading -them to Tolgee. - -**Command:** `migrate` - -The `migrate` command processes `.tsx` files in the project directory, replaces -string literals with Tolgee’s `` component or `useTranslate` hook, and generates an `allKeys.json` file containing the created localization keys. - -**Process Overview:** - -1. The project files are overwritten with new components. -2. An `allKeys.json` file is generated and stored in the root of the project, containing the keys for localization. -3. Users can then manually review or modify both the project files and the `allKeys.json` file. - -**Usage** - -```bash -tolgee-migrator migrate [options] -``` - -**Options** - -- `-l, --log-level `: Sets the logging level. Available options are `error`, `warn`, `info`, `verbose`, and `debug`. Defaults to `info. - - - Example: - - ```bash - tolgee-migrator --log-level debug migrate --pattern "src/test_files/**/*.tsx" - ``` - - -- `-p, --pattern `: Defines the file pattern to search for files to process. The default pattern is `src/**/*.tsx`. - - - Example: - - ```bash - tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" - ``` - -- `-u, --upload`: Automatically uploads the created localization keys to Tolgee. If this option is **not** provided, you can upload the keys manually in a separate step using the `upload-keys` command. - - - Example: - - ```bash - tolgee-migrator migrate --upload - ``` - -- `-a, --appendixPath `: Specifies the path to a file containing custom instructions (prompt appendix) for ChatGPT. This allows you to provide additional context or guidelines for the migration process. - - - Example: - - ```bash - tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" - ```- `--azure-api-key `: Specifies the Azure OpenAI API key. - -- `--azure-endpoint `: Specifies the Azure OpenAI endpoint URL. - -- `--openai-api-key `: Specifies the OpenAI API key. - -**Examples:** - -- Run the migration with the default file pattern and review the `allKeys.json` file before uploading: - - ```bash - tolgee-migrator migrate - ``` - -- Run the migration for files in the `src/test_files/` directory and automatically upload the keys: - - ```bash - tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload - ``` - -- Run the migration with a custom prompt appendix for ChatGPT, using the default file pattern: - - ```bash - tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" - ``` - -- Run the migration with a specific file pattern, automatically upload the keys, and use a custom prompt appendix: - - ```bash - tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --upload --appendixPath "./path/to/instructions.txt" - ``` - -
- -**Command:** `upload-keys` - -The `upload-keys` command allows you to upload the localization keys that were generated and stored in the `allKeys.json` file to the Tolgee platform. This command is run after reviewing and updating the `allKeys.json` file or project files as needed. - -**Process Overview:** - -1. Users **review and modify** the `allKeys.json` file and project files. -2. Once ready, run the upload-keys` command to upload the finalized localization strings to the Tolgee platform. - -**Usage** - -```bash -tolgee-migrator upload-keys -``` - -**Examples:** - -- Upload keys from `allKeys.json` to Tolgee after reviewing and finalizing them: - - ```bash - tolgee-migrator upload-keys - ``` - -
- -**Command:** `status` - -The `status` command allows you to check the migration status of a specific file or view the entire migration status. - -**Usage** - -```bash -tolgee-migrator status [file] [options] -``` - -**Options** - -- `[file]`: Specify a file path to check the migration status for that particular file. - - - Example: - - ```bash - tolgee-migrator status src/test_files/App.tsx - ``` - -- `--all`: Show the entire migration status for all processed files. - - - Example: - - ```bash - tolgee-migrator status --all - ``` - -**Examples:** - -- Check the migration status for a specific file: - - ```bash - tolgee-migrator status src/test_files/App.tsx - ``` - -- Show the entire migration status: - - ```bash - tolgee-migrator status --all - ``` - -
- -**Verbose Logging with Log Levels** - -The `tolgee-migrator` CLI supports multiple logging levels to control output verbosity. - -- **Default Level (info)**: Displays important messages and errors only. Shows a progress bar indicating the number of files processed. -- **Verbose**: Displays additional information about each file currently being handled. -- **Debug**: Logs detailed information including full prompts and responses from ChatGPT for each file. - -To set the log level, use the `-l` or `--log-level` option: - -```bash -tolgee-migrator migrate --log-level debug -``` - -The available log levels are: - -- `error`: Only error messages. -- `warn`: Warning and error messages. -- `info`: Important messages, errors, and progress updates (default). -- `verbose`: Information about each file being processed. -- `debug`: Full output, including prompts and responses. - -
- -**Running the CLI** - -You can run the CLI directly using npx without global installation: - -```bash -npx tolgee-migrator migrate -``` - -Or, for a more convenient setup, you can link the package globally using: - -```bash -npm link -``` - -After linking, you can run the CLI globally: - -```bash -tolgee-migrator migrate -``` - -
- -### Complete Workflow Example - -1. **Step 1:** Run the migration to process the files , generate `allKeys.json`, and set the log level to `debug` to see all output. - - ```bash - tolgee-migrator migrate --pattern "src/test_files/**/*.tsx" --log-level debug --openai-api-key - ``` - -2. **Step 2:** Open the project files and `allKeys.json`, review and make any necessary updates or changes. - -3. **Step 3:** Once satisfied with the changes, upload the keys to the Tolgee platform: - - ```bash - tolgee-migrator upload-keys - ``` - -
- -### Modules - -### 1. File Finder (`findFiles.ts`) - -This module uses `fast-glob` to find all files in the project directory based on a provided pattern. It -returns a list of file paths that match the pattern. - -#### Example Usage: - -```ts -import { findFiles } from "./findFiles"; - -const files = await findFiles("src/**/*.tsx"); -console.log("Files found:", files); -``` - -### 2. Migration Status (`migrationStatus.ts`) - -This module manages the migration status, saving, loading, and checking it from a JSON file (migration-status.json). The -status is used to track which files have already been processed, ensuring that each file is processed only once. - -- **updateMigrationStatus:** Saves the current migration status to a JSON file. -- **loadMigrationStatus:** Loads the migration status from the JSON file, creating the file if it doesn't exist. -- **checkMigrationStatus:** Checks the migration status of a specific file or displays the entire migration status if - requested. - -#### Example Usage: - -```ts -import { - loadMigrationStatus, - updateMigrationStatus, - checkMigrationStatus, -} from "./migrationStatus"; - -// Load the migration status -const status = await loadMigrationStatus(); -console.log("Migration Status:", status); - -// After processing a file, update the status -await updateMigrationStatus("src/test_files/App.tsx", ["keyName1", "keyName2"]); - -// Check the status of a specific file -await checkMigrationStatus("src/test_files/App.tsx"); - -// Show the entire status -await checkMigrationStatus("", true); -``` - -### 3. ChatGPT Localization (`chatGPT.ts`) - -This module communicates with ChatGPT, using either Azure OpenAI or OpenAI setup, to process `.tsx` file contents, primarily for React components. It sends the content of `.tsx` files -to ChatGPT, requesting that string literals be replaced with the Tolgee `` component or `useTranslate` hook. The -function returns the updated file content and the list of created localization keys. - -#### Example Usage: - -```ts -import { sendFileToChatGPT } from "./chatGPT"; - -const result = await sendFileToChatGPT("src/test_files/App.tsx"); -const { updatedContent, createdKeys } = result; - -console.log("Updated Content:", updatedContent); -console.log("Created Keys:", createdKeys); -``` - -#### Extracting Keys - -The `extractCreatedKeys` function parses the response from ChatGPT, using either Azure OpenAI or OpenAI setup, to extract localization keys, -descriptions, and translations. This allows for more robust handling of the response structure and ensures that the -correct format is returned. The key names, descriptions, and default values are returned as part of the final -localization setup. - -
- -### 4. Tolgee Integration (`uploadKeysToTolgee.ts`) - -This module is responsible for uploading the keys from the `allKeys.json` file to the Tolgee platform. You can run this step manually after the migration process to ensure that all keys are finalized before uploading. - -#### Example Usage: - -```ts -import { uploadKeysToTolgee } from "./uploadKeysToTolgee"; - -const keys = [ - { - keyName: "menu.item.translation", - description: "Menu item translation", - translations: { en: "Translation" }, - }, -]; - -const result = await uploadKeysToTolgee(keys); -if (result.success) { - console.log(result.message); // Logs: Keys uploaded successfully -} else { - console.error(result.message); // Logs error message if upload fails -} -``` - -
- -### Testing - -This project includes unit tests to ensure the functionality of each module, such as file discovery, migration status tracking, and Tolgee API integration. We use [Jest](https://jestjs.io/) as the testing framework. - -#### Running Tests - -To run all tests, use the following command: - -```bash -npm test -``` - -You can also run specific test files: - -``` -npm test tests/migrationStatus.test.ts -``` - -
- -### Error Handling - -Each module includes error handling for improved reliability: - -- **File Finder:** Catches errors while reading the file system and throws meaningful messages. -- **Migration Status:** Logs errors if the migration status file cannot be read or written to. -- **ChatGPT Localization:** Throws errors when there is a failure during the ChatGPT API call. -- **Tolgee Integration:** Handles and logs errors that occur during the key upload process. -- **CLI Feedback:** The CLI informs the user about any files that fail to process or upload. Error messages will be - displayed directly in the CLI output, including details about which step failed (e.g., file reading, localization, key - upload). - -### Conclusion - -This tool automates the migration of string literals in TypeScript/TSX files to localized keys using ChatGPT, through either Azure OpenAI or OpenAI setup, and Tolgee. It is designed for ease of use, tracking migration status to prevent duplicate processing, and integration -with the Tolgee platform for seamless localization management. diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts new file mode 100755 index 0000000..8ae81c4 --- /dev/null +++ b/src/FileProcessor.ts @@ -0,0 +1,63 @@ +import fsExtra from "fs-extra"; +import { ChatGptResponse } from "./responseProviders/responseFormat"; +import { PresetType } from "./presets/PresetType"; +import { createResponseProvider } from "./responseProviders/createResponseProvider"; + +const { promises: fs } = fsExtra; + +export function FileProcessor(preset: PresetType) { + const responseProvider = createResponseProvider(preset); + + // Function to send file content to ChatGPT for migration + async function processFile(filePath: string, promptAppendixPath?: string) { + const fileContent = await fs.readFile(filePath, "utf-8"); + const promptAppendix = await loadPromptAppendix(promptAppendixPath); + return await requestCompleteResponse(fileContent, promptAppendix); + } + + // Function to load prompt appendix from a file if path is provided + async function loadPromptAppendix(filePath?: string): Promise { + if (!filePath) return ""; + try { + return await fs.readFile(filePath, "utf-8"); + } catch (error) { + throw new Error( + `[chatGPT] Error loading prompt appendix or path ${filePath}`, + ); + } + } + + // Function to request a complete response with retries + async function requestCompleteResponse( + fileContent: string, + promptAppendix: string, + ) { + const responseJson = await responseProvider.getResponse({ + fileContent: fileContent, + promptAppendix, + }); + + if (!responseJson) { + throw new NoResponseError(); + } + + try { + const response: ChatGptResponse = JSON.parse(responseJson); + return response; + } catch (e) { + if (e instanceof SyntaxError) { + throw Error("[chatGPT] Error parsing response JSON"); + } + throw e; + } + } + + return { + processFile, + }; +} + +export class NoResponseError implements Error { + message: string = "No response from OpenAI"; + name: string = "NoResponseError"; +} diff --git a/src/PromptsProvider.ts b/src/PromptsProvider.ts new file mode 100644 index 0000000..5ec3a88 --- /dev/null +++ b/src/PromptsProvider.ts @@ -0,0 +1,28 @@ +import { PresetType } from "./presets/PresetType"; + +export function PromptsProvider(preset: PresetType) { + function getPrompts({ + fileContent, + promptAppendix, + }: { + fileContent: string; + promptAppendix: string; + }) { + const systemPrompt = preset.getSystemPrompt(); + + // Append the promptAppendix if provided + const completeSystemPrompt = promptAppendix + ? `${systemPrompt}\n\nAdditional Instructions:\n${promptAppendix}` + : systemPrompt; + + const userPrompt = preset.getUserPrompt({ fileContent }); + + return { systemPrompt: completeSystemPrompt, userPrompt }; + } + + return { + getPrompts, + }; +} + +export type PromptsProviderType = ReturnType; diff --git a/src/chatGPT.ts b/src/chatGPT.ts deleted file mode 100755 index 6d7c9a8..0000000 --- a/src/chatGPT.ts +++ /dev/null @@ -1,57 +0,0 @@ -import fsExtra from "fs-extra"; -import { getOpenAiResponse } from "./getOpenAiResponse"; -import { ChatGptResponse } from "./responseProviders/responseFormat"; - -const { promises: fs } = fsExtra; - -// Function to send file content to ChatGPT for migration -export const sendFileToChatGPT = async ( - filePath: string, - promptAppendixPath?: string, -) => { - const fileContent = await fs.readFile(filePath, "utf-8"); - const promptAppendix = await loadPromptAppendix(promptAppendixPath); - return await requestCompleteResponse(fileContent, promptAppendix); -}; - -// Function to load prompt appendix from a file if path is provided -async function loadPromptAppendix(filePath?: string): Promise { - if (!filePath) return ""; - try { - return await fs.readFile(filePath, "utf-8"); - } catch (error) { - throw new Error( - `[chatGPT] Error loading prompt appendix or path ${filePath}`, - ); - } -} - -// Function to request a complete response with retries -async function requestCompleteResponse( - fileContent: string, - promptAppendix: string, -) { - const responseJson = await getOpenAiResponse({ - fileContent: fileContent, - promptAppendix, - }); - - if (!responseJson) { - throw new NoResponseError(); - } - - try { - const response: ChatGptResponse = JSON.parse(responseJson); - return response; - } catch (e) { - if (e instanceof SyntaxError) { - throw Error("[chatGPT] Error parsing response JSON"); - } - throw e; - } -} - -export class NoResponseError implements Error { - message: string = "No response from OpenAI"; - name: string = "NoResponseError"; -} diff --git a/src/cli.ts b/src/cli.ts index 87c0df6..e301eb7 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,23 +1,9 @@ #!/usr/bin/env node -import { Command, Option } from "commander"; -import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; -import { addStatusCommand } from "./commands/status/addStatusCommand"; -import { addUploadCommand } from "./commands/upload/addUploadCommand"; import { setLogLevel } from "./utils/logger"; +import {createProgram} from "./program"; -// Setup Commander CLI -const program = new Command(); - -program.name("cli").usage("[command] [options]"); -// add log level option -program.addOption( - new Option("-l, --log-level ", "Set the log level").default("info"), -); -addMigrationCommand(program); -addStatusCommand(program) -addUploadCommand(program) - +const program = createProgram(); program.parse(process.argv); // Parse the command-line arguments setLogLevel(program.opts().logLevel); diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index 4b99157..e2ff20e 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -1,5 +1,9 @@ -import {Command} from "commander"; -import {migrateFiles} from "./migrateFiles"; +import { Command, Option } from "commander"; +import { migrateFiles } from "./migrateFiles"; +import { presetShape, PresetType } from "../../presets/PresetType"; +import { buildNativePreset } from "../../presets/buildNativePreset"; +import { z } from "zod"; +import logger from "../../utils/logger"; export function addMigrationCommand(program: Command) { // Migrate command @@ -15,13 +19,39 @@ export function addMigrationCommand(program: Command) { "-a, --appendixPath ", "Path to file with custom prompt appendix", ) + .option("-r, --preset ", "Preset to use for migration", "react") .action(async (options) => { - const { pattern, appendixPath } = options; - try { - // Run the migration process - await migrateFiles(pattern, appendixPath); - } catch (error) { - console.error("[cli][migrate command] Error during migration:", error); - } + const { pattern, appendixPath, preset } = options; + // Run the migration process + await migrateFiles({ + filePattern: pattern, + preset: getAndValidatePreset(preset), + appendixPath: appendixPath, + }); }); } + +function getAndValidatePreset(preset: string): PresetType { + const presetObject = getPreset(preset); + try { + validatePreset(presetObject); + } catch (e) { + if (e instanceof z.ZodError) { + logger.error(`Invalid custom preset: ${preset}`, e.errors); + throw e; + } + } + return presetObject; +} + +function getPreset(preset: string): PresetType { + if (preset.endsWith(".js")) { + return require(preset); + } + + return buildNativePreset(preset); +} + +export function validatePreset(preset: PresetType) { + presetShape.parse(preset); +} diff --git a/src/commands/migrate/migrateFiles.ts b/src/commands/migrate/migrateFiles.ts index 60e63e7..457304d 100644 --- a/src/commands/migrate/migrateFiles.ts +++ b/src/commands/migrate/migrateFiles.ts @@ -1,18 +1,29 @@ // Main function to handle file migration interactively -import {loadMigrationStatus, updateMigrationStatus} from "../../migrationStatus"; -import {findFiles} from "../../findFiles"; -import {saveKeys} from "../../saveAllKeys"; -import {checkGitClean} from "../../common/checkGitClean"; -import {sendFileToChatGPT} from "../../chatGPT"; +import { + loadMigrationStatus, + updateMigrationStatus, +} from "../../migrationStatus"; +import { findFiles } from "../../findFiles"; +import { saveKeys } from "../../saveAllKeys"; +import { checkGitClean } from "../../common/checkGitClean"; import fsExtra from "fs-extra"; import logger from "../../utils/logger"; +import { PresetType } from "../../presets/PresetType"; +import { FileProcessor } from "../../FileProcessor"; const { promises: fs } = fsExtra; -export const migrateFiles = async ( - filePattern: string, - appendixPath?: string, -) => { +interface MigrateFilesParams { + filePattern: string; + preset: PresetType; + appendixPath?: string; +} + +export const migrateFiles = async ({ + filePattern, + preset, + appendixPath, +}: MigrateFilesParams) => { try { // Check if the Git working directory is clean if (!checkGitClean()) { @@ -38,7 +49,7 @@ export const migrateFiles = async ( logger.info( `[cli][migrateFiles] Processing file ${index + 1}/${files.length}: ${keysFilePath}`, ); - const keys = await processFile(keysFilePath, appendixPath); + const keys = await processFile(keysFilePath, preset, appendixPath); await saveKeys(keysFilePath, keys); } } catch (error) { @@ -48,31 +59,32 @@ export const migrateFiles = async ( } }; +// TODO: Refactor and batch it to improve performance +// Move single file logic to FileProcessor // Function to process a single file const processFile = async ( file: string, + preset: PresetType, appendixPath?: string, ) => { const status = await loadMigrationStatus(); // Skip already processed files if (status[file] && status[file].migrated) { - logger.info( - `[cli][processFile] Skipping already processed file: ${file}`, - ); + logger.info(`[cli][processFile] Skipping already processed file: ${file}`); return []; } + const fileProcessor = FileProcessor(preset); + try { // Send the file content to ChatGPT for localization - const result = await sendFileToChatGPT(file, appendixPath); + const result = await fileProcessor.processFile(file, appendixPath); const { newFileContents, keys } = result; - if(keys.length === 0){ - logger.info( - `[cli][processFile] No keys found in file: ${file}`, - ); + if (keys.length === 0) { + logger.info(`[cli][processFile] No keys found in file: ${file}`); await updateMigrationStatus(file, [], false); return []; } diff --git a/src/getOpenAiResponse.ts b/src/getOpenAiResponse.ts deleted file mode 100644 index 03928bb..0000000 --- a/src/getOpenAiResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { getResponseProvider } from "./responseProviders/getResponseProvider"; -import { GetResponseProps } from "./responseProviders/ResponseProvider"; - -export function getOpenAiResponse(props: GetResponseProps) { - const responseProvider = getResponseProvider(); - return responseProvider.getResponse(props); -} diff --git a/src/presets/PresetType.ts b/src/presets/PresetType.ts new file mode 100644 index 0000000..91468d9 --- /dev/null +++ b/src/presets/PresetType.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +export const presetShape = z.object({ + name: z.string(), + getUserPrompt: z + .function() + .args(z.object({ fileContent: z.string() })) + .returns(z.string()), + getSystemPrompt: z.function().returns(z.string()), +}); + +export type PresetType = z.infer; diff --git a/src/presets/buildNativePreset.ts b/src/presets/buildNativePreset.ts new file mode 100644 index 0000000..2eeb5cf --- /dev/null +++ b/src/presets/buildNativePreset.ts @@ -0,0 +1,28 @@ +import fs from "node:fs"; +import path from "node:path"; +import Handlebars from "handlebars"; +import { PresetType } from "./PresetType"; + +export function buildNativePreset(name: string): PresetType { + function getPromptContents(fileName: string) { + return fs.readFileSync(path.resolve(__dirname, name, fileName), "utf8"); + } + + function getSystemPrompt() { + const systemTemplateRaw = getPromptContents("system.handlebars"); + const systemTemplate = Handlebars.compile(systemTemplateRaw); + return systemTemplate({}); + } + + function getUserPrompt(props: { fileContent: string }) { + const systemTemplateRaw = getPromptContents("user.handlebars"); + const systemTemplate = Handlebars.compile(systemTemplateRaw); + return systemTemplate(props); + } + + return { + name, + getUserPrompt, + getSystemPrompt, + }; +} diff --git a/src/prompts/react/system.handlebars b/src/presets/react/system.handlebars similarity index 100% rename from src/prompts/react/system.handlebars rename to src/presets/react/system.handlebars diff --git a/src/prompts/react/user.handlebars b/src/presets/react/user.handlebars similarity index 100% rename from src/prompts/react/user.handlebars rename to src/presets/react/user.handlebars diff --git a/src/program.ts b/src/program.ts new file mode 100644 index 0000000..e4d839b --- /dev/null +++ b/src/program.ts @@ -0,0 +1,20 @@ +import { Command, Option } from "commander"; +import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; +import { addStatusCommand } from "./commands/status/addStatusCommand"; +import { addUploadCommand } from "./commands/upload/addUploadCommand" + +export function createProgram(): Command { + // Setup Commander CLI + const program = new Command(); + + program.name("cli").usage("[command] [options]"); + // add log level option + program.addOption( + new Option("-l, --log-level ", "Set the log level").default("info"), + ); + addMigrationCommand(program); + addStatusCommand(program); + addUploadCommand(program); + + return program; +} diff --git a/src/promptsProvider.ts b/src/promptsProvider.ts deleted file mode 100644 index 58d7a78..0000000 --- a/src/promptsProvider.ts +++ /dev/null @@ -1,41 +0,0 @@ -import Handlebars from "handlebars"; -import * as fs from "node:fs"; -import * as path from "node:path"; - -export function getPrompts({ - fileContent, - promptAppendix, -}: { - fileContent: string; - promptAppendix: string; -}) { - const systemPrompt = getSystemPrompt(); - - // Append the promptAppendix if provided - const completeSystemPrompt = promptAppendix - ? `${systemPrompt}\n\nAdditional Instructions:\n${promptAppendix}` - : systemPrompt; - - const userPrompt = getUserPrompt({ fileContent }); - - return { completeSystemPrompt, userPrompt }; -} - -function getPromptContents(fileName: string) { - return fs.readFileSync( - path.resolve(__dirname, "prompts", "react", fileName), - "utf8", - ); -} - -function getSystemPrompt() { - const systemTemplateRaw = getPromptContents("system.handlebars"); - const systemTemplate = Handlebars.compile(systemTemplateRaw); - return systemTemplate({}); -} - -function getUserPrompt(props: { fileContent: string }) { - const systemTemplateRaw = getPromptContents("user.handlebars"); - const systemTemplate = Handlebars.compile(systemTemplateRaw); - return systemTemplate(props); -} diff --git a/src/responseProviders/AzureResponseProvider.ts b/src/responseProviders/AzureResponseProvider.ts index 81173cc..1ce9d79 100644 --- a/src/responseProviders/AzureResponseProvider.ts +++ b/src/responseProviders/AzureResponseProvider.ts @@ -1,26 +1,30 @@ import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; -import { getPrompts } from "../promptsProvider"; import { AzureOpenAI } from "openai"; import { chatGptResponseFormat } from "./responseFormat"; +import { PromptsProviderType } from "../PromptsProvider"; -export function AzureResponseProvider(config: { - apiVersion: string; - azureApiKey: any; - azureEndpoint: any; - deployment: any; +export function AzureResponseProvider(providerProps: { + config: { + apiVersion: string; + azureApiKey: any; + azureEndpoint: any; + deployment: any; + }; + promptsProvider: PromptsProviderType; }): ResponseProvider { const azureClient = new AzureOpenAI({ - apiKey: config.azureApiKey, - endpoint: config.azureEndpoint, - deployment: config.deployment, - apiVersion: config.apiVersion, + apiKey: providerProps.config.azureApiKey, + endpoint: providerProps.config.azureEndpoint, + deployment: providerProps.config.deployment, + apiVersion: providerProps.config.apiVersion, }); return { async getResponse( props: GetResponseProps, ): Promise { - const { completeSystemPrompt, userPrompt } = getPrompts(props); + const { systemPrompt, userPrompt } = + providerProps.promptsProvider.getPrompts(props); const response = await azureClient.chat.completions.create({ model: "gpt-4o", @@ -29,7 +33,7 @@ export function AzureResponseProvider(config: { messages: [ { role: "system", - content: completeSystemPrompt, + content: systemPrompt, }, { role: "user", diff --git a/src/responseProviders/OpenAiResponseProvider.ts b/src/responseProviders/OpenAiResponseProvider.ts index ac0c63b..68ee15c 100644 --- a/src/responseProviders/OpenAiResponseProvider.ts +++ b/src/responseProviders/OpenAiResponseProvider.ts @@ -1,12 +1,14 @@ import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; import { OpenAI } from "openai"; -import { getPrompts } from "../promptsProvider"; +import { PromptsProviderType } from "../PromptsProvider"; import { chatGptResponseFormat } from "./responseFormat"; export function OpenAiResponseProvider({ openAiApiKey, + promptsProvider, }: { openAiApiKey: string; + promptsProvider: PromptsProviderType; }): ResponseProvider { const openai = new OpenAI({ apiKey: openAiApiKey, @@ -16,7 +18,7 @@ export function OpenAiResponseProvider({ async getResponse( props: GetResponseProps, ): Promise { - const { completeSystemPrompt, userPrompt } = getPrompts(props); + const { systemPrompt, userPrompt } = promptsProvider.getPrompts(props); const response = await openai.chat.completions.create( { @@ -25,7 +27,7 @@ export function OpenAiResponseProvider({ messages: [ { role: "system", - content: completeSystemPrompt, + content: systemPrompt, }, { role: "user", diff --git a/src/responseProviders/getResponseProvider.ts b/src/responseProviders/createResponseProvider.ts similarity index 70% rename from src/responseProviders/getResponseProvider.ts rename to src/responseProviders/createResponseProvider.ts index 188f535..42df4e9 100644 --- a/src/responseProviders/getResponseProvider.ts +++ b/src/responseProviders/createResponseProvider.ts @@ -2,10 +2,12 @@ import { ResponseProvider } from "./ResponseProvider"; import { AzureResponseProvider } from "./AzureResponseProvider"; import { OpenAiResponseProvider } from "./OpenAiResponseProvider"; import dotenv from "dotenv"; +import { PromptsProvider } from "../PromptsProvider"; +import { PresetType } from "../presets/PresetType"; dotenv.config(); -// Load environment variables +// TODO: Get rid of the environment const azureApiKey = process.env.AZURE_OPENAI_API_KEY; const azureEndpoint = process.env.AZURE_OPENAI_ENDPOINT; const openAiApiKey = process.env.OPENAI_API_KEY; @@ -14,19 +16,22 @@ const deployment = process.env.AZURE_OPENAI_DEPLOYMENT; const apiVersion = "2024-10-01-preview"; type ApiProvider = "AZURE_OPENAI" | "OPENAI"; -export function getResponseProvider(): ResponseProvider { +export function createResponseProvider(preset: PresetType): ResponseProvider { const apiProviderType: ApiProvider = getApiProviderType(); - + const promptsProvider = PromptsProvider(preset); switch (apiProviderType) { case "AZURE_OPENAI": return AzureResponseProvider({ - azureApiKey: azureApiKey!, - azureEndpoint, - deployment, - apiVersion, + config: { + azureApiKey: azureApiKey!, + azureEndpoint, + deployment, + apiVersion, + }, + promptsProvider, }); case "OPENAI": - return OpenAiResponseProvider({ openAiApiKey: openAiApiKey! }); + return OpenAiResponseProvider({ openAiApiKey: openAiApiKey!, promptsProvider }); } } diff --git a/tests/fixtures/invalid-preset.js b/tests/fixtures/invalid-preset.js new file mode 100644 index 0000000..0fa6e13 --- /dev/null +++ b/tests/fixtures/invalid-preset.js @@ -0,0 +1,5 @@ +module.exports = { + name: 'My react', + getUserPrompt: "I am a test prompt!", + getSystemPrompt: () => "I am a system prompt!" +} diff --git a/tests/fixtures/my-preset.js b/tests/fixtures/my-preset.js new file mode 100644 index 0000000..8b72e59 --- /dev/null +++ b/tests/fixtures/my-preset.js @@ -0,0 +1,5 @@ +module.exports = { + name: 'My react', + getUserPrompt: (props) => "I am a test prompt!", + getSystemPrompt: () => "I am a system prompt!" +} diff --git a/tests/presets.test.ts b/tests/presets.test.ts new file mode 100644 index 0000000..4be8280 --- /dev/null +++ b/tests/presets.test.ts @@ -0,0 +1,48 @@ +import { migrateFiles } from "../src/commands/migrate/migrateFiles"; +import { PresetType } from "../src/presets/PresetType"; +import { validatePreset } from "../src/commands/migrate/addMigrationCommand"; +import Mock = jest.Mock; +import { createProgram } from "../src/program"; +import path from "node:path"; +import {ZodError} from "zod"; + +jest.mock("fast-glob"); +jest.mock("../src/commands/migrate/migrateFiles"); + +describe("presets", () => { + it("preset argument should work", async () => { + runWithPreset("my-preset.js"); + expect(migrateFiles).toHaveBeenCalledTimes(1); + const calls = (migrateFiles as Mock).mock.calls; + const preset = calls[0][0].preset as PresetType; + expect(() => { + validatePreset(preset); + }).not.toThrow(); + }); + + it("fails on invalid preset", async () => { + await expect(async () => { + try { + await runWithPreset("invalid-preset.js"); + } catch (e) { + const zodError = (e as ZodError) + const message = zodError.message; + expect(message).toContain("invalid_type"); + expect(message).toContain("getUserPrompt"); + throw e; + } + }).rejects.toThrow(expect.any(ZodError)); + }); +}); + +async function runWithPreset(preset: string) { + const program = createProgram(); + const presetPath = path.resolve(__dirname, "fixtures", preset); + await program.parseAsync([ + "npx", + "tolgee-migrator", + "migrate", + "--preset", + presetPath, + ]); +} diff --git a/testsGpt/gptResponses.test.ts b/testsGpt/gptResponses.test.ts index ab954fb..577f150 100644 --- a/testsGpt/gptResponses.test.ts +++ b/testsGpt/gptResponses.test.ts @@ -1,22 +1,27 @@ -import { sendFileToChatGPT } from "../src/chatGPT"; +import { FileProcessor } from "../src/FileProcessor"; import * as path from "node:path"; +import { buildNativePreset } from "../src/presets/buildNativePreset"; describe("Chat GPT", () => { + const fileProcessor = FileProcessor(buildNativePreset("react")); + it( "correctly uses T component", async () => { - const result = await sendFileToChatGPT( + const result = await fileProcessor.processFile( path.resolve(__dirname + "/exampleFiles/simple.tsx.txt"), ); - expect(result.keys).toHaveLength(1) - expect(result.keys[0].name).toBe("welcome-message") - expect(result.keys[0].description.length).toBeGreaterThan(10) - expect(result.keys[0].default).toBe("Welcome!") - expect(result.newFileContents).toBe("import { T } from '@tolgee/react';\n" + - "\n" + - "export const WelcomeMessage = () => {\n" + - " return
;\n" + - "};\n") + expect(result.keys).toHaveLength(1); + expect(result.keys[0].name).toBe("welcome-message"); + expect(result.keys[0].description.length).toBeGreaterThan(10); + expect(result.keys[0].default).toBe("Welcome!"); + expect(result.newFileContents).toBe( + "import { T } from '@tolgee/react';\n" + + "\n" + + "export const WelcomeMessage = () => {\n" + + ' return
;\n' + + "};\n", + ); }, 60 * 1000, ); @@ -24,15 +29,15 @@ describe("Chat GPT", () => { it( "correctly uses useTranslate hook", async () => { - const result = await sendFileToChatGPT( + const result = await fileProcessor.processFile( path.resolve(__dirname + "/exampleFiles/useTranslate.tsx.txt"), ); - expect(result.keys).toHaveLength(1) - expect(result.keys[0].name).toContain("password") - expect(result.keys[0].name).toContain("placeholder") - expect(result.keys[0].description.length).toBeGreaterThan(10) - expect(result.keys[0].default).toBe("New password") - expect(result.newFileContents).toContain("const { t } = useTranslate();") + expect(result.keys).toHaveLength(1); + expect(result.keys[0].name).toContain("password"); + expect(result.keys[0].name).toContain("placeholder"); + expect(result.keys[0].description.length).toBeGreaterThan(10); + expect(result.keys[0].default).toBe("New password"); + expect(result.newFileContents).toContain("const { t } = useTranslate();"); expect(result.newFileContents).toContain("t('new-password-"); }, 60 * 1000, From 0f2cdd05fd317edd125d53dafaa8038cc5e91f79 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sat, 9 Nov 2024 19:29:00 +0100 Subject: [PATCH 04/21] feat: More refactoring and chunking --- jest.config.js | 7 ++ src/FileProcessor.ts | 14 ++- src/cli.ts | 22 +++- src/commands/migrate/FilesMigrator.ts | 115 +++++++++++++++++++ src/commands/migrate/addMigrationCommand.ts | 16 ++- src/commands/migrate/migrateFiles.ts | 116 -------------------- src/migrationStatus.ts | 63 +++++------ src/saveAllKeys.ts | 48 -------- src/uploadKeysToTolgee.ts | 13 +-- 9 files changed, 200 insertions(+), 214 deletions(-) create mode 100644 jest.config.js create mode 100644 src/commands/migrate/FilesMigrator.ts delete mode 100644 src/commands/migrate/migrateFiles.ts delete mode 100644 src/saveAllKeys.ts diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..f5d30d1 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,7 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} **/ +module.exports = { + testEnvironment: "node", + transform: { + "^.+.tsx?$": ["ts-jest",{}], + }, +}; \ No newline at end of file diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts index 8ae81c4..d3c6abf 100755 --- a/src/FileProcessor.ts +++ b/src/FileProcessor.ts @@ -2,17 +2,27 @@ import fsExtra from "fs-extra"; import { ChatGptResponse } from "./responseProviders/responseFormat"; import { PresetType } from "./presets/PresetType"; import { createResponseProvider } from "./responseProviders/createResponseProvider"; +import logger from "./utils/logger"; const { promises: fs } = fsExtra; +export type FileProcessorType = ReturnType; +export type ProcessFileReturnType = + ReturnType extends Promise + ? T + : never; + export function FileProcessor(preset: PresetType) { const responseProvider = createResponseProvider(preset); - // Function to send file content to ChatGPT for migration async function processFile(filePath: string, promptAppendixPath?: string) { + logger.info(`[FileProcessor] Processing file: ${filePath}`); const fileContent = await fs.readFile(filePath, "utf-8"); const promptAppendix = await loadPromptAppendix(promptAppendixPath); - return await requestCompleteResponse(fileContent, promptAppendix); + const result = await requestCompleteResponse(fileContent, promptAppendix); + await fs.writeFile(filePath, result.newFileContents); + logger.info(`[FileProcessor] Processed file: ${filePath} ✅`); + return result; } // Function to load prompt appendix from a file if path is provided diff --git a/src/cli.ts b/src/cli.ts index e301eb7..703780c 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,9 +1,21 @@ #!/usr/bin/env node -import { setLogLevel } from "./utils/logger"; -import {createProgram} from "./program"; +import logger, { setLogLevel } from "./utils/logger"; +import { createProgram } from "./program"; -const program = createProgram(); -program.parse(process.argv); // Parse the command-line arguments +async function main() { + const program = createProgram(); + try { + const promise = program.parseAsync(process.argv); // Parse the command-line arguments + + const logLevel = program.opts().logLevel; + setLogLevel(logLevel); + await promise; + } catch (e) { + logger.error(e); + process.exit(1); + } +} + +main(); -setLogLevel(program.opts().logLevel); diff --git a/src/commands/migrate/FilesMigrator.ts b/src/commands/migrate/FilesMigrator.ts new file mode 100644 index 0000000..3d8813e --- /dev/null +++ b/src/commands/migrate/FilesMigrator.ts @@ -0,0 +1,115 @@ +// Main function to handle file migration interactively +import { + FileStatus, + loadMigrationStatus, + updateMigrationStatus, +} from "../../migrationStatus"; +import { findFiles } from "../../findFiles"; +import { checkGitClean } from "../../common/checkGitClean"; +import logger from "../../utils/logger"; +import { PresetType } from "../../presets/PresetType"; +import { FileProcessor, ProcessFileReturnType } from "../../FileProcessor"; + +interface FilesMigratorProps { + filePattern: string; + preset: PresetType; + appendixPath?: string; + chunkSize: number; +} + +export function FilesMigrator({ + filePattern, + preset, + appendixPath, + chunkSize, +}: FilesMigratorProps) { + const fileProcessor = FileProcessor(preset); + + const migrateFiles = async () => { + // Check if the Git working directory is clean + if (!checkGitClean()) { + return; + } + + // Find the files to process + const files = await findFiles(filePattern); + + if (!files || files.length === 0) { + logger.info("[cli][migrateFiles] No files found for the given pattern."); + return; + } + + logger.info( + `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, + ); + + async function processChunk(chunk: string[]) { + const status = await loadMigrationStatus(); + const all = await Promise.all( + chunk.map((file) => { + // Skip already processed files + if (status[file] && status[file].migrated) { + logger.info( + `[cli][processFile] Skipping already processed file: ${file}`, + ); + return null; + } + + return fileProcessor + .processFile(file, appendixPath) + .then((result) => ({ + result: result as ProcessFileReturnType, + filePath: file, + error: undefined, + })) + .catch((e) => ({ + filePath: file, + error: e, + result: undefined as ProcessFileReturnType | undefined, + })); + }), + ); + const fileStatuses: FileStatus[] = all.map((result) => { + if (!result) { + throw Error("No result from processFile"); + } + + if (!result.error) { + if (!result.result) { + throw Error("No error and no result from processFile"); + } + return { + filePath: result.filePath, + keys: result.result.keys, + success: true, + }; + } + + return { + filePath: result.filePath, + keys: [] as any, + success: false, + }; + }); + await updateMigrationStatus({ currentStatus: status, fileStatuses }); + } + + await forEachChunk(files, chunkSize, async (chunk) => { + await processChunk(chunk); + }); + }; + + return { + migrateFiles, + }; +} + +async function forEachChunk( + arr: T[], + chunkSize: number, + callback: (chunk: T[]) => Promise, +) { + for (let i = 0; i < arr.length; i += chunkSize) { + await callback(arr.slice(i, i + chunkSize)); + } +} diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index e2ff20e..b23a169 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -1,9 +1,9 @@ -import { Command, Option } from "commander"; -import { migrateFiles } from "./migrateFiles"; +import { Command } from "commander"; import { presetShape, PresetType } from "../../presets/PresetType"; import { buildNativePreset } from "../../presets/buildNativePreset"; import { z } from "zod"; import logger from "../../utils/logger"; +import { FilesMigrator } from "./FilesMigrator"; export function addMigrationCommand(program: Command) { // Migrate command @@ -20,14 +20,22 @@ export function addMigrationCommand(program: Command) { "Path to file with custom prompt appendix", ) .option("-r, --preset ", "Preset to use for migration", "react") + .option( + "-c, --chunk-size ", + "Chunk size for files processing. If greater than 1, files will be sent to ChatGPT in parallel.", + "5", + ) .action(async (options) => { - const { pattern, appendixPath, preset } = options; + const { pattern, appendixPath, preset, chunkSize } = options; // Run the migration process - await migrateFiles({ + const migrator = FilesMigrator({ filePattern: pattern, preset: getAndValidatePreset(preset), appendixPath: appendixPath, + chunkSize: parseInt(chunkSize), }); + + await migrator.migrateFiles(); }); } diff --git a/src/commands/migrate/migrateFiles.ts b/src/commands/migrate/migrateFiles.ts deleted file mode 100644 index 457304d..0000000 --- a/src/commands/migrate/migrateFiles.ts +++ /dev/null @@ -1,116 +0,0 @@ -// Main function to handle file migration interactively -import { - loadMigrationStatus, - updateMigrationStatus, -} from "../../migrationStatus"; -import { findFiles } from "../../findFiles"; -import { saveKeys } from "../../saveAllKeys"; -import { checkGitClean } from "../../common/checkGitClean"; -import fsExtra from "fs-extra"; -import logger from "../../utils/logger"; -import { PresetType } from "../../presets/PresetType"; -import { FileProcessor } from "../../FileProcessor"; - -const { promises: fs } = fsExtra; - -interface MigrateFilesParams { - filePattern: string; - preset: PresetType; - appendixPath?: string; -} - -export const migrateFiles = async ({ - filePattern, - preset, - appendixPath, -}: MigrateFilesParams) => { - try { - // Check if the Git working directory is clean - if (!checkGitClean()) { - return; - } - - // Find the files to process - const files = await findFiles(filePattern); - - if (!files || files.length === 0) { - logger.info("[cli][migrateFiles] No files found for the given pattern."); - return; - } - - logger.info( - `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, - ); - - // Process each file sequentially - //iterate over index and value - for (let index = 0; index < files.length; index++) { - const keysFilePath = files[index]; - logger.info( - `[cli][migrateFiles] Processing file ${index + 1}/${files.length}: ${keysFilePath}`, - ); - const keys = await processFile(keysFilePath, preset, appendixPath); - await saveKeys(keysFilePath, keys); - } - } catch (error) { - console.error( - `[cli][migrateFiles] Error during localization process: ${error}`, - ); - } -}; - -// TODO: Refactor and batch it to improve performance -// Move single file logic to FileProcessor -// Function to process a single file -const processFile = async ( - file: string, - preset: PresetType, - appendixPath?: string, -) => { - const status = await loadMigrationStatus(); - - // Skip already processed files - if (status[file] && status[file].migrated) { - logger.info(`[cli][processFile] Skipping already processed file: ${file}`); - return []; - } - - const fileProcessor = FileProcessor(preset); - - try { - // Send the file content to ChatGPT for localization - const result = await fileProcessor.processFile(file, appendixPath); - - const { newFileContents, keys } = result; - - if (keys.length === 0) { - logger.info(`[cli][processFile] No keys found in file: ${file}`); - await updateMigrationStatus(file, [], false); - return []; - } - - // Overwrite the original file - await fs.writeFile(file, newFileContents, "utf8"); - logger.info( - `[cli][processFile] File ${file} has been updated successfully.`, - ); - - // Get the relevant key names - const relevantKeys = keys.map((key) => key.name); - - // Mark the file as processed and include relevant keys - await updateMigrationStatus(file, relevantKeys, true); - - logger.info( - `[cli][processFile] Successfully processed and updated file: ${file}`, - ); - - return keys; - } catch (e) { - logger.error(`[cli][processFile] Migration failed for file: ${file}`, e); - - // Update migration status to indicate failure - await updateMigrationStatus(file, [], false); // Pass false to mark as not migrated - return []; - } -}; diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index f142356..6d5dfaa 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -1,55 +1,62 @@ import fsExtra from "fs-extra"; import { getFilePaths } from "./FilePaths"; import logger from "./utils/logger"; +import { Key } from "./responseProviders/responseFormat"; +import path from "node:path"; const { promises: fs } = fsExtra; -interface MigrationStatus { +export interface MigrationStatus { [filePath: string]: { migrated: boolean; - relevantKeys: string[]; + keys: Key[]; }; } +export interface FileStatus { + filePath: string; + keys: Key[]; + success: boolean; +} + +interface UpdateMigrationStatusProps { + fileStatuses: FileStatus[]; + currentStatus: MigrationStatus; +} + // Function to update migration status -export const updateMigrationStatus = async ( - filePath: string, - relevantKeys: string[], - success: boolean, -): Promise => { - try { - const { storageDir, statusFilePath } = getFilePaths(); - await fsExtra.ensureDir(storageDir); - const currentStatus = await loadMigrationStatus(); +export const updateMigrationStatus = async ({ + currentStatus, + fileStatuses, + }: UpdateMigrationStatusProps): Promise => { + const {storageDir, statusFilePath} = getFilePaths(); + await fsExtra.ensureDir(storageDir); + fileStatuses.forEach(({ filePath, keys, success }) => { // Update the file status and relevant keys currentStatus[filePath] = { migrated: success, - relevantKeys, + keys, }; + }); - // Write the updated status back to the JSON file - await fs.writeFile( - statusFilePath, - JSON.stringify(currentStatus, null, 2), - "utf8", - ); - } catch (error) { - console.error( - "[migrationStatus][update] Error updating migration status:", - error, - ); - } + // Write the updated status back to the JSON file + await fs.writeFile( + statusFilePath, + JSON.stringify(currentStatus, null, 2), + "utf8", + ); }; // Function to load migration status export const loadMigrationStatus = async (): Promise => { - try { const { statusFilePath } = getFilePaths(); // Check if the file exists before trying to load it const exists = await fsExtra.pathExists(statusFilePath); if (!exists) { + const dirname = path.dirname(statusFilePath) + await fsExtra.ensureDir(dirname); await fsExtra.writeJson(statusFilePath, {}); } @@ -62,12 +69,6 @@ export const loadMigrationStatus = async (): Promise => { // File is not empty return JSON.parse(fileContent) as MigrationStatus; } - } catch (error) { - console.error( - `[migrationStatus][load] Error loading migration status: ${error}`, - ); - return {}; - } }; // Function to check the migration status of a specific file or show the entire status diff --git a/src/saveAllKeys.ts b/src/saveAllKeys.ts deleted file mode 100644 index a9dc8d9..0000000 --- a/src/saveAllKeys.ts +++ /dev/null @@ -1,48 +0,0 @@ -import fsExtra from "fs-extra"; -import {Key} from "./responseProviders/responseFormat"; -import { getFilePaths } from "./FilePaths"; - -export type AllKeysFile = { [filePath: string]: Key[] } - -// Function to save or append keys -export const saveKeys = async (filePath: string, keys: Key[]) => { - const { allKeysFilePath } = getFilePaths(); - - try { - let allKeys: AllKeysFile = {}; - const fileExists = await fsExtra.pathExists(allKeysFilePath); - - if (fileExists) { - try { - allKeys = await fsExtra.readJson(allKeysFilePath); - } catch (error) { - console.warn( - "[saveKeys] Warning: allKeys.json is empty or malformed. Initializing as empty object.", - ); - allKeys = {}; - } - } else { - await fsExtra.writeJson(allKeysFilePath, allKeys, { spaces: 2 }); - } - - // Check if the specified filePath already exists in allKeys.json - if (!allKeys[filePath]) { - // If file path does not exist, add the new keys for this file - allKeys[filePath] = keys; - } else { - // If file path exists, filter out keys that are already present - const existingKeys = allKeys[filePath].map((keyObj) => keyObj.name); - const keysToAdd = keys.filter((key) => !existingKeys.includes(key.name)); - - // Only update if there are new keys to add - if (keysToAdd.length > 0) { - allKeys[filePath] = [...allKeys[filePath], ...keysToAdd]; - } - } - - // Write updated allKeys object back to allKeys.json - await fsExtra.writeJson(allKeysFilePath, allKeys, { spaces: 2 }); - } catch (error) { - console.error("[saveAllKeys] Error saving keys:", error); - } -}; diff --git a/src/uploadKeysToTolgee.ts b/src/uploadKeysToTolgee.ts index 519173d..68f5fca 100755 --- a/src/uploadKeysToTolgee.ts +++ b/src/uploadKeysToTolgee.ts @@ -1,15 +1,12 @@ -import { Key } from "./responseProviders/responseFormat"; -import fsExtra from "fs-extra"; -import { getFilePaths } from "./FilePaths"; -import { AllKeysFile } from "./saveAllKeys"; import { TolgeeProjectClientType } from "./common/client/TolgeeProjectClient"; +import { loadMigrationStatus } from "./migrationStatus"; export const uploadKeysToTolgee = async (client: TolgeeProjectClientType) => { - const { allKeysFilePath } = getFilePaths(); + const status = await loadMigrationStatus(); - const keys = (await fsExtra.readJson(allKeysFilePath)) as AllKeysFile; - - const allKeys = Object.values(keys).flat() as Key[]; + const allKeys = Object.values(status) + .map((fileStatus) => fileStatus.keys) + .flat(); const baseLanguageTag = await client.getBaseLanguageTag(); From 377e16d98ee6b87ef7a46ca1a2ff85ff9b878ef0 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sat, 9 Nov 2024 21:05:37 +0100 Subject: [PATCH 05/21] feat: Prettier and retrying --- README.backup.md | 14 +-- jest.config.js | 4 +- src/FilePaths.ts | 4 +- src/FileProcessor.ts | 53 +++++--- src/cli.ts | 1 - src/commands/migrate/FilesMigrator.ts | 119 ++++++++---------- src/commands/migrate/addMigrationCommand.ts | 10 +- src/commands/status/addStatusCommand.ts | 2 +- src/common/checkGitClean.ts | 2 +- src/common/client/TolgeeProjectClient.ts | 5 +- src/common/client/decodeApiKey.ts | 16 +-- src/migrationStatus.ts | 45 +++---- src/presets/react/system.handlebars | 1 + src/presets/react/user.handlebars | 5 +- src/program.ts | 2 +- .../createResponseProvider.ts | 5 +- src/responseProviders/responseFormat.tsx | 4 +- src/utils/logger.ts | 9 +- tests/fixtures/invalid-preset.js | 6 +- tests/fixtures/my-preset.js | 6 +- tests/presets.test.ts | 4 +- 21 files changed, 168 insertions(+), 149 deletions(-) diff --git a/README.backup.md b/README.backup.md index d55ec9b..312de9f 100644 --- a/README.backup.md +++ b/README.backup.md @@ -128,12 +128,11 @@ tolgee-migrator migrate [options] - `-l, --log-level `: Sets the logging level. Available options are `error`, `warn`, `info`, `verbose`, and `debug`. Defaults to `info. - - Example: - - ```bash - tolgee-migrator --log-level debug migrate --pattern "src/test_files/**/*.tsx" - ``` + - Example: + ```bash + tolgee-migrator --log-level debug migrate --pattern "src/test_files/**/*.tsx" + ``` - `-p, --pattern `: Defines the file pattern to search for files to process. The default pattern is `src/**/*.tsx`. @@ -155,9 +154,10 @@ tolgee-migrator migrate [options] - Example: - ```bash + ````bash tolgee-migrator migrate --appendixPath "./path/to/instructions.txt" ```- `--azure-api-key `: Specifies the Azure OpenAI API key. + ```` - `--azure-endpoint `: Specifies the Azure OpenAI endpoint URL. @@ -281,7 +281,7 @@ The available log levels are: - `info`: Important messages, errors, and progress updates (default). - `verbose`: Information about each file being processed. - `debug`: Full output, including prompts and responses. - +
**Running the CLI** diff --git a/jest.config.js b/jest.config.js index f5d30d1..304a65d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,6 @@ module.exports = { testEnvironment: "node", transform: { - "^.+.tsx?$": ["ts-jest",{}], + "^.+.tsx?$": ["ts-jest", {}], }, -}; \ No newline at end of file +}; diff --git a/src/FilePaths.ts b/src/FilePaths.ts index 7b648a2..ca20e59 100644 --- a/src/FilePaths.ts +++ b/src/FilePaths.ts @@ -13,9 +13,9 @@ function FilePaths(workingDir?: string) { allKeysFilePath, statusFilePath, storageDir, - } + }; } -export function getFilePaths(){ +export function getFilePaths() { return FilePaths(); } diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts index d3c6abf..353970e 100755 --- a/src/FileProcessor.ts +++ b/src/FileProcessor.ts @@ -6,25 +6,41 @@ import logger from "./utils/logger"; const { promises: fs } = fsExtra; -export type FileProcessorType = ReturnType; -export type ProcessFileReturnType = - ReturnType extends Promise - ? T - : never; - export function FileProcessor(preset: PresetType) { const responseProvider = createResponseProvider(preset); async function processFile(filePath: string, promptAppendixPath?: string) { - logger.info(`[FileProcessor] Processing file: ${filePath}`); const fileContent = await fs.readFile(filePath, "utf-8"); const promptAppendix = await loadPromptAppendix(promptAppendixPath); - const result = await requestCompleteResponse(fileContent, promptAppendix); - await fs.writeFile(filePath, result.newFileContents); - logger.info(`[FileProcessor] Processed file: ${filePath} ✅`); + const result = await getResponseRetrying(fileContent, promptAppendix); + await writeFileIfKeysExtracted(filePath, result); return result; } + + // TODO: Test this + async function getResponseRetrying( + fileContent: string, + promptAppendix: string, + ) { + const retries = 3; + let response: ChatGptResponse | null = null; + for (let i = 0; i < retries; i++) { + try { + response = await getResponse(fileContent, promptAppendix); + break; + } catch (e) { + if (e instanceof SyntaxError) { + logger.info(`Retrying on GPT response parse error...`); + continue; + } + throw e; + } + } + + return response!; + } + // Function to load prompt appendix from a file if path is provided async function loadPromptAppendix(filePath?: string): Promise { if (!filePath) return ""; @@ -38,10 +54,7 @@ export function FileProcessor(preset: PresetType) { } // Function to request a complete response with retries - async function requestCompleteResponse( - fileContent: string, - promptAppendix: string, - ) { + async function getResponse(fileContent: string, promptAppendix: string) { const responseJson = await responseProvider.getResponse({ fileContent: fileContent, promptAppendix, @@ -55,13 +68,19 @@ export function FileProcessor(preset: PresetType) { const response: ChatGptResponse = JSON.parse(responseJson); return response; } catch (e) { - if (e instanceof SyntaxError) { - throw Error("[chatGPT] Error parsing response JSON"); - } throw e; } } + async function writeFileIfKeysExtracted( + filePath: string, + result: ChatGptResponse, + ) { + if (result.keys.length > 0) { + await fs.writeFile(filePath, result.newFileContents); + } + } + return { processFile, }; diff --git a/src/cli.ts b/src/cli.ts index 703780c..57a38d9 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -18,4 +18,3 @@ async function main() { } main(); - diff --git a/src/commands/migrate/FilesMigrator.ts b/src/commands/migrate/FilesMigrator.ts index 3d8813e..79aa8f4 100644 --- a/src/commands/migrate/FilesMigrator.ts +++ b/src/commands/migrate/FilesMigrator.ts @@ -1,6 +1,4 @@ -// Main function to handle file migration interactively import { - FileStatus, loadMigrationStatus, updateMigrationStatus, } from "../../migrationStatus"; @@ -8,30 +6,28 @@ import { findFiles } from "../../findFiles"; import { checkGitClean } from "../../common/checkGitClean"; import logger from "../../utils/logger"; import { PresetType } from "../../presets/PresetType"; -import { FileProcessor, ProcessFileReturnType } from "../../FileProcessor"; +import { FileProcessor } from "../../FileProcessor"; interface FilesMigratorProps { filePattern: string; preset: PresetType; appendixPath?: string; - chunkSize: number; + concurrency: number; } export function FilesMigrator({ filePattern, preset, appendixPath, - chunkSize, + concurrency, }: FilesMigratorProps) { const fileProcessor = FileProcessor(preset); const migrateFiles = async () => { - // Check if the Git working directory is clean if (!checkGitClean()) { return; } - // Find the files to process const files = await findFiles(filePattern); if (!files || files.length === 0) { @@ -43,73 +39,64 @@ export function FilesMigrator({ `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, ); - async function processChunk(chunk: string[]) { - const status = await loadMigrationStatus(); - const all = await Promise.all( - chunk.map((file) => { - // Skip already processed files - if (status[file] && status[file].migrated) { - logger.info( - `[cli][processFile] Skipping already processed file: ${file}`, - ); - return null; - } + const fileQueue = [...files]; + const activePromises: Promise[] = []; + let processed = 0; - return fileProcessor - .processFile(file, appendixPath) - .then((result) => ({ - result: result as ProcessFileReturnType, - filePath: file, - error: undefined, - })) - .catch((e) => ({ - filePath: file, - error: e, - result: undefined as ProcessFileReturnType | undefined, - })); - }), - ); - const fileStatuses: FileStatus[] = all.map((result) => { - if (!result) { - throw Error("No result from processFile"); - } + const status = await loadMigrationStatus(); + + const processFile = async (file: string) => { + if (status[file] && status[file].migrated) { + logger.info( + `[cli][processFile] Skipping already processed file: ${file}`, + ); + return; + } + + try { + logger.info(`[FileProcessor] Processing file: ${file}`); + const result = await fileProcessor.processFile(file, appendixPath); + logger.info( + `[FileProcessor] Processed file: ${file} ✅ ${++processed}/${files.length}`, + ); + await updateMigrationStatus({ + currentStatus: status, + fileStatuses: [{ filePath: file, keys: result.keys, success: true }], + }); + } catch (error) { + logger.error( + `[cli][processFile] Error processing file: ${file}`, + error, + ); + await updateMigrationStatus({ + currentStatus: status, + fileStatuses: [{ filePath: file, keys: [], success: false }], + }); + } + }; - if (!result.error) { - if (!result.result) { - throw Error("No error and no result from processFile"); + const processQueue = async () => { + while (fileQueue.length > 0) { + if (activePromises.length < concurrency) { + const file = fileQueue.shift(); + if (file) { + const promise = processFile(file).then(() => { + activePromises.splice(activePromises.indexOf(promise), 1); + }); + activePromises.push(promise); } - return { - filePath: result.filePath, - keys: result.result.keys, - success: true, - }; + } else { + await Promise.race(activePromises); } + } + await Promise.all(activePromises); + }; - return { - filePath: result.filePath, - keys: [] as any, - success: false, - }; - }); - await updateMigrationStatus({ currentStatus: status, fileStatuses }); - } - - await forEachChunk(files, chunkSize, async (chunk) => { - await processChunk(chunk); - }); + await processQueue(); + logger.info("[cli][migrateFiles] Migration completed."); }; return { migrateFiles, }; } - -async function forEachChunk( - arr: T[], - chunkSize: number, - callback: (chunk: T[]) => Promise, -) { - for (let i = 0; i < arr.length; i += chunkSize) { - await callback(arr.slice(i, i + chunkSize)); - } -} diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index b23a169..4213be6 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -21,18 +21,18 @@ export function addMigrationCommand(program: Command) { ) .option("-r, --preset ", "Preset to use for migration", "react") .option( - "-c, --chunk-size ", - "Chunk size for files processing. If greater than 1, files will be sent to ChatGPT in parallel.", - "5", + "-c, --concurrency ", + "Number of files to process concurrently", + "10", ) .action(async (options) => { - const { pattern, appendixPath, preset, chunkSize } = options; + const { pattern, appendixPath, preset, concurrency } = options; // Run the migration process const migrator = FilesMigrator({ filePattern: pattern, preset: getAndValidatePreset(preset), appendixPath: appendixPath, - chunkSize: parseInt(chunkSize), + concurrency: parseInt(concurrency), }); await migrator.migrateFiles(); diff --git a/src/commands/status/addStatusCommand.ts b/src/commands/status/addStatusCommand.ts index 4382480..142364e 100644 --- a/src/commands/status/addStatusCommand.ts +++ b/src/commands/status/addStatusCommand.ts @@ -1,5 +1,5 @@ import { Command } from "commander"; -import {checkMigrationStatus} from "../../migrationStatus"; +import { checkMigrationStatus } from "../../migrationStatus"; export function addStatusCommand(program: Command) { program diff --git a/src/common/checkGitClean.ts b/src/common/checkGitClean.ts index 74f25a7..3fa9037 100644 --- a/src/common/checkGitClean.ts +++ b/src/common/checkGitClean.ts @@ -1,5 +1,5 @@ // Function to check if the Git working directory is clean -import {execSync} from "child_process"; +import { execSync } from "child_process"; export function checkGitClean(): boolean { const result = execSync("git status --porcelain").toString().trim(); diff --git a/src/common/client/TolgeeProjectClient.ts b/src/common/client/TolgeeProjectClient.ts index 1c2d8e3..01fa951 100644 --- a/src/common/client/TolgeeProjectClient.ts +++ b/src/common/client/TolgeeProjectClient.ts @@ -55,7 +55,10 @@ function getUrl({ return `${origin}/v2/projects/${projectId}${endpointPath}`; } -function getProjectId(props: { apiKey: string; passedProjectId: string | number }) { +function getProjectId(props: { + apiKey: string; + passedProjectId: string | number; +}) { if (props.passedProjectId) { return props.passedProjectId; } diff --git a/src/common/client/decodeApiKey.ts b/src/common/client/decodeApiKey.ts index c60dbc4..043297e 100644 --- a/src/common/client/decodeApiKey.ts +++ b/src/common/client/decodeApiKey.ts @@ -1,10 +1,10 @@ -const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; +const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; function readChar(char: string) { const idx = alphabet.indexOf(char); if (idx === -1) { - throw new Error('Invalid character found: ' + char); + throw new Error("Invalid character found: " + char); } return idx; @@ -13,7 +13,7 @@ function readChar(char: string) { function arrayBufferToString(buffer: any) { const bufView = new Uint8Array(buffer); const length = bufView.length; - let result = ''; + let result = ""; let addition = Math.pow(2, 16) - 1; for (let i = 0; i < length; i += addition) { @@ -23,7 +23,7 @@ function arrayBufferToString(buffer: any) { result += String.fromCharCode.apply( null, // @ts-ignore - bufView.subarray(i, i + addition) + bufView.subarray(i, i + addition), ); } @@ -55,15 +55,15 @@ function base32Decode(input: string) { } export function getProjectIdFromApiKey( - key: string | undefined + key: string | undefined, ): number | undefined { if (!key) { return undefined; } try { - const [prefix, rest] = key.split('_'); - if (prefix === 'tgpak') { - const [projectId] = base32Decode(rest).split('_'); + const [prefix, rest] = key.split("_"); + if (prefix === "tgpak") { + const [projectId] = base32Decode(rest).split("_"); return Number(projectId); } } catch { diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index 6d5dfaa..dd00ff7 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -24,12 +24,15 @@ interface UpdateMigrationStatusProps { currentStatus: MigrationStatus; } +let writingPromise: Promise | null = Promise.resolve(); + // Function to update migration status export const updateMigrationStatus = async ({ - currentStatus, - fileStatuses, - }: UpdateMigrationStatusProps): Promise => { - const {storageDir, statusFilePath} = getFilePaths(); + currentStatus, + fileStatuses, +}: UpdateMigrationStatusProps): Promise => { + await writingPromise; + const { storageDir, statusFilePath } = getFilePaths(); await fsExtra.ensureDir(storageDir); fileStatuses.forEach(({ filePath, keys, success }) => { @@ -50,25 +53,25 @@ export const updateMigrationStatus = async ({ // Function to load migration status export const loadMigrationStatus = async (): Promise => { - const { statusFilePath } = getFilePaths(); + const { statusFilePath } = getFilePaths(); - // Check if the file exists before trying to load it - const exists = await fsExtra.pathExists(statusFilePath); - if (!exists) { - const dirname = path.dirname(statusFilePath) - await fsExtra.ensureDir(dirname); - await fsExtra.writeJson(statusFilePath, {}); - } + // Check if the file exists before trying to load it + const exists = await fsExtra.pathExists(statusFilePath); + if (!exists) { + const dirname = path.dirname(statusFilePath); + await fsExtra.ensureDir(dirname); + await fsExtra.writeJson(statusFilePath, {}); + } - // If the file exists, load it - const fileContent = await fs.readFile(statusFilePath, "utf8"); - if (!fileContent.trim()) { - // File is empty - return {}; - } else { - // File is not empty - return JSON.parse(fileContent) as MigrationStatus; - } + // If the file exists, load it + const fileContent = await fs.readFile(statusFilePath, "utf8"); + if (!fileContent.trim()) { + // File is empty + return {}; + } else { + // File is not empty + return JSON.parse(fileContent) as MigrationStatus; + } }; // Function to check the migration status of a specific file or show the entire status diff --git a/src/presets/react/system.handlebars b/src/presets/react/system.handlebars index 301509d..e4c10ff 100644 --- a/src/presets/react/system.handlebars +++ b/src/presets/react/system.handlebars @@ -13,6 +13,7 @@ Follow these important rules: - should become - **Use T component only for suitable places. When the target needs string for some reason, use t function and add useTranslate hook to the component top. - Import T or useTranslate it from @tolgee/react package. Import only what you need! Don't forget to use useTranslate, but use it only when required! +- This is the right way to get t function using useTranslate(): `const { t } = useTranslate();` - Never keep default in the code (it's stored to the json files') - e.g. Don't do `Save`, instead do `` - e.g. Don't do `t('new-list-item-input-placeholder', 'New list item')`, instead do `t('new-list-item-input-placeholder')` diff --git a/src/presets/react/user.handlebars b/src/presets/react/user.handlebars index 3e9eaa4..e149064 100644 --- a/src/presets/react/user.handlebars +++ b/src/presets/react/user.handlebars @@ -1,4 +1,3 @@ -Here is the file content that needs to be processed: -``` +Here is the file content that needs to be processed: ``` {{fileContent}} -``` +``` \ No newline at end of file diff --git a/src/program.ts b/src/program.ts index e4d839b..3a35f79 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1,7 +1,7 @@ import { Command, Option } from "commander"; import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; import { addStatusCommand } from "./commands/status/addStatusCommand"; -import { addUploadCommand } from "./commands/upload/addUploadCommand" +import { addUploadCommand } from "./commands/upload/addUploadCommand"; export function createProgram(): Command { // Setup Commander CLI diff --git a/src/responseProviders/createResponseProvider.ts b/src/responseProviders/createResponseProvider.ts index 42df4e9..c12cafd 100644 --- a/src/responseProviders/createResponseProvider.ts +++ b/src/responseProviders/createResponseProvider.ts @@ -31,7 +31,10 @@ export function createResponseProvider(preset: PresetType): ResponseProvider { promptsProvider, }); case "OPENAI": - return OpenAiResponseProvider({ openAiApiKey: openAiApiKey!, promptsProvider }); + return OpenAiResponseProvider({ + openAiApiKey: openAiApiKey!, + promptsProvider, + }); } } diff --git a/src/responseProviders/responseFormat.tsx b/src/responseProviders/responseFormat.tsx index 06375de..454f001 100644 --- a/src/responseProviders/responseFormat.tsx +++ b/src/responseProviders/responseFormat.tsx @@ -1,5 +1,5 @@ -import {z} from "zod"; -import {zodResponseFormat} from "openai/helpers/zod"; +import { z } from "zod"; +import { zodResponseFormat } from "openai/helpers/zod"; const keySchema = z.object({ name: z.string(), diff --git a/src/utils/logger.ts b/src/utils/logger.ts index fc33176..9658241 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -5,10 +5,15 @@ const logLevel = process.env.LOG_LEVEL || "info"; // Default to "info" const logger = winston.createLogger({ level: logLevel, format: winston.format.combine( + winston.format.errors({ stack: true }), winston.format.colorize(), winston.format.timestamp(), - winston.format.printf(({ timestamp, level, message }) => { - return `[${timestamp}] ${level}: ${message}`; + winston.format.printf(({ timestamp, level, message, stack }) => { + if (!stack) { + return `[${timestamp}] ${level}: ${message}`; + } else { + return `[${timestamp}] ${level}: ${message}\n${stack}`; + } }), ), transports: [ diff --git a/tests/fixtures/invalid-preset.js b/tests/fixtures/invalid-preset.js index 0fa6e13..016ddd5 100644 --- a/tests/fixtures/invalid-preset.js +++ b/tests/fixtures/invalid-preset.js @@ -1,5 +1,5 @@ module.exports = { - name: 'My react', + name: "My react", getUserPrompt: "I am a test prompt!", - getSystemPrompt: () => "I am a system prompt!" -} + getSystemPrompt: () => "I am a system prompt!", +}; diff --git a/tests/fixtures/my-preset.js b/tests/fixtures/my-preset.js index 8b72e59..10cedf3 100644 --- a/tests/fixtures/my-preset.js +++ b/tests/fixtures/my-preset.js @@ -1,5 +1,5 @@ module.exports = { - name: 'My react', + name: "My react", getUserPrompt: (props) => "I am a test prompt!", - getSystemPrompt: () => "I am a system prompt!" -} + getSystemPrompt: () => "I am a system prompt!", +}; diff --git a/tests/presets.test.ts b/tests/presets.test.ts index 4be8280..e018340 100644 --- a/tests/presets.test.ts +++ b/tests/presets.test.ts @@ -4,7 +4,7 @@ import { validatePreset } from "../src/commands/migrate/addMigrationCommand"; import Mock = jest.Mock; import { createProgram } from "../src/program"; import path from "node:path"; -import {ZodError} from "zod"; +import { ZodError } from "zod"; jest.mock("fast-glob"); jest.mock("../src/commands/migrate/migrateFiles"); @@ -25,7 +25,7 @@ describe("presets", () => { try { await runWithPreset("invalid-preset.js"); } catch (e) { - const zodError = (e as ZodError) + const zodError = e as ZodError; const message = zodError.message; expect(message).toContain("invalid_type"); expect(message).toContain("getUserPrompt"); From 550b79d49ac3092de2e7eb5453fd7018c6a8ecab Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 08:40:20 +0100 Subject: [PATCH 06/21] fix: Move config to commandline options --- src/FileProcessor.ts | 14 +++++-- src/commands/migrate/FilesMigrator.ts | 5 ++- src/commands/migrate/addMigrationCommand.ts | 19 +++++++--- .../createResponseProvider.ts | 37 ++++++++++++------- testsGpt/exampleFiles/simple.tsx.txt | 4 +- testsGpt/exampleFiles/useTranslate.tsx.txt | 5 ++- testsGpt/gptResponses.test.ts | 19 +++++++++- 7 files changed, 76 insertions(+), 27 deletions(-) diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts index 353970e..fd2ff73 100755 --- a/src/FileProcessor.ts +++ b/src/FileProcessor.ts @@ -1,13 +1,19 @@ import fsExtra from "fs-extra"; import { ChatGptResponse } from "./responseProviders/responseFormat"; import { PresetType } from "./presets/PresetType"; -import { createResponseProvider } from "./responseProviders/createResponseProvider"; +import { + createResponseProvider, + AiProviderOptions, +} from "./responseProviders/createResponseProvider"; import logger from "./utils/logger"; const { promises: fs } = fsExtra; -export function FileProcessor(preset: PresetType) { - const responseProvider = createResponseProvider(preset); +export function FileProcessor( + preset: PresetType, + providerOptions: AiProviderOptions, +) { + const responseProvider = createResponseProvider(preset, providerOptions); async function processFile(filePath: string, promptAppendixPath?: string) { const fileContent = await fs.readFile(filePath, "utf-8"); @@ -17,8 +23,8 @@ export function FileProcessor(preset: PresetType) { return result; } - // TODO: Test this + // retry on rate limit exceeded async function getResponseRetrying( fileContent: string, promptAppendix: string, diff --git a/src/commands/migrate/FilesMigrator.ts b/src/commands/migrate/FilesMigrator.ts index 79aa8f4..6c534c7 100644 --- a/src/commands/migrate/FilesMigrator.ts +++ b/src/commands/migrate/FilesMigrator.ts @@ -7,12 +7,14 @@ import { checkGitClean } from "../../common/checkGitClean"; import logger from "../../utils/logger"; import { PresetType } from "../../presets/PresetType"; import { FileProcessor } from "../../FileProcessor"; +import { AiProviderOptions } from "../../responseProviders/createResponseProvider"; interface FilesMigratorProps { filePattern: string; preset: PresetType; appendixPath?: string; concurrency: number; + providerOptions: AiProviderOptions; } export function FilesMigrator({ @@ -20,8 +22,9 @@ export function FilesMigrator({ preset, appendixPath, concurrency, + providerOptions }: FilesMigratorProps) { - const fileProcessor = FileProcessor(preset); + const fileProcessor = FileProcessor(preset, providerOptions); const migrateFiles = async () => { if (!checkGitClean()) { diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index 4213be6..a20bd36 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -25,14 +25,23 @@ export function addMigrationCommand(program: Command) { "Number of files to process concurrently", "10", ) + // TODO: align with Tolgee CLI + .option("-k, --api-key ", "OpenAI or Azure OpenAI API key") + .option("-e, --endpoint ", "Azure OpenAI endpoint") + .option("-d, --deployment ", "Azure OpenAI deployment") .action(async (options) => { - const { pattern, appendixPath, preset, concurrency } = options; // Run the migration process const migrator = FilesMigrator({ - filePattern: pattern, - preset: getAndValidatePreset(preset), - appendixPath: appendixPath, - concurrency: parseInt(concurrency), + filePattern: options.pattern, + preset: getAndValidatePreset(options.preset), + appendixPath: options.appendixPath, + concurrency: parseInt(options.concurrency), + providerOptions: { + openAiApiKey: options.apiKey, + azureApiKey: options.apiKey, + azureEndpoint: options.endpoint, + azureDeployment: options.deployment, + } }); await migrator.migrateFiles(); diff --git a/src/responseProviders/createResponseProvider.ts b/src/responseProviders/createResponseProvider.ts index c12cafd..26e28e6 100644 --- a/src/responseProviders/createResponseProvider.ts +++ b/src/responseProviders/createResponseProvider.ts @@ -1,31 +1,36 @@ import { ResponseProvider } from "./ResponseProvider"; import { AzureResponseProvider } from "./AzureResponseProvider"; import { OpenAiResponseProvider } from "./OpenAiResponseProvider"; -import dotenv from "dotenv"; import { PromptsProvider } from "../PromptsProvider"; import { PresetType } from "../presets/PresetType"; -dotenv.config(); - -// TODO: Get rid of the environment -const azureApiKey = process.env.AZURE_OPENAI_API_KEY; -const azureEndpoint = process.env.AZURE_OPENAI_ENDPOINT; -const openAiApiKey = process.env.OPENAI_API_KEY; - -const deployment = process.env.AZURE_OPENAI_DEPLOYMENT; const apiVersion = "2024-10-01-preview"; type ApiProvider = "AZURE_OPENAI" | "OPENAI"; -export function createResponseProvider(preset: PresetType): ResponseProvider { - const apiProviderType: ApiProvider = getApiProviderType(); +export type AiProviderOptions = { + openAiApiKey?: string; + azureApiKey?: string; + azureEndpoint?: string; + azureDeployment?: string; +}; + +export function createResponseProvider( + preset: PresetType, + providerOptions: AiProviderOptions, +): ResponseProvider { + const apiProviderType: ApiProvider = getApiProviderType(providerOptions); const promptsProvider = PromptsProvider(preset); + + const { openAiApiKey, azureApiKey, azureEndpoint, azureDeployment } = + providerOptions; + switch (apiProviderType) { case "AZURE_OPENAI": return AzureResponseProvider({ config: { azureApiKey: azureApiKey!, azureEndpoint, - deployment, + deployment: azureDeployment, apiVersion, }, promptsProvider, @@ -38,7 +43,11 @@ export function createResponseProvider(preset: PresetType): ResponseProvider { } } -function getApiProviderType(): ApiProvider { +function getApiProviderType({ + azureApiKey, + azureEndpoint, + openAiApiKey, +}: AiProviderOptions): ApiProvider { if (azureApiKey && azureEndpoint) { return "AZURE_OPENAI"; } @@ -48,6 +57,6 @@ function getApiProviderType(): ApiProvider { } throw new Error( - "No API provider credentials specified in .env file, specify either Azure OpenAI or OpenAI credentials", + "No API provider credentials specified in configuration, specify either OpenAI or Azure OpenAI credentials", ); } diff --git a/testsGpt/exampleFiles/simple.tsx.txt b/testsGpt/exampleFiles/simple.tsx.txt index 98bf113..75e47b4 100644 --- a/testsGpt/exampleFiles/simple.tsx.txt +++ b/testsGpt/exampleFiles/simple.tsx.txt @@ -1,3 +1,5 @@ +import { T } from '@tolgee/react'; + export const WelcomeMessage = () => { - return
Welcome!
; + return
; }; diff --git a/testsGpt/exampleFiles/useTranslate.tsx.txt b/testsGpt/exampleFiles/useTranslate.tsx.txt index f6dcbe1..dbb6ee2 100644 --- a/testsGpt/exampleFiles/useTranslate.tsx.txt +++ b/testsGpt/exampleFiles/useTranslate.tsx.txt @@ -1,3 +1,6 @@ +import { useTranslate } from '@tolgee/react'; + export const PasswordField = () => { - return ; + const { t } = useTranslate(); + return ; }; diff --git a/testsGpt/gptResponses.test.ts b/testsGpt/gptResponses.test.ts index 577f150..d1ceeff 100644 --- a/testsGpt/gptResponses.test.ts +++ b/testsGpt/gptResponses.test.ts @@ -1,9 +1,10 @@ import { FileProcessor } from "../src/FileProcessor"; import * as path from "node:path"; import { buildNativePreset } from "../src/presets/buildNativePreset"; +import dotenv from "dotenv"; describe("Chat GPT", () => { - const fileProcessor = FileProcessor(buildNativePreset("react")); + const fileProcessor = createFileProcessor(); it( "correctly uses T component", @@ -43,3 +44,19 @@ describe("Chat GPT", () => { 60 * 1000, ); }); + +function createFileProcessor() { + dotenv.config(); + + const azureApiKey = process.env.AZURE_OPENAI_API_KEY; + const azureEndpoint = process.env.AZURE_OPENAI_ENDPOINT; + const openAiApiKey = process.env.OPENAI_API_KEY; + const deployment = process.env.AZURE_OPENAI_DEPLOYMENT; + + return FileProcessor(buildNativePreset("react"), { + openAiApiKey, + azureApiKey, + azureEndpoint, + azureDeployment: deployment, + }); +} From 58beb53004923fded0df26854a7f37d85725a228 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 13:31:40 +0100 Subject: [PATCH 07/21] fix: Minor fixes & OpenAI provider & retries and tests --- src/FileProcessor.ts | 36 +++-- src/commands/migrate/addMigrationCommand.ts | 1 - src/commands/upload/addUploadCommand.ts | 7 +- src/common/retryOnError.ts | 65 +++++++++ src/common/sleep.ts | 3 + src/presets/react/system.handlebars | 7 +- .../OpenAiResponseProvider.ts | 3 +- tests/FileProcessor.test.ts | 75 ++++++++++ tests/keyExtractor.test.ts | 27 ---- tests/migrationStatus.test.ts | 129 ------------------ tests/presets.test.ts | 10 +- 11 files changed, 173 insertions(+), 190 deletions(-) create mode 100644 src/common/retryOnError.ts create mode 100644 src/common/sleep.ts create mode 100644 tests/FileProcessor.test.ts delete mode 100644 tests/keyExtractor.test.ts delete mode 100644 tests/migrationStatus.test.ts diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts index fd2ff73..4389821 100755 --- a/src/FileProcessor.ts +++ b/src/FileProcessor.ts @@ -2,10 +2,10 @@ import fsExtra from "fs-extra"; import { ChatGptResponse } from "./responseProviders/responseFormat"; import { PresetType } from "./presets/PresetType"; import { - createResponseProvider, AiProviderOptions, + createResponseProvider, } from "./responseProviders/createResponseProvider"; -import logger from "./utils/logger"; +import { retryOnError, retryOnRateLimit } from "./common/retryOnError"; const { promises: fs } = fsExtra; @@ -23,28 +23,26 @@ export function FileProcessor( return result; } - // TODO: Test this - // retry on rate limit exceeded async function getResponseRetrying( fileContent: string, promptAppendix: string, ) { - const retries = 3; - let response: ChatGptResponse | null = null; - for (let i = 0; i < retries; i++) { - try { - response = await getResponse(fileContent, promptAppendix); - break; - } catch (e) { - if (e instanceof SyntaxError) { - logger.info(`Retrying on GPT response parse error...`); - continue; + return await retryOnRateLimit({ + callback: async () => + retryOnError({ + callback: async () => getResponse(fileContent, promptAppendix), + retries: 3, + errorMatcher: (e) => e instanceof SyntaxError, + }), + retryAfterProvider: (e: any) => { + if (e["status"] === 429) { + const retryAfter = 60000; + if (!retryAfter) return undefined; + return retryAfter; } - throw e; - } - } - - return response!; + return undefined; + }, + }); } // Function to load prompt appendix from a file if path is provided diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index a20bd36..e001236 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -25,7 +25,6 @@ export function addMigrationCommand(program: Command) { "Number of files to process concurrently", "10", ) - // TODO: align with Tolgee CLI .option("-k, --api-key ", "OpenAI or Azure OpenAI API key") .option("-e, --endpoint ", "Azure OpenAI endpoint") .option("-d, --deployment ", "Azure OpenAI deployment") diff --git a/src/commands/upload/addUploadCommand.ts b/src/commands/upload/addUploadCommand.ts index 89ef31b..e48dd67 100644 --- a/src/commands/upload/addUploadCommand.ts +++ b/src/commands/upload/addUploadCommand.ts @@ -6,10 +6,9 @@ export function addUploadCommand(program: Command) { program .command("upload-keys") .description("Upload the localization strings to Tolgee") - // TODO: Align with tolgee CLI - .addOption(new Option("-p, --projectId ", "Tolgee project ID")) - .addOption(new Option("-a, --apiKey ", "Tolgee API key")) - .addOption(new Option("-u, --apiUrl ", "Tolgee API URL")) + .addOption(new Option("-au, --api-url ", "Tolgee API URL")) + .addOption(new Option("-ak, --api-key ", "Tolgee API key")) + .addOption(new Option("-p, --project-id ", "Tolgee project ID (required only when using project API key)")) .action(async function (opts) { const client = TolgeeProjectClient({ projectId: opts["projectId"], diff --git a/src/common/retryOnError.ts b/src/common/retryOnError.ts new file mode 100644 index 0000000..576ff37 --- /dev/null +++ b/src/common/retryOnError.ts @@ -0,0 +1,65 @@ +import logger from "../utils/logger"; +import {sleep} from "./sleep"; + +interface RetryOnErrorParams { + retries: number; + callback: () => Promise; + errorMatcher?: (error: any) => boolean; +} + +export async function retryOnError({ + retries, + callback, + errorMatcher, +}: RetryOnErrorParams): Promise { + let attempts = 0; + let lastError: any; + while (attempts < retries) { + try { + return await callback(); + } catch (error) { + if (errorMatcher && !errorMatcher(error)) { + throw error; + } + attempts++; + if (attempts >= retries) { + lastError = error; + break; + } + } + } + + logger.error("Retry limit exceeded after " + attempts + " attempts..."); + throw lastError!; +} + +interface RetryOnRateLimitParams { + retryAfterProvider: (e: any) => number | undefined; + callback: () => Promise; +} + +/** + * Retry a callback when a rate limit is exceeded + * @param retryAfterProvider If provider returns a positive number, the callback will be retried after that many milliseconds + * @param callback + */ +export async function retryOnRateLimit({ + retryAfterProvider, + callback, +}: RetryOnRateLimitParams): Promise { + while (true) { + try { + return await callback(); + } catch (error) { + const retryAfter = retryAfterProvider(error as Error); + if (retryAfter && retryAfter > 0) { + logger.info( + `Rate limit exceeded. Retrying after ${Math.round(retryAfter / 1000)} seconds...`, + ); + await sleep(retryAfter); + continue; + } + throw error; + } + } +} diff --git a/src/common/sleep.ts b/src/common/sleep.ts new file mode 100644 index 0000000..69dc25d --- /dev/null +++ b/src/common/sleep.ts @@ -0,0 +1,3 @@ +export async function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/src/presets/react/system.handlebars b/src/presets/react/system.handlebars index e4c10ff..4cda3f6 100644 --- a/src/presets/react/system.handlebars +++ b/src/presets/react/system.handlebars @@ -15,8 +15,8 @@ Follow these important rules: - Import T or useTranslate it from @tolgee/react package. Import only what you need! Don't forget to use useTranslate, but use it only when required! - This is the right way to get t function using useTranslate(): `const { t } = useTranslate();` - Never keep default in the code (it's stored to the json files') - - e.g. Don't do `Save`, instead do `` - - e.g. Don't do `t('new-list-item-input-placeholder', 'New list item')`, instead do `t('new-list-item-input-placeholder')` + - e.g. Don't do `Save` do `` instead. + - e.g. Don't do `t('new-list-item-input-placeholder', 'New list item')`. Do `t('new-list-item-input-placeholder')` instead. - **When generating key names**, ensure that each keyName is unique and descriptive, based on the original content. The key name should reflect the purpose or content of the string. **Do not use generic key names like "translations" in JSON files.**. - For example, "Share" should map to "share-button", "My cool app" should map to "app-title", and "Add item" button should map to "add-item-button". @@ -41,6 +41,7 @@ Follow these important rules: - Don't use any dynamic keys like, always use static key names, - e.g. do this `{isCool ? : }` instead of this `` - Don't try to translate dynamic strings - - e.g.
{tooltip}
, should be kept as it is. Only translate hardcoded strings + - e.g.
{tooltip}
, should be kept as it is. Only translate hardcoded strings. Don't do
{t('icon-button-tooltip', { tooltip })}
or anything similar - If there is a probability that component won't accept component as prop, rather use t functions - e.g. Don't do } />, instead do +- Only return keys, which are really used in the source file. Don't return unused keys. diff --git a/src/responseProviders/OpenAiResponseProvider.ts b/src/responseProviders/OpenAiResponseProvider.ts index 68ee15c..0e6b6b0 100644 --- a/src/responseProviders/OpenAiResponseProvider.ts +++ b/src/responseProviders/OpenAiResponseProvider.ts @@ -22,7 +22,7 @@ export function OpenAiResponseProvider({ const response = await openai.chat.completions.create( { - model: "gpt-4o", + model: "gpt-4o-2024-08-06", response_format: chatGptResponseFormat, messages: [ { @@ -34,7 +34,6 @@ export function OpenAiResponseProvider({ content: userPrompt, }, ], - max_tokens: 1024, }, { headers: { diff --git a/tests/FileProcessor.test.ts b/tests/FileProcessor.test.ts new file mode 100644 index 0000000..c1591bf --- /dev/null +++ b/tests/FileProcessor.test.ts @@ -0,0 +1,75 @@ +import { RateLimitError } from "openai"; +import { FileProcessor } from "../src/FileProcessor"; +import { buildNativePreset } from "../src/presets/buildNativePreset"; +import { OpenAiResponseProvider } from "../src/responseProviders/OpenAiResponseProvider"; +import { sleep } from "../src/common/sleep"; + +jest.mock("../src/responseProviders/OpenAiResponseProvider"); +jest.mock("fs-extra", () => ({ + promises: { + readFile: jest.fn(), + }, +})); +jest.mock("../src/common/sleep"); + +describe("File processor test", () => { + it("retries on JSON when syntax error", async () => { + const MockedResponseProvider = jest.mocked(OpenAiResponseProvider); + + const getResponseMock = jest.fn(async () => "res"); + MockedResponseProvider.mockReturnValue({ + getResponse: getResponseMock, + }); + + const fileProcessor = FileProcessor(buildNativePreset("react"), { + openAiApiKey: "dummy", + }); + + await expect(async () => { + await fileProcessor.processFile("dummyFilepath", ""); + }).rejects.toThrow(SyntaxError); + expect(getResponseMock).toHaveBeenCalledTimes(3); + }); + + it("retries on rate limit exceeded", async () => { + const MockedResponseProvider = jest.mocked(OpenAiResponseProvider); + + const getResponseMock = jest.fn(() => { + throw new RateLimitError(429, undefined, undefined, undefined); + }); + MockedResponseProvider.mockReturnValue({ + getResponse: getResponseMock, + }); + + const fileProcessor = FileProcessor(buildNativePreset("react"), { + openAiApiKey: "dummy", + }); + + const mockedSleep = jest.mocked(sleep); + + let resolve: (() => void) | null = null; + + mockedSleep.mockImplementation( + () => + new Promise((r) => { + resolve = r; + }), + ); + + fileProcessor.processFile("dummyFilepath", ""); + + await afterEventLoopCycle(); + + expect(getResponseMock).toHaveBeenCalledTimes(1); + + resolve!(); + + await afterEventLoopCycle(); + + expect(getResponseMock).toHaveBeenCalledTimes(2); + }); +}); + +function afterEventLoopCycle() { + return new Promise((resolve) => setImmediate(resolve)); +} diff --git a/tests/keyExtractor.test.ts b/tests/keyExtractor.test.ts deleted file mode 100644 index 3550357..0000000 --- a/tests/keyExtractor.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { extractCreatedKeys } from "../src/keyExtractor"; - -describe("keyExtractor", () => { - it("should extract keys correctly from a structured JSON string", () => { - const fileContent = ` - { - "submit_button": { - "description": "Button to submit a form.", - "en": "Submit" - } - }`; - const keys = extractCreatedKeys(fileContent); - expect(keys).toEqual([ - { - keyName: "submit_button", - description: "Button to submit a form.", - translations: { en: "Submit" }, - }, - ]); - }); - - it("should handle files with no keys", () => { - const fileContent = "No keys here!"; - const keys = extractCreatedKeys(fileContent); - expect(keys).toEqual([]); - }); -}); diff --git a/tests/migrationStatus.test.ts b/tests/migrationStatus.test.ts deleted file mode 100644 index 4061d8a..0000000 --- a/tests/migrationStatus.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - updateMigrationStatus, - loadMigrationStatus, - checkMigrationStatus, -} from "../src/migrationStatus"; -import fsExtra from "fs-extra"; - -// Mock fs-extra and fs -jest.mock("fs-extra", () => ({ - promises: { - readFile: jest.fn(), - writeFile: jest.fn(), - }, - pathExists: jest.fn(), -})); - -describe("migrationStatus", () => { - const mockStatus = { - "file1.tsx": { - migrated: true, - relevantKeys: ["key1", "key2"], - }, - }; - - beforeEach(() => { - jest.clearAllMocks(); // Clear all mocks before each test - }); - - it("should load migration status from a JSON file", async () => { - (fsExtra.pathExists as jest.Mock).mockResolvedValue(true); - (fsExtra.promises.readFile as jest.Mock).mockResolvedValue( - JSON.stringify(mockStatus), - ); - - const status = await loadMigrationStatus(); - - expect(fsExtra.pathExists).toHaveBeenCalledWith("./migration-status.json"); // Ensure pathExists is called with the correct path - expect(status).toEqual(mockStatus); - }); - - it("should return an empty object when the file does not exist", async () => { - // Mock fsExtra.pathExists to return false (file does not exist) - (fsExtra.pathExists as jest.Mock).mockResolvedValue(false); - - const status = await loadMigrationStatus(); - - expect(fsExtra.pathExists).toHaveBeenCalledWith("./migration-status.json"); - expect(status).toEqual({}); // Expect an empty object when the file doesn't exist - }); - - it("should update migration status in the JSON file", async () => { - // Mock the current status as being empty initially - (fsExtra.pathExists as jest.Mock).mockResolvedValue(true); - (fsExtra.promises.readFile as jest.Mock).mockResolvedValue("{}"); - - const relevantKeys = ["key1", "key2"]; - await updateMigrationStatus("file1.tsx", relevantKeys, true); - - const expectedStatus = { - "file1.tsx": { - migrated: true, - relevantKeys, - }, - }; - - expect(fsExtra.promises.writeFile).toHaveBeenCalledWith( - "./migration-status.json", - JSON.stringify(expectedStatus, null, 2), - "utf8", - ); - }); - - it("should handle empty files when loading migration status", async () => { - // Mock fsExtra.pathExists to return true - (fsExtra.pathExists as jest.Mock).mockResolvedValue(true); - // Mock fs.readFile to return an empty string (simulating an empty file) - (fsExtra.promises.readFile as jest.Mock).mockResolvedValue(""); - - const status = await loadMigrationStatus(); - - expect(status).toEqual({}); // Expect an empty object when the file is empty - }); - - it("should check migration status for a specific file", async () => { - (fsExtra.pathExists as jest.Mock).mockResolvedValue(true); - (fsExtra.promises.readFile as jest.Mock).mockResolvedValue( - JSON.stringify(mockStatus), - ); - - // Call the function to check the migration status - await checkMigrationStatus("file1.tsx"); - - // Assert that the mocked console.log was called with the expected message - expect(console.log).toHaveBeenCalledWith( - `Migration status for file1.tsx:`, - mockStatus["file1.tsx"], - ); - }); - - it("should display a message when a file is not migrated", async () => { - (fsExtra.pathExists as jest.Mock).mockResolvedValue(true); - (fsExtra.promises.readFile as jest.Mock).mockResolvedValue( - JSON.stringify(mockStatus), - ); - - // Call the function with a file that hasn't been migrated - await checkMigrationStatus("file2.tsx"); - - // Assert that the mocked console.log was called with the correct message - expect(console.log).toHaveBeenCalledWith( - "file2.tsx has not been migrated yet.", - ); - }); - - it("should handle errors when updating migration status", async () => { - (fsExtra.promises.writeFile as jest.Mock).mockRejectedValue( - new Error("Write error"), - ); - - const relevantKeys = ["key1", "key2"]; - await updateMigrationStatus("file1.tsx", relevantKeys, false); - - // Assert that the mocked console.error was called with the correct error message - expect(console.error).toHaveBeenCalledWith( - "Error updating migration status:", - expect.any(Error), - ); - }); -}); diff --git a/tests/presets.test.ts b/tests/presets.test.ts index e018340..b890733 100644 --- a/tests/presets.test.ts +++ b/tests/presets.test.ts @@ -1,19 +1,19 @@ -import { migrateFiles } from "../src/commands/migrate/migrateFiles"; import { PresetType } from "../src/presets/PresetType"; import { validatePreset } from "../src/commands/migrate/addMigrationCommand"; -import Mock = jest.Mock; import { createProgram } from "../src/program"; import path from "node:path"; import { ZodError } from "zod"; +import Mock = jest.Mock; +import {FilesMigrator} from "../src/commands/migrate/FilesMigrator"; jest.mock("fast-glob"); -jest.mock("../src/commands/migrate/migrateFiles"); +jest.mock("../src/commands/migrate/FilesMigrator"); describe("presets", () => { it("preset argument should work", async () => { runWithPreset("my-preset.js"); - expect(migrateFiles).toHaveBeenCalledTimes(1); - const calls = (migrateFiles as Mock).mock.calls; + expect(FilesMigrator).toHaveBeenCalledTimes(1); + const calls = (FilesMigrator as Mock).mock.calls; const preset = calls[0][0].preset as PresetType; expect(() => { validatePreset(preset); From e172d43bbd3d28dcc69274a6cc34f00e3aca0228 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 14:35:47 +0100 Subject: [PATCH 08/21] fix: Migration integration test --- src/commands/migrate/addMigrationCommand.ts | 2 +- src/test.tsx | 0 tests/migration.test.ts | 146 ++++++++++++++++++++ 3 files changed, 147 insertions(+), 1 deletion(-) delete mode 100644 src/test.tsx create mode 100644 tests/migration.test.ts diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index e001236..6d920be 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -13,7 +13,7 @@ export function addMigrationCommand(program: Command) { .option( "-p, --pattern ", "File pattern to search for (e.g., src/**/*.tsx)", - "src/**/*.tsx", + "src/**/*", ) .option( "-a, --appendixPath ", diff --git a/src/test.tsx b/src/test.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/tests/migration.test.ts b/tests/migration.test.ts new file mode 100644 index 0000000..4789be9 --- /dev/null +++ b/tests/migration.test.ts @@ -0,0 +1,146 @@ +import { createProgram } from "../src/program"; +import logger from "../src/utils/logger"; + +jest.mock("openai"); +jest.mock("fast-glob"); +jest.mock("fs-extra"); +jest.mock("child_process"); +jest.mock("../src/responseProviders/OpenAiResponseProvider"); + +import * as child_process from "child_process"; +import fsExtra from "fs-extra"; +import glob from "fast-glob"; +import { OpenAiResponseProvider } from "../src/responseProviders/OpenAiResponseProvider"; +import { ChatGptResponse } from "../src/responseProviders/responseFormat"; +import { ResponseProvider } from "../src/responseProviders/ResponseProvider"; + +const mockedFilePaths = ["dummyFilepath.tsx", "dummyFilepath2.tsx"]; + +/** + * This is integration test for the whole migration process. + * It mocks only the necessary parts. + */ +describe("migration", () => { + jest.spyOn(logger, "info"); + it("migrates correctly", async () => { + const { mockedFs } = initMocks(); + + await run(); + + expect(mockedFs.writeFile).toHaveBeenCalledWith( + "dummyFilepath.tsx", + "newFileContents", + ); + expect(mockedFs.writeFile).not.toHaveBeenCalledWith( + "dummyFilepath2.tsx", + "newFileContents", + ); + expect(mockedFs.writeFile.mock.calls[2][1]).toEqual( + JSON.stringify(resultingMigrationStatus, undefined, 2), + ); + expect(logger.info).toHaveBeenCalledWith( + expect.stringContaining("Migration completed"), + ); + expect(logger.info).toHaveBeenCalledWith( + expect.stringContaining("Processed file: dummyFilepath2.tsx"), + ); + + expect(logger.info).toHaveBeenCalledWith( + expect.stringContaining("Processed file: dummyFilepath.tsx"), + ); + expect(logger.info).toHaveBeenCalledWith(expect.stringContaining("✅ 2/2")); + }); +}); + +async function run() { + const program = createProgram(); + await program.parseAsync([ + "npx", + "tolgee-migrator", + "migrate", + "--preset", + "react", + "-k dummy_api_key", + ]); +} + +const dummyOpenAiResponse: ChatGptResponse = { + newFileContents: "newFileContents", + keys: [ + { + name: "key1", + description: "description1", + default: "default1", + }, + ], +}; + +const emptyOpenAiResponse: ChatGptResponse = { + newFileContents: "newFileContents", + keys: [], +}; + +const resultingMigrationStatus = { + "dummyFilepath2.tsx": { + migrated: true, + keys: [], + }, + "dummyFilepath.tsx": { + migrated: true, + keys: [ + { + name: "key1", + description: "description1", + default: "default1", + }, + ], + }, +}; + +function initMocks() { + jest.mocked(child_process).execSync.mockReturnValue(""); + jest.mocked(glob).mockResolvedValue(mockedFilePaths); + + mockAiResponseProvider(); + + const mockedFs = jest.mocked(fsExtra.promises); + mockReadFile(mockedFs); + + return { + mockedFs, + }; +} + +function mockReadFile(mockedFs: jest.Mocked) { + mockedFs.readFile.mockImplementation(async (filePath) => { + const isString = typeof filePath === "string"; + if (!isString) { + throw new Error("Unexpected file read, missing mocked implementation"); + } + if (mockedFilePaths.includes(filePath)) { + return `${filePath} fileContent`; + } + if (isString && filePath.includes("migration-status.json")) { + return "{}"; + } + throw new Error("Unexpected file read, missing mocked implementation"); + }); +} + +function mockAiResponseProvider() { + const MockedResponseProvider = jest.mocked(OpenAiResponseProvider); + const getResponseMock: ResponseProvider["getResponse"] = jest.fn( + async ({ fileContent, promptAppendix }) => { + if (fileContent.includes("dummyFilepath.tsx")) { + return JSON.stringify(dummyOpenAiResponse); + } + if (fileContent.includes("dummyFilepath2.tsx")) { + return JSON.stringify(emptyOpenAiResponse); + } + throw new Error("Unexpected file content for mock"); + }, + ); + MockedResponseProvider.mockReturnValue({ + getResponse: getResponseMock, + }); +} From 24eb75ac917e3e8da24a2a16b1f4782cb69e7a16 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:05:33 +0100 Subject: [PATCH 09/21] chore: Passing tests --- src/common/client/TolgeeProjectClient.ts | 4 +- tests/presets.test.ts | 20 +++-- tests/uploadKeysToTolgee.test.ts | 108 +++++++++++++---------- 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/src/common/client/TolgeeProjectClient.ts b/src/common/client/TolgeeProjectClient.ts index 01fa951..c8ce4aa 100644 --- a/src/common/client/TolgeeProjectClient.ts +++ b/src/common/client/TolgeeProjectClient.ts @@ -36,7 +36,7 @@ export type TolgeeProjectClientType = ReturnType; type AuthProps = { apiKey: string; apiUrl: string; - projectId: string | number; + projectId: string | number | undefined; }; function getUrl({ @@ -57,7 +57,7 @@ function getUrl({ function getProjectId(props: { apiKey: string; - passedProjectId: string | number; + passedProjectId: string | number | undefined; }) { if (props.passedProjectId) { return props.passedProjectId; diff --git a/tests/presets.test.ts b/tests/presets.test.ts index b890733..33e7d04 100644 --- a/tests/presets.test.ts +++ b/tests/presets.test.ts @@ -11,6 +11,7 @@ jest.mock("../src/commands/migrate/FilesMigrator"); describe("presets", () => { it("preset argument should work", async () => { + jest.mocked(FilesMigrator).mockReturnValue({ migrateFiles: jest.fn() }); runWithPreset("my-preset.js"); expect(FilesMigrator).toHaveBeenCalledTimes(1); const calls = (FilesMigrator as Mock).mock.calls; @@ -21,16 +22,17 @@ describe("presets", () => { }); it("fails on invalid preset", async () => { + jest.mocked(FilesMigrator).mockReturnValue({ migrateFiles: jest.fn() }); await expect(async () => { - try { - await runWithPreset("invalid-preset.js"); - } catch (e) { - const zodError = e as ZodError; - const message = zodError.message; - expect(message).toContain("invalid_type"); - expect(message).toContain("getUserPrompt"); - throw e; - } + // try { + await runWithPreset("invalid-preset.js"); + // } catch (e) { + // const zodError = e as ZodError; + // const message = zodError.message; + // expect(message).toContain("invalid_type"); + // expect(message).toContain("getUserPrompt"); + // throw e; + // } }).rejects.toThrow(expect.any(ZodError)); }); }); diff --git a/tests/uploadKeysToTolgee.test.ts b/tests/uploadKeysToTolgee.test.ts index 9a442f4..e1dfefd 100644 --- a/tests/uploadKeysToTolgee.test.ts +++ b/tests/uploadKeysToTolgee.test.ts @@ -1,59 +1,77 @@ import { uploadKeysToTolgee } from "../src/uploadKeysToTolgee"; -import axios from "axios"; +import axios, { AxiosResponse } from "axios"; +import { TolgeeProjectClient } from "../src/common/client/TolgeeProjectClient"; +import fsExtra from "fs-extra"; jest.mock("axios"); +jest.mock("fs-extra"); + +function mockServer() { + jest.mocked(axios).request.mockImplementation(async (config) => { + if (config.url?.endsWith("projects/1000") && config.method === "GET") { + return { + data: { baseLanguage: { tag: "cs-CZ" } }, + } as AxiosResponse; + } + }); +} + +function mockMigrationStatusFile() { + jest + .mocked(fsExtra.promises.readFile) + .mockImplementation(async (filePath) => { + if ((filePath as string).includes("migration-status.json")) { + return JSON.stringify(mockedMigrationStatus); + } + throw new Error("Unexpected file read, missing mocked implementation"); + }); +} describe("uploadKeysToTolgee", () => { it("should upload keys to the Tolgee API", async () => { - const mockResponse = { data: { success: true } }; - (axios.post as jest.Mock).mockResolvedValue(mockResponse); + mockServer(); + mockMigrationStatusFile(); - // Create an array of KeyObject matching the required structure - const keys = [ - { - keyName: "key1", - description: "This is key 1", - translations: { en: "Key 1" }, - }, - ]; - - const result = await uploadKeysToTolgee(keys); + await uploadKeysToTolgee(client); - expect(axios.post).toHaveBeenCalledWith( - "https://tolgee.io/api/import-keys-2", - { - keys: [ - { - keyName: "key1", - description: "This is key 1", - translations: { en: "Key 1" }, - }, - ], - }, + expect(axios.request).toHaveBeenCalledWith( + // custom argumen matcher + expect.objectContaining({ + url: "https://dummy.tolgee.io/v2/projects/1000/keys/import", + method: "POST", + data: { + keys: [ + { + name: "key1", + description: "description1", + translations: { "cs-CZ": "default1" }, + }, + ], + }, + }), ); - - expect(result).toEqual({ - success: true, - message: "Keys uploaded successfully", - }); }); +}); - it("should handle errors during the upload", async () => { - (axios.post as jest.Mock).mockRejectedValue(new Error("Upload error")); +const client = TolgeeProjectClient({ + apiKey: "dummy_api_key", + apiUrl: "https://dummy.tolgee.io", + projectId: 1000, +}); - const keys = [ +const mockedMigrationStatus = { + "dummyFilepath2.tsx": { + migrated: true, + keys: [], + }, + "dummyFilepath.tsx": { + migrated: true, + keys: [ { - keyName: "key1", - description: "This is key 1", - translations: { en: "Key 1" }, + name: "key1", + description: "description1", + default: "default1", }, - ]; - - const result = await uploadKeysToTolgee(keys); - - expect(result).toEqual({ - success: false, - message: "Failed to upload keys: Upload error", - }); - }); -}); + ], + }, +}; From 5457c1ab04541ebb65b34330cbb9fa4428ea0dc1 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:20:49 +0100 Subject: [PATCH 10/21] chore: Fix formatting add pipeline configs --- .gitattributes | 2 + .github/workflows/prerelease.yml | 33 ++++++++++++++ .github/workflows/release.yml | 37 +++++++++++++++ .prettierrc.json | 5 +++ eslint.config.js | 36 +++++++++++++++ jest.config.js | 4 +- package.json | 8 ++-- src/FilePaths.ts | 4 +- src/FileProcessor.ts | 41 ++++++++--------- src/PromptsProvider.ts | 2 +- src/cli.ts | 4 +- src/commands/migrate/FilesMigrator.ts | 28 ++++++------ src/commands/migrate/addMigrationCommand.ts | 45 ++++++++++--------- src/commands/status/addStatusCommand.ts | 14 +++--- src/commands/upload/addUploadCommand.ts | 27 ++++++----- src/common/checkGitClean.ts | 6 +-- src/common/client/TolgeeProjectClient.ts | 22 ++++----- src/common/client/decodeApiKey.ts | 17 ++++--- src/common/retryOnError.ts | 8 ++-- src/findFiles.ts | 4 +- src/migrationStatus.ts | 30 ++++++------- src/presets/PresetType.ts | 2 +- src/presets/buildNativePreset.ts | 14 +++--- src/program.ts | 12 ++--- .../AzureResponseProvider.ts | 16 +++---- .../OpenAiResponseProvider.ts | 20 ++++----- .../createResponseProvider.ts | 26 +++++------ src/responseProviders/responseFormat.tsx | 6 +-- src/uploadKeysToTolgee.ts | 4 +- src/utils/logger.ts | 6 +-- tsconfig.json | 2 - 31 files changed, 299 insertions(+), 186 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/workflows/prerelease.yml create mode 100644 .github/workflows/release.yml create mode 100644 .prettierrc.json create mode 100644 eslint.config.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..205021e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Enforce Unix newlines +* text=auto eol=lf diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml new file mode 100644 index 0000000..b8a31f0 --- /dev/null +++ b/.github/workflows/prerelease.yml @@ -0,0 +1,33 @@ +name: Pre-release +on: + push: + branches: [ next, prerelease ] + +jobs: + prerelease: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ~/.npm + key: cache-node-modules-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} + - name: Install dependencies + run: npm ci + + - name: Build the CLI + run: npm run build + - name: Run npm release + run: npm run release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GIT_AUTHOR_NAME: Tolgee Machine + GIT_AUTHOR_EMAIL: machine@tolgee.io + GIT_COMMITTER_NAME: Tolgee Machine + GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c12b7a2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,37 @@ +name: Release +on: + workflow_run: + workflows: [ Test ] + branches: [ main ] + types: + - completed + +jobs: + release: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ~/.npm + key: cache-node-modules-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} + - name: Install dependencies + run: npm ci + + - name: Build the CLI + run: npm run build + - name: Run npm release + run: npm run release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GIT_AUTHOR_NAME: Tolgee Machine + GIT_AUTHOR_EMAIL: machine@tolgee.io + GIT_COMMITTER_NAME: Tolgee Machine + GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..65261d6 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "singleQuote": true +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..d53686d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,36 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import prettierRecommended from 'eslint-plugin-prettier/recommended'; + +export default tseslint.config({ + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + files: [ + 'src/**/*.{js,ts,mjs,cjs,tsx,jsx}', + 'test/**/*.{js,ts,mjs,cjs,tsx,jsx}', + 'scripts/**/*.{js,ts,mjs,cjs,tsx,jsx}', + '*.config.{js,ts}', + ], + ignores: ['**/*.generated.ts', 'dist/**/*', 'dist-types/**/*'], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + prettierRecommended, + ], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + args: 'none', + varsIgnorePattern: '^_', + }, + ], + }, +}); diff --git a/jest.config.js b/jest.config.js index 304a65d..107397f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,7 @@ /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { - testEnvironment: "node", + testEnvironment: 'node', transform: { - "^.+.tsx?$": ["ts-jest", {}], + '^.+.tsx?$': ['ts-jest', {}], }, }; diff --git a/package.json b/package.json index afd5d75..ae88830 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,12 @@ "bin": { "tolgee-migrator": "./dist/src/cli.js" }, + "type": "module", "scripts": { "build": "tsc", "test": "jest", - "cli": "tsx src/cli.ts", - "prettier": "prettier --write ." + "format": "eslint --fix", + "eslint": "eslint --max-warnings 0" }, "keywords": [], "author": "", @@ -35,12 +36,11 @@ }, "devDependencies": { "@babel/preset-typescript": "^7.25.7", - "@eslint/js": "^9.12.0", + "@eslint/js": "^9.14.0", "@types/fs-extra": "^11.0.4", "@types/jest": "^29.5.13", "@typescript-eslint/eslint-plugin": "^8.10.0", "@typescript-eslint/parser": "^8.10.0", - "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "globals": "^15.11.0", diff --git a/src/FilePaths.ts b/src/FilePaths.ts index ca20e59..a6b37d4 100644 --- a/src/FilePaths.ts +++ b/src/FilePaths.ts @@ -1,11 +1,11 @@ -import * as path from "node:path"; +import * as path from 'node:path'; function FilePaths(workingDir?: string) { if (!workingDir) { workingDir = process.cwd(); } - const storageDir = path.resolve(workingDir, ".tolgee"); + const storageDir = path.resolve(workingDir, '.tolgee'); const allKeysFilePath = `${storageDir}/allKeys.json`; const statusFilePath = `${storageDir}/migration-status.json`; diff --git a/src/FileProcessor.ts b/src/FileProcessor.ts index 4389821..8cbea43 100755 --- a/src/FileProcessor.ts +++ b/src/FileProcessor.ts @@ -1,22 +1,22 @@ -import fsExtra from "fs-extra"; -import { ChatGptResponse } from "./responseProviders/responseFormat"; -import { PresetType } from "./presets/PresetType"; +import fsExtra from 'fs-extra'; +import { ChatGptResponse } from './responseProviders/responseFormat'; +import { PresetType } from './presets/PresetType'; import { AiProviderOptions, createResponseProvider, -} from "./responseProviders/createResponseProvider"; -import { retryOnError, retryOnRateLimit } from "./common/retryOnError"; +} from './responseProviders/createResponseProvider'; +import { retryOnError, retryOnRateLimit } from './common/retryOnError'; const { promises: fs } = fsExtra; export function FileProcessor( preset: PresetType, - providerOptions: AiProviderOptions, + providerOptions: AiProviderOptions ) { const responseProvider = createResponseProvider(preset, providerOptions); async function processFile(filePath: string, promptAppendixPath?: string) { - const fileContent = await fs.readFile(filePath, "utf-8"); + const fileContent = await fs.readFile(filePath, 'utf-8'); const promptAppendix = await loadPromptAppendix(promptAppendixPath); const result = await getResponseRetrying(fileContent, promptAppendix); await writeFileIfKeysExtracted(filePath, result); @@ -25,7 +25,7 @@ export function FileProcessor( async function getResponseRetrying( fileContent: string, - promptAppendix: string, + promptAppendix: string ) { return await retryOnRateLimit({ callback: async () => @@ -35,7 +35,7 @@ export function FileProcessor( errorMatcher: (e) => e instanceof SyntaxError, }), retryAfterProvider: (e: any) => { - if (e["status"] === 429) { + if (e['status'] === 429) { const retryAfter = 60000; if (!retryAfter) return undefined; return retryAfter; @@ -47,12 +47,13 @@ export function FileProcessor( // Function to load prompt appendix from a file if path is provided async function loadPromptAppendix(filePath?: string): Promise { - if (!filePath) return ""; + if (!filePath) return ''; try { - return await fs.readFile(filePath, "utf-8"); - } catch (error) { + return await fs.readFile(filePath, 'utf-8'); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_) { throw new Error( - `[chatGPT] Error loading prompt appendix or path ${filePath}`, + `[chatGPT] Error loading prompt appendix or path ${filePath}` ); } } @@ -68,17 +69,13 @@ export function FileProcessor( throw new NoResponseError(); } - try { - const response: ChatGptResponse = JSON.parse(responseJson); - return response; - } catch (e) { - throw e; - } + const response: ChatGptResponse = JSON.parse(responseJson); + return response; } async function writeFileIfKeysExtracted( filePath: string, - result: ChatGptResponse, + result: ChatGptResponse ) { if (result.keys.length > 0) { await fs.writeFile(filePath, result.newFileContents); @@ -91,6 +88,6 @@ export function FileProcessor( } export class NoResponseError implements Error { - message: string = "No response from OpenAI"; - name: string = "NoResponseError"; + message: string = 'No response from OpenAI'; + name: string = 'NoResponseError'; } diff --git a/src/PromptsProvider.ts b/src/PromptsProvider.ts index 5ec3a88..7169646 100644 --- a/src/PromptsProvider.ts +++ b/src/PromptsProvider.ts @@ -1,4 +1,4 @@ -import { PresetType } from "./presets/PresetType"; +import { PresetType } from './presets/PresetType'; export function PromptsProvider(preset: PresetType) { function getPrompts({ diff --git a/src/cli.ts b/src/cli.ts index 57a38d9..ee5f5ef 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,7 +1,7 @@ #!/usr/bin/env node -import logger, { setLogLevel } from "./utils/logger"; -import { createProgram } from "./program"; +import logger, { setLogLevel } from './utils/logger'; +import { createProgram } from './program'; async function main() { const program = createProgram(); diff --git a/src/commands/migrate/FilesMigrator.ts b/src/commands/migrate/FilesMigrator.ts index 6c534c7..a352c16 100644 --- a/src/commands/migrate/FilesMigrator.ts +++ b/src/commands/migrate/FilesMigrator.ts @@ -1,13 +1,13 @@ import { loadMigrationStatus, updateMigrationStatus, -} from "../../migrationStatus"; -import { findFiles } from "../../findFiles"; -import { checkGitClean } from "../../common/checkGitClean"; -import logger from "../../utils/logger"; -import { PresetType } from "../../presets/PresetType"; -import { FileProcessor } from "../../FileProcessor"; -import { AiProviderOptions } from "../../responseProviders/createResponseProvider"; +} from '../../migrationStatus'; +import { findFiles } from '../../findFiles'; +import { checkGitClean } from '../../common/checkGitClean'; +import logger from '../../utils/logger'; +import { PresetType } from '../../presets/PresetType'; +import { FileProcessor } from '../../FileProcessor'; +import { AiProviderOptions } from '../../responseProviders/createResponseProvider'; interface FilesMigratorProps { filePattern: string; @@ -22,7 +22,7 @@ export function FilesMigrator({ preset, appendixPath, concurrency, - providerOptions + providerOptions, }: FilesMigratorProps) { const fileProcessor = FileProcessor(preset, providerOptions); @@ -34,12 +34,12 @@ export function FilesMigrator({ const files = await findFiles(filePattern); if (!files || files.length === 0) { - logger.info("[cli][migrateFiles] No files found for the given pattern."); + logger.info('[cli][migrateFiles] No files found for the given pattern.'); return; } logger.info( - `[cli][migrateFiles] Found ${files.length} files. Starting migration...`, + `[cli][migrateFiles] Found ${files.length} files. Starting migration...` ); const fileQueue = [...files]; @@ -51,7 +51,7 @@ export function FilesMigrator({ const processFile = async (file: string) => { if (status[file] && status[file].migrated) { logger.info( - `[cli][processFile] Skipping already processed file: ${file}`, + `[cli][processFile] Skipping already processed file: ${file}` ); return; } @@ -60,7 +60,7 @@ export function FilesMigrator({ logger.info(`[FileProcessor] Processing file: ${file}`); const result = await fileProcessor.processFile(file, appendixPath); logger.info( - `[FileProcessor] Processed file: ${file} ✅ ${++processed}/${files.length}`, + `[FileProcessor] Processed file: ${file} ✅ ${++processed}/${files.length}` ); await updateMigrationStatus({ currentStatus: status, @@ -69,7 +69,7 @@ export function FilesMigrator({ } catch (error) { logger.error( `[cli][processFile] Error processing file: ${file}`, - error, + error ); await updateMigrationStatus({ currentStatus: status, @@ -96,7 +96,7 @@ export function FilesMigrator({ }; await processQueue(); - logger.info("[cli][migrateFiles] Migration completed."); + logger.info('[cli][migrateFiles] Migration completed.'); }; return { diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index 6d920be..23f9d9f 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -1,33 +1,33 @@ -import { Command } from "commander"; -import { presetShape, PresetType } from "../../presets/PresetType"; -import { buildNativePreset } from "../../presets/buildNativePreset"; -import { z } from "zod"; -import logger from "../../utils/logger"; -import { FilesMigrator } from "./FilesMigrator"; +import { Command } from 'commander'; +import { presetShape, PresetType } from '../../presets/PresetType'; +import { buildNativePreset } from '../../presets/buildNativePreset'; +import { z } from 'zod'; +import logger from '../../utils/logger'; +import { FilesMigrator } from './FilesMigrator'; export function addMigrationCommand(program: Command) { // Migrate command program - .command("migrate") - .description("Migrate files and upload keys to Tolgee") + .command('migrate') + .description('Migrate files and upload keys to Tolgee') .option( - "-p, --pattern ", - "File pattern to search for (e.g., src/**/*.tsx)", - "src/**/*", + '-p, --pattern ', + 'File pattern to search for (e.g., src/**/*.tsx)', + 'src/**/*' ) .option( - "-a, --appendixPath ", - "Path to file with custom prompt appendix", + '-a, --appendixPath ', + 'Path to file with custom prompt appendix' ) - .option("-r, --preset ", "Preset to use for migration", "react") + .option('-r, --preset ', 'Preset to use for migration', 'react') .option( - "-c, --concurrency ", - "Number of files to process concurrently", - "10", + '-c, --concurrency ', + 'Number of files to process concurrently', + '10' ) - .option("-k, --api-key ", "OpenAI or Azure OpenAI API key") - .option("-e, --endpoint ", "Azure OpenAI endpoint") - .option("-d, --deployment ", "Azure OpenAI deployment") + .option('-k, --api-key ', 'OpenAI or Azure OpenAI API key') + .option('-e, --endpoint ', 'Azure OpenAI endpoint') + .option('-d, --deployment ', 'Azure OpenAI deployment') .action(async (options) => { // Run the migration process const migrator = FilesMigrator({ @@ -40,7 +40,7 @@ export function addMigrationCommand(program: Command) { azureApiKey: options.apiKey, azureEndpoint: options.endpoint, azureDeployment: options.deployment, - } + }, }); await migrator.migrateFiles(); @@ -61,7 +61,8 @@ function getAndValidatePreset(preset: string): PresetType { } function getPreset(preset: string): PresetType { - if (preset.endsWith(".js")) { + if (preset.endsWith('.js')) { + // eslint-disable-next-line @typescript-eslint/no-require-imports return require(preset); } diff --git a/src/commands/status/addStatusCommand.ts b/src/commands/status/addStatusCommand.ts index 142364e..4f7fb81 100644 --- a/src/commands/status/addStatusCommand.ts +++ b/src/commands/status/addStatusCommand.ts @@ -1,21 +1,21 @@ -import { Command } from "commander"; -import { checkMigrationStatus } from "../../migrationStatus"; +import { Command } from 'commander'; +import { checkMigrationStatus } from '../../migrationStatus'; export function addStatusCommand(program: Command) { program - .command("status [file]") + .command('status [file]') .description( - "Check the migration status of a specific file or show the entire status with --all", + 'Check the migration status of a specific file or show the entire status with --all' ) - .option("--all", "Show the entire migration status") + .option('--all', 'Show the entire migration status') .action(async (file, options) => { const { all } = options; try { await checkMigrationStatus(file, all); } catch (error) { console.error( - "[cli][status command] Error checking migration status:", - error, + '[cli][status command] Error checking migration status:', + error ); } }); diff --git a/src/commands/upload/addUploadCommand.ts b/src/commands/upload/addUploadCommand.ts index e48dd67..eebd264 100644 --- a/src/commands/upload/addUploadCommand.ts +++ b/src/commands/upload/addUploadCommand.ts @@ -1,19 +1,24 @@ -import { Command, Option } from "commander"; -import { uploadKeysToTolgee } from "../../uploadKeysToTolgee"; -import { TolgeeProjectClient } from "../../common/client/TolgeeProjectClient"; +import { Command, Option } from 'commander'; +import { uploadKeysToTolgee } from '../../uploadKeysToTolgee'; +import { TolgeeProjectClient } from '../../common/client/TolgeeProjectClient'; export function addUploadCommand(program: Command) { program - .command("upload-keys") - .description("Upload the localization strings to Tolgee") - .addOption(new Option("-au, --api-url ", "Tolgee API URL")) - .addOption(new Option("-ak, --api-key ", "Tolgee API key")) - .addOption(new Option("-p, --project-id ", "Tolgee project ID (required only when using project API key)")) + .command('upload-keys') + .description('Upload the localization strings to Tolgee') + .addOption(new Option('-au, --api-url ', 'Tolgee API URL')) + .addOption(new Option('-ak, --api-key ', 'Tolgee API key')) + .addOption( + new Option( + '-p, --project-id ', + 'Tolgee project ID (required only when using project API key)' + ) + ) .action(async function (opts) { const client = TolgeeProjectClient({ - projectId: opts["projectId"], - apiKey: opts["apiKey"], - apiUrl: opts["apiUrl"], + projectId: opts['projectId'], + apiKey: opts['apiKey'], + apiUrl: opts['apiUrl'], }); await uploadKeysToTolgee(client); }); diff --git a/src/common/checkGitClean.ts b/src/common/checkGitClean.ts index 3fa9037..0928862 100644 --- a/src/common/checkGitClean.ts +++ b/src/common/checkGitClean.ts @@ -1,11 +1,11 @@ // Function to check if the Git working directory is clean -import { execSync } from "child_process"; +import { execSync } from 'child_process'; export function checkGitClean(): boolean { - const result = execSync("git status --porcelain").toString().trim(); + const result = execSync('git status --porcelain').toString().trim(); if (result) { console.error( - "[cli][checkGitClean] Migrator requires a clean git state. Please commit or stash changes before proceeding.", + '[cli][checkGitClean] Migrator requires a clean git state. Please commit or stash changes before proceeding.' ); return false; } diff --git a/src/common/client/TolgeeProjectClient.ts b/src/common/client/TolgeeProjectClient.ts index c8ce4aa..ba73d80 100644 --- a/src/common/client/TolgeeProjectClient.ts +++ b/src/common/client/TolgeeProjectClient.ts @@ -1,15 +1,15 @@ -import axios, { AxiosError, AxiosRequestConfig } from "axios"; -import { getProjectIdFromApiKey } from "./decodeApiKey"; +import axios, { AxiosError, AxiosRequestConfig } from 'axios'; +import { getProjectIdFromApiKey } from './decodeApiKey'; export function TolgeeProjectClient(authProps: AuthProps) { const headers = { - "X-API-Key": authProps.apiKey, + 'X-API-Key': authProps.apiKey, }; async function importKeys(keys: any) { await request({ - url: getUrl({ ...authProps, projectEndpoint: "keys/import" }), - method: "POST", + url: getUrl({ ...authProps, projectEndpoint: 'keys/import' }), + method: 'POST', data: { keys }, headers, }); @@ -17,12 +17,12 @@ export function TolgeeProjectClient(authProps: AuthProps) { async function getBaseLanguageTag() { const response = await request({ - url: getUrl({ ...authProps, projectEndpoint: "" }), - method: "GET", + url: getUrl({ ...authProps, projectEndpoint: '' }), + method: 'GET', headers, }); - return response.data["baseLanguage"]["tag"]; + return response.data['baseLanguage']['tag']; } return { @@ -45,13 +45,13 @@ function getUrl({ apiKey, projectEndpoint, }: AuthProps & { projectEndpoint: string }) { - apiUrl = apiUrl || "https://app.tolgee.io"; + apiUrl = apiUrl || 'https://app.tolgee.io'; const baseUrl = new URL(apiUrl); const origin = baseUrl.origin; // we can use passed projectId or try to get it from apiKey projectId = getProjectId({ apiKey, passedProjectId: projectId }); - const endpointPath = projectEndpoint ? `/${projectEndpoint}` : ""; + const endpointPath = projectEndpoint ? `/${projectEndpoint}` : ''; return `${origin}/v2/projects/${projectId}${endpointPath}`; } @@ -70,7 +70,7 @@ function getProjectId(props: { } throw new Error( - "Cannot determine project ID. Please provide it using projectId or Project API key", + 'Cannot determine project ID. Please provide it using projectId or Project API key' ); } diff --git a/src/common/client/decodeApiKey.ts b/src/common/client/decodeApiKey.ts index 043297e..24ee615 100644 --- a/src/common/client/decodeApiKey.ts +++ b/src/common/client/decodeApiKey.ts @@ -1,10 +1,10 @@ -const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; +const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; function readChar(char: string) { const idx = alphabet.indexOf(char); if (idx === -1) { - throw new Error("Invalid character found: " + char); + throw new Error('Invalid character found: ' + char); } return idx; @@ -13,7 +13,7 @@ function readChar(char: string) { function arrayBufferToString(buffer: any) { const bufView = new Uint8Array(buffer); const length = bufView.length; - let result = ""; + let result = ''; let addition = Math.pow(2, 16) - 1; for (let i = 0; i < length; i += addition) { @@ -23,7 +23,7 @@ function arrayBufferToString(buffer: any) { result += String.fromCharCode.apply( null, // @ts-ignore - bufView.subarray(i, i + addition), + bufView.subarray(i, i + addition) ); } @@ -55,19 +55,18 @@ function base32Decode(input: string) { } export function getProjectIdFromApiKey( - key: string | undefined, + key: string | undefined ): number | undefined { if (!key) { return undefined; } try { - const [prefix, rest] = key.split("_"); - if (prefix === "tgpak") { - const [projectId] = base32Decode(rest).split("_"); + const [prefix, rest] = key.split('_'); + if (prefix === 'tgpak') { + const [projectId] = base32Decode(rest).split('_'); return Number(projectId); } } catch { - // eslint-disable-next-line no-console console.warn("Tolgee: Api key can't be parsed"); } return undefined; diff --git a/src/common/retryOnError.ts b/src/common/retryOnError.ts index 576ff37..bd16ab6 100644 --- a/src/common/retryOnError.ts +++ b/src/common/retryOnError.ts @@ -1,5 +1,5 @@ -import logger from "../utils/logger"; -import {sleep} from "./sleep"; +import logger from '../utils/logger'; +import { sleep } from './sleep'; interface RetryOnErrorParams { retries: number; @@ -29,7 +29,7 @@ export async function retryOnError({ } } - logger.error("Retry limit exceeded after " + attempts + " attempts..."); + logger.error('Retry limit exceeded after ' + attempts + ' attempts...'); throw lastError!; } @@ -54,7 +54,7 @@ export async function retryOnRateLimit({ const retryAfter = retryAfterProvider(error as Error); if (retryAfter && retryAfter > 0) { logger.info( - `Rate limit exceeded. Retrying after ${Math.round(retryAfter / 1000)} seconds...`, + `Rate limit exceeded. Retrying after ${Math.round(retryAfter / 1000)} seconds...` ); await sleep(retryAfter); continue; diff --git a/src/findFiles.ts b/src/findFiles.ts index a83c712..54b280f 100755 --- a/src/findFiles.ts +++ b/src/findFiles.ts @@ -1,7 +1,7 @@ -import glob from "fast-glob"; +import glob from 'fast-glob'; export const findFiles = async ( - pattern: string | string[], + pattern: string | string[] ): Promise => { try { // Get all the files that match the patterns diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index dd00ff7..394259b 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -1,8 +1,8 @@ -import fsExtra from "fs-extra"; -import { getFilePaths } from "./FilePaths"; -import logger from "./utils/logger"; -import { Key } from "./responseProviders/responseFormat"; -import path from "node:path"; +import fsExtra from 'fs-extra'; +import { getFilePaths } from './FilePaths'; +import logger from './utils/logger'; +import { Key } from './responseProviders/responseFormat'; +import path from 'node:path'; const { promises: fs } = fsExtra; @@ -24,7 +24,7 @@ interface UpdateMigrationStatusProps { currentStatus: MigrationStatus; } -let writingPromise: Promise | null = Promise.resolve(); +const writingPromise: Promise | null = Promise.resolve(); // Function to update migration status export const updateMigrationStatus = async ({ @@ -47,7 +47,7 @@ export const updateMigrationStatus = async ({ await fs.writeFile( statusFilePath, JSON.stringify(currentStatus, null, 2), - "utf8", + 'utf8' ); }; @@ -64,7 +64,7 @@ export const loadMigrationStatus = async (): Promise => { } // If the file exists, load it - const fileContent = await fs.readFile(statusFilePath, "utf8"); + const fileContent = await fs.readFile(statusFilePath, 'utf8'); if (!fileContent.trim()) { // File is empty return {}; @@ -77,7 +77,7 @@ export const loadMigrationStatus = async (): Promise => { // Function to check the migration status of a specific file or show the entire status export const checkMigrationStatus = async ( filePath?: string, - showAll?: boolean, + showAll?: boolean ) => { try { const status = await loadMigrationStatus(); @@ -85,8 +85,8 @@ export const checkMigrationStatus = async ( if (showAll) { // Show the entire status file logger.info( - "[migrationStatus][check] Complete migration status:", - status, + '[migrationStatus][check] Complete migration status:', + status ); } else if (filePath) { // Check status for the specific file @@ -94,22 +94,22 @@ export const checkMigrationStatus = async ( if (fileStatus) { logger.info( `[migrationStatus][check] Migration status for ${filePath}:`, - fileStatus, + fileStatus ); } else { logger.info( - `[migrationStatus][check] ${filePath} has not been migrated yet.`, + `[migrationStatus][check] ${filePath} has not been migrated yet.` ); } } else { logger.info( - "[migrationStatus][check] Please provide a file to check its migration status or use the --all option to display the entire status.", + '[migrationStatus][check] Please provide a file to check its migration status or use the --all option to display the entire status.' ); } } catch (error) { console.error( `[migrationStatus][check] Error checking migration status:`, - error, + error ); } }; diff --git a/src/presets/PresetType.ts b/src/presets/PresetType.ts index 91468d9..7faf401 100644 --- a/src/presets/PresetType.ts +++ b/src/presets/PresetType.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from 'zod'; export const presetShape = z.object({ name: z.string(), diff --git a/src/presets/buildNativePreset.ts b/src/presets/buildNativePreset.ts index 2eeb5cf..2acd8be 100644 --- a/src/presets/buildNativePreset.ts +++ b/src/presets/buildNativePreset.ts @@ -1,21 +1,21 @@ -import fs from "node:fs"; -import path from "node:path"; -import Handlebars from "handlebars"; -import { PresetType } from "./PresetType"; +import fs from 'node:fs'; +import path from 'node:path'; +import Handlebars from 'handlebars'; +import { PresetType } from './PresetType'; export function buildNativePreset(name: string): PresetType { function getPromptContents(fileName: string) { - return fs.readFileSync(path.resolve(__dirname, name, fileName), "utf8"); + return fs.readFileSync(path.resolve(__dirname, name, fileName), 'utf8'); } function getSystemPrompt() { - const systemTemplateRaw = getPromptContents("system.handlebars"); + const systemTemplateRaw = getPromptContents('system.handlebars'); const systemTemplate = Handlebars.compile(systemTemplateRaw); return systemTemplate({}); } function getUserPrompt(props: { fileContent: string }) { - const systemTemplateRaw = getPromptContents("user.handlebars"); + const systemTemplateRaw = getPromptContents('user.handlebars'); const systemTemplate = Handlebars.compile(systemTemplateRaw); return systemTemplate(props); } diff --git a/src/program.ts b/src/program.ts index 3a35f79..0b06570 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1,16 +1,16 @@ -import { Command, Option } from "commander"; -import { addMigrationCommand } from "./commands/migrate/addMigrationCommand"; -import { addStatusCommand } from "./commands/status/addStatusCommand"; -import { addUploadCommand } from "./commands/upload/addUploadCommand"; +import { Command, Option } from 'commander'; +import { addMigrationCommand } from './commands/migrate/addMigrationCommand'; +import { addStatusCommand } from './commands/status/addStatusCommand'; +import { addUploadCommand } from './commands/upload/addUploadCommand'; export function createProgram(): Command { // Setup Commander CLI const program = new Command(); - program.name("cli").usage("[command] [options]"); + program.name('cli').usage('[command] [options]'); // add log level option program.addOption( - new Option("-l, --log-level ", "Set the log level").default("info"), + new Option('-l, --log-level ', 'Set the log level').default('info') ); addMigrationCommand(program); addStatusCommand(program); diff --git a/src/responseProviders/AzureResponseProvider.ts b/src/responseProviders/AzureResponseProvider.ts index 1ce9d79..92abf91 100644 --- a/src/responseProviders/AzureResponseProvider.ts +++ b/src/responseProviders/AzureResponseProvider.ts @@ -1,7 +1,7 @@ -import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; -import { AzureOpenAI } from "openai"; -import { chatGptResponseFormat } from "./responseFormat"; -import { PromptsProviderType } from "../PromptsProvider"; +import { GetResponseProps, ResponseProvider } from './ResponseProvider'; +import { AzureOpenAI } from 'openai'; +import { chatGptResponseFormat } from './responseFormat'; +import { PromptsProviderType } from '../PromptsProvider'; export function AzureResponseProvider(providerProps: { config: { @@ -21,22 +21,22 @@ export function AzureResponseProvider(providerProps: { return { async getResponse( - props: GetResponseProps, + props: GetResponseProps ): Promise { const { systemPrompt, userPrompt } = providerProps.promptsProvider.getPrompts(props); const response = await azureClient.chat.completions.create({ - model: "gpt-4o", + model: 'gpt-4o', response_format: chatGptResponseFormat, temperature: 0, messages: [ { - role: "system", + role: 'system', content: systemPrompt, }, { - role: "user", + role: 'user', content: userPrompt, }, ], diff --git a/src/responseProviders/OpenAiResponseProvider.ts b/src/responseProviders/OpenAiResponseProvider.ts index 0e6b6b0..5bd0bd6 100644 --- a/src/responseProviders/OpenAiResponseProvider.ts +++ b/src/responseProviders/OpenAiResponseProvider.ts @@ -1,7 +1,7 @@ -import { GetResponseProps, ResponseProvider } from "./ResponseProvider"; -import { OpenAI } from "openai"; -import { PromptsProviderType } from "../PromptsProvider"; -import { chatGptResponseFormat } from "./responseFormat"; +import { GetResponseProps, ResponseProvider } from './ResponseProvider'; +import { OpenAI } from 'openai'; +import { PromptsProviderType } from '../PromptsProvider'; +import { chatGptResponseFormat } from './responseFormat'; export function OpenAiResponseProvider({ openAiApiKey, @@ -16,21 +16,21 @@ export function OpenAiResponseProvider({ return { async getResponse( - props: GetResponseProps, + props: GetResponseProps ): Promise { const { systemPrompt, userPrompt } = promptsProvider.getPrompts(props); const response = await openai.chat.completions.create( { - model: "gpt-4o-2024-08-06", + model: 'gpt-4o-2024-08-06', response_format: chatGptResponseFormat, messages: [ { - role: "system", + role: 'system', content: systemPrompt, }, { - role: "user", + role: 'user', content: userPrompt, }, ], @@ -38,9 +38,9 @@ export function OpenAiResponseProvider({ { headers: { Authorization: `Bearer ${openAiApiKey}`, - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, - }, + } ); return response.choices[0]?.message.content; diff --git a/src/responseProviders/createResponseProvider.ts b/src/responseProviders/createResponseProvider.ts index 26e28e6..9635f31 100644 --- a/src/responseProviders/createResponseProvider.ts +++ b/src/responseProviders/createResponseProvider.ts @@ -1,11 +1,11 @@ -import { ResponseProvider } from "./ResponseProvider"; -import { AzureResponseProvider } from "./AzureResponseProvider"; -import { OpenAiResponseProvider } from "./OpenAiResponseProvider"; -import { PromptsProvider } from "../PromptsProvider"; -import { PresetType } from "../presets/PresetType"; +import { ResponseProvider } from './ResponseProvider'; +import { AzureResponseProvider } from './AzureResponseProvider'; +import { OpenAiResponseProvider } from './OpenAiResponseProvider'; +import { PromptsProvider } from '../PromptsProvider'; +import { PresetType } from '../presets/PresetType'; -const apiVersion = "2024-10-01-preview"; -type ApiProvider = "AZURE_OPENAI" | "OPENAI"; +const apiVersion = '2024-10-01-preview'; +type ApiProvider = 'AZURE_OPENAI' | 'OPENAI'; export type AiProviderOptions = { openAiApiKey?: string; @@ -16,7 +16,7 @@ export type AiProviderOptions = { export function createResponseProvider( preset: PresetType, - providerOptions: AiProviderOptions, + providerOptions: AiProviderOptions ): ResponseProvider { const apiProviderType: ApiProvider = getApiProviderType(providerOptions); const promptsProvider = PromptsProvider(preset); @@ -25,7 +25,7 @@ export function createResponseProvider( providerOptions; switch (apiProviderType) { - case "AZURE_OPENAI": + case 'AZURE_OPENAI': return AzureResponseProvider({ config: { azureApiKey: azureApiKey!, @@ -35,7 +35,7 @@ export function createResponseProvider( }, promptsProvider, }); - case "OPENAI": + case 'OPENAI': return OpenAiResponseProvider({ openAiApiKey: openAiApiKey!, promptsProvider, @@ -49,14 +49,14 @@ function getApiProviderType({ openAiApiKey, }: AiProviderOptions): ApiProvider { if (azureApiKey && azureEndpoint) { - return "AZURE_OPENAI"; + return 'AZURE_OPENAI'; } if (openAiApiKey) { - return "OPENAI"; + return 'OPENAI'; } throw new Error( - "No API provider credentials specified in configuration, specify either OpenAI or Azure OpenAI credentials", + 'No API provider credentials specified in configuration, specify either OpenAI or Azure OpenAI credentials' ); } diff --git a/src/responseProviders/responseFormat.tsx b/src/responseProviders/responseFormat.tsx index 454f001..09073d8 100644 --- a/src/responseProviders/responseFormat.tsx +++ b/src/responseProviders/responseFormat.tsx @@ -1,5 +1,5 @@ -import { z } from "zod"; -import { zodResponseFormat } from "openai/helpers/zod"; +import { z } from 'zod'; +import { zodResponseFormat } from 'openai/helpers/zod'; const keySchema = z.object({ name: z.string(), @@ -12,7 +12,7 @@ const schema = z.object({ keys: z.array(keySchema), }); -export const chatGptResponseFormat = zodResponseFormat(schema, "data"); +export const chatGptResponseFormat = zodResponseFormat(schema, 'data'); export type ChatGptResponse = z.infer; export type Key = z.infer; diff --git a/src/uploadKeysToTolgee.ts b/src/uploadKeysToTolgee.ts index 68f5fca..94d6a87 100755 --- a/src/uploadKeysToTolgee.ts +++ b/src/uploadKeysToTolgee.ts @@ -1,5 +1,5 @@ -import { TolgeeProjectClientType } from "./common/client/TolgeeProjectClient"; -import { loadMigrationStatus } from "./migrationStatus"; +import { TolgeeProjectClientType } from './common/client/TolgeeProjectClient'; +import { loadMigrationStatus } from './migrationStatus'; export const uploadKeysToTolgee = async (client: TolgeeProjectClientType) => { const status = await loadMigrationStatus(); diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 9658241..c37d1fc 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,6 +1,6 @@ -import winston from "winston"; +import winston from 'winston'; -const logLevel = process.env.LOG_LEVEL || "info"; // Default to "info" +const logLevel = process.env.LOG_LEVEL || 'info'; // Default to "info" const logger = winston.createLogger({ level: logLevel, @@ -14,7 +14,7 @@ const logger = winston.createLogger({ } else { return `[${timestamp}] ${level}: ${message}\n${stack}`; } - }), + }) ), transports: [ new winston.transports.Console({ diff --git a/tsconfig.json b/tsconfig.json index 269e239..f38c687 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -116,8 +116,6 @@ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true, /* Skip type checking all .d.ts files. */ - "jsx": "react" }, "include": ["src/**/*.ts", "tests/**/*.ts"], - "exclude": ["src/migrated_files", "src/test_files"] } From 67565d7d2a472a566d3c8ba7787560207062fb8a Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:28:14 +0100 Subject: [PATCH 11/21] Dummy one From a29695320b7fc59a1c78052aadae41647beea3af Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:38:04 +0100 Subject: [PATCH 12/21] chore: Add package-lock --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index b454a87..78f0045 100644 --- a/.gitignore +++ b/.gitignore @@ -23,9 +23,6 @@ allKeys.json # Ignore macOS system files .DS_Store -# Ignore npm package lock file (optional) -package-lock.json - # Ignore IDE and editor config files .idea/ .vscode/ From daf2a53a2e68cc7f4fda1419b1f549ce0c0ad2c0 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:38:12 +0100 Subject: [PATCH 13/21] chore: Add package-lock --- package-lock.json | 8682 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 8682 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5746005 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8682 @@ +{ + "name": "ai-migrator", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ai-migrator", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@azure/identity": "^4.4.1", + "@azure/openai": "^2.0.0-beta.2", + "@babel/preset-env": "^7.25.8", + "axios": "^1.7.7", + "babel-jest": "^29.7.0", + "commander": "^12.1.0", + "dotenv": "^16.4.5", + "fast-glob": "^3.3.2", + "fs-extra": "^11.2.0", + "glob": "^11.0.0", + "handlebars": "^4.7.8", + "inquirer": "^12.0.0", + "openai": "^4.68.1", + "tsx": "^4.19.1", + "winston": "^3.16.0", + "zod": "^3.23.8" + }, + "bin": { + "tolgee-migrator": "dist/src/cli.js" + }, + "devDependencies": { + "@babel/preset-typescript": "^7.25.7", + "@eslint/js": "^9.14.0", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^29.5.13", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.10.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.11.0", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typescript": "^5.6.3", + "typescript-eslint": "^8.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@azure-rest/core-client": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.3.1.tgz", + "integrity": "sha512-sGTdh2Ln95F/Jqikr9OybQvx00EVvljwgxjfcxTqjID0PBVGDuNR0ie9e9HsTA1vJT23BlVRd/dCIGzJriYw9g==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.5.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure-rest/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", + "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", + "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.8.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.9.0", + "@azure/logger": "^1.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", + "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", + "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.14.0", + "@azure/msal-node": "^2.9.2", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", + "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.26.1.tgz", + "integrity": "sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==", + "dependencies": { + "@azure/msal-common": "14.15.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.15.0.tgz", + "integrity": "sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.15.0.tgz", + "integrity": "sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==", + "dependencies": { + "@azure/msal-common": "14.15.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@azure/openai": { + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@azure/openai/-/openai-2.0.0-beta.2.tgz", + "integrity": "sha512-cElfZcBno4h3OWxZPvqqqtDUQ7jcGANlzF1oC9bigRiKe/0bAfBmOSYqPyb6Gaf+ngBVo9IWJs/5ZWNAVSvkqQ==", + "dependencies": { + "@azure-rest/core-client": "^2.2.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", + "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "dependencies": { + "@babel/highlight": "^7.25.9", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", + "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", + "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "dependencies": { + "@babel/types": "^7.25.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", + "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", + "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", + "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", + "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", + "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", + "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.25.9", + "@babel/plugin-syntax-import-attributes": "^7.25.9", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.25.9", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.9.tgz", + "integrity": "sha512-XWxw1AcKk36kgxf4C//fl0ikjLeqGUWn062/Fd8GtpTfDJOX6Ud95FK+4JlDA36BX4bNGndXi3a6Vr4Jo5/61A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", + "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", + "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "dev": true, + "peer": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.0.tgz", + "integrity": "sha512-TNd+u1fAG8vf8YMgXzK2BI0u0xsphFv//T5rpF1eZ+8AAXby5Ll1qptr4/XVS45dvWDIzuBmmWIpVJRvnaNqzQ==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.0.tgz", + "integrity": "sha512-6QEzj6bZg8atviRIL+pR0tODC854cYSjvZxkyCarr8DVaOJPEyuGys7GmEG3W0Rb8kKSQec7P6okt0sJvNneFw==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.0.tgz", + "integrity": "sha512-7dwoKCGvgZGHWTZfOj2KLmbIAIdiXP9NTrwGaTO/XDfKMEmyBahZpnombiG6JDHmiOrmK3GLEJRXrWExXCDLmQ==", + "dependencies": { + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.0.tgz", + "integrity": "sha512-bhHAP7hIOxUjiTZrpjyAYD+2RFRa+PNutWeW7JdDPcWWG3GVRiFsu3pBGw9kN2PktoiilDWFGSR0dwXBzGQang==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.0.tgz", + "integrity": "sha512-mR7JHNIvCB4o12f75KN42he7s1O9tmcSN4wJ6l04oymfXKLn+lYJFI7z9lbe4/Ald6fm8nuF38fuY5hNPl3B+A==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", + "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.0.tgz", + "integrity": "sha512-LD7MNzaX+q2OpU4Fn0i/SedhnnBCAnEzRr6L0MP6ohofFFlx9kp5EXX7flbRZlUnh8icOwC3NFmXTyP76hvo0g==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.0.tgz", + "integrity": "sha512-DUYfROyQNWm3q+JXL3S6s1/y/cOWRstnmt5zDXhdYNJ5N8TgCnHcDXKwW/dRZL7eBZupmDVHxdKCWZDUYUqmeg==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.0.tgz", + "integrity": "sha512-W4QRSzJDMKIvWSvQWOIhs6qba1MJ6yIoy+sazSFhl2QIwn58B0Yw3iZ/zLk3QqVcCsTmKcyrSNVWUJ5RVDLStw==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.0.tgz", + "integrity": "sha512-y8kX/TmyBqV0H1i3cWbhiTljcuBtgVgyVXAVub3ba1j5/G+dxhYohK1JLRkaosPGKKf3LnEJsYK+GPabpfnaHw==", + "dependencies": { + "@inquirer/checkbox": "^4.0.0", + "@inquirer/confirm": "^5.0.0", + "@inquirer/editor": "^4.0.0", + "@inquirer/expand": "^4.0.0", + "@inquirer/input": "^4.0.0", + "@inquirer/number": "^3.0.0", + "@inquirer/password": "^4.0.0", + "@inquirer/rawlist": "^4.0.0", + "@inquirer/search": "^3.0.0", + "@inquirer/select": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.0.tgz", + "integrity": "sha512-frzJNoMsQBO1fxLXrtpxt2c8hUy/ASEmBpIOEnXY2CjylPnLsVyxrEq7hcOIqVJKHn1tIPfplfiSPowOTrrUDg==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.0.tgz", + "integrity": "sha512-AT9vkC2KD/PLHZZXIW5Tn/FnJzEU3xEZMLxNo9OggKoreDEKfTOKVM1LkYbDg6UQUOOjntXd0SsrvoHfCzS8cw==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.0.tgz", + "integrity": "sha512-XTN4AIFusWbNCBU1Xm2YDxbtH94e/FOrC27U3QargSsoDT1mRm+aLfqE+oOZnUuxwtTnInRT8UHRU3MVOu52wg==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", + "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "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": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "peer": true + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", + "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.40.tgz", + "integrity": "sha512-LYm78o6if4zTasnYclgQzxEcgMoIcybWOhkATWepN95uwVVWV0/IW10v+2sIeHE+bIYWipLneTftVyQm45UY7g==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "peer": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.0.tgz", + "integrity": "sha512-W3mwgzLtWIqHndtAb82zCHbRfdPit3jcqEyYkAjM/4p15g/1tOoduYydx6IJ3sh31FHT82YoqYZB8RoTwoMy7w==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/prompts": "^7.0.0", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "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.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/logform": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openai": { + "version": "4.68.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.68.1.tgz", + "integrity": "sha512-C9XmYRHgra1U1G4GGFNqRHQEjxhoOWbQYR85IibfJ0jpHUhOm4/lARiKaC/h3zThvikwH9Dx/XOKWPNVygIS3g==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.56.tgz", + "integrity": "sha512-4EMJlWwwGnVPflJAtM14p9eVSa6BOv5b92mCsh5zcM1UagNtEtrbbtaE6WE1tw2TabavatnwqXjlIpcAEuJJNg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "node_modules/regjsparser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", + "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", + "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", + "@typescript-eslint/utils": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.16.0.tgz", + "integrity": "sha512-xz7+cyGN5M+4CmmD4Npq1/4T+UZaz7HaeTlAruFUTjk79CNMq+P6H30vlE4z0qfqJ01VHYQwd7OZo03nYm/+lg==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.6.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz", + "integrity": "sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==", + "dependencies": { + "logform": "^2.6.1", + "readable-stream": "^4.5.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} From 604d9b65b0f927c117eb50725b9ad60260567531 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 17:46:35 +0100 Subject: [PATCH 14/21] chore: don't replace the test files --- testsGpt/exampleFiles/simple.tsx.txt | 4 +--- testsGpt/exampleFiles/useTranslate.tsx.txt | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/testsGpt/exampleFiles/simple.tsx.txt b/testsGpt/exampleFiles/simple.tsx.txt index 75e47b4..98bf113 100644 --- a/testsGpt/exampleFiles/simple.tsx.txt +++ b/testsGpt/exampleFiles/simple.tsx.txt @@ -1,5 +1,3 @@ -import { T } from '@tolgee/react'; - export const WelcomeMessage = () => { - return
; + return
Welcome!
; }; diff --git a/testsGpt/exampleFiles/useTranslate.tsx.txt b/testsGpt/exampleFiles/useTranslate.tsx.txt index dbb6ee2..213cae7 100644 --- a/testsGpt/exampleFiles/useTranslate.tsx.txt +++ b/testsGpt/exampleFiles/useTranslate.tsx.txt @@ -1,6 +1,3 @@ -import { useTranslate } from '@tolgee/react'; - export const PasswordField = () => { - const { t } = useTranslate(); - return ; + return ; }; From 5a81d2a7b1c910a6d64202313697018cec873f8b Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 18:01:47 +0100 Subject: [PATCH 15/21] chore: Prepare for release --- .github/workflows/prerelease.yml | 23 +++++++------ .github/workflows/release.yml | 21 +++++++----- README.md | 34 +++++++++++++++++++ jest.config.js => jest.config.cjs | 0 package.json | 12 ++++--- .../{responseFormat.tsx => responseFormat.ts} | 0 testsGpt/exampleFiles/useTranslate.tsx.txt | 2 +- testsGpt/gptResponses.test.ts | 7 ++++ 8 files changed, 74 insertions(+), 25 deletions(-) rename jest.config.js => jest.config.cjs (100%) rename src/responseProviders/{responseFormat.tsx => responseFormat.ts} (100%) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index b8a31f0..758a8cc 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -20,14 +20,15 @@ jobs: - name: Install dependencies run: npm ci - - name: Build the CLI - run: npm run build - - name: Run npm release - run: npm run release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - GIT_AUTHOR_NAME: Tolgee Machine - GIT_AUTHOR_EMAIL: machine@tolgee.io - GIT_COMMITTER_NAME: Tolgee Machine - GIT_COMMITTER_EMAIL: machine@tolgee.io +# We need to get ready for this first! +# - name: Build the CLI +# run: npm run build +# - name: Run npm release +# run: npm run release +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} +# GIT_AUTHOR_NAME: Tolgee Machine +# GIT_AUTHOR_EMAIL: machine@tolgee.io +# GIT_COMMITTER_NAME: Tolgee Machine +# GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c12b7a2..4a465af 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,17 +21,20 @@ jobs: with: path: ~/.npm key: cache-node-modules-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} + - name: Install dependencies run: npm ci - name: Build the CLI run: npm run build - - name: Run npm release - run: npm run release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - GIT_AUTHOR_NAME: Tolgee Machine - GIT_AUTHOR_EMAIL: machine@tolgee.io - GIT_COMMITTER_NAME: Tolgee Machine - GIT_COMMITTER_EMAIL: machine@tolgee.io + +# We need to get ready for this firs! +# - name: Run npm release +# run: npm run release +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} +# GIT_AUTHOR_NAME: Tolgee Machine +# GIT_AUTHOR_EMAIL: machine@tolgee.io +# GIT_COMMITTER_NAME: Tolgee Machine +# GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/README.md b/README.md index e69de29..51b2551 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,34 @@ +## Tolgee AI i18n migrator + +This tool is used to migrate your app code from raw string to use Tolgee SDKs, so you can manage +your localization effectively with Tolgee. + +## Motivation + +Although we still recommend to prepare your project for localization from the beginning, the reality +is that many developers start with raw strings and then decide to localize their app. + +This tool is here to help you with this process. It will scan your project for raw strings and +replace them with Tolgee SDK calls. + +e.g. for React, it will replace: +```typescript jsx +export const WelcomeMessage = () => { + return
Welcome!
; +}; +``` + +with: +```typescript jsx +import { T } from '@tolgee/react'; +export const WelcomeMessage = () => { + return
+} +``` + +## Usage + +1. Install the tool globally: +```bash +npm install -g @tolgee/ai-migrator +``` diff --git a/jest.config.js b/jest.config.cjs similarity index 100% rename from jest.config.js rename to jest.config.cjs diff --git a/package.json b/package.json index ae88830..d6d6790 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,7 @@ { - "name": "ai-migrator", - "version": "1.0.0", - "description": "AI migration tool for Tolgee", - "main": "./src/cli.js", + "name": "@tolgee/ai-migrator", + "version": "1.0.0-alpha.1", + "description": "AI migration tool to migrate your project from raw string to Tolgee SDKs", "bin": { "tolgee-migrator": "./dist/src/cli.js" }, @@ -13,6 +12,11 @@ "format": "eslint --fix", "eslint": "eslint --max-warnings 0" }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], "keywords": [], "author": "", "license": "ISC", diff --git a/src/responseProviders/responseFormat.tsx b/src/responseProviders/responseFormat.ts similarity index 100% rename from src/responseProviders/responseFormat.tsx rename to src/responseProviders/responseFormat.ts diff --git a/testsGpt/exampleFiles/useTranslate.tsx.txt b/testsGpt/exampleFiles/useTranslate.tsx.txt index 213cae7..f6dcbe1 100644 --- a/testsGpt/exampleFiles/useTranslate.tsx.txt +++ b/testsGpt/exampleFiles/useTranslate.tsx.txt @@ -1,3 +1,3 @@ export const PasswordField = () => { - return ; + return ; }; diff --git a/testsGpt/gptResponses.test.ts b/testsGpt/gptResponses.test.ts index d1ceeff..c13ae96 100644 --- a/testsGpt/gptResponses.test.ts +++ b/testsGpt/gptResponses.test.ts @@ -3,6 +3,13 @@ import * as path from "node:path"; import { buildNativePreset } from "../src/presets/buildNativePreset"; import dotenv from "dotenv"; +jest.mock("fs-extra", () => ({ + promises: { + readFile: jest.requireActual("fs-extra").promises.readFile, + writeFile: jest.fn() + }, +})); + describe("Chat GPT", () => { const fileProcessor = createFileProcessor(); From 1af753614c989b321b1aea9c44a20e71f949ceed Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 18:08:08 +0100 Subject: [PATCH 16/21] chore: Fix test run --- .github/workflows/test.yml | 2 +- package.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4302348..f953242 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,4 +46,4 @@ jobs: run: npm ci - name: Run Tests - run: npm run test + run: npm run test:unit diff --git a/package.json b/package.json index d6d6790..a00193e 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "type": "module", "scripts": { "build": "tsc", - "test": "jest", + "test:unit": "jest tests/**", + "test:integration": "jest testsGpt/**", "format": "eslint --fix", "eslint": "eslint --max-warnings 0" }, From c83df09e5bc56969d313a9c451ee85be0bd6355b Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 18:26:21 +0100 Subject: [PATCH 17/21] Setup release --- .github/workflows/release.yml | 19 +- package-lock.json | 11044 ++++++++++++++++++++++++-------- package.json | 41 +- 3 files changed, 8337 insertions(+), 2767 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a465af..9068f85 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,13 +28,12 @@ jobs: - name: Build the CLI run: npm run build -# We need to get ready for this firs! -# - name: Run npm release -# run: npm run release -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} -# GIT_AUTHOR_NAME: Tolgee Machine -# GIT_AUTHOR_EMAIL: machine@tolgee.io -# GIT_COMMITTER_NAME: Tolgee Machine -# GIT_COMMITTER_EMAIL: machine@tolgee.io + - name: Run npm release + run: npm run release -- -d + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GIT_AUTHOR_NAME: Tolgee Machine + GIT_AUTHOR_EMAIL: machine@tolgee.io + GIT_COMMITTER_NAME: Tolgee Machine + GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/package-lock.json b/package-lock.json index 5746005..56e2a17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,19 @@ { - "name": "ai-migrator", - "version": "1.0.0", + "name": "@tolgee/ai-migrator", + "version": "1.0.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "ai-migrator", - "version": "1.0.0", + "name": "@tolgee/ai-migrator", + "version": "1.0.0-alpha.1", "license": "ISC", "dependencies": { "@azure/identity": "^4.4.1", "@azure/openai": "^2.0.0-beta.2", "@babel/preset-env": "^7.25.8", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", "axios": "^1.7.7", "babel-jest": "^29.7.0", "commander": "^12.1.0", @@ -22,6 +24,7 @@ "handlebars": "^4.7.8", "inquirer": "^12.0.0", "openai": "^4.68.1", + "semantic-release": "^24.0.0", "tsx": "^4.19.1", "winston": "^3.16.0", "zod": "^3.23.8" @@ -3278,1955 +3281,6493 @@ "node": ">= 8" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, + "node_modules/@octokit/auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "node": ">= 18" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, + "node_modules/@octokit/core": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@octokit/endpoint": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@octokit/graphql": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", "dependencies": { - "@babel/types": "^7.0.0" + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz", + "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==", "dependencies": { - "@babel/types": "^7.20.7" + "@octokit/types": "^13.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "peer": true - }, - "node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, + "node_modules/@octokit/plugin-retry": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz", + "integrity": "sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==", "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" + "@octokit/request-error": "^6.0.0", + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@octokit/plugin-throttling": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.2.tgz", + "integrity": "sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==", "dependencies": { - "@types/node": "*" + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^6.0.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@octokit/request": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@octokit/request-error": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", + "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", "dependencies": { - "@types/istanbul-lib-report": "*" + "@octokit/types": "^13.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@types/jest": { - "version": "29.5.13", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", - "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", - "dev": true, + "node_modules/@octokit/types": { + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz", + "integrity": "sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "@octokit/openapi-types": "^22.2.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "dependencies": { - "@types/node": "*" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@types/node": { - "version": "22.7.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", - "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", - "dependencies": { - "undici-types": "~6.19.2" + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "dependencies": { - "@types/yargs-parser": "*" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", - "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", - "dev": true, + "node_modules/@semantic-release/changelog": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", + "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/type-utils": "8.11.0", - "@typescript-eslint/utils": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=14.17" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "semantic-release": ">=18.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", - "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", - "dev": true, + "node_modules/@semantic-release/commit-analyzer": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.0.tgz", + "integrity": "sha512-KtXWczvTAB1ZFZ6B4O+w8HkfYm/OgQb1dUGNFZtDgQ0csggrmkq8sTxhd+lwGF8kMb59/RnG9o4Tn7M/I8dQ9Q==", "dependencies": { - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", - "debug": "^4.3.4" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^1.0.3", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.8.1" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "semantic-release": ">=20.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", - "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", - "dev": true, + "node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0" + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=14.17" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", - "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/utils": "8.11.0", + "node_modules/@semantic-release/github": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.1.tgz", + "integrity": "sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==", + "dependencies": { + "@octokit/core": "^6.0.0", + "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-retry": "^7.0.0", + "@octokit/plugin-throttling": "^9.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "dir-glob": "^3.0.1", + "globby": "^14.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "url-join": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.8.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "semantic-release": ">=24.1.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", - "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", - "dev": true, + "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", - "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", - "dev": true, + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dependencies": { - "brace-expansion": "^2.0.1" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", - "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0" - }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", - "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.11.0", - "eslint-visitor-keys": "^3.4.3" - }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@semantic-release/npm": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz", + "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==", "dependencies": { - "event-target-shim": "^5.0.0" + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^9.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^10.5.0", + "rc": "^1.2.8", + "read-pkg": "^9.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" }, "engines": { - "node": ">=6.5" + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "engines": { - "node": ">=0.4.0" + "node": ">=18" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/@semantic-release/npm/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dependencies": { - "acorn": "^8.11.0" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dependencies": { - "debug": "^4.3.4" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">= 14" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dependencies": { - "humanize-ms": "^1.2.1" - }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">= 8.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz", + "integrity": "sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dependencies": { - "type-fest": "^0.21.3" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", "engines": { - "node": ">=8" + "node": ">=18.18.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node_modules/@semantic-release/npm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + "node_modules/@semantic-release/npm/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "node_modules/@semantic-release/npm/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "node_modules/@semantic-release/release-notes-generator": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.0.1.tgz", + "integrity": "sha512-K0w+5220TM4HZTthE5dDpIuFrnkN1NfTGPidJFm04ULT1DEZ9WG89VNXN7F0c+6nMEpWgqmPvb7vY7JkB2jyyA==", "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from-esm": "^1.0.3", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-package-up": "^11.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.8.1" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "semantic-release": ">=20.1.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "type-detect": "4.0.8" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/types": "^7.0.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/types": "^7.20.7" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "peer": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dependencies": { - "balanced-match": "^1.0.0" + "@types/node": "*" } }, - "node_modules/braces": { + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { - "fill-range": "^7.1.1" + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", + "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "node_modules/@typescript-eslint/parser": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } - ], + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", + "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, - "bin": { - "browserslist": "cli.js" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/bs-logger": { - "version": "0.2.6", + "node_modules/@typescript-eslint/types": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "dependencies": { - "fast-json-stable-stringify": "2.x" + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz", + "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.0.tgz", + "integrity": "sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA==", + "dependencies": { + "@types/semver": "^7.5.5", + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz", + "integrity": "sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.40.tgz", + "integrity": "sha512-LYm78o6if4zTasnYclgQzxEcgMoIcybWOhkATWepN95uwVVWV0/IW10v+2sIeHE+bIYWipLneTftVyQm45UY7g==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/env-ci": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.1.0.tgz", + "integrity": "sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==", + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", + "dependencies": { + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "peer": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", + "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "0.6.8" + } + }, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.0.tgz", + "integrity": "sha512-4nw3vOVR+vHUOT8+U4giwe2tcGv+R3pwwRidUe67DoMBTjhrfr6rZYJVVwdkBE+Um050SG+X9tf0Jo4fOpn01w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.4.tgz", + "integrity": "sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=16.20" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.0.tgz", + "integrity": "sha512-W3mwgzLtWIqHndtAb82zCHbRfdPit3jcqEyYkAjM/4p15g/1tOoduYydx6IJ3sh31FHT82YoqYZB8RoTwoMy7w==", + "dependencies": { + "@inquirer/core": "^10.0.0", + "@inquirer/prompts": "^7.0.0", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/into-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/issue-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "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.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + }, + "node_modules/logform": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "tmpl": "1.0.5" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": ">=6" + "node": ">= 18" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/marked-terminal": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.2.1.tgz", + "integrity": "sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==", + "dependencies": { + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.1.0" + }, "engines": { - "node": ">=6" + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <15" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "environment": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, + "node_modules/marked-terminal/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">= 12" + "node": ">= 8" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=12" + "node": ">=8.6" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node_modules/mime": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", + "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "bin": { + "mime": "bin/cli.js" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">= 0.6" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dependencies": { - "color-name": "~1.1.4" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=7.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dependencies": { - "color-name": "1.1.3" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", "dependencies": { - "delayed-stream": "~1.0.0" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dependencies": { - "browserslist": "^4.23.3" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" + "lru-cache": "^10.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "engines": { + "node": ">=14.16" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, + "node_modules/npm": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.0.tgz", + "integrity": "sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/config": "^9.0.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", + "@npmcli/promise-spawn": "^8.0.1", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "@sigstore/tuf": "^2.3.4", + "abbrev": "^3.0.0", + "archy": "~1.0.0", + "cacache": "^19.0.1", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.4.5", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^8.0.0", + "ini": "^5.0.0", + "init-package-json": "^7.0.1", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^4.0.0", + "libnpmaccess": "^9.0.0", + "libnpmdiff": "^7.0.0", + "libnpmexec": "^9.0.0", + "libnpmfund": "^6.0.0", + "libnpmhook": "^11.0.0", + "libnpmorg": "^7.0.0", + "libnpmpack": "^8.0.0", + "libnpmpublish": "^10.0.0", + "libnpmsearch": "^8.0.0", + "libnpmteam": "^7.0.0", + "libnpmversion": "^7.0.0", + "make-fetch-happen": "^14.0.1", + "minimatch": "^9.0.5", + "minipass": "^7.1.1", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.2.0", + "nopt": "^8.0.0", + "normalize-package-data": "^7.0.0", + "npm-audit-report": "^6.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-profile": "^11.0.1", + "npm-registry-fetch": "^18.0.1", + "npm-user-validate": "^3.0.0", + "p-map": "^4.0.0", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^4.0.0", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "ssri": "^12.0.0", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^6.0.0", + "which": "^5.0.0", + "write-file-atomic": "^6.0.0" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "safe-buffer": "^5.0.1" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "jake": "^10.8.5" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^4.0.0", + "semver": "^7.3.7", + "ssri": "^12.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" }, "bin": { - "ejs": "bin/cli.js" + "arborist": "bin/index.js" }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.40", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.40.tgz", - "integrity": "sha512-LYm78o6if4zTasnYclgQzxEcgMoIcybWOhkATWepN95uwVVWV0/IW10v+2sIeHE+bIYWipLneTftVyQm45UY7g==" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/npm/node_modules/@npmcli/config": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", + "ci-info": "^4.0.0", + "ini": "^5.0.0", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-arrayish": "^0.2.1" + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "hasInstallScript": true, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, "bin": { - "esbuild": "bin/esbuild" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=18" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "normalize-package-data": "^7.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "8.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "which": "^5.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.1.2" }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.3.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.3.2", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { + "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "peer": true, + "inBundle": true, + "license": "ISC", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "unique-slug": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.4", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "is-glob": "^4.0.3" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "engines": { - "node": ">=10.13.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.1", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "p-locate": "^5.0.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/abbrev": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "debug": "^4.3.4" }, "engines": { - "node": "*" + "node": ">= 14" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/cacache": { + "version": "19.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "estraverse": "^5.1.0" + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": ">=0.10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/minizlib": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">=4.0" + "node": ">= 18" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/npm/node_modules/cacache/node_modules/p-map": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/npm/node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/npm/node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=0.8.x" + "node": ">=18" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "ip-regex": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8.6.0" + "node": ">=6" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" + "node_modules/npm/node_modules/cmd-shim": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "minimatch": "^5.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/npm/node_modules/debug": { + "version": "4.3.6", + "inBundle": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=6" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "peer": true + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">= 4.9.1" } }, - "node_modules/foreground-child": { + "node_modules/npm/node_modules/foreground-child": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "inBundle": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -5238,1175 +9779,1196 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + "node_modules/npm/node_modules/glob": { + "version": "10.4.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">= 12.20" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=14.14" + "node": ">= 14" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 14" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/npm/node_modules/ignore-walk": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.8.19" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/npm/node_modules/ini": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "node_modules/npm/node_modules/init-package-json": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "@npmcli/package-json": "^6.0.0", + "npm-package-arg": "^12.0.0", + "promzard": "^2.0.0", + "read": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^6.0.0" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "inBundle": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": "20 || >=22" + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/npm/node_modules/is-cidr": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "is-glob": "^4.0.1" + "cidr-regex": "^4.1.1" }, "engines": { - "node": ">= 6" + "node": ">=14" } }, - "node_modules/globals": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", - "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", - "dev": true, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "node_modules/npm/node_modules/jackspeak": { + "version": "3.4.3", + "inBundle": true, + "license": "BlueOak-1.0.0", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=0.4.7" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { - "uglify-js": "^3.1.4" + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/has-flag": { + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "function-bind": "^1.1.2" + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/npm/node_modules/libnpmdiff": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "@npmcli/arborist": "^8.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "binary-extensions": "^2.3.0", + "diff": "^5.1.0", + "minimatch": "^9.0.4", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", + "tar": "^6.2.1" }, "engines": { - "node": ">= 14" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "node_modules/npm/node_modules/libnpmexec": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", + "ci-info": "^4.0.0", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", + "read": "^4.0.0", + "read-package-json-fast": "^4.0.0", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" }, "engines": { - "node": ">= 14" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, + "node_modules/npm/node_modules/libnpmfund": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^8.0.0" + }, "engines": { - "node": ">=10.17.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/npm/node_modules/libnpmhook": { + "version": "11.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "ms": "^2.0.0" + "aproba": "^2.0.0", + "npm-registry-fetch": "^18.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/npm/node_modules/libnpmorg": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "aproba": "^2.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, + "node_modules/npm/node_modules/libnpmpack": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0" + }, "engines": { - "node": ">= 4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "10.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ci-info": "^4.0.0", + "normalize-package-data": "^7.0.0", + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1", + "proc-log": "^5.0.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^12.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^18.0.1" + }, "engines": { - "node": ">=4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, + "node_modules/npm/node_modules/libnpmteam": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "aproba": "^2.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.1", + "@npmcli/run-script": "^9.0.1", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/npm/node_modules/lru-cache": { + "version": "10.4.3", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "14.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, "engines": { - "node": ">=0.8.19" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.5", + "inBundle": true, + "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/npm/node_modules/minipass": { + "version": "7.1.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/inquirer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.0.tgz", - "integrity": "sha512-W3mwgzLtWIqHndtAb82zCHbRfdPit3jcqEyYkAjM/4p15g/1tOoduYydx6IJ3sh31FHT82YoqYZB8RoTwoMy7w==", + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "@inquirer/core": "^10.0.0", - "@inquirer/prompts": "^7.0.0", - "@inquirer/type": "^3.0.0", - "ansi-escapes": "^4.3.2", - "mute-stream": "^2.0.0", - "run-async": "^3.0.0", - "rxjs": "^7.8.1" + "minipass": "^7.0.3" }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "node_modules/npm/node_modules/minipass-fetch": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.17.0 || >=20.5.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" + "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 18" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-extglob": "^2.1.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, "bin": { - "semver": "bin/semver.js" + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "semver": "^7.3.5" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jackspeak": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", - "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, + "node_modules/npm/node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=16" } }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "7.2.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "abbrev": "^2.0.0" }, "bin": { - "jest": "bin/jest.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "unique-slug": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" + "isexe": "^3.1.1" }, "bin": { - "jest": "bin/jest.js" + "node-which": "bin/which.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "bin": { + "nopt": "bin/nopt.js" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, + "node_modules/npm/node_modules/nopt/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "7.0.0", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "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.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "hosted-git-info": "^8.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "7.1.0", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "semver": "^7.1.1" }, "engines": { - "node": "*" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "12.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/npm/node_modules/npm-packlist": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "ignore-walk": "^7.0.0" }, "engines": { - "node": "*" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "10.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, + "node_modules/npm/node_modules/npm-profile": { + "version": "11.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "detect-newline": "^3.0.0" + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "18.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, + "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 18" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "3.0.0", + "inBundle": true, + "license": "BSD-2-Clause", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "aggregate-error": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/npm/node_modules/pacote": { + "version": "19.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "json-parse-even-better-errors": "^4.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.11.1", + "inBundle": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, + "node_modules/npm/node_modules/proc-log": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/npm/node_modules/proggy": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, + "node_modules/npm/node_modules/promzard": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "read": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "mute-stream": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 4" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, + "node_modules/npm/node_modules/rimraf": { + "version": "5.0.10", + "inBundle": true, + "license": "ISC", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "glob": "^10.3.7" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-snapshot/node_modules/semver": { + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, + "inBundle": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6414,601 +10976,603 @@ "node": ">=10" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, + "node_modules/npm/node_modules/sigstore": { + "version": "2.3.1", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.4", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 14" } }, - "node_modules/js-tokens": { + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.18", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ssri": { + "version": "12.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "minipass": "^7.0.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "universalify": "^2.0.0" + "minipass": "^3.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 8" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" + "yallist": "^4.0.0" }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=8" } }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" } }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/fs": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/tuf-js/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, + "node_modules/npm/node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, + "node_modules/npm/node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 0.8.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "node_modules/npm/node_modules/tuf-js/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/npm/node_modules/tuf-js/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/logform": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", - "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "node_modules/npm/node_modules/tuf-js/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "unique-slug": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/npm/node_modules/tuf-js/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "yallist": "^3.0.2" + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/make-dir": { + "node_modules/npm/node_modules/unique-filename": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "semver": "^7.5.3" + "unique-slug": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/npm/node_modules/unique-slug": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "tmpl": "1.0.5" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/which": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">=8.6" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=16" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=10.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/npm/node_modules/write-file-atomic": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "whatwg-url": "^5.0.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7029,7 +11593,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7120,6 +11683,39 @@ "node": ">=0.10.0" } }, + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", + "dependencies": { + "p-map": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7160,6 +11756,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -7177,8 +11792,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -7190,7 +11803,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -7204,6 +11816,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7253,31 +11894,120 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", "engines": { - "node": "20 || >=22" + "node": "20 || >=22" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=4" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { - "node": ">= 6" + "node": ">=4" } }, "node_modules/pkg-dir": { @@ -7355,6 +12085,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7363,6 +12107,11 @@ "node": ">= 0.6.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -7376,6 +12125,11 @@ "node": ">= 6" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -7426,12 +12180,106 @@ } ] }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7490,6 +12338,17 @@ "node": ">=4" } }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -7510,7 +12369,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7647,6 +12505,247 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semantic-release": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.0.tgz", + "integrity": "sha512-fQfn6e/aYToRtVJYKqneFM1Rg3KP2gh3wSWtpYsLlz6uaPKlISrTzvYAFn+mYWo07F0X1Cz5ucU89AVE8X1mbg==", + "dependencies": { + "@semantic-release/commit-analyzer": "^13.0.0-beta.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^11.0.0", + "@semantic-release/npm": "^12.0.0", + "@semantic-release/release-notes-generator": "^14.0.0-beta.1", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^8.0.0", + "import-from-esm": "^1.3.1", + "lodash-es": "^4.17.21", + "marked": "^12.0.0", + "marked-terminal": "^7.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^11.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=20.8.1" + } + }, + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz", + "integrity": "sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7655,6 +12754,42 @@ "semver": "bin/semver.js" } }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7685,6 +12820,94 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -7704,6 +12927,17 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7730,6 +12964,47 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + }, + "node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dependencies": { + "through2": "~2.0.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7764,6 +13039,42 @@ "npm": ">=6" } }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7881,7 +13192,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -7898,6 +13208,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/super-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", + "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", + "dependencies": { + "function-timeout": "^1.0.1", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7909,6 +13234,21 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -7936,6 +13276,53 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -7997,9 +13384,76 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "peer": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/tmp": { "version": "0.0.33", @@ -8033,6 +13487,17 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -8216,7 +13681,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8273,6 +13738,14 @@ "node": ">=4" } }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", @@ -8301,6 +13774,36 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -8348,6 +13851,14 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8381,6 +13892,15 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -8577,11 +14097,18 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -8595,7 +14122,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8613,7 +14139,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -8621,14 +14146,12 @@ "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8659,6 +14182,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/package.json b/package.json index a00193e..91c52b0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "test:unit": "jest tests/**", "test:integration": "jest testsGpt/**", "format": "eslint --fix", - "eslint": "eslint --max-warnings 0" + "eslint": "eslint --max-warnings 0", + "release": "semantic-release" }, "files": [ "dist", @@ -37,7 +38,10 @@ "openai": "^4.68.1", "tsx": "^4.19.1", "winston": "^3.16.0", - "zod": "^3.23.8" + "zod": "^3.23.8", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "semantic-release": "^24.0.0" }, "devDependencies": { "@babel/preset-typescript": "^7.25.7", @@ -55,5 +59,38 @@ "ts-node": "^10.9.2", "typescript": "^5.6.3", "typescript-eslint": "^8.10.0" + }, + "release": { + "branches": [ + { + "name": "main", + "channel": "alpha", + "prerelease": "alpha" + }, + { + "name": "next", + "channel": "next" + }, + { + "name": "prerelease", + "channel": "rc", + "prerelease": "rc" + } + ], + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/git", + { + "assets": [ + "package.json", + "CHANGELOG.md" + ] + } + ], + "@semantic-release/npm", + "@semantic-release/github" + ] } } From 6e35a42409f994d20f924b69536074598775dae3 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 18:34:46 +0100 Subject: [PATCH 18/21] chore: fix publish config, comment out release --- .github/workflows/release.yml | 18 +++++++++--------- package.json | 5 ++++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9068f85..45309af 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,12 +28,12 @@ jobs: - name: Build the CLI run: npm run build - - name: Run npm release - run: npm run release -- -d - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - GIT_AUTHOR_NAME: Tolgee Machine - GIT_AUTHOR_EMAIL: machine@tolgee.io - GIT_COMMITTER_NAME: Tolgee Machine - GIT_COMMITTER_EMAIL: machine@tolgee.io +# - name: Run npm release +# run: npm run release -- -d +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} +# GIT_AUTHOR_NAME: Tolgee Machine +# GIT_AUTHOR_EMAIL: machine@tolgee.io +# GIT_COMMITTER_NAME: Tolgee Machine +# GIT_COMMITTER_EMAIL: machine@tolgee.io diff --git a/package.json b/package.json index 91c52b0..bae24ca 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,12 @@ "README.md", "LICENSE" ], + "publishConfig": { + "access": "public" + }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "dependencies": { "@azure/identity": "^4.4.1", "@azure/openai": "^2.0.0-beta.2", From 60abca4f0939faa69ff85c6840655859c5cef5c5 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Sun, 10 Nov 2024 18:58:53 +0100 Subject: [PATCH 19/21] chore: remove eslint.config.mjs --- eslint.config.mjs | 21 --------------------- package-lock.json | 6 ++++-- 2 files changed, 4 insertions(+), 23 deletions(-) delete mode 100644 eslint.config.mjs diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 5294757..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,21 +0,0 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; -import prettierConfig from "eslint-config-prettier"; -import prettierPlugin from "eslint-plugin-prettier"; - -export default [ - { files: ["**/*.{js,mjs,cjs,ts}"] }, - { files: ["**/*.js"], languageOptions: { sourceType: "commonjs" } }, - { languageOptions: { globals: globals.browser } }, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - - prettierConfig, - { - plugins: { prettier: prettierPlugin }, - rules: { - "prettier/prettier": "error", - }, - }, -]; diff --git a/package-lock.json b/package-lock.json index 56e2a17..e684101 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "@tolgee/ai-migrator", "version": "1.0.0-alpha.1", - "license": "ISC", + "license": "MIT", "dependencies": { "@azure/identity": "^4.4.1", "@azure/openai": "^2.0.0-beta.2", @@ -13384,7 +13384,9 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true }, "node_modules/thenify": { "version": "3.3.1", From 26d109bc4475d20e3994e249bda712fd7042f980 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Mon, 11 Nov 2024 13:03:20 +0100 Subject: [PATCH 20/21] chore: Fix error handling w/ stack trace, add some better readme --- README.md | 110 +++++++++++++++++- docs/img/diff.webp | Bin 0 -> 67862 bytes eslint.config.js => eslint.config.mjs | 0 package.json | 22 ++-- scripts/copyResources.ts | 26 +++++ src/cli.ts | 9 ++ src/commands/migrate/FilesMigrator.ts | 4 +- src/commands/migrate/addMigrationCommand.ts | 2 +- src/commands/status/addStatusCommand.ts | 22 ---- src/commands/upload/addUploadCommand.ts | 2 +- src/common/ExpectedError.ts | 6 + src/common/checkGitClean.ts | 9 +- src/migrationStatus.ts | 40 ------- src/program.ts | 6 +- .../createResponseProvider.ts | 3 +- src/uploadKeysToTolgee.ts | 2 + 16 files changed, 174 insertions(+), 89 deletions(-) create mode 100644 docs/img/diff.webp rename eslint.config.js => eslint.config.mjs (100%) create mode 100644 scripts/copyResources.ts delete mode 100644 src/commands/status/addStatusCommand.ts create mode 100644 src/common/ExpectedError.ts diff --git a/README.md b/README.md index 51b2551..ad6adb9 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,117 @@ export const WelcomeMessage = () => { } ``` +## Prerequisites + +This tool help you to migrate your project to use Tolgee SDKs by removing the repetitive task of replacing raw strings +(or other library usage) with Tolgee SDK calls. + +However, you will have to do some non-repetitive manual work to finish the migration process. + +- Tolgee has to be setup in your code project, follow the [docs](https://docs.tolgee.io/js-sdk) to set up Tolgee SDKs in + your project. Steps like installing the libraries, creating Tolgee or wrapping your app code with Tolgee provider is + not subject of this tool. +- You need to have an OpenAI API key. You can get it [here](https://platform.openai.com/api-keys). Alternatively, you + cau use the Azure OpenAI. +- You need to have a project in Tolgee platform where you want to upload the keys. You can create a new project in + Tolgee platform [here](https://app.tolgee.io). +- You need to create an API key for the project in Tolgee platform. To create one, follow + these [docs](https://docs.tolgee.io/platform/account_settings/api_keys_and_pat_tokens/#generation). + ## Usage +The migration process is divided into two steps. First step, `migrate` command execution, will process your files, +replacing them with migrated version and produce status file including the localization keys to create. + +In the second step, you can manually fix the migrated files and status file. You can also add new keys to the status +file. + +The third step, `upload-keys` command execution will upload the keys to the Tolgee platform. + +### Step 1 - `migrate` command execution + 1. Install the tool globally: + ```bash + npm install -g @tolgee/ai-migrator + ``` + +2. Run the migration command: + + This will replace your original files with migrated versions and create a status file with keys to upload to Tolgee + platform. + + The command requires clean git state, if you have any uncommitted changes, stash them or commit them, or else you + will get `Migrator requires a clean git state. Please commit or stash changes before proceeding.` error message. + + ```bash + tolgee-migrator migrate -p src/**/*.tsx -r react -k + ``` + - `-p` - glob pattern to search for files to migrate + - `-r` - preset according your project stack (currently only `react` is supported) + - `-k` - your OpenAI API key + + You can also use `--help` to see all available options. Or see them bellow. + +### Step 2 - Fixing migrated files and status file + +In the second step, you can go over the migrated files and status file and fix them. It's good idea to open each file +diff +in your favourite IDE. + +If you add new key to any file, don't forget to add it to the status file. + +![Diff example](./docs/img/diff.webp) + +The status file is located on this path `.tolgee/migration-status.json`. This is example content: + +```json +[ + { + "src/authenticated/Onboarding.tsx": { + "migrated": true, + "keys": [ + { + "name": "setup-stickies-message", + "description": "Message shown while setting up stickies", + "default": "Setting up your stickies..." + } + ] + }, + ... + ] +``` + +### Step 3 - `upload-keys` command execution + +The upload keys command will upload the keys from the status file to the Tolgee platform. It will save the raw strings +from your code as the base language strings. + +```bash +tolgee-migrator upload-keys -ak tgpak_geytgmztl5shiobrmrzg4ndboe3tcnzsmvuwczlemmzdamtjmm3q +``` + +When success, it will print the message `Keys successfully uploaded to Tolgee ✅`. + +## The migration command +This command iterates over project files and replaces raw strings with Tolgee SDK calls. + +See the command help for all available options: + ```bash -npm install -g @tolgee/ai-migrator +tolgee-migrator migrate --help +``` + +``` +Migrate files and upload keys to Tolgee + +Options: + -p, --pattern File pattern to search for (e.g., src/**/*.tsx) (default: "src/**/*") + -a, --appendixPath Path to file with custom prompt appendix + -r, --preset Preset to use for migration (default: "react") + -c, --concurrency Number of files to process concurrently (default: "10") + -k, --api-key OpenAI or Azure OpenAI API key + -e, --endpoint Azure OpenAI endpoint + -d, --deployment Azure OpenAI deployment + -h, --help display help for command ``` + diff --git a/docs/img/diff.webp b/docs/img/diff.webp new file mode 100644 index 0000000000000000000000000000000000000000..74f0aca123388b001d5fcd7f90eb47f342d5d218 GIT binary patch literal 67862 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

O6(ODqCQ+m1l$k7Pf!#NK-fdMkZu+ndq}JO{Nd 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 { - if (!checkGitClean()) { - return; - } + checkGitClean(); const files = await findFiles(filePattern); diff --git a/src/commands/migrate/addMigrationCommand.ts b/src/commands/migrate/addMigrationCommand.ts index 23f9d9f..d04238f 100644 --- a/src/commands/migrate/addMigrationCommand.ts +++ b/src/commands/migrate/addMigrationCommand.ts @@ -9,7 +9,7 @@ export function addMigrationCommand(program: Command) { // Migrate command program .command('migrate') - .description('Migrate files and upload keys to Tolgee') + .description('Migrates files and creates status file ') .option( '-p, --pattern ', 'File pattern to search for (e.g., src/**/*.tsx)', diff --git a/src/commands/status/addStatusCommand.ts b/src/commands/status/addStatusCommand.ts deleted file mode 100644 index 4f7fb81..0000000 --- a/src/commands/status/addStatusCommand.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Command } from 'commander'; -import { checkMigrationStatus } from '../../migrationStatus'; - -export function addStatusCommand(program: Command) { - program - .command('status [file]') - .description( - 'Check the migration status of a specific file or show the entire status with --all' - ) - .option('--all', 'Show the entire migration status') - .action(async (file, options) => { - const { all } = options; - try { - await checkMigrationStatus(file, all); - } catch (error) { - console.error( - '[cli][status command] Error checking migration status:', - error - ); - } - }); -} diff --git a/src/commands/upload/addUploadCommand.ts b/src/commands/upload/addUploadCommand.ts index eebd264..a11cffd 100644 --- a/src/commands/upload/addUploadCommand.ts +++ b/src/commands/upload/addUploadCommand.ts @@ -5,7 +5,7 @@ import { TolgeeProjectClient } from '../../common/client/TolgeeProjectClient'; export function addUploadCommand(program: Command) { program .command('upload-keys') - .description('Upload the localization strings to Tolgee') + .description('Uploads the localization data from status file to Tolgee') .addOption(new Option('-au, --api-url ', 'Tolgee API URL')) .addOption(new Option('-ak, --api-key ', 'Tolgee API key')) .addOption( diff --git a/src/common/ExpectedError.ts b/src/common/ExpectedError.ts new file mode 100644 index 0000000..6062dbf --- /dev/null +++ b/src/common/ExpectedError.ts @@ -0,0 +1,6 @@ +export class ExpectedError extends Error { + constructor(message: string) { + super(message); + this.name = 'ExpectedError'; + } +} diff --git a/src/common/checkGitClean.ts b/src/common/checkGitClean.ts index 0928862..3f33220 100644 --- a/src/common/checkGitClean.ts +++ b/src/common/checkGitClean.ts @@ -1,13 +1,12 @@ // Function to check if the Git working directory is clean import { execSync } from 'child_process'; +import { ExpectedError } from './ExpectedError'; -export function checkGitClean(): boolean { +export function checkGitClean() { const result = execSync('git status --porcelain').toString().trim(); if (result) { - console.error( - '[cli][checkGitClean] Migrator requires a clean git state. Please commit or stash changes before proceeding.' + throw new ExpectedError( + 'Migrator requires a clean git state. Please commit or stash changes before proceeding.' ); - return false; } - return true; } diff --git a/src/migrationStatus.ts b/src/migrationStatus.ts index 394259b..f18f708 100755 --- a/src/migrationStatus.ts +++ b/src/migrationStatus.ts @@ -73,43 +73,3 @@ export const loadMigrationStatus = async (): Promise => { return JSON.parse(fileContent) as MigrationStatus; } }; - -// Function to check the migration status of a specific file or show the entire status -export const checkMigrationStatus = async ( - filePath?: string, - showAll?: boolean -) => { - try { - const status = await loadMigrationStatus(); - - if (showAll) { - // Show the entire status file - logger.info( - '[migrationStatus][check] Complete migration status:', - status - ); - } else if (filePath) { - // Check status for the specific file - const fileStatus = status[filePath]; - if (fileStatus) { - logger.info( - `[migrationStatus][check] Migration status for ${filePath}:`, - fileStatus - ); - } else { - logger.info( - `[migrationStatus][check] ${filePath} has not been migrated yet.` - ); - } - } else { - logger.info( - '[migrationStatus][check] Please provide a file to check its migration status or use the --all option to display the entire status.' - ); - } - } catch (error) { - console.error( - `[migrationStatus][check] Error checking migration status:`, - error - ); - } -}; diff --git a/src/program.ts b/src/program.ts index 0b06570..2b3ed56 100644 --- a/src/program.ts +++ b/src/program.ts @@ -1,19 +1,15 @@ import { Command, Option } from 'commander'; import { addMigrationCommand } from './commands/migrate/addMigrationCommand'; -import { addStatusCommand } from './commands/status/addStatusCommand'; import { addUploadCommand } from './commands/upload/addUploadCommand'; export function createProgram(): Command { - // Setup Commander CLI const program = new Command(); - program.name('cli').usage('[command] [options]'); - // add log level option + program.name('tolgee-migrator').usage('[command] [options]'); program.addOption( new Option('-l, --log-level ', 'Set the log level').default('info') ); addMigrationCommand(program); - addStatusCommand(program); addUploadCommand(program); return program; diff --git a/src/responseProviders/createResponseProvider.ts b/src/responseProviders/createResponseProvider.ts index 9635f31..ae3d0fe 100644 --- a/src/responseProviders/createResponseProvider.ts +++ b/src/responseProviders/createResponseProvider.ts @@ -3,6 +3,7 @@ import { AzureResponseProvider } from './AzureResponseProvider'; import { OpenAiResponseProvider } from './OpenAiResponseProvider'; import { PromptsProvider } from '../PromptsProvider'; import { PresetType } from '../presets/PresetType'; +import {ExpectedError} from "../common/ExpectedError"; const apiVersion = '2024-10-01-preview'; type ApiProvider = 'AZURE_OPENAI' | 'OPENAI'; @@ -56,7 +57,7 @@ function getApiProviderType({ return 'OPENAI'; } - throw new Error( + throw new ExpectedError( 'No API provider credentials specified in configuration, specify either OpenAI or Azure OpenAI credentials' ); } diff --git a/src/uploadKeysToTolgee.ts b/src/uploadKeysToTolgee.ts index 94d6a87..0185b6c 100755 --- a/src/uploadKeysToTolgee.ts +++ b/src/uploadKeysToTolgee.ts @@ -1,5 +1,6 @@ import { TolgeeProjectClientType } from './common/client/TolgeeProjectClient'; import { loadMigrationStatus } from './migrationStatus'; +import logger from "./utils/logger"; export const uploadKeysToTolgee = async (client: TolgeeProjectClientType) => { const status = await loadMigrationStatus(); @@ -17,4 +18,5 @@ export const uploadKeysToTolgee = async (client: TolgeeProjectClientType) => { })); await client.importKeys(formattedKeys); + logger.info('Keys successfully uploaded to Tolgee ✅ '); }; From c1743356dbec13ebd26ae3f85bee03ca676c6c44 Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Mon, 11 Nov 2024 15:26:48 +0100 Subject: [PATCH 21/21] docs: Fix docs & add proper readme, create development.md --- .gitignore | 2 +- .vscode/launch.template.json | 39 ++++++ README.md | 146 +++++++++++++++----- docs/development.md | 48 +++++++ docs/img/img.png | Bin 0 -> 70572 bytes docs/img/migrate-keys.webp | Bin 0 -> 22946 bytes src/commands/migrate/addMigrationCommand.ts | 2 +- 7 files changed, 202 insertions(+), 35 deletions(-) create mode 100644 .vscode/launch.template.json create mode 100644 docs/development.md create mode 100644 docs/img/img.png create mode 100644 docs/img/migrate-keys.webp diff --git a/.gitignore b/.gitignore index 78f0045..2fd5228 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,7 @@ allKeys.json # Ignore IDE and editor config files .idea/ -.vscode/ +.vscode/launch.json *.swp # Ignore compiled TypeScript files diff --git a/.vscode/launch.template.json b/.vscode/launch.template.json new file mode 100644 index 0000000..5fa3df5 --- /dev/null +++ b/.vscode/launch.template.json @@ -0,0 +1,39 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Migrate", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/src/cli.ts", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/tsx", + "args": [ + "migrate", + "-p", + "src/**/*.tsx", + "-k", + "" + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "cwd": "", + "skipFiles": ["/**", "${workspaceFolder}/node_modules/**"] + }, + { + "name": "Upload keys", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/src/cli.ts", + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/tsx", + "args": [ + "upload-keys", + "-ak", + "" + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "cwd": "", + "skipFiles": ["/**", "${workspaceFolder}/node_modules/**"] + } + ] +} diff --git a/README.md b/README.md index ad6adb9..71901ea 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,13 @@ ## Tolgee AI i18n migrator -This tool is used to migrate your app code from raw string to use Tolgee SDKs, so you can manage +This tool helps to migrate your unlocalized with no i18n app code from raw strings to use Tolgee SDKs so you can manage your localization effectively with Tolgee. ## Motivation -Although we still recommend to prepare your project for localization from the beginning, the reality -is that many developers start with raw strings and then decide to localize their app. +Although we still recommend preparing your project for localization from the beginning, the reality is that many developers start with raw strings and then decide to localize their apps. -This tool is here to help you with this process. It will scan your project for raw strings and -replace them with Tolgee SDK calls. +This tool is here to help you with this process. It scans your project and replaces raw strings with Tolgee SDK calls. e.g. for React, it will replace: ```typescript jsx @@ -26,32 +24,34 @@ export const WelcomeMessage = () => { } ``` +Then, it helps you to upload the keys with the new base language strings to the Tolgee platform. + ## Prerequisites -This tool help you to migrate your project to use Tolgee SDKs by removing the repetitive task of replacing raw strings +This tool helps you migrate your project to Tolgee SDKs by removing the repetitive task of replacing raw strings. (or other library usage) with Tolgee SDK calls. -However, you will have to do some non-repetitive manual work to finish the migration process. +However, you must do non-repetitive manual work to complete the migration process. -- Tolgee has to be setup in your code project, follow the [docs](https://docs.tolgee.io/js-sdk) to set up Tolgee SDKs in - your project. Steps like installing the libraries, creating Tolgee or wrapping your app code with Tolgee provider is - not subject of this tool. +- Tolgee has to be set up in your code project. Follow the [docs](https://docs.tolgee.io/js-sdk) to set up Tolgee SDKs for + your project. Steps like installing the libraries, creating Tolgee or wrapping your app code with the Tolgee provider are + not subject to this tool. - You need to have an OpenAI API key. You can get it [here](https://platform.openai.com/api-keys). Alternatively, you - cau use the Azure OpenAI. -- You need to have a project in Tolgee platform where you want to upload the keys. You can create a new project in + can use the Azure OpenAI. +- You need to have a project in the Tolgee platform where you want to upload the keys. You can create a new project in Tolgee platform [here](https://app.tolgee.io). -- You need to create an API key for the project in Tolgee platform. To create one, follow +- You need to create an API key for the project in the Tolgee platform. To create one, follow these [docs](https://docs.tolgee.io/platform/account_settings/api_keys_and_pat_tokens/#generation). ## Usage -The migration process is divided into two steps. First step, `migrate` command execution, will process your files, -replacing them with migrated version and produce status file including the localization keys to create. +The migration process consists of two steps. The first step, `migrate` command execution, will process your files, +replacing them with the migrated version and producing a status file, including the localization keys to create. -In the second step, you can manually fix the migrated files and status file. You can also add new keys to the status +In the second step, you can manually fix the migrated code files and the migration status file. You can also add new keys to the status file. -The third step, `upload-keys` command execution will upload the keys to the Tolgee platform. +The third step, the `upload-keys` command execution, will upload the keys to the Tolgee platform. ### Step 1 - `migrate` command execution @@ -62,32 +62,31 @@ The third step, `upload-keys` command execution will upload the keys to the Tolg 2. Run the migration command: - This will replace your original files with migrated versions and create a status file with keys to upload to Tolgee + This command execution will replace your original files with migrated versions and create a status file with keys to upload to Tolgee platform. - The command requires clean git state, if you have any uncommitted changes, stash them or commit them, or else you + The command requires a clean git state, if you have any uncommitted changes, stash them or commit them, or else you will get `Migrator requires a clean git state. Please commit or stash changes before proceeding.` error message. ```bash - tolgee-migrator migrate -p src/**/*.tsx -r react -k + tolgee-migrator migrate -p 'src/**/*.tsx' -r react -k ``` - - `-p` - glob pattern to search for files to migrate - - `-r` - preset according your project stack (currently only `react` is supported) - - `-k` - your OpenAI API key + - `-p` - glob pattern to search for files to migrate + - `-r` - preset according to your project stack (currently, only `react` is supported, or custom preset) + - `-k` - your OpenAI API key - You can also use `--help` to see all available options. Or see them bellow. + You can also use `--help` to see all available options. Or see them below. ### Step 2 - Fixing migrated files and status file -In the second step, you can go over the migrated files and status file and fix them. It's good idea to open each file -diff -in your favourite IDE. +In the second step, you can review the migrated and status files and fix them. It's a good idea to open each file diff +in your favorite IDE. -If you add new key to any file, don't forget to add it to the status file. +If you add a new key to any file, don't forget to add it to the status file. ![Diff example](./docs/img/diff.webp) -The status file is located on this path `.tolgee/migration-status.json`. This is example content: +The status file is located on this path `.tolgee/migration-status.json`. This is an example content: ```json [ @@ -115,9 +114,9 @@ from your code as the base language strings. tolgee-migrator upload-keys -ak tgpak_geytgmztl5shiobrmrzg4ndboe3tcnzsmvuwczlemmzdamtjmm3q ``` -When success, it will print the message `Keys successfully uploaded to Tolgee ✅`. +When successful, it will print the message `Keys successfully uploaded to Tolgee ✅.` -## The migration command +## The `migrate` command This command iterates over project files and replaces raw strings with Tolgee SDK calls. See the command help for all available options: @@ -127,16 +126,97 @@ tolgee-migrator migrate --help ``` ``` -Migrate files and upload keys to Tolgee +Migrates files and creates status file Options: -p, --pattern File pattern to search for (e.g., src/**/*.tsx) (default: "src/**/*") -a, --appendixPath Path to file with custom prompt appendix -r, --preset Preset to use for migration (default: "react") - -c, --concurrency Number of files to process concurrently (default: "10") + -c, --concurrency Number of files to process concurrently (default: "5") -k, --api-key OpenAI or Azure OpenAI API key -e, --endpoint Azure OpenAI endpoint -d, --deployment Azure OpenAI deployment -h, --help display help for command ``` +### Customizing the prompt + +You can customize the prompt using the `--appendixPath` option. The file should be text file containing additional +instructions for the AI model (ChatGPT). + +For example you can create file `.tolgee/appendix.txt` with following content. + +```text +Don't use T component inside message prop of ErrorMessage component. + - e.g. Don't do } />, instead do +``` + +Then you can run the command with the `--appendixPath` option: + +```bash +tolgee-migrator migrate -a .tolgee/appendix.txt ... +``` + +### Custom preset + +The only supported preset is `react`. You can create your custom preset by creating a javascript file with the structure +of the following example and use it with the `--preset` option. + +e.g., create file `.tolgee/my-react-preset.js` with content: + +```typescript +module.exports = { + name: "My react", + getUserPrompt: (props) => "I am a test prompt!", + getSystemPrompt: () => "I am a system prompt!", +}; +``` + +Then you can run the command with the `--preset` option: + +```bash +tolgee-migrator migrate -p 'src/**/*.tsx' -r my-react-preset.js ... +``` + +### Concurrency + +The migration command executes the requests in parallel. You can set the number of files to process concurrently using +the `--concurrency` option. + +### Using Azure OpenAI + +To use the Azure OpenAI, you need to provide the `--endpoint` and `--deployment` options. + +e.g. + +```bash +migrate -k -e https://my-endpoint.openai.azure.com -d my-deployment +``` + +## The `upload-keys` command + +This command uploads the keys from the status file to the Tolgee platform. If the specific key already exists in the +Tolgee, +it will have no effect on the key, so the base translation will not be overwritten. + +See the command help for all available options: + +```bash +tolgee-migrator upload-keys --help +``` + +``` +Usage: tolgee-migrator upload-keys [options] + +Uploads the localization data from the status file to Tolgee + +Options: + -au, --api-url Tolgee API URL + -ak, --api-key Tolgee API key + -p, --project-id Tolgee project ID (required just when using project API key) + -h, --help display help for command +``` + +## Development + +Read the development [docs](./docs/development.md). diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..aac7e0e --- /dev/null +++ b/docs/development.md @@ -0,0 +1,48 @@ +## Tolgee AI migration tool - Development docs +To run this project for debugging purposes, follow these steps: + +### 1. Clone and install dependencies + +1. Clone the repository + + ```bash + git clone https://github.com/tolgee/ai-migrator tolgee-ai-migrator + ``` + +2. Install dependencies + ```bash + cd tolgee-ai-migrator + npm ci + ``` + +### Running the tool +Running the tool is a bit tricky because it has to be run in a different working directory - the migrated project directory. Here are guides for different tools. + +#### Running in VSCode +To run it in VSCode, you can use the `.vsdode/launch.json` configuration provided in the repository. + +1. Open the project in VSCode +2. Copy the `.vscode/launch.template.json` to `.vscode/launch.json` + + And replace + - `` with your OpenAI API key + - `` with the directory you want to migrate + - `` with your Tolgee API key + +3. Select `Run and Debug` from the left sidebar and run the `Migrate` or `Upload keys` configuration + +#### Running in IntelliJ IDEA, WebStorm or other JetBrains IDEs + +1. Open the project in the IDE +2. Create a new run configuration according to this image + +![Idea configuration example](./img/migrate-keys.webp) + +Similarly, you can configure the upload keys command. + +Debugging should work out of the box in both cases. + +### Creating a new preset +To create a new preset, you can start by copying the `presets/react` directory to `presets/`. Then, you can +simply modify the `system.handlebars` file to match your needs. The system handlebars file is a prompt template +that is being sent to the ChatGPT. diff --git a/docs/img/img.png b/docs/img/img.png new file mode 100644 index 0000000000000000000000000000000000000000..085311cff16e8a13fad759efb4f5110cfcef94d7 GIT binary patch literal 70572 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 HH9IeTiGXLV{NA+|3U=i-}C0{Y$nUE_65 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≪YRo*?5Co-l8Q? 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', 'Number of files to process concurrently', - '10' + '5' ) .option('-k, --api-key ', 'OpenAI or Azure OpenAI API key') .option('-e, --endpoint ', 'Azure OpenAI endpoint')