From 44df437425c470c572b62aa3cb9dc44ea8aa1f61 Mon Sep 17 00:00:00 2001 From: andrei-mihnea-cerbu Date: Tue, 12 Nov 2024 18:05:50 +0200 Subject: [PATCH] async plugins fixed --- .../network/operations_base/operation_base.ts | 40 - .../operations_base/operation_handler.ts | 15 +- .../operations_custom/general_operations.ts | 43 +- .../user_to_user_operations.ts | 629 ++--- .../tcp_client_communicator.ts | 14 +- .../tcp_server_communicator.ts | 10 +- .../udp_socket_communicator.ts | 4 +- CEO/src/network/tcp/tcp_server.ts | 47 +- CEO/src/network/udp/udp_server.ts | 2 +- User/package-lock.json | 2269 +++++++++-------- User/package.json | 10 +- User/src/helpers/department_sharer.ts | 15 +- User/src/helpers/window_manager.ts | 50 +- .../network/operations_base/operation_base.ts | 40 - .../operations_base/operation_handler.ts | 15 +- .../operations_custom/general_operations.ts | 43 +- .../user_to_user_operations.ts | 629 ++--- .../tcp_client_communicator.ts | 14 +- .../tcp_server_communicator.ts | 10 +- .../udp_socket_communicator.ts | 4 +- User/src/network/tcp/tcp_server.ts | 47 +- User/src/network/udp/udp_server.ts | 2 +- 22 files changed, 1690 insertions(+), 2262 deletions(-) delete mode 100644 CEO/src/network/operations_base/operation_base.ts delete mode 100644 User/src/network/operations_base/operation_base.ts diff --git a/CEO/src/network/operations_base/operation_base.ts b/CEO/src/network/operations_base/operation_base.ts deleted file mode 100644 index 70fc47b..0000000 --- a/CEO/src/network/operations_base/operation_base.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ParsedMessage } from '../message_handler'; -import { OperationHandler } from './operation_handler'; -import { OperationPlugin } from './operation_plugin'; - -export abstract class OperationBase implements OperationPlugin { - // Shared operation codes - public static readonly operationCodes = { - OK: 'OK', - ERR: 'ERR', - END: 'END', - }; - - // Default handler for OK operation - public static handleOk(parsedMessage: ParsedMessage): ParsedMessage { - return parsedMessage; // Typically, you would just acknowledge with OK, returning as-is - } - - // Default handler for ERR operation - public static handleErr(parsedMessage: ParsedMessage): ParsedMessage { - return parsedMessage; // Typically, you would log the error and return - } - - // Default handler for END operation - public static handleEnd(parsedMessage: ParsedMessage): ParsedMessage { - return { - operationCode: OperationBase.operationCodes.END, - metaInfo: { message: 'Connection ended.' }, - }; - } - - // Register the common OK, ERR, and END handlers - public static registerCommonOperations(operationHandler: OperationHandler): void { - operationHandler.registerHandler(OperationBase.operationCodes.OK, OperationBase.handleOk); - operationHandler.registerHandler(OperationBase.operationCodes.ERR, OperationBase.handleErr); - operationHandler.registerHandler(OperationBase.operationCodes.END, OperationBase.handleEnd); - } - - // Abstract register method that will be implemented by subclasses - public abstract register(operationHandler: OperationHandler): void; -} diff --git a/CEO/src/network/operations_base/operation_handler.ts b/CEO/src/network/operations_base/operation_handler.ts index 76c00ce..4b9a2f2 100644 --- a/CEO/src/network/operations_base/operation_handler.ts +++ b/CEO/src/network/operations_base/operation_handler.ts @@ -2,14 +2,14 @@ import { ParsedMessage, MessageHandler } from '../message_handler'; import { OperationPlugin } from './operation_plugin'; -type OperationHandlerFunction = (parsedMessage: ParsedMessage) => ParsedMessage; +// Define handler function type to return Promise +type OperationHandlerFunction = (parsedMessage: ParsedMessage) => Promise; export class OperationHandler { private static instance: OperationHandler; private handlers: { [operationCode: string]: OperationHandlerFunction } = {}; private constructor() { - // Register only the unknown command handler on initialization this.registerHandler('UNKNOWN_COMMAND', this.handleUnknownCommand); } @@ -26,25 +26,24 @@ export class OperationHandler { this.handlers[operationCode] = handler; } - // Handle operation request - public handleOperation(rawMessage: string): ParsedMessage { - // Parse and validate the message + // Handle operation request asynchronously + public async handleOperation(rawMessage: string): Promise { const parsedMessage = MessageHandler.parseMessage(rawMessage); if (!parsedMessage || !MessageHandler.validateMessage(parsedMessage)) { return this.handleUnknownCommand(parsedMessage); } - // Dispatch the handler for the given operation code + // Retrieve the handler for the operation code and invoke it asynchronously const handler = this.handlers[parsedMessage.operationCode]; if (handler) { - return handler(parsedMessage); + return await handler(parsedMessage); } else { return this.handleUnknownCommand(parsedMessage); } } // Default handler for unknown commands - private handleUnknownCommand(parsedMessage: ParsedMessage): ParsedMessage { + private async handleUnknownCommand(parsedMessage: ParsedMessage): Promise { return { operationCode: 'UNKNOWN_COMMAND', metaInfo: { message: 'Unknown command received.' }, diff --git a/CEO/src/network/operations_custom/general_operations.ts b/CEO/src/network/operations_custom/general_operations.ts index d9d83a2..fd1e5f7 100644 --- a/CEO/src/network/operations_custom/general_operations.ts +++ b/CEO/src/network/operations_custom/general_operations.ts @@ -1,25 +1,26 @@ import { ParsedMessage } from '../message_handler'; -import { OperationBase } from '../operations_base/operation_base'; import { OperationHandler } from '../operations_base/operation_handler'; import os from 'node:os'; +import {OperationPlugin} from "../operations_base/operation_plugin"; -export class GeneralOperations extends OperationBase { +export class GeneralOperations implements OperationPlugin { public static readonly operationCodes = { - ...OperationBase.operationCodes, // Inherit common operation codes (OK, ERR, END) + OK: 'OK', + ERR: 'ERR', + END: 'END', HEARTBEAT: 'HEARTBEAT', ALIVE: 'ALIVE', SET_PUBLIC_KEY: 'SET_PUBLIC_KEY', SET_AES_KEY: 'SET_AES_KEY', }; - // Handle heartbeat operation - public static handleHeartbeat(): ParsedMessage { + // Handle heartbeat operation asynchronously + public static async handleHeartbeat(): Promise { const networkInterfaces = os.networkInterfaces(); let ipAddress = 'Unknown'; for (const iface of Object.values(networkInterfaces)) { - // @ts-ignore - for (const address of iface) { + for (const address of iface!) { if (address.family === 'IPv4' && !address.internal) { ipAddress = address.address; break; @@ -34,8 +35,8 @@ export class GeneralOperations extends OperationBase { }; } - // Handle public key exchange - public static handlePublicKey(parsedMessage: ParsedMessage): ParsedMessage { + // Handle public key exchange asynchronously + public static async handlePublicKey(parsedMessage: ParsedMessage): Promise { const clientPublicKey = parsedMessage.metaInfo?.publicKey; if (clientPublicKey) { return { @@ -50,14 +51,14 @@ export class GeneralOperations extends OperationBase { } } - // Handle AES key exchange - public static handleAESKey(parsedMessage: ParsedMessage): ParsedMessage { + // Handle AES key exchange asynchronously + public static async handleAESKey(parsedMessage: ParsedMessage): Promise { const aesKey = parsedMessage.metaInfo?.aesKey; const aesIv = parsedMessage.metaInfo?.aesIv; if (aesKey && aesIv) { return { operationCode: GeneralOperations.operationCodes.SET_AES_KEY, - metaInfo: { aesKey: aesKey, aesIv: aesIv }, + metaInfo: { aesKey, aesIv }, }; } else { return { @@ -67,14 +68,22 @@ export class GeneralOperations extends OperationBase { } } + // Default async handler for OK operation + public static async handleOk(parsedMessage: ParsedMessage): Promise { + return parsedMessage; // Acknowledge with OK, returning as-is + } + + // Default async handler for ERR operation + public static async handleErr(parsedMessage: ParsedMessage): Promise { + return parsedMessage; // Log the error and return + } + // Register general operations with the OperationHandler public register(operationHandler: OperationHandler): void { - // Register specific handlers for the general operations operationHandler.registerHandler(GeneralOperations.operationCodes.HEARTBEAT, GeneralOperations.handleHeartbeat); operationHandler.registerHandler(GeneralOperations.operationCodes.SET_PUBLIC_KEY, GeneralOperations.handlePublicKey); - operationHandler.registerHandler(GeneralOperations.operationCodes.SET_AES_KEY, GeneralOperations.handleAESKey); // Register AES key handler - - // Register common operations inherited from the base class - OperationBase.registerCommonOperations(operationHandler); + operationHandler.registerHandler(GeneralOperations.operationCodes.SET_AES_KEY, GeneralOperations.handleAESKey); + operationHandler.registerHandler(GeneralOperations.operationCodes.OK, GeneralOperations.handleOk); + operationHandler.registerHandler(GeneralOperations.operationCodes.ERR, GeneralOperations.handleErr); } } diff --git a/CEO/src/network/operations_custom/user_to_user_operations.ts b/CEO/src/network/operations_custom/user_to_user_operations.ts index 3e5c214..adefe62 100644 --- a/CEO/src/network/operations_custom/user_to_user_operations.ts +++ b/CEO/src/network/operations_custom/user_to_user_operations.ts @@ -1,18 +1,16 @@ import { ParsedMessage } from '../message_handler'; -import { OperationBase } from '../operations_base/operation_base'; import { OperationHandler } from '../operations_base/operation_handler'; +import {operationCodes} from "../operation_codes"; import path from 'path'; -import { execSync } from 'child_process'; -import fs from 'fs'; +import fs from 'fs/promises'; +import checkDiskSpace from "check-disk-space"; +import { JsonManager } from '../../helpers/json_manager'; +import {OperationPlugin} from "../operations_base/operation_plugin"; -const LOCK_FILE_EXTENSION = '.lock'; - -export class UserToUserOperations extends OperationBase { +export class UserToUserOperations implements OperationPlugin { public static readonly operationCodes = { - ...OperationBase.operationCodes, // Inherit common operation codes (OK, ERR, END) SEND_ANNOUNCEMENT: 'SEND_ANNOUNCEMENT', GET_USER_INFORMATION: 'GET_USER_INFORMATION', - RESET_DATABASE: 'RESET_DATABASE', BACKUP_FILE: 'BACKUP_FILE', CLEAR_BACKUP: 'CLEAR_BACKUP', SHARE_FILE: 'SHARE_FILE', @@ -24,429 +22,149 @@ export class UserToUserOperations extends OperationBase { DECRYPT_AND_SAVE_OLD_BACKUP_FILE: 'DECRYPT_AND_SAVE_OLD_BACKUP_FILE', }; - // Utility function to pause execution (sleep) - static sleep(ms: number): void { - const start = Date.now(); - while (Date.now() - start < ms) { - // Busy wait loop (not optimal but fine for this short duration) - } - } - - // Read JSON file with a lock mechanism - static readJsonSync(filePath: string): any { - const lockFilePath = `${filePath}.${LOCK_FILE_EXTENSION}`; - const absolutePath = path.resolve(filePath); - + private static async hasEnoughDiskSpace(directory: string, requiredPercentage: number = 25): Promise { try { - // Loop until the lock file is removed by another process - while (fs.existsSync(lockFilePath)) { - console.log(`Waiting for lock file to be released: ${lockFilePath}`); - UserToUserOperations.sleep(100); - } - - // Create lock file to signal this process is working on the file - fs.writeFileSync(lockFilePath, ''); // Create the lock file - - // Read and parse the JSON file - const fileContents = fs.readFileSync(absolutePath, 'utf-8'); - const parsedJson = JSON.parse(fileContents); - - // Once processing is done, delete the lock file - fs.unlinkSync(lockFilePath); // Remove the lock file - - return parsedJson; // Return the parsed JSON data - } catch (error) { - console.error(`Error reading or parsing JSON from ${filePath}:`, error); - - // Ensure the lock file is removed even in case of an error - if (fs.existsSync(lockFilePath)) { - fs.unlinkSync(lockFilePath); - } - - return null; // Return null or throw error based on preference - } - } - - static writeJsonSync(filePath: string, data: any): boolean { - const lockFilePath = `${filePath}.${LOCK_FILE_EXTENSION}`; - const absolutePath = path.resolve(filePath); - - try { - // Loop until the lock file is removed by another process - while (fs.existsSync(lockFilePath)) { - console.log(`Waiting for lock file to be released: ${lockFilePath}`); - UserToUserOperations.sleep(100); // Use the sleep utility to pause - } - - // Create lock file to signal this process is working on the file - fs.writeFileSync(lockFilePath, ''); // Create the lock file - - // Write the data to the JSON file - fs.writeFileSync(absolutePath, JSON.stringify(data, null, 2), 'utf-8'); - console.log(`Data written successfully to ${absolutePath}`); - - // Once processing is done, delete the lock file - fs.unlinkSync(lockFilePath); // Remove the lock file - - return true; // Indicate successful write - } catch (error) { - console.error(`Error writing JSON to ${filePath}:`, error); - - // Ensure the lock file is removed even in case of an error - if (fs.existsSync(lockFilePath)) { - fs.unlinkSync(lockFilePath); - } - - return false; // Indicate failure - } - } - - private static hasEnoughDiskSpace(directory: string, requiredPercentage: number): boolean { - try { - let availableSpace = 0; - let totalSpace = 0; - - if (process.platform === 'win32') { - // Windows - const output = execSync(`wmic logicaldisk where "DeviceID='${directory[0]}:'" get FreeSpace,Size`).toString(); - const lines = output.trim().split('\n'); - const [freeSpaceStr, totalSpaceStr] = lines[1].trim().split(/\s+/); - availableSpace = parseInt(freeSpaceStr, 10); // Available space in bytes - totalSpace = parseInt(totalSpaceStr, 10); // Total space in bytes - } else { - // Unix-based (Linux/macOS) - const output = execSync(`df -k "${directory}"`).toString(); - const lines = output.trim().split('\n'); - const parts = lines[lines.length - 1].split(/\s+/); - const availableSpaceInKb = parseInt(parts[3], 10); // Available space in KB - const totalSpaceInKb = parseInt(parts[1], 10); // Total space in KB - availableSpace = availableSpaceInKb * 1024; - totalSpace = totalSpaceInKb * 1024; - } - - // Calculate available space as a percentage of the total space + const diskInfo = await checkDiskSpace(directory); + const availableSpace = diskInfo.free; + const totalSpace = diskInfo.size; const availablePercentage = (availableSpace / totalSpace) * 100; - - // Return true if the available percentage is greater than or equal to the required percentage return availablePercentage >= requiredPercentage; } catch (error) { console.error(`Error checking disk space: ${error}`); - return false; // Return false if there's an error + return false; } } - public static handleResetDatabase(parsedMessage: ParsedMessage): ParsedMessage { - // Path to the application.json file - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); + public static async handleSendAnnouncement(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.message) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing announcement message.' }}; + } + + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); try { - // Read the existing data from application.json - const appData = UserToUserOperations.readJsonSync(pathToApplicationJson) || {}; - - // Update the reset_application_preferences field to true - appData.reset_application_preferences = true; - - // Write the updated data back to application.json - const success = UserToUserOperations.writeJsonSync(pathToApplicationJson, appData); - - if (success) { - console.log(`Application preferences reset successfully.`); - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: 'Application preferences reset successfully.' }, - }; - } else { - throw new Error("Failed to write to application.json"); - } + await jsonManager.writeValue('announcement', parsedMessage.metaInfo.message); + console.log(`Announcement saved: ${parsedMessage.metaInfo.message}`); + return { operationCode: operationCodes.OK, metaInfo: { message: 'Announcement saved.' }}; } catch (error: any) { - console.error(`Error resetting application preferences: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error resetting application preferences: ${error.message}` }, - }; + console.error(`Error saving announcement: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error: ${error.message}` }}; } } - - public static handleSendAnnouncement(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the message is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.message) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing announcement message in meta information.' }, - }; - } - - const announcementMessage = parsedMessage.metaInfo.message; - - // Path to the application.json file - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - + public static async handleGetUserInformation(parsedMessage: ParsedMessage): Promise { + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'userConfig.json')); try { - // Read the existing data from application.json - const appData = UserToUserOperations.readJsonSync(pathToApplicationJson) || {}; - - // Update the announcement field with the new message - appData.announcement = announcementMessage; - - // Write the updated data back to application.json - fs.writeFileSync(pathToApplicationJson, JSON.stringify(appData, null, 2), 'utf-8'); - - console.log(`Announcement message saved successfully: ${announcementMessage}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: 'Announcement message saved successfully.' }, - }; + const userInfo = await jsonManager.readValue('user_info'); + return { operationCode: operationCodes.OK, metaInfo: userInfo }; } catch (error: any) { - console.error(`Error saving announcement message: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error saving announcement message: ${error.message}` }, - }; + console.error(`Error fetching user info: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Error fetching user info' }}; } } - // Handle user information retrieval - public static handleGetUserInformation(parsedMessage: ParsedMessage): ParsedMessage { - const pathToUserJson = path.join(__dirname, '..', '..', 'json_files', 'userConfig.json'); - const userInfo = UserToUserOperations.readJsonSync(pathToUserJson); - - if (userInfo) { - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: userInfo.user_info, - }; - } else { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error fetching user information.' }, - }; - } - } - - // Handle file reception and saving - public static handleBackupFile(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure metaInfo and fileContent are available - if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing file content or meta information.' }, - }; + public static async handleBackupFile(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName || !parsedMessage.metaInfo?.relativeFilePath || !parsedMessage.fileContent) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing file or user information.' }}; } const { userName, relativeFilePath } = parsedMessage.metaInfo; - - if (!userName || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name or file path information.' }, - }; - } - - // Base directory where backups will be stored - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - - // Full path where the file will be stored (under the user's directory) - const fullFilePath = path.join(baseBackupDir, userName, relativeFilePath); + const fullFilePath = path.join(__dirname, '..', '..', 'backups', userName, relativeFilePath); try { - // Check if there is enough disk space - const requiredPercentage = 25; - if (!UserToUserOperations.hasEnoughDiskSpace(baseBackupDir, requiredPercentage)) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Insufficient disk space for backup.' }, - }; + if (!await UserToUserOperations.hasEnoughDiskSpace(path.dirname(fullFilePath), 25)) { + return { operationCode: operationCodes.ERR, metaInfo: + { message: 'Insufficient disk space.' }}; } - // Ensure the directory structure exists (create directories if they don't exist) - const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } + await fs.mkdir(path.dirname(fullFilePath), { recursive: true }); + await fs.writeFile(fullFilePath, parsedMessage.fileContent as Buffer); + console.log(`File saved: ${fullFilePath}`); - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); - - console.log(`File saved successfully: ${fullFilePath}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File saved successfully: ${relativeFilePath}` }, - }; + return { operationCode: operationCodes.OK, metaInfo: { message: `File saved: ${relativeFilePath}` }}; } catch (error: any) { console.error(`Error saving file: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error saving file: ${error.message}` }, - }; + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error saving file: ${error.message}` }}; } } - // Handle clearing all backups for a user - public static handleClearBackup(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the userName is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.userName) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name in meta information.' }, - }; + public static async handleClearBackup(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name.' }}; } - const { userName } = parsedMessage.metaInfo; - - // Base directory where backups are stored - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, userName); - + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.userName); try { - // Check if the user's backup directory exists - if (fs.existsSync(userBackupDir)) { - // Recursively delete the user's backup directory - fs.rmSync(userBackupDir, { recursive: true, force: true }); - console.log(`Backup cleared successfully for user: ${userName}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `Backup cleared successfully for user: ${userName}` }, - }; - } else { - console.warn(`Backup directory not found for user: ${userName}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Backup directory not found for user: ${userName}` }, - }; - } + await fs.rm(userBackupDir, { recursive: true, force: true }); + console.log(`Backup cleared: ${userBackupDir}`); + return { operationCode: operationCodes.OK, metaInfo: { message: `Backup cleared for ${parsedMessage.metaInfo.userName}` }}; } catch (error: any) { - console.error(`Error clearing backup for user: ${userName} - ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error clearing backup for user: ${userName}` }, - }; + console.error(`Error clearing backup: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error clearing backup: ${error.message}` }}; } } - // Handle sharing file operation - public static handleShareFile(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure metaInfo and fileContent are available - if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing file content or meta information.' }, - }; + public static async handleShareFile(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName || !parsedMessage.metaInfo?.relativeFilePath || !parsedMessage.fileContent) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing share info.' }}; } + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); const { userName, relativeFilePath } = parsedMessage.metaInfo; - if (!userName || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name or file path information.' }, - }; - } - - // Path to the application.json to read the shareDirectory field - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); - - // Corrected the condition - if (!appInfo || !appInfo.shareDirectory) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, - }; - } - - // Get the share directory path - const shareDirectory = appInfo.shareDirectory.path; - - // Full path where the file will be stored (under the user's directory in the shared folder) - const fullFilePath = path.join(shareDirectory, userName, relativeFilePath); - try { - // Ensure the directory structure exists (create directories if they don't exist) - const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); + const appInfo = await jsonManager.readValue('shareDirectory'); + const shareDirectory = appInfo?.path || ''; + + if (!shareDirectory) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Share directory missing.' }}; } - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); + const fullFilePath = path.join(shareDirectory, userName, relativeFilePath); + await fs.mkdir(path.dirname(fullFilePath), { recursive: true }); + await fs.writeFile(fullFilePath, parsedMessage.fileContent as Buffer); + console.log(`File shared: ${fullFilePath}`); - console.log(`File shared successfully: ${fullFilePath}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File shared successfully: ${relativeFilePath}` }, - }; + return { operationCode: operationCodes.OK, metaInfo: { message: `File shared: ${relativeFilePath}` }}; } catch (error: any) { console.error(`Error sharing file: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error sharing file: ${error.message}` }, - }; + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error sharing file: ${error.message}` }}; } } - public static handleClearDepartment(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the userName is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.userName) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name in meta information.' }, - }; + public static async handleClearDepartment(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name.' }}; } + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); const { userName } = parsedMessage.metaInfo; - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); - - // Corrected the condition - if (!appInfo || !appInfo.departmentDirectory) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, - }; - } - - // Get the share directory path - const baseDepartmentDir = appInfo.departmentDirectory.path; - const userDepartmentDir = path.join(baseDepartmentDir, '..', 'DEPARTMENT_FILES', userName); - try { - // Check if the user's backup directory exists - if (fs.existsSync(userDepartmentDir)) { - // Recursively delete the user's backup directory - fs.rmSync(userDepartmentDir, { recursive: true, force: true }); - console.log(`Backup cleared successfully for user: ${userName}`); + const appInfo = await jsonManager.readValue('departmentDirectory'); + const departmentDir = appInfo?.path || ''; + const userDepartmentDir = path.join(departmentDir, '..', 'DEPARTMENT_SHARE', userName); - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `Backup cleared successfully for user: ${userName}`}, - }; - } else { - console.warn(`Backup directory not found for user: ${userName}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Backup directory not found for user: ${userName}`}, - }; + try { + await fs.access(userDepartmentDir) + }catch(ex: any){ + return { operationCode: operationCodes.OK}; } + + await fs.rm(userDepartmentDir, { recursive: true, force: true }); + console.log(`Department backup cleared: ${userDepartmentDir}`); + return { operationCode: operationCodes.OK, metaInfo: { message: `Department backup cleared for ${userName}` }}; } catch (error: any) { - console.error(`Error clearing backup for user: ${userName} - ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error clearing backup for user: ${userName}`}, - }; + console.error(`Error clearing department: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error clearing department: ${error.message}` }}; } } - public static handleDepartmentFile(parsedMessage: ParsedMessage): ParsedMessage { + public static async handleDepartmentFile(parsedMessage: ParsedMessage): Promise { // Ensure metaInfo and fileContent are available if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { return { - operationCode: UserToUserOperations.operationCodes.ERR, + operationCode: operationCodes.ERR, metaInfo: { message: 'Missing file content or meta information.' }, }; } @@ -455,130 +173,99 @@ export class UserToUserOperations extends OperationBase { if (!userName || !relativeFilePath) { return { - operationCode: UserToUserOperations.operationCodes.ERR, + operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name or file path information.' }, }; } // Path to the application.json to read the shareDirectory field const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); + const jsonManager = new JsonManager(pathToApplicationJson); - // Corrected the condition - if (!appInfo || !appInfo.departmentDirectory) { + // Read application configuration asynchronously + let appInfo; + try { + appInfo = await jsonManager.readValue('departmentDirectory'); + } catch (error: any) { return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error reading application config: ${error.message}` }, + }; + } + + if (!appInfo || !appInfo.path) { + return { + operationCode: operationCodes.ERR, + metaInfo: { message: 'Error retrieving department directory from application.json.' }, }; } // Get the share directory path - const departmentDirectory = appInfo.departmentDirectory.path; - - // Full path where the file will be stored (under the user's directory in the shared folder) + const departmentDirectory = appInfo.path; const fullFilePath = path.join(departmentDirectory, '..', 'DEPARTMENT_FILES', userName, relativeFilePath); try { // Ensure the directory structure exists (create directories if they don't exist) const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } + await fs.mkdir(dirPath, { recursive: true }); - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); - - console.log(`File shared successfully: ${fullFilePath}`); + // Write the file content to the specified path + await fs.writeFile(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File shared successfully: ${relativeFilePath}`}, - }; + operationCode: operationCodes.OK, + metaInfo: { message: `File shared successfully: ${relativeFilePath}` }, + }; } catch (error: any) { - console.error(`Error sharing file: ${error.message}`); return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: {message: `Error sharing file: ${error.message}`}, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error sharing file: ${error.message}` }, }; } } - // Check if a backup has been created for a user - public static handleIsBackupCreated(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, - }; + public static async handleIsBackupCreated(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing name in meta information.' }}; } - const {name} = parsedMessage.metaInfo; - if (!name) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name in meta information.' }, - }; + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.name); + + try { + const exists = await fs.access(userBackupDir).then(() => true).catch(() => false); + return { operationCode: operationCodes.OK, metaInfo: { backupExists: exists }}; + } catch (error: any) { + console.error(`Error checking backup: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error checking backup: ${error.message}` }}; } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - - console.log(userBackupDir); - - const exists = fs.existsSync(userBackupDir); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { backupExists: exists }, - }; } - // Get the structure of the backup directory for a user - public static handleGetBackupStructure(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, - }; + public static async handleGetBackupStructure(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing name in meta information.' }}; } - const {name} = parsedMessage.metaInfo; - if (!name) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name in meta information.' }, - }; + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.name); + + try { + const structure = await UserToUserOperations.buildDirectoryStructure(userBackupDir); + return { operationCode: operationCodes.OK, metaInfo: { structure }}; + } catch (error: any) { + console.error(`Error building backup structure: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error: ${error.message}` }}; } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - - if (!fs.existsSync(userBackupDir)) { - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { structure: {} }, // Return empty structure if directory doesn't exist - }; - } - - const fileStructure = UserToUserOperations.buildDirectoryStructure(userBackupDir); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { structure: fileStructure }, - }; } - // Build the directory structure recursively - private static buildDirectoryStructure(directoryPath: string): any { + private static async buildDirectoryStructure(directoryPath: string): Promise { const structure: any = {}; - const files = fs.readdirSync(directoryPath); + const files = await fs.readdir(directoryPath); for (const file of files) { const filePath = path.join(directoryPath, file); - const stats = fs.statSync(filePath); + const stats = await fs.stat(filePath); if (stats.isDirectory()) { - structure[file] = UserToUserOperations.buildDirectoryStructure(filePath); // Recursive for subdirectories + structure[file] = await UserToUserOperations.buildDirectoryStructure(filePath); } else { structure[file] = path.relative(directoryPath, filePath); } @@ -587,67 +274,43 @@ export class UserToUserOperations extends OperationBase { return structure; } - // Handle file request from backup directory - public static handleReqFileFromBackup(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { + public static async handleReqFileFromBackup(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name || !parsedMessage.metaInfo?.relativeFilePath) { return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, + operationCode: operationCodes.ERR, + metaInfo: { message: 'Missing user name or file path in meta information.' }, }; } const { name, relativeFilePath } = parsedMessage.metaInfo; - - if (!name || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name or file path in meta information.' }, - }; - } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - const fullFilePath = path.join(userBackupDir, relativeFilePath); - - if (!fs.existsSync(fullFilePath)) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'File not found in backup.' }, - }; - } + const fullFilePath = path.join(__dirname, '..', '..', 'backups', name, relativeFilePath); try { - const fileContent = fs.readFileSync(fullFilePath, 'base64'); + const fileContent = await fs.readFile(fullFilePath); return { - operationCode: UserToUserOperations.operationCodes.OK, + operationCode: operationCodes.OK, metaInfo: { relativeFilePath }, - fileContent: Buffer.from(fileContent, 'base64') + fileContent, }; } catch (error: any) { - console.error(`Error reading file: ${error.message}`); + console.error(`Error reading file from backup: ${error.message}`); return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error reading file: ${error.message}`}, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error reading file: ${error.message}` }, }; } } - // Register user-to-user operations with the OperationHandler public register(operationHandler: OperationHandler): void { - // Register specific handlers for user-to-user operations - operationHandler.registerHandler(UserToUserOperations.operationCodes.RESET_DATABASE, UserToUserOperations.handleResetDatabase); operationHandler.registerHandler(UserToUserOperations.operationCodes.SEND_ANNOUNCEMENT, UserToUserOperations.handleSendAnnouncement); operationHandler.registerHandler(UserToUserOperations.operationCodes.GET_USER_INFORMATION, UserToUserOperations.handleGetUserInformation); operationHandler.registerHandler(UserToUserOperations.operationCodes.BACKUP_FILE, UserToUserOperations.handleBackupFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.CLEAR_BACKUP, UserToUserOperations.handleClearBackup); operationHandler.registerHandler(UserToUserOperations.operationCodes.SHARE_FILE, UserToUserOperations.handleShareFile); - operationHandler.registerHandler(UserToUserOperations.operationCodes.DEPARTMENT_FILE, UserToUserOperations.handleDepartmentFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.CLEAR_DEPARTMENT, UserToUserOperations.handleClearDepartment); + operationHandler.registerHandler(UserToUserOperations.operationCodes.DEPARTMENT_FILE, UserToUserOperations.handleDepartmentFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.IS_BACKUP_CREATED, UserToUserOperations.handleIsBackupCreated); operationHandler.registerHandler(UserToUserOperations.operationCodes.GET_BACKUP_STRUCTURE, UserToUserOperations.handleGetBackupStructure); operationHandler.registerHandler(UserToUserOperations.operationCodes.REQ_FILE_FROM_BACKUP, UserToUserOperations.handleReqFileFromBackup); - - // Register common operations inherited from the base class - OperationBase.registerCommonOperations(operationHandler); } } diff --git a/CEO/src/network/socket_communicator/tcp_client_communicator.ts b/CEO/src/network/socket_communicator/tcp_client_communicator.ts index 6bf2aa2..5bffe31 100644 --- a/CEO/src/network/socket_communicator/tcp_client_communicator.ts +++ b/CEO/src/network/socket_communicator/tcp_client_communicator.ts @@ -122,7 +122,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { for (let i = 0; i < messages.length - 1; i++) { const completeMessage = messages[i]; if (completeMessage) { - this.processCompleteMessage(completeMessage); + await this.processCompleteMessage(completeMessage); } } @@ -130,7 +130,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { } } - private processCompleteMessage(completeMessage: string): void { + private async processCompleteMessage(completeMessage: string): Promise { const [headerJson, chunkContent] = completeMessage.split('|'); const header = JSON.parse(headerJson); @@ -142,12 +142,12 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { if (this.chunkBuffers[header.messageId].every((chunk) => chunk !== undefined)) { const fullMessage = this.chunkBuffers[header.messageId].join(''); - this.handleIncomingMessage(fullMessage); + await this.handleIncomingMessage(fullMessage); delete this.chunkBuffers[header.messageId]; } } - handleIncomingMessage(incomingMessage: string): void { + async handleIncomingMessage(incomingMessage: string): Promise { let messageToProcess = incomingMessage; if (this.aesKey && this.aesIv) { messageToProcess = this.decryptWithAes(incomingMessage); @@ -155,7 +155,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { messageToProcess = this.decryptWithRsa(incomingMessage); } - const result = this.operationHandler.handleOperation(messageToProcess); + const result = await this.operationHandler.handleOperation(messageToProcess); if (result.operationCode === operationCodes.SET_AES_KEY) { this.isAesKeySetFlag = true; @@ -176,6 +176,8 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { } getHandlerResult(): ParsedMessage | null { - return this.handlerResult; + const message = this.handlerResult; + this.handlerResult = null; + return message; } } diff --git a/CEO/src/network/socket_communicator/tcp_server_communicator.ts b/CEO/src/network/socket_communicator/tcp_server_communicator.ts index 61840ef..feb1632 100644 --- a/CEO/src/network/socket_communicator/tcp_server_communicator.ts +++ b/CEO/src/network/socket_communicator/tcp_server_communicator.ts @@ -106,7 +106,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { for (let i = 0; i < messages.length - 1; i++) { const completeMessage = messages[i]; if (completeMessage) { - this.processCompleteMessage(completeMessage); + await this.processCompleteMessage(completeMessage); } } @@ -114,7 +114,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { } } - private processCompleteMessage(completeMessage: string): void { + private async processCompleteMessage(completeMessage: string): Promise { const [headerJson, chunkContent] = completeMessage.split('|'); const header = JSON.parse(headerJson); @@ -126,7 +126,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { if (this.chunkBuffers[header.messageId].every((chunk) => chunk !== undefined)) { const fullMessage = this.chunkBuffers[header.messageId].join(''); - this.handleIncomingMessage(fullMessage); + await this.handleIncomingMessage(fullMessage); delete this.chunkBuffers[header.messageId]; } } @@ -169,14 +169,14 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { } // Handle incoming message (decrypt with AES if available) - handleIncomingMessage(incomingMessage: string): void { + async handleIncomingMessage(incomingMessage: string): Promise { let messageToProcess = incomingMessage; if (this.aesKey && this.aesIv) { messageToProcess = this.decryptWithAes(incomingMessage); } - this.handlerResult = this.operationHandler.handleOperation(messageToProcess); + this.handlerResult = await this.operationHandler.handleOperation(messageToProcess); } // Write message to socket diff --git a/CEO/src/network/socket_communicator/udp_socket_communicator.ts b/CEO/src/network/socket_communicator/udp_socket_communicator.ts index 0385573..2e8de1a 100644 --- a/CEO/src/network/socket_communicator/udp_socket_communicator.ts +++ b/CEO/src/network/socket_communicator/udp_socket_communicator.ts @@ -12,8 +12,8 @@ export class UdpSocketCommunicator extends SocketCommunicatorBase { } // Handle incoming message (no decryption needed for UDP) - handleIncomingMessage(incomingMessage: string): void { - this.handlerResult = this.operationHandler.handleOperation(incomingMessage); + async handleIncomingMessage(incomingMessage: string): Promise { + this.handlerResult = await this.operationHandler.handleOperation(incomingMessage); } // Send plain message over UDP (metaInfo as JSON and fileContent as Buffer) diff --git a/CEO/src/network/tcp/tcp_server.ts b/CEO/src/network/tcp/tcp_server.ts index aabb408..14256c0 100644 --- a/CEO/src/network/tcp/tcp_server.ts +++ b/CEO/src/network/tcp/tcp_server.ts @@ -14,6 +14,7 @@ export class TcpServer { private readonly operationHandler: OperationHandler; private readonly port: number; private readonly host: string; + private clientQueues: Map> = new Map(); constructor(host: string, port: number) { this.connectionManager = new ConnectionManager(); @@ -25,21 +26,14 @@ export class TcpServer { this.operationHandler.loadPlugin(new UserToUserOperations()); } - // Unified logging function private log(message: string, level: 'log' | 'error' = 'log'): void { const prefix = '[TcpServer]'; - if (level === 'error') { - console.error(`${prefix} ${message}`); - } else { - console.log(`${prefix} ${message}`); - } + console[level === 'error' ? 'error' : 'log'](`${prefix} ${message}`); } - // Start the TCP server public start(): void { const tcpServer = net.createServer(); - // Handle incoming connections tcpServer.on('connection', (socket: Socket) => { const ip = socket.remoteAddress || 'unknown'; const port = socket.remotePort || 0; @@ -49,61 +43,66 @@ export class TcpServer { const tcpCommunicator = new TcpServerCommunicator(socket, ip, port, this.operationHandler); this.connectionManager.addConnection(ip, port, tcpCommunicator); - - // Generate RSA key pair and start key exchange tcpCommunicator.generateKeyPair(); + tcpCommunicator.sendPublicKey() .then(() => tcpCommunicator.sendAesKey()) .catch(err => { this.log(`Error during key exchange with client ${clientId}: ${err}`, 'error'); - socket.end(); // Close the connection in case of any error + socket.end(); }); - // Handle incoming data in chunks - socket.on('data', async (data: Buffer) => { - this.log(`Data received from client ${clientId}`); - await this.handleData(data, ip, port); + this.clientQueues.set(clientId, Promise.resolve()); + + socket.on('data', (data: Buffer) => { + this.queueClientDataProcessing(data, ip, port); }); - // Handle client disconnect socket.on('end', () => { this.log(`Client disconnected: ${clientId}`); this.connectionManager.removeCommunicator(ip, port); + this.clientQueues.delete(clientId); }); - // Handle socket errors socket.on('error', (err: Error) => { this.log(`Error from client ${clientId}: ${err.message}`, 'error'); this.connectionManager.removeCommunicator(ip, port); + this.clientQueues.delete(clientId); }); }); - // Handle server errors tcpServer.on('error', (err: Error) => { this.log(`TCP server error: ${err.message}`, 'error'); }); - // Start listening for connections tcpServer.listen(this.port, this.host, () => { this.log(`TCP server listening on ${this.host}:${this.port}`); }); } - // Handle incoming data from a client + private queueClientDataProcessing(data: Buffer, ip: string, port: number): void { + const clientId = `${ip}:${port}`; + const clientQueue = this.clientQueues.get(clientId) || Promise.resolve(); + + this.clientQueues.set( + clientId, + clientQueue.then(() => this.handleData(data, ip, port)).catch(error => { + this.log(`Error handling data for ${clientId}: ${error}`, 'error'); + }) + ); + } + private async handleData(data: Buffer, ip: string, port: number): Promise { const clientId = `${ip}:${port}`; - - // Retrieve the communicator associated with this connection const communicator = this.connectionManager.getCommunicator(ip, port) as TcpServerCommunicator; if (!communicator) { this.log(`No communicator found for ${clientId}`, 'error'); return; } - // Handle incoming chunked message via communicator await communicator.handleIncomingChunk(data); - // Fetch and process result if available + // Check if message is complete before fetching result const handlerResult = communicator.getHandlerResult(); if (handlerResult) { try { diff --git a/CEO/src/network/udp/udp_server.ts b/CEO/src/network/udp/udp_server.ts index 7111ed7..c18aaa5 100644 --- a/CEO/src/network/udp/udp_server.ts +++ b/CEO/src/network/udp/udp_server.ts @@ -50,7 +50,7 @@ export class UdpServer { const communicator = new UdpSocketCommunicator(this.udpServer, ip, port, this.operationHandler); // Process the incoming message using the communicator - communicator.handleIncomingMessage(msg.toString()); + await communicator.handleIncomingMessage(msg.toString()); const communicatorResult = communicator.getHandlerResult(); if (communicatorResult) { diff --git a/User/package-lock.json b/User/package-lock.json index 6a9924e..7aa3edc 100644 --- a/User/package-lock.json +++ b/User/package-lock.json @@ -1,14 +1,15 @@ { - "name": "proiect-licenta", + "name": "clientapp", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "proiect-licenta", + "name": "clientapp", "version": "1.0.0", "license": "ISC", "dependencies": { + "check-disk-space": "^3.4.0", "dotenv": "^16.4.5", "ping": "^0.4.4", "uuid": "^10.0.0" @@ -24,39 +25,18 @@ "copyfiles": "^2.4.1", "del-cli": "^5.0.0", "electron": "^33.0.2", + "node-disk-info": "^1.3.0", "typescript": "^5.6.2" } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", + "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, @@ -64,54 +44,14 @@ "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==", + "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==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "license": "MIT", "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" } }, "node_modules/@electron-forge/cli": { @@ -150,29 +90,6 @@ "node": ">= 14.17.5" } }, - "node_modules/@electron-forge/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron-forge/cli/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@electron-forge/core": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", @@ -251,32 +168,6 @@ "node": ">= 14.17.5" } }, - "node_modules/@electron-forge/core-utils/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron-forge/core/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@electron-forge/maker-base": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", @@ -480,10 +371,11 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.14", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.14.tgz", - "integrity": "sha512-hc52QkesULqbxTRC1vOmSBN1YndUkieoNMfvpe988h0MEoGGqbijkOqv4/2M9PufBJxiTVoDdBmBFfXPowZDQg==", + "version": "3.2.17", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.17.tgz", + "integrity": "sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", @@ -496,11 +388,44 @@ "node": ">=10.12.0" } }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/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, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -522,6 +447,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -536,24 +462,92 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@electron/get/node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, + "node_modules/@electron/node-gyp": { + "version": "10.2.0-electron.1", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-4MSBTT8y07YUDqf69/vSh80Hh791epYqGtWHO3zSKhYFwQg+gx9wi1PqbqP6YqC4WMsNxZ5l9oDmnWdK5pfCKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@electron/osx-sign": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -570,24 +564,14 @@ "node": ">=12.0.0" } }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, "node_modules/@electron/rebuild": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", - "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.1.tgz", + "integrity": "sha512-sKGD+xav4Gh25+LcLY0rjIwcCFTw+f/HU1pB48UVbwxXXRGaXEqIH0AaYKN46dgd/7+6kuiDXzoyAEvx1zCsdw==", "dev": true, + "license": "MIT", "dependencies": { + "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.1.1", @@ -596,7 +580,6 @@ "got": "^11.7.0", "node-abi": "^3.45.0", "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", @@ -610,63 +593,68 @@ "node": ">=12.13.0" } }, - "node_modules/@electron/rebuild/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==", + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" }, "engines": { - "node": ">=12" + "node": ">=8.6" } }, - "node_modules/@electron/rebuild/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@electron/rebuild/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/@electron/rebuild/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/@electron/windows-sign": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", - "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.0.tgz", + "integrity": "sha512-5zfLHfD6kGgsXzuYlKwlWWO8w6dboKy4dhd7rGnR4rQYumuDgPAF2TYjEa8LUi89KdHxtDy2btq02KvbjhK9Iw==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -704,7 +692,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@malept/cross-spawn-promise": { "version": "2.0.0", @@ -721,6 +710,7 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], + "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -733,6 +723,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -746,6 +737,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -755,6 +747,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -768,6 +761,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, + "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -776,24 +770,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/fs/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/@npmcli/move-file": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -807,6 +790,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -819,6 +803,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -831,6 +816,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -840,6 +826,7 @@ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -852,6 +839,7 @@ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -873,13 +861,15 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -896,13 +886,15 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -911,19 +903,22 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ping": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@types/ping/-/ping-0.4.4.tgz", "integrity": "sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -932,13 +927,15 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -949,6 +946,7 @@ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -957,13 +955,28 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } }, "node_modules/agentkeepalive": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, + "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -976,6 +989,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -1003,24 +1017,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/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==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1030,6 +1032,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1040,74 +1043,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/are-we-there-yet/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==", - "dev": true, - "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/are-we-there-yet/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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1136,11 +1077,46 @@ "@types/glob": "^7.1.1" } }, + "node_modules/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/asar/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, + "license": "ISC", + "optional": 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/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1150,6 +1126,7 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -1168,7 +1145,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1188,13 +1166,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1206,6 +1186,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1215,31 +1196,12 @@ "node": ">= 6" } }, - "node_modules/bl/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==", - "dev": true, - "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/bl/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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -1248,13 +1210,16 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, + "license": "MIT", "optional": true }, "node_modules/brace-expansion": { @@ -1262,6 +1227,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1272,6 +1238,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1298,6 +1265,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1308,6 +1276,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -1329,13 +1298,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/cacache": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -1365,6 +1336,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1373,79 +1345,32 @@ "node": ">=8" } }, - "node_modules/cacache/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/cacache/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "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": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cacache/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/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/cacache/node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -1461,6 +1386,7 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.6.0" } @@ -1470,6 +1396,7 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1488,6 +1415,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1500,6 +1428,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.3.0", "map-obj": "^4.1.0", @@ -1518,6 +1447,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1530,6 +1460,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1541,25 +1472,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/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==", - "dev": true, + "node_modules/check-disk-space": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", + "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==", + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=16" } }, "node_modules/chownr": { @@ -1567,6 +1486,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -1576,6 +1496,7 @@ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/clean-stack": { @@ -1583,6 +1504,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -1598,6 +1520,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1610,6 +1533,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -1622,6 +1546,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1634,6 +1559,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -1646,14 +1572,18 @@ } }, "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==", + "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, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -1661,6 +1591,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -1670,6 +1601,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -1682,6 +1614,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1693,16 +1626,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "bin": { - "color-support": "bin.js" - } + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", @@ -1712,10 +1637,11 @@ "license": "MIT" }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -1725,6 +1651,7 @@ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1733,19 +1660,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", "dev": true, + "license": "MIT", "dependencies": { "glob": "^7.0.5", "minimatch": "^3.0.3", @@ -1760,11 +1683,75 @@ "copyup": "copyfiles" } }, + "node_modules/copyfiles/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/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, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "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/copyfiles/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-dirname": { "version": "0.1.0", @@ -1775,10 +1762,11 @@ "optional": 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==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1861,12 +1849,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1882,6 +1871,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1894,6 +1884,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -1910,6 +1901,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1919,6 +1911,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1928,6 +1921,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -1943,6 +1937,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1955,6 +1950,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -1967,6 +1963,7 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -1976,6 +1973,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "es-define-property": "^1.0.0", @@ -1994,6 +1992,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "define-data-property": "^1.0.1", @@ -2012,6 +2011,7 @@ "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", "dev": true, + "license": "MIT", "dependencies": { "globby": "^13.1.2", "graceful-fs": "^4.2.10", @@ -2034,6 +2034,7 @@ "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.1.0.tgz", "integrity": "sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==", "dev": true, + "license": "MIT", "dependencies": { "del": "^7.1.0", "meow": "^10.1.3" @@ -2049,17 +2050,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -2069,13 +2065,26 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, + "license": "MIT", "optional": true }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, "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==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2087,6 +2096,7 @@ "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -2095,9 +2105,9 @@ } }, "node_modules/electron": { - "version": "33.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.0.2.tgz", - "integrity": "sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw==", + "version": "33.2.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.0.tgz", + "integrity": "sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2182,18 +2192,27 @@ "node": ">=10" } }, - "node_modules/electron-installer-common/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/electron-installer-common/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, "license": "ISC", "optional": true, - "bin": { - "semver": "bin/semver.js" + "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": ">=10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/electron-installer-debian": { @@ -2248,6 +2267,19 @@ "node": ">= 10" } }, + "node_modules/electron-installer-debian/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==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/electron-installer-debian/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2265,6 +2297,37 @@ "node": ">=10" } }, + "node_modules/electron-installer-debian/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "optional": true, + "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/electron-installer-debian/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==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/electron-installer-redhat": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", @@ -2316,6 +2379,19 @@ "node": ">= 10" } }, + "node_modules/electron-installer-redhat/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==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/electron-installer-redhat/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2333,6 +2409,37 @@ "node": ">=10" } }, + "node_modules/electron-installer-redhat/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "optional": true, + "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/electron-installer-redhat/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==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/electron-packager": { "version": "17.1.2", "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", @@ -2371,105 +2478,6 @@ "url": "https://github.com/electron/electron-packager?sponsor=1" } }, - "node_modules/electron-packager/node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-packager/node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-packager/node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/electron-packager/node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-packager/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-packager/node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, "node_modules/electron-packager/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -2485,29 +2493,6 @@ "node": ">=14.14" } }, - "node_modules/electron-packager/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-packager/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, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/electron-winstaller": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", @@ -2568,26 +2553,19 @@ "node": ">= 4.0.0" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "20.16.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", - "integrity": "sha512-T7PpxM/6yeDE+AdlVysT62BX6/bECZOmQAgiFg5NoBd5MQheZ3tzal7f1wvzfiEcmrcJNRi2zRr2nY2zF+0uqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, "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 + "dev": true, + "license": "MIT" }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -2598,6 +2576,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -2607,6 +2586,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2615,13 +2595,15 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -2631,6 +2613,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "get-intrinsic": "^1.2.4" @@ -2644,6 +2627,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -2654,6 +2638,7 @@ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/escalade": { @@ -2661,6 +2646,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2670,6 +2656,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=10" @@ -2800,13 +2787,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -2827,6 +2816,7 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2843,6 +2833,7 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2852,6 +2843,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -2889,6 +2881,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2901,6 +2894,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2931,6 +2925,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2945,6 +2940,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2956,13 +2952,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "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==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2991,31 +2989,12 @@ "license": "MIT", "optional": true }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3050,6 +3029,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "es-errors": "^1.3.0", @@ -3091,40 +3071,6 @@ "ms": "2.0.0" } }, - "node_modules/get-package-info/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-package-info/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/get-package-info/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3132,112 +3078,12 @@ "dev": true, "license": "MIT" }, - "node_modules/get-package-info/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/get-package-info/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-package-info/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -3249,21 +3095,21 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": 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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3274,6 +3120,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3281,11 +3128,35 @@ "node": ">= 6" } }, + "node_modules/glob/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -3299,22 +3170,6 @@ "node": ">=10.0" } }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -3361,13 +3216,15 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -3381,6 +3238,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -3400,6 +3258,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "get-intrinsic": "^1.1.3" @@ -3413,6 +3272,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -3437,24 +3297,27 @@ "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==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -3462,6 +3325,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "es-define-property": "^1.0.0" @@ -3475,6 +3339,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -3488,6 +3353,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -3496,17 +3362,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3532,6 +3393,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3539,17 +3401,47 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -3558,11 +3450,26 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "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==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } @@ -3572,7 +3479,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -3598,13 +3505,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "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, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3614,6 +3523,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -3623,6 +3533,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3634,7 +3545,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", @@ -3642,6 +3554,7 @@ "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.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3651,7 +3564,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", @@ -3675,6 +3589,7 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -3687,13 +3602,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3725,6 +3642,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3734,6 +3652,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3743,6 +3662,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3755,6 +3675,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3763,13 +3684,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3779,6 +3702,7 @@ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3791,6 +3715,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3803,6 +3728,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3822,6 +3748,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3856,43 +3783,63 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, + "license": "ISC", "optional": true }, "node_modules/jsonfile": { @@ -3900,6 +3847,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -3922,6 +3870,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3931,6 +3880,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3939,7 +3889,8 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/listr2": { "version": "5.0.8", @@ -4035,24 +3986,12 @@ "node": ">=4" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "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, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -4067,7 +4006,8 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", @@ -4081,6 +4021,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -4149,20 +4090,19 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/make-fetch-happen": { @@ -4170,6 +4110,7 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -4192,54 +4133,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/make-fetch-happen/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -4258,6 +4151,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4270,6 +4164,7 @@ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -4298,6 +4193,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^7.0.0", @@ -4319,11 +4215,68 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/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, + "license": "MIT", + "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/meow/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/meow/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==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4331,11 +4284,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -4345,6 +4309,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4358,6 +4323,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4367,6 +4333,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4376,6 +4343,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4385,6 +4353,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4397,6 +4366,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4406,6 +4376,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -4420,6 +4391,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4432,6 +4404,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -4444,6 +4417,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -4461,6 +4435,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -4473,6 +4448,7 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -4485,6 +4461,7 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -4497,6 +4474,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -4510,6 +4488,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -4518,16 +4497,18 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4544,6 +4525,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -4551,37 +4533,27 @@ "node": ">=10" } }, - "node_modules/node-abi/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/node-api-version": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" } }, - "node_modules/node-api-version/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/node-disk-info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-disk-info/-/node-disk-info-1.3.0.tgz", + "integrity": "sha512-NEx858vJZ0AoBtmD/ChBIHLjFTF28xCsDIgmFl4jtGKsvlUx9DU/OrMDjvj3qp/E4hzLN0HvTg7eJx5XFQvbeg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" }, "engines": { - "node": ">=10" + "node": ">= 12" } }, "node_modules/node-fetch": { @@ -4605,48 +4577,12 @@ } } }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/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/noms": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", "dev": true, + "license": "ISC", "dependencies": { "inherits": "^2.0.1", "readable-stream": "~1.0.31" @@ -4657,6 +4593,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -4672,6 +4609,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -4682,23 +4620,12 @@ "node": ">=10" } }, - "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==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4729,27 +4656,12 @@ "node": ">=4" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -4760,6 +4672,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -4769,6 +4682,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4784,6 +4698,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -4807,6 +4722,7 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4846,6 +4762,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4861,6 +4778,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4876,6 +4794,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -4887,13 +4806,13 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/parse-author": { @@ -4910,21 +4829,16 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, + "license": "MIT", "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" + "error-ex": "^1.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/parse-passwd": { @@ -4942,6 +4856,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4951,6 +4866,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4960,6 +4876,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4976,6 +4893,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4984,19 +4902,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5018,6 +4939,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz", "integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -5091,21 +5013,12 @@ "node": ">=8" } }, - "node_modules/pkg-dir/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -5143,17 +5056,29 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -5162,13 +5087,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -5178,10 +5105,11 @@ } }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5205,13 +5133,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5237,6 +5167,7 @@ "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -5245,62 +5176,148 @@ } }, "node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/read-pkg-up/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==", + "node_modules/read-pkg-up/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==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/read-pkg/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==", + "node_modules/read-pkg-up/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==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/readable-stream": { @@ -5308,6 +5325,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -5333,6 +5351,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -5349,6 +5368,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5375,7 +5395,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-dir": { "version": "1.0.1", @@ -5410,6 +5431,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -5422,6 +5444,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -5435,6 +5458,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -5444,6 +5468,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5462,6 +5487,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -5472,11 +5498,34 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/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, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -5509,6 +5558,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -5524,25 +5574,44 @@ } }, "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==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-compare": { @@ -5550,6 +5619,7 @@ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/serialize-error": { @@ -5557,6 +5627,7 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -5568,17 +5639,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "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", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5591,6 +5671,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5599,13 +5680,15 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5618,6 +5701,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -5632,6 +5716,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -5642,6 +5727,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -5656,6 +5742,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -5665,23 +5752,12 @@ "node": ">= 10" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "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==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5691,6 +5767,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5701,6 +5778,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -5710,13 +5788,15 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -5726,19 +5806,22 @@ "version": "3.0.20", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -5750,13 +5833,15 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5771,6 +5856,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5803,6 +5889,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -5848,6 +5935,7 @@ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^4.1.0" }, @@ -5856,15 +5944,16 @@ } }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -5885,6 +5974,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -5902,6 +5992,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } @@ -5921,6 +6012,29 @@ "node": ">=6.0.0" } }, + "node_modules/temp/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, + "license": "ISC", + "optional": 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/temp/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -5962,6 +6076,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -5971,13 +6086,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5988,11 +6105,19 @@ "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==", + "dev": true, + "license": "MIT" + }, "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -6010,6 +6135,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14.14" @@ -6020,6 +6146,7 @@ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tmp": "^0.2.0" @@ -6030,6 +6157,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6049,6 +6177,7 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6080,18 +6209,18 @@ } }, "node_modules/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "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==", "dev": true, - "optional": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6100,10 +6229,11 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6116,13 +6246,15 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, + "license": "ISC", "dependencies": { "unique-slug": "^3.0.0" }, @@ -6135,6 +6267,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -6147,6 +6280,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -6156,6 +6290,7 @@ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6178,7 +6313,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/uuid": { "version": "10.0.0", @@ -6188,6 +6324,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -6197,6 +6334,7 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -6207,6 +6345,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -6234,6 +6373,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6244,15 +6384,6 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -6269,6 +6400,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6285,13 +6417,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0" } @@ -6301,6 +6435,7 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } @@ -6310,6 +6445,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -6318,33 +6454,36 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "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==", + "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, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yarn-or-npm": { @@ -6443,6 +6582,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -6453,6 +6593,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/User/package.json b/User/package.json index 35307dc..2af95d9 100644 --- a/User/package.json +++ b/User/package.json @@ -15,6 +15,7 @@ "author": "Cerbu Andrei - Mihnea", "license": "ISC", "dependencies": { + "check-disk-space": "^3.4.0", "dotenv": "^16.4.5", "ping": "^0.4.4", "uuid": "^10.0.0" @@ -30,6 +31,7 @@ "copyfiles": "^2.4.1", "del-cli": "^5.0.0", "electron": "^33.0.2", + "node-disk-info": "^1.3.0", "typescript": "^5.6.2" }, "config": { @@ -54,14 +56,18 @@ }, { "name": "@electron-forge/maker-zip", - "platforms": ["darwin"], + "platforms": [ + "darwin" + ], "config": { "icon": "../app_icons/icon.icns" } }, { "name": "@electron-forge/maker-deb", - "platforms": ["linux"], + "platforms": [ + "linux" + ], "config": { "icon": "../app_icons/icon.png" } diff --git a/User/src/helpers/department_sharer.ts b/User/src/helpers/department_sharer.ts index 62dc6b5..a29c4e6 100644 --- a/User/src/helpers/department_sharer.ts +++ b/User/src/helpers/department_sharer.ts @@ -87,11 +87,10 @@ export class DepartmentSharer { const userIp = user.ip; this.tcpCommunicator = new TcpCommunicator(userIp, this.clientPort); - if (await this.tcpCommunicator.connect()) continue; + if (!await this.tcpCommunicator.connect()) continue; - // First clear the department directory - const clearSuccess = await this.clearDepartmentDirectory(); - if (clearSuccess) { + // First clear the department directory; + if (await this.clearDepartmentDirectory(userName)) { await this.sendFilesToUser(departmentFiles.structure, userName); } @@ -108,12 +107,14 @@ export class DepartmentSharer { } // Clear the department directory for a user - private async clearDepartmentDirectory(): Promise { + private async clearDepartmentDirectory(userName: string): Promise { if(!this.tcpCommunicator) return false; - if (!await this.tcpCommunicator.sendMessage(operationCodes.CLEAR_DEPARTMENT)) return false; + if (!await this.tcpCommunicator.sendMessage(operationCodes.CLEAR_DEPARTMENT, {userName: userName})) return false; const response = await this.waitForResponse(); + this.log(`${response?.operationCode}: ${response?.metaInfo?.message}`); + if (!response || response.operationCode !== operationCodes.OK){ this.log('Failed to clear the department directory.', 'error'); return false; @@ -158,6 +159,8 @@ export class DepartmentSharer { return; } + this.log(`File sent successfully: ${fileName} to ${userName}`); + unsentFiles.splice(unsentFiles.indexOf(fileName), 1); await this.tcpCommunicator.disconnect(); } diff --git a/User/src/helpers/window_manager.ts b/User/src/helpers/window_manager.ts index d661a05..97abfc3 100644 --- a/User/src/helpers/window_manager.ts +++ b/User/src/helpers/window_manager.ts @@ -10,6 +10,17 @@ export class WindowManager { constructor(mainWindow: BrowserWindow, pathToPagesDir: string) { this.pathToPagesDir = pathToPagesDir; this.mainWindow = mainWindow; + this.log('WindowManager initialized.'); + } + + // Logging helper function + private log(message: string, level: 'log' | 'error' = 'log'): void { + const prefix = '[WindowManager]'; + if (level === 'error') { + console.error(`${prefix} ${message}`); + } else { + console.log(`${prefix} ${message}`); + } } // Show an alert dialog @@ -21,8 +32,9 @@ export class WindowManager { message: message, buttons: ['OK'], }); + this.log(`Alert displayed with message: "${message}"`); } else { - console.error('Main window is not available.'); + this.log('Main window is not available.', 'error'); } } @@ -31,17 +43,17 @@ export class WindowManager { if (this.mainWindow) { try { const destinationPath = path.join(this.pathToPagesDir, `${destination}.html`); - console.log(`Navigating to: ${destinationPath}`); + this.log(`Navigating to: ${destinationPath}`); // Load the destination HTML file into the main window await this.mainWindow.loadFile(destinationPath); - console.log(`Navigated to ${destination}`); + this.log(`Navigated to ${destination}`); } catch (error) { - console.error('Error changing content:', error); - throw error; // Pass the error back to the render process + this.log(`Error changing content: ${error}`, 'error'); + throw error; // Pass the error back to the render process } } else { - console.error('Main window is not available.'); + this.log('Main window is not available.', 'error'); } } @@ -51,26 +63,26 @@ export class WindowManager { properties: ['openDirectory'], // Only allow selecting directories }); - // If the user cancels, result.filePaths will be an empty array if (result.filePaths && result.filePaths.length > 0) { + this.log(`Directory selected: ${result.filePaths[0]}`); return result.filePaths[0]; // Return the selected directory path } else { - console.log('No directory selected.'); + this.log('No directory selected.'); return undefined; // Return undefined if no directory was selected } } + // Show a file in the explorer async showFileInExplorer(filePath: string): Promise { if (filePath && fs.existsSync(filePath)) { try { - // Use Electron's shell module to show the file in the explorer shell.showItemInFolder(filePath); - console.log(`Opened file explorer for: ${filePath}`); + this.log(`Opened file explorer for: ${filePath}`); } catch (error: any) { - console.error(`Error showing file in explorer: ${error.message}`); + this.log(`Error showing file in explorer: ${error.message}`, 'error'); } } else { - console.error('File path is undefined or does not exist.'); + this.log('File path is undefined or does not exist.', 'error'); } } @@ -84,9 +96,10 @@ export class WindowManager { }); if (result.filePaths && result.filePaths.length > 0) { + this.log(`File selected: ${result.filePaths[0]}`); return result.filePaths[0]; // Return the selected file path } else { - console.log('No file selected.'); + this.log('No file selected.'); return undefined; // Return undefined if no file was selected } } @@ -94,15 +107,14 @@ export class WindowManager { // Method to display an announcement in a new window async displayAnnouncement(): Promise { if (this.announcementWindow) { - // If the window is already open, focus it this.announcementWindow.focus(); + this.log('Announcement window focused.'); return; } const mainScreen = require('electron').screen.getPrimaryDisplay(); const { width, height } = mainScreen.size; - // Initialize the announcement window this.announcementWindow = new BrowserWindow({ width: width / 3, height: height / 2, @@ -116,20 +128,22 @@ export class WindowManager { }); this.announcementWindow.removeMenu(); - - // Load the announcement page const announcementPath = path.join(this.pathToPagesDir, 'announcement.html'); await this.announcementWindow.loadFile(announcementPath); + this.log(`Announcement window opened at: ${announcementPath}`); + // Handle window close this.announcementWindow.on('closed', () => { - this.announcementWindow = null; // Clean up the reference + this.announcementWindow = null; + this.log('Announcement window closed.'); }); } async closeAnnouncementWindow(): Promise { if (this.announcementWindow) { this.announcementWindow.close(); + this.log('Announcement window closed by user.'); } } } diff --git a/User/src/network/operations_base/operation_base.ts b/User/src/network/operations_base/operation_base.ts deleted file mode 100644 index 70fc47b..0000000 --- a/User/src/network/operations_base/operation_base.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ParsedMessage } from '../message_handler'; -import { OperationHandler } from './operation_handler'; -import { OperationPlugin } from './operation_plugin'; - -export abstract class OperationBase implements OperationPlugin { - // Shared operation codes - public static readonly operationCodes = { - OK: 'OK', - ERR: 'ERR', - END: 'END', - }; - - // Default handler for OK operation - public static handleOk(parsedMessage: ParsedMessage): ParsedMessage { - return parsedMessage; // Typically, you would just acknowledge with OK, returning as-is - } - - // Default handler for ERR operation - public static handleErr(parsedMessage: ParsedMessage): ParsedMessage { - return parsedMessage; // Typically, you would log the error and return - } - - // Default handler for END operation - public static handleEnd(parsedMessage: ParsedMessage): ParsedMessage { - return { - operationCode: OperationBase.operationCodes.END, - metaInfo: { message: 'Connection ended.' }, - }; - } - - // Register the common OK, ERR, and END handlers - public static registerCommonOperations(operationHandler: OperationHandler): void { - operationHandler.registerHandler(OperationBase.operationCodes.OK, OperationBase.handleOk); - operationHandler.registerHandler(OperationBase.operationCodes.ERR, OperationBase.handleErr); - operationHandler.registerHandler(OperationBase.operationCodes.END, OperationBase.handleEnd); - } - - // Abstract register method that will be implemented by subclasses - public abstract register(operationHandler: OperationHandler): void; -} diff --git a/User/src/network/operations_base/operation_handler.ts b/User/src/network/operations_base/operation_handler.ts index 76c00ce..4b9a2f2 100644 --- a/User/src/network/operations_base/operation_handler.ts +++ b/User/src/network/operations_base/operation_handler.ts @@ -2,14 +2,14 @@ import { ParsedMessage, MessageHandler } from '../message_handler'; import { OperationPlugin } from './operation_plugin'; -type OperationHandlerFunction = (parsedMessage: ParsedMessage) => ParsedMessage; +// Define handler function type to return Promise +type OperationHandlerFunction = (parsedMessage: ParsedMessage) => Promise; export class OperationHandler { private static instance: OperationHandler; private handlers: { [operationCode: string]: OperationHandlerFunction } = {}; private constructor() { - // Register only the unknown command handler on initialization this.registerHandler('UNKNOWN_COMMAND', this.handleUnknownCommand); } @@ -26,25 +26,24 @@ export class OperationHandler { this.handlers[operationCode] = handler; } - // Handle operation request - public handleOperation(rawMessage: string): ParsedMessage { - // Parse and validate the message + // Handle operation request asynchronously + public async handleOperation(rawMessage: string): Promise { const parsedMessage = MessageHandler.parseMessage(rawMessage); if (!parsedMessage || !MessageHandler.validateMessage(parsedMessage)) { return this.handleUnknownCommand(parsedMessage); } - // Dispatch the handler for the given operation code + // Retrieve the handler for the operation code and invoke it asynchronously const handler = this.handlers[parsedMessage.operationCode]; if (handler) { - return handler(parsedMessage); + return await handler(parsedMessage); } else { return this.handleUnknownCommand(parsedMessage); } } // Default handler for unknown commands - private handleUnknownCommand(parsedMessage: ParsedMessage): ParsedMessage { + private async handleUnknownCommand(parsedMessage: ParsedMessage): Promise { return { operationCode: 'UNKNOWN_COMMAND', metaInfo: { message: 'Unknown command received.' }, diff --git a/User/src/network/operations_custom/general_operations.ts b/User/src/network/operations_custom/general_operations.ts index d9d83a2..fd1e5f7 100644 --- a/User/src/network/operations_custom/general_operations.ts +++ b/User/src/network/operations_custom/general_operations.ts @@ -1,25 +1,26 @@ import { ParsedMessage } from '../message_handler'; -import { OperationBase } from '../operations_base/operation_base'; import { OperationHandler } from '../operations_base/operation_handler'; import os from 'node:os'; +import {OperationPlugin} from "../operations_base/operation_plugin"; -export class GeneralOperations extends OperationBase { +export class GeneralOperations implements OperationPlugin { public static readonly operationCodes = { - ...OperationBase.operationCodes, // Inherit common operation codes (OK, ERR, END) + OK: 'OK', + ERR: 'ERR', + END: 'END', HEARTBEAT: 'HEARTBEAT', ALIVE: 'ALIVE', SET_PUBLIC_KEY: 'SET_PUBLIC_KEY', SET_AES_KEY: 'SET_AES_KEY', }; - // Handle heartbeat operation - public static handleHeartbeat(): ParsedMessage { + // Handle heartbeat operation asynchronously + public static async handleHeartbeat(): Promise { const networkInterfaces = os.networkInterfaces(); let ipAddress = 'Unknown'; for (const iface of Object.values(networkInterfaces)) { - // @ts-ignore - for (const address of iface) { + for (const address of iface!) { if (address.family === 'IPv4' && !address.internal) { ipAddress = address.address; break; @@ -34,8 +35,8 @@ export class GeneralOperations extends OperationBase { }; } - // Handle public key exchange - public static handlePublicKey(parsedMessage: ParsedMessage): ParsedMessage { + // Handle public key exchange asynchronously + public static async handlePublicKey(parsedMessage: ParsedMessage): Promise { const clientPublicKey = parsedMessage.metaInfo?.publicKey; if (clientPublicKey) { return { @@ -50,14 +51,14 @@ export class GeneralOperations extends OperationBase { } } - // Handle AES key exchange - public static handleAESKey(parsedMessage: ParsedMessage): ParsedMessage { + // Handle AES key exchange asynchronously + public static async handleAESKey(parsedMessage: ParsedMessage): Promise { const aesKey = parsedMessage.metaInfo?.aesKey; const aesIv = parsedMessage.metaInfo?.aesIv; if (aesKey && aesIv) { return { operationCode: GeneralOperations.operationCodes.SET_AES_KEY, - metaInfo: { aesKey: aesKey, aesIv: aesIv }, + metaInfo: { aesKey, aesIv }, }; } else { return { @@ -67,14 +68,22 @@ export class GeneralOperations extends OperationBase { } } + // Default async handler for OK operation + public static async handleOk(parsedMessage: ParsedMessage): Promise { + return parsedMessage; // Acknowledge with OK, returning as-is + } + + // Default async handler for ERR operation + public static async handleErr(parsedMessage: ParsedMessage): Promise { + return parsedMessage; // Log the error and return + } + // Register general operations with the OperationHandler public register(operationHandler: OperationHandler): void { - // Register specific handlers for the general operations operationHandler.registerHandler(GeneralOperations.operationCodes.HEARTBEAT, GeneralOperations.handleHeartbeat); operationHandler.registerHandler(GeneralOperations.operationCodes.SET_PUBLIC_KEY, GeneralOperations.handlePublicKey); - operationHandler.registerHandler(GeneralOperations.operationCodes.SET_AES_KEY, GeneralOperations.handleAESKey); // Register AES key handler - - // Register common operations inherited from the base class - OperationBase.registerCommonOperations(operationHandler); + operationHandler.registerHandler(GeneralOperations.operationCodes.SET_AES_KEY, GeneralOperations.handleAESKey); + operationHandler.registerHandler(GeneralOperations.operationCodes.OK, GeneralOperations.handleOk); + operationHandler.registerHandler(GeneralOperations.operationCodes.ERR, GeneralOperations.handleErr); } } diff --git a/User/src/network/operations_custom/user_to_user_operations.ts b/User/src/network/operations_custom/user_to_user_operations.ts index 3e5c214..adefe62 100644 --- a/User/src/network/operations_custom/user_to_user_operations.ts +++ b/User/src/network/operations_custom/user_to_user_operations.ts @@ -1,18 +1,16 @@ import { ParsedMessage } from '../message_handler'; -import { OperationBase } from '../operations_base/operation_base'; import { OperationHandler } from '../operations_base/operation_handler'; +import {operationCodes} from "../operation_codes"; import path from 'path'; -import { execSync } from 'child_process'; -import fs from 'fs'; +import fs from 'fs/promises'; +import checkDiskSpace from "check-disk-space"; +import { JsonManager } from '../../helpers/json_manager'; +import {OperationPlugin} from "../operations_base/operation_plugin"; -const LOCK_FILE_EXTENSION = '.lock'; - -export class UserToUserOperations extends OperationBase { +export class UserToUserOperations implements OperationPlugin { public static readonly operationCodes = { - ...OperationBase.operationCodes, // Inherit common operation codes (OK, ERR, END) SEND_ANNOUNCEMENT: 'SEND_ANNOUNCEMENT', GET_USER_INFORMATION: 'GET_USER_INFORMATION', - RESET_DATABASE: 'RESET_DATABASE', BACKUP_FILE: 'BACKUP_FILE', CLEAR_BACKUP: 'CLEAR_BACKUP', SHARE_FILE: 'SHARE_FILE', @@ -24,429 +22,149 @@ export class UserToUserOperations extends OperationBase { DECRYPT_AND_SAVE_OLD_BACKUP_FILE: 'DECRYPT_AND_SAVE_OLD_BACKUP_FILE', }; - // Utility function to pause execution (sleep) - static sleep(ms: number): void { - const start = Date.now(); - while (Date.now() - start < ms) { - // Busy wait loop (not optimal but fine for this short duration) - } - } - - // Read JSON file with a lock mechanism - static readJsonSync(filePath: string): any { - const lockFilePath = `${filePath}.${LOCK_FILE_EXTENSION}`; - const absolutePath = path.resolve(filePath); - + private static async hasEnoughDiskSpace(directory: string, requiredPercentage: number = 25): Promise { try { - // Loop until the lock file is removed by another process - while (fs.existsSync(lockFilePath)) { - console.log(`Waiting for lock file to be released: ${lockFilePath}`); - UserToUserOperations.sleep(100); - } - - // Create lock file to signal this process is working on the file - fs.writeFileSync(lockFilePath, ''); // Create the lock file - - // Read and parse the JSON file - const fileContents = fs.readFileSync(absolutePath, 'utf-8'); - const parsedJson = JSON.parse(fileContents); - - // Once processing is done, delete the lock file - fs.unlinkSync(lockFilePath); // Remove the lock file - - return parsedJson; // Return the parsed JSON data - } catch (error) { - console.error(`Error reading or parsing JSON from ${filePath}:`, error); - - // Ensure the lock file is removed even in case of an error - if (fs.existsSync(lockFilePath)) { - fs.unlinkSync(lockFilePath); - } - - return null; // Return null or throw error based on preference - } - } - - static writeJsonSync(filePath: string, data: any): boolean { - const lockFilePath = `${filePath}.${LOCK_FILE_EXTENSION}`; - const absolutePath = path.resolve(filePath); - - try { - // Loop until the lock file is removed by another process - while (fs.existsSync(lockFilePath)) { - console.log(`Waiting for lock file to be released: ${lockFilePath}`); - UserToUserOperations.sleep(100); // Use the sleep utility to pause - } - - // Create lock file to signal this process is working on the file - fs.writeFileSync(lockFilePath, ''); // Create the lock file - - // Write the data to the JSON file - fs.writeFileSync(absolutePath, JSON.stringify(data, null, 2), 'utf-8'); - console.log(`Data written successfully to ${absolutePath}`); - - // Once processing is done, delete the lock file - fs.unlinkSync(lockFilePath); // Remove the lock file - - return true; // Indicate successful write - } catch (error) { - console.error(`Error writing JSON to ${filePath}:`, error); - - // Ensure the lock file is removed even in case of an error - if (fs.existsSync(lockFilePath)) { - fs.unlinkSync(lockFilePath); - } - - return false; // Indicate failure - } - } - - private static hasEnoughDiskSpace(directory: string, requiredPercentage: number): boolean { - try { - let availableSpace = 0; - let totalSpace = 0; - - if (process.platform === 'win32') { - // Windows - const output = execSync(`wmic logicaldisk where "DeviceID='${directory[0]}:'" get FreeSpace,Size`).toString(); - const lines = output.trim().split('\n'); - const [freeSpaceStr, totalSpaceStr] = lines[1].trim().split(/\s+/); - availableSpace = parseInt(freeSpaceStr, 10); // Available space in bytes - totalSpace = parseInt(totalSpaceStr, 10); // Total space in bytes - } else { - // Unix-based (Linux/macOS) - const output = execSync(`df -k "${directory}"`).toString(); - const lines = output.trim().split('\n'); - const parts = lines[lines.length - 1].split(/\s+/); - const availableSpaceInKb = parseInt(parts[3], 10); // Available space in KB - const totalSpaceInKb = parseInt(parts[1], 10); // Total space in KB - availableSpace = availableSpaceInKb * 1024; - totalSpace = totalSpaceInKb * 1024; - } - - // Calculate available space as a percentage of the total space + const diskInfo = await checkDiskSpace(directory); + const availableSpace = diskInfo.free; + const totalSpace = diskInfo.size; const availablePercentage = (availableSpace / totalSpace) * 100; - - // Return true if the available percentage is greater than or equal to the required percentage return availablePercentage >= requiredPercentage; } catch (error) { console.error(`Error checking disk space: ${error}`); - return false; // Return false if there's an error + return false; } } - public static handleResetDatabase(parsedMessage: ParsedMessage): ParsedMessage { - // Path to the application.json file - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); + public static async handleSendAnnouncement(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.message) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing announcement message.' }}; + } + + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); try { - // Read the existing data from application.json - const appData = UserToUserOperations.readJsonSync(pathToApplicationJson) || {}; - - // Update the reset_application_preferences field to true - appData.reset_application_preferences = true; - - // Write the updated data back to application.json - const success = UserToUserOperations.writeJsonSync(pathToApplicationJson, appData); - - if (success) { - console.log(`Application preferences reset successfully.`); - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: 'Application preferences reset successfully.' }, - }; - } else { - throw new Error("Failed to write to application.json"); - } + await jsonManager.writeValue('announcement', parsedMessage.metaInfo.message); + console.log(`Announcement saved: ${parsedMessage.metaInfo.message}`); + return { operationCode: operationCodes.OK, metaInfo: { message: 'Announcement saved.' }}; } catch (error: any) { - console.error(`Error resetting application preferences: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error resetting application preferences: ${error.message}` }, - }; + console.error(`Error saving announcement: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error: ${error.message}` }}; } } - - public static handleSendAnnouncement(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the message is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.message) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing announcement message in meta information.' }, - }; - } - - const announcementMessage = parsedMessage.metaInfo.message; - - // Path to the application.json file - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - + public static async handleGetUserInformation(parsedMessage: ParsedMessage): Promise { + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'userConfig.json')); try { - // Read the existing data from application.json - const appData = UserToUserOperations.readJsonSync(pathToApplicationJson) || {}; - - // Update the announcement field with the new message - appData.announcement = announcementMessage; - - // Write the updated data back to application.json - fs.writeFileSync(pathToApplicationJson, JSON.stringify(appData, null, 2), 'utf-8'); - - console.log(`Announcement message saved successfully: ${announcementMessage}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: 'Announcement message saved successfully.' }, - }; + const userInfo = await jsonManager.readValue('user_info'); + return { operationCode: operationCodes.OK, metaInfo: userInfo }; } catch (error: any) { - console.error(`Error saving announcement message: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error saving announcement message: ${error.message}` }, - }; + console.error(`Error fetching user info: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Error fetching user info' }}; } } - // Handle user information retrieval - public static handleGetUserInformation(parsedMessage: ParsedMessage): ParsedMessage { - const pathToUserJson = path.join(__dirname, '..', '..', 'json_files', 'userConfig.json'); - const userInfo = UserToUserOperations.readJsonSync(pathToUserJson); - - if (userInfo) { - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: userInfo.user_info, - }; - } else { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error fetching user information.' }, - }; - } - } - - // Handle file reception and saving - public static handleBackupFile(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure metaInfo and fileContent are available - if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing file content or meta information.' }, - }; + public static async handleBackupFile(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName || !parsedMessage.metaInfo?.relativeFilePath || !parsedMessage.fileContent) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing file or user information.' }}; } const { userName, relativeFilePath } = parsedMessage.metaInfo; - - if (!userName || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name or file path information.' }, - }; - } - - // Base directory where backups will be stored - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - - // Full path where the file will be stored (under the user's directory) - const fullFilePath = path.join(baseBackupDir, userName, relativeFilePath); + const fullFilePath = path.join(__dirname, '..', '..', 'backups', userName, relativeFilePath); try { - // Check if there is enough disk space - const requiredPercentage = 25; - if (!UserToUserOperations.hasEnoughDiskSpace(baseBackupDir, requiredPercentage)) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Insufficient disk space for backup.' }, - }; + if (!await UserToUserOperations.hasEnoughDiskSpace(path.dirname(fullFilePath), 25)) { + return { operationCode: operationCodes.ERR, metaInfo: + { message: 'Insufficient disk space.' }}; } - // Ensure the directory structure exists (create directories if they don't exist) - const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } + await fs.mkdir(path.dirname(fullFilePath), { recursive: true }); + await fs.writeFile(fullFilePath, parsedMessage.fileContent as Buffer); + console.log(`File saved: ${fullFilePath}`); - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); - - console.log(`File saved successfully: ${fullFilePath}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File saved successfully: ${relativeFilePath}` }, - }; + return { operationCode: operationCodes.OK, metaInfo: { message: `File saved: ${relativeFilePath}` }}; } catch (error: any) { console.error(`Error saving file: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error saving file: ${error.message}` }, - }; + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error saving file: ${error.message}` }}; } } - // Handle clearing all backups for a user - public static handleClearBackup(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the userName is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.userName) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name in meta information.' }, - }; + public static async handleClearBackup(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name.' }}; } - const { userName } = parsedMessage.metaInfo; - - // Base directory where backups are stored - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, userName); - + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.userName); try { - // Check if the user's backup directory exists - if (fs.existsSync(userBackupDir)) { - // Recursively delete the user's backup directory - fs.rmSync(userBackupDir, { recursive: true, force: true }); - console.log(`Backup cleared successfully for user: ${userName}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `Backup cleared successfully for user: ${userName}` }, - }; - } else { - console.warn(`Backup directory not found for user: ${userName}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Backup directory not found for user: ${userName}` }, - }; - } + await fs.rm(userBackupDir, { recursive: true, force: true }); + console.log(`Backup cleared: ${userBackupDir}`); + return { operationCode: operationCodes.OK, metaInfo: { message: `Backup cleared for ${parsedMessage.metaInfo.userName}` }}; } catch (error: any) { - console.error(`Error clearing backup for user: ${userName} - ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error clearing backup for user: ${userName}` }, - }; + console.error(`Error clearing backup: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error clearing backup: ${error.message}` }}; } } - // Handle sharing file operation - public static handleShareFile(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure metaInfo and fileContent are available - if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing file content or meta information.' }, - }; + public static async handleShareFile(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName || !parsedMessage.metaInfo?.relativeFilePath || !parsedMessage.fileContent) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing share info.' }}; } + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); const { userName, relativeFilePath } = parsedMessage.metaInfo; - if (!userName || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name or file path information.' }, - }; - } - - // Path to the application.json to read the shareDirectory field - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); - - // Corrected the condition - if (!appInfo || !appInfo.shareDirectory) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, - }; - } - - // Get the share directory path - const shareDirectory = appInfo.shareDirectory.path; - - // Full path where the file will be stored (under the user's directory in the shared folder) - const fullFilePath = path.join(shareDirectory, userName, relativeFilePath); - try { - // Ensure the directory structure exists (create directories if they don't exist) - const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); + const appInfo = await jsonManager.readValue('shareDirectory'); + const shareDirectory = appInfo?.path || ''; + + if (!shareDirectory) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Share directory missing.' }}; } - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); + const fullFilePath = path.join(shareDirectory, userName, relativeFilePath); + await fs.mkdir(path.dirname(fullFilePath), { recursive: true }); + await fs.writeFile(fullFilePath, parsedMessage.fileContent as Buffer); + console.log(`File shared: ${fullFilePath}`); - console.log(`File shared successfully: ${fullFilePath}`); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File shared successfully: ${relativeFilePath}` }, - }; + return { operationCode: operationCodes.OK, metaInfo: { message: `File shared: ${relativeFilePath}` }}; } catch (error: any) { console.error(`Error sharing file: ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error sharing file: ${error.message}` }, - }; + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error sharing file: ${error.message}` }}; } } - public static handleClearDepartment(parsedMessage: ParsedMessage): ParsedMessage { - // Ensure the userName is available in metaInfo - if (!parsedMessage.metaInfo || !parsedMessage.metaInfo.userName) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing user name in meta information.' }, - }; + public static async handleClearDepartment(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.userName) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name.' }}; } + const jsonManager = new JsonManager(path.join(__dirname, '..', '..', 'json_files', 'application.json')); const { userName } = parsedMessage.metaInfo; - const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); - - // Corrected the condition - if (!appInfo || !appInfo.departmentDirectory) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, - }; - } - - // Get the share directory path - const baseDepartmentDir = appInfo.departmentDirectory.path; - const userDepartmentDir = path.join(baseDepartmentDir, '..', 'DEPARTMENT_FILES', userName); - try { - // Check if the user's backup directory exists - if (fs.existsSync(userDepartmentDir)) { - // Recursively delete the user's backup directory - fs.rmSync(userDepartmentDir, { recursive: true, force: true }); - console.log(`Backup cleared successfully for user: ${userName}`); + const appInfo = await jsonManager.readValue('departmentDirectory'); + const departmentDir = appInfo?.path || ''; + const userDepartmentDir = path.join(departmentDir, '..', 'DEPARTMENT_SHARE', userName); - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `Backup cleared successfully for user: ${userName}`}, - }; - } else { - console.warn(`Backup directory not found for user: ${userName}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Backup directory not found for user: ${userName}`}, - }; + try { + await fs.access(userDepartmentDir) + }catch(ex: any){ + return { operationCode: operationCodes.OK}; } + + await fs.rm(userDepartmentDir, { recursive: true, force: true }); + console.log(`Department backup cleared: ${userDepartmentDir}`); + return { operationCode: operationCodes.OK, metaInfo: { message: `Department backup cleared for ${userName}` }}; } catch (error: any) { - console.error(`Error clearing backup for user: ${userName} - ${error.message}`); - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error clearing backup for user: ${userName}`}, - }; + console.error(`Error clearing department: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error clearing department: ${error.message}` }}; } } - public static handleDepartmentFile(parsedMessage: ParsedMessage): ParsedMessage { + public static async handleDepartmentFile(parsedMessage: ParsedMessage): Promise { // Ensure metaInfo and fileContent are available if (!parsedMessage.metaInfo || !parsedMessage.fileContent) { return { - operationCode: UserToUserOperations.operationCodes.ERR, + operationCode: operationCodes.ERR, metaInfo: { message: 'Missing file content or meta information.' }, }; } @@ -455,130 +173,99 @@ export class UserToUserOperations extends OperationBase { if (!userName || !relativeFilePath) { return { - operationCode: UserToUserOperations.operationCodes.ERR, + operationCode: operationCodes.ERR, metaInfo: { message: 'Missing user name or file path information.' }, }; } // Path to the application.json to read the shareDirectory field const pathToApplicationJson = path.join(__dirname, '..', '..', 'json_files', 'application.json'); - const appInfo = UserToUserOperations.readJsonSync(pathToApplicationJson); + const jsonManager = new JsonManager(pathToApplicationJson); - // Corrected the condition - if (!appInfo || !appInfo.departmentDirectory) { + // Read application configuration asynchronously + let appInfo; + try { + appInfo = await jsonManager.readValue('departmentDirectory'); + } catch (error: any) { return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Error retrieving share directory from application.json.' }, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error reading application config: ${error.message}` }, + }; + } + + if (!appInfo || !appInfo.path) { + return { + operationCode: operationCodes.ERR, + metaInfo: { message: 'Error retrieving department directory from application.json.' }, }; } // Get the share directory path - const departmentDirectory = appInfo.departmentDirectory.path; - - // Full path where the file will be stored (under the user's directory in the shared folder) + const departmentDirectory = appInfo.path; const fullFilePath = path.join(departmentDirectory, '..', 'DEPARTMENT_FILES', userName, relativeFilePath); try { // Ensure the directory structure exists (create directories if they don't exist) const dirPath = path.dirname(fullFilePath); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } + await fs.mkdir(dirPath, { recursive: true }); - // Write the file content to the correct path - fs.writeFileSync(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); - - console.log(`File shared successfully: ${fullFilePath}`); + // Write the file content to the specified path + await fs.writeFile(fullFilePath, Buffer.from(parsedMessage.fileContent as Buffer), 'base64'); return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { message: `File shared successfully: ${relativeFilePath}`}, - }; + operationCode: operationCodes.OK, + metaInfo: { message: `File shared successfully: ${relativeFilePath}` }, + }; } catch (error: any) { - console.error(`Error sharing file: ${error.message}`); return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: {message: `Error sharing file: ${error.message}`}, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error sharing file: ${error.message}` }, }; } } - // Check if a backup has been created for a user - public static handleIsBackupCreated(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, - }; + public static async handleIsBackupCreated(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing name in meta information.' }}; } - const {name} = parsedMessage.metaInfo; - if (!name) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name in meta information.' }, - }; + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.name); + + try { + const exists = await fs.access(userBackupDir).then(() => true).catch(() => false); + return { operationCode: operationCodes.OK, metaInfo: { backupExists: exists }}; + } catch (error: any) { + console.error(`Error checking backup: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error checking backup: ${error.message}` }}; } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - - console.log(userBackupDir); - - const exists = fs.existsSync(userBackupDir); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { backupExists: exists }, - }; } - // Get the structure of the backup directory for a user - public static handleGetBackupStructure(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, - }; + public static async handleGetBackupStructure(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name) { + return { operationCode: operationCodes.ERR, metaInfo: { message: 'Missing name in meta information.' }}; } - const {name} = parsedMessage.metaInfo; - if (!name) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name in meta information.' }, - }; + const userBackupDir = path.join(__dirname, '..', '..', 'backups', parsedMessage.metaInfo.name); + + try { + const structure = await UserToUserOperations.buildDirectoryStructure(userBackupDir); + return { operationCode: operationCodes.OK, metaInfo: { structure }}; + } catch (error: any) { + console.error(`Error building backup structure: ${error.message}`); + return { operationCode: operationCodes.ERR, metaInfo: { message: `Error: ${error.message}` }}; } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - - if (!fs.existsSync(userBackupDir)) { - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { structure: {} }, // Return empty structure if directory doesn't exist - }; - } - - const fileStructure = UserToUserOperations.buildDirectoryStructure(userBackupDir); - - return { - operationCode: UserToUserOperations.operationCodes.OK, - metaInfo: { structure: fileStructure }, - }; } - // Build the directory structure recursively - private static buildDirectoryStructure(directoryPath: string): any { + private static async buildDirectoryStructure(directoryPath: string): Promise { const structure: any = {}; - const files = fs.readdirSync(directoryPath); + const files = await fs.readdir(directoryPath); for (const file of files) { const filePath = path.join(directoryPath, file); - const stats = fs.statSync(filePath); + const stats = await fs.stat(filePath); if (stats.isDirectory()) { - structure[file] = UserToUserOperations.buildDirectoryStructure(filePath); // Recursive for subdirectories + structure[file] = await UserToUserOperations.buildDirectoryStructure(filePath); } else { structure[file] = path.relative(directoryPath, filePath); } @@ -587,67 +274,43 @@ export class UserToUserOperations extends OperationBase { return structure; } - // Handle file request from backup directory - public static handleReqFileFromBackup(parsedMessage: ParsedMessage): ParsedMessage { - if(!parsedMessage.metaInfo) { + public static async handleReqFileFromBackup(parsedMessage: ParsedMessage): Promise { + if (!parsedMessage.metaInfo?.name || !parsedMessage.metaInfo?.relativeFilePath) { return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing metaInfo.' }, + operationCode: operationCodes.ERR, + metaInfo: { message: 'Missing user name or file path in meta information.' }, }; } const { name, relativeFilePath } = parsedMessage.metaInfo; - - if (!name || !relativeFilePath) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'Missing name or file path in meta information.' }, - }; - } - - const baseBackupDir = path.join(__dirname, '..', '..', 'backups'); - const userBackupDir = path.join(baseBackupDir, name); - const fullFilePath = path.join(userBackupDir, relativeFilePath); - - if (!fs.existsSync(fullFilePath)) { - return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: 'File not found in backup.' }, - }; - } + const fullFilePath = path.join(__dirname, '..', '..', 'backups', name, relativeFilePath); try { - const fileContent = fs.readFileSync(fullFilePath, 'base64'); + const fileContent = await fs.readFile(fullFilePath); return { - operationCode: UserToUserOperations.operationCodes.OK, + operationCode: operationCodes.OK, metaInfo: { relativeFilePath }, - fileContent: Buffer.from(fileContent, 'base64') + fileContent, }; } catch (error: any) { - console.error(`Error reading file: ${error.message}`); + console.error(`Error reading file from backup: ${error.message}`); return { - operationCode: UserToUserOperations.operationCodes.ERR, - metaInfo: { message: `Error reading file: ${error.message}`}, + operationCode: operationCodes.ERR, + metaInfo: { message: `Error reading file: ${error.message}` }, }; } } - // Register user-to-user operations with the OperationHandler public register(operationHandler: OperationHandler): void { - // Register specific handlers for user-to-user operations - operationHandler.registerHandler(UserToUserOperations.operationCodes.RESET_DATABASE, UserToUserOperations.handleResetDatabase); operationHandler.registerHandler(UserToUserOperations.operationCodes.SEND_ANNOUNCEMENT, UserToUserOperations.handleSendAnnouncement); operationHandler.registerHandler(UserToUserOperations.operationCodes.GET_USER_INFORMATION, UserToUserOperations.handleGetUserInformation); operationHandler.registerHandler(UserToUserOperations.operationCodes.BACKUP_FILE, UserToUserOperations.handleBackupFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.CLEAR_BACKUP, UserToUserOperations.handleClearBackup); operationHandler.registerHandler(UserToUserOperations.operationCodes.SHARE_FILE, UserToUserOperations.handleShareFile); - operationHandler.registerHandler(UserToUserOperations.operationCodes.DEPARTMENT_FILE, UserToUserOperations.handleDepartmentFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.CLEAR_DEPARTMENT, UserToUserOperations.handleClearDepartment); + operationHandler.registerHandler(UserToUserOperations.operationCodes.DEPARTMENT_FILE, UserToUserOperations.handleDepartmentFile); operationHandler.registerHandler(UserToUserOperations.operationCodes.IS_BACKUP_CREATED, UserToUserOperations.handleIsBackupCreated); operationHandler.registerHandler(UserToUserOperations.operationCodes.GET_BACKUP_STRUCTURE, UserToUserOperations.handleGetBackupStructure); operationHandler.registerHandler(UserToUserOperations.operationCodes.REQ_FILE_FROM_BACKUP, UserToUserOperations.handleReqFileFromBackup); - - // Register common operations inherited from the base class - OperationBase.registerCommonOperations(operationHandler); } } diff --git a/User/src/network/socket_communicator/tcp_client_communicator.ts b/User/src/network/socket_communicator/tcp_client_communicator.ts index 6bf2aa2..5bffe31 100644 --- a/User/src/network/socket_communicator/tcp_client_communicator.ts +++ b/User/src/network/socket_communicator/tcp_client_communicator.ts @@ -122,7 +122,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { for (let i = 0; i < messages.length - 1; i++) { const completeMessage = messages[i]; if (completeMessage) { - this.processCompleteMessage(completeMessage); + await this.processCompleteMessage(completeMessage); } } @@ -130,7 +130,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { } } - private processCompleteMessage(completeMessage: string): void { + private async processCompleteMessage(completeMessage: string): Promise { const [headerJson, chunkContent] = completeMessage.split('|'); const header = JSON.parse(headerJson); @@ -142,12 +142,12 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { if (this.chunkBuffers[header.messageId].every((chunk) => chunk !== undefined)) { const fullMessage = this.chunkBuffers[header.messageId].join(''); - this.handleIncomingMessage(fullMessage); + await this.handleIncomingMessage(fullMessage); delete this.chunkBuffers[header.messageId]; } } - handleIncomingMessage(incomingMessage: string): void { + async handleIncomingMessage(incomingMessage: string): Promise { let messageToProcess = incomingMessage; if (this.aesKey && this.aesIv) { messageToProcess = this.decryptWithAes(incomingMessage); @@ -155,7 +155,7 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { messageToProcess = this.decryptWithRsa(incomingMessage); } - const result = this.operationHandler.handleOperation(messageToProcess); + const result = await this.operationHandler.handleOperation(messageToProcess); if (result.operationCode === operationCodes.SET_AES_KEY) { this.isAesKeySetFlag = true; @@ -176,6 +176,8 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { } getHandlerResult(): ParsedMessage | null { - return this.handlerResult; + const message = this.handlerResult; + this.handlerResult = null; + return message; } } diff --git a/User/src/network/socket_communicator/tcp_server_communicator.ts b/User/src/network/socket_communicator/tcp_server_communicator.ts index 61840ef..feb1632 100644 --- a/User/src/network/socket_communicator/tcp_server_communicator.ts +++ b/User/src/network/socket_communicator/tcp_server_communicator.ts @@ -106,7 +106,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { for (let i = 0; i < messages.length - 1; i++) { const completeMessage = messages[i]; if (completeMessage) { - this.processCompleteMessage(completeMessage); + await this.processCompleteMessage(completeMessage); } } @@ -114,7 +114,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { } } - private processCompleteMessage(completeMessage: string): void { + private async processCompleteMessage(completeMessage: string): Promise { const [headerJson, chunkContent] = completeMessage.split('|'); const header = JSON.parse(headerJson); @@ -126,7 +126,7 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { if (this.chunkBuffers[header.messageId].every((chunk) => chunk !== undefined)) { const fullMessage = this.chunkBuffers[header.messageId].join(''); - this.handleIncomingMessage(fullMessage); + await this.handleIncomingMessage(fullMessage); delete this.chunkBuffers[header.messageId]; } } @@ -169,14 +169,14 @@ export class TcpServerCommunicator extends SocketCommunicatorBase { } // Handle incoming message (decrypt with AES if available) - handleIncomingMessage(incomingMessage: string): void { + async handleIncomingMessage(incomingMessage: string): Promise { let messageToProcess = incomingMessage; if (this.aesKey && this.aesIv) { messageToProcess = this.decryptWithAes(incomingMessage); } - this.handlerResult = this.operationHandler.handleOperation(messageToProcess); + this.handlerResult = await this.operationHandler.handleOperation(messageToProcess); } // Write message to socket diff --git a/User/src/network/socket_communicator/udp_socket_communicator.ts b/User/src/network/socket_communicator/udp_socket_communicator.ts index 0385573..2e8de1a 100644 --- a/User/src/network/socket_communicator/udp_socket_communicator.ts +++ b/User/src/network/socket_communicator/udp_socket_communicator.ts @@ -12,8 +12,8 @@ export class UdpSocketCommunicator extends SocketCommunicatorBase { } // Handle incoming message (no decryption needed for UDP) - handleIncomingMessage(incomingMessage: string): void { - this.handlerResult = this.operationHandler.handleOperation(incomingMessage); + async handleIncomingMessage(incomingMessage: string): Promise { + this.handlerResult = await this.operationHandler.handleOperation(incomingMessage); } // Send plain message over UDP (metaInfo as JSON and fileContent as Buffer) diff --git a/User/src/network/tcp/tcp_server.ts b/User/src/network/tcp/tcp_server.ts index aabb408..14256c0 100644 --- a/User/src/network/tcp/tcp_server.ts +++ b/User/src/network/tcp/tcp_server.ts @@ -14,6 +14,7 @@ export class TcpServer { private readonly operationHandler: OperationHandler; private readonly port: number; private readonly host: string; + private clientQueues: Map> = new Map(); constructor(host: string, port: number) { this.connectionManager = new ConnectionManager(); @@ -25,21 +26,14 @@ export class TcpServer { this.operationHandler.loadPlugin(new UserToUserOperations()); } - // Unified logging function private log(message: string, level: 'log' | 'error' = 'log'): void { const prefix = '[TcpServer]'; - if (level === 'error') { - console.error(`${prefix} ${message}`); - } else { - console.log(`${prefix} ${message}`); - } + console[level === 'error' ? 'error' : 'log'](`${prefix} ${message}`); } - // Start the TCP server public start(): void { const tcpServer = net.createServer(); - // Handle incoming connections tcpServer.on('connection', (socket: Socket) => { const ip = socket.remoteAddress || 'unknown'; const port = socket.remotePort || 0; @@ -49,61 +43,66 @@ export class TcpServer { const tcpCommunicator = new TcpServerCommunicator(socket, ip, port, this.operationHandler); this.connectionManager.addConnection(ip, port, tcpCommunicator); - - // Generate RSA key pair and start key exchange tcpCommunicator.generateKeyPair(); + tcpCommunicator.sendPublicKey() .then(() => tcpCommunicator.sendAesKey()) .catch(err => { this.log(`Error during key exchange with client ${clientId}: ${err}`, 'error'); - socket.end(); // Close the connection in case of any error + socket.end(); }); - // Handle incoming data in chunks - socket.on('data', async (data: Buffer) => { - this.log(`Data received from client ${clientId}`); - await this.handleData(data, ip, port); + this.clientQueues.set(clientId, Promise.resolve()); + + socket.on('data', (data: Buffer) => { + this.queueClientDataProcessing(data, ip, port); }); - // Handle client disconnect socket.on('end', () => { this.log(`Client disconnected: ${clientId}`); this.connectionManager.removeCommunicator(ip, port); + this.clientQueues.delete(clientId); }); - // Handle socket errors socket.on('error', (err: Error) => { this.log(`Error from client ${clientId}: ${err.message}`, 'error'); this.connectionManager.removeCommunicator(ip, port); + this.clientQueues.delete(clientId); }); }); - // Handle server errors tcpServer.on('error', (err: Error) => { this.log(`TCP server error: ${err.message}`, 'error'); }); - // Start listening for connections tcpServer.listen(this.port, this.host, () => { this.log(`TCP server listening on ${this.host}:${this.port}`); }); } - // Handle incoming data from a client + private queueClientDataProcessing(data: Buffer, ip: string, port: number): void { + const clientId = `${ip}:${port}`; + const clientQueue = this.clientQueues.get(clientId) || Promise.resolve(); + + this.clientQueues.set( + clientId, + clientQueue.then(() => this.handleData(data, ip, port)).catch(error => { + this.log(`Error handling data for ${clientId}: ${error}`, 'error'); + }) + ); + } + private async handleData(data: Buffer, ip: string, port: number): Promise { const clientId = `${ip}:${port}`; - - // Retrieve the communicator associated with this connection const communicator = this.connectionManager.getCommunicator(ip, port) as TcpServerCommunicator; if (!communicator) { this.log(`No communicator found for ${clientId}`, 'error'); return; } - // Handle incoming chunked message via communicator await communicator.handleIncomingChunk(data); - // Fetch and process result if available + // Check if message is complete before fetching result const handlerResult = communicator.getHandlerResult(); if (handlerResult) { try { diff --git a/User/src/network/udp/udp_server.ts b/User/src/network/udp/udp_server.ts index 7111ed7..c18aaa5 100644 --- a/User/src/network/udp/udp_server.ts +++ b/User/src/network/udp/udp_server.ts @@ -50,7 +50,7 @@ export class UdpServer { const communicator = new UdpSocketCommunicator(this.udpServer, ip, port, this.operationHandler); // Process the incoming message using the communicator - communicator.handleIncomingMessage(msg.toString()); + await communicator.handleIncomingMessage(msg.toString()); const communicatorResult = communicator.getHandlerResult(); if (communicatorResult) {