diff --git a/.gitignore b/.gitignore index f4d88b5..dda5832 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules /dist .DS_Store .env -/test \ No newline at end of file +/test +/temp \ No newline at end of file diff --git a/bin/upload.ts b/bin/upload.ts index 36416f4..30fbecd 100644 --- a/bin/upload.ts +++ b/bin/upload.ts @@ -2,7 +2,7 @@ import path from 'path'; import chalk from 'chalk'; import inquirer from 'inquirer'; import figlet from 'figlet'; -import upload from './utils/uploadToIpfs'; +import upload from './utils/uploadToIpfsSplit'; import fs from 'fs'; import CryptoJS from 'crypto-js'; @@ -84,11 +84,12 @@ export default async (options?: UploadOptions): Promise => { ); console.log(chalk.cyan(`URL:`)); console.log(chalk.cyan(`${URL}${encryptedCID}`)); + console.log(chalk.green('\nšŸŽ‰ upload successful, program exit')); } } catch (error: any) { console.error(chalk.red(`Error: ${error.message}`)); } - return; + process.exit(0); } const answer = await inquirer.prompt([ @@ -120,10 +121,12 @@ export default async (options?: UploadOptions): Promise => { ); console.log(chalk.cyan(`URL:`)); console.log(chalk.cyan(`${URL}${encryptedCID}`)); + console.log(chalk.green('\nšŸŽ‰ upload successful, program exit')); } } catch (error: any) { console.error(chalk.red(`Error: ${error.message}`)); } + process.exit(0); } } catch (error: any) { console.error(chalk.red(`error executing: ${error.message}`)); diff --git a/bin/utils/history.ts b/bin/utils/history.ts index 4c1f64a..df6ae77 100644 --- a/bin/utils/history.ts +++ b/bin/utils/history.ts @@ -30,7 +30,7 @@ interface UploadData { path: string; filename?: string; contentHash: string; - previewHash: string | null; + previewHash?: string | null; size: number; fileCount?: number; isDirectory?: boolean; diff --git a/bin/utils/uploadToIpfsSplit.ts b/bin/utils/uploadToIpfsSplit.ts new file mode 100644 index 0000000..fdfa5e7 --- /dev/null +++ b/bin/utils/uploadToIpfsSplit.ts @@ -0,0 +1,658 @@ +import axios from 'axios'; +import fs from 'fs-extra'; +import path from 'path'; +import FormData from 'form-data'; +import ora from 'ora'; +import * as crypto from 'crypto'; +import { + checkFileSizeLimit, + checkDirectorySizeLimit, + formatSize, +} from './uploadLimits'; +import { saveUploadHistory } from './history'; +import { getDeviceId } from './getDeviceId'; + +// Configuration constants +const IPFS_API_URL = process.env.IPFS_API_URL || 'https://ipfs.glitterprotocol.dev/api/v2'; +const MAX_RETRIES = parseInt(process.env.MAX_RETRIES || '2'); +const RETRY_DELAY = parseInt(process.env.RETRY_DELAY_MS || '1000'); +const TIMEOUT = parseInt(process.env.TIMEOUT_MS || '600000'); +const MAX_POLL_TIME = parseInt(process.env.MAX_POLL_TIME_MINUTES || '5') * 60 * 1000; +const POLL_INTERVAL = parseInt(process.env.POLL_INTERVAL_SECONDS || '2') * 1000; +const PROGRESS_UPDATE_INTERVAL = 200; // ms +const EXPECTED_UPLOAD_TIME = 60000; // 60 seconds +const MAX_PROGRESS = 0.95; // 95% + +// Type definitions +interface ChunkSessionResponse { + code: number; + msg: string; + data: { + session_id: string; + total_chunks: number; + chunk_size: number; + }; +} + +interface ChunkUploadResponse { + code: number; + msg: string; + data: { + chunk_index: number; + chunk_size: number; + }; +} + +interface ChunkCompleteResponse { + code: number; + msg: string; + data: { + trace_id: string; + }; +} + +interface ChunkStatusResponse { + code: number; + msg: string; + data: { + is_ready: boolean; + upload_rst: { + Bytes: number; + Name: string; + Size: number; + Hash?: string; + ShortUrl?: string; + }; + }; +} + +interface UploadResult { + hash: string; + shortUrl?: string; +} + +// Enhanced progress bar with better UX +class StepProgressBar { + private readonly spinner: ora.Ora; + private readonly fileName: string; + private readonly startTime: number; + private currentStep: number = 0; + private stepStartTime: number = 0; + private progressInterval: NodeJS.Timeout | null = null; + + constructor(fileName: string, isDirectory: boolean = false) { + this.fileName = fileName; + this.spinner = ora(`Preparing to upload ${fileName}...`).start(); + this.startTime = Date.now(); + this.stepStartTime = Date.now(); + + this.startProgress(); + } + + startStep(stepIndex: number, stepName?: string): void { + this.currentStep = stepIndex; + this.stepStartTime = Date.now(); + } + + updateProgress(progress: number, total: number): void { + // Chunk progress update handled by auto progress + } + + completeStep(): void { + // Step completed, let auto progress continue + } + + failStep(error: string): void { + this.stopProgress(); + this.spinner.fail(`Upload failed: ${error}`); + } + + complete(): void { + this.stopProgress(); + const totalTime = Math.floor((Date.now() - this.startTime) / 1000); + const progressBar = this.createProgressBar(1); + this.spinner.succeed(`Upload completed ${progressBar} 100% (${totalTime}s)`); + } + + fail(error: string): void { + this.stopProgress(); + const totalTime = Math.floor((Date.now() - this.startTime) / 1000); + this.spinner.fail(`Upload failed: ${error} (${totalTime}s)`); + } + + private startProgress(): void { + this.progressInterval = setInterval(() => { + const elapsed = Date.now() - this.startTime; + const progress = this.calculateProgress(elapsed); + const duration = this.formatDuration(Math.floor(elapsed / 1000)); + + const progressBar = this.createProgressBar(progress); + this.spinner.text = `Uploading ${this.fileName}... ${progressBar} ${Math.round(progress * 100)}% (${duration})`; + }, PROGRESS_UPDATE_INTERVAL); + } + + private stopProgress(): void { + if (this.progressInterval) { + clearInterval(this.progressInterval); + this.progressInterval = null; + } + } + + private calculateProgress(elapsed: number): number { + return Math.min((elapsed / EXPECTED_UPLOAD_TIME) * MAX_PROGRESS, MAX_PROGRESS); + } + + private createProgressBar(progress: number, width: number = 20): string { + const percentage = Math.min(progress, 1); + const filledWidth = Math.round(width * percentage); + const emptyWidth = width - filledWidth; + + return `[${'ā–ˆ'.repeat(filledWidth)}${'ā–‘'.repeat(emptyWidth)}]`; + } + + private formatDuration(seconds: number): string { + if (seconds < 60) { + return `${seconds}s`; + } else if (seconds < 3600) { + const minutes = Math.floor(seconds / 60); + const remainingSeconds = seconds % 60; + return `${minutes}m ${remainingSeconds}s`; + } else { + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + const remainingSeconds = seconds % 60; + return `${hours}h ${minutes}m ${remainingSeconds}s`; + } + } +} + +// Utility functions +async function calculateMD5(filePath: string): Promise { + return new Promise((resolve, reject) => { + const hash = crypto.createHash('md5'); + const stream = fs.createReadStream(filePath); + + stream.on('data', hash.update.bind(hash)); + stream.on('end', () => resolve(hash.digest('hex'))); + stream.on('error', reject); + }); +} + +async function compressDirectory(sourcePath: string): Promise { + return new Promise((resolve, reject) => { + const tempDir = path.join(process.cwd(), 'temp'); + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + + const outputPath = path.join( + tempDir, + `${path.basename(sourcePath)}_${Date.now()}.zip`, + ); + const output = fs.createWriteStream(outputPath); + + const zlib = require('zlib'); + const gzip = zlib.createGzip({ level: 9 }); + + output.on('close', () => resolve(outputPath)); + gzip.on('error', reject); + gzip.pipe(output); + + const stats = fs.statSync(sourcePath); + if (stats.isDirectory()) { + const archive = require('archiver'); + const archiveStream = archive('zip', { zlib: { level: 9 } }); + + archiveStream.on('error', reject); + archiveStream.pipe(output); + archiveStream.directory(sourcePath, false); + archiveStream.finalize(); + } else { + const fileStream = fs.createReadStream(sourcePath); + fileStream.pipe(gzip); + } + }); +} + +// API functions with better error handling +async function initChunkSession( + filePath: string, + deviceId: string, + isDirectory: boolean = false, +): Promise { + const stats = fs.statSync(filePath); + const fileName = path.basename(filePath); + const fileSize = stats.size; + const md5 = await calculateMD5(filePath); + + try { + const response = await axios.post( + `${IPFS_API_URL}/chunk/init`, + { + file_name: fileName, + file_size: fileSize, + md5: md5, + is_directory: isDirectory, + uid: deviceId, + }, + { + timeout: TIMEOUT, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const { code, msg, data } = response.data; + if (code === 200 && data) { + return data; + } + throw new Error(`Session initialization failed: ${msg} (code: ${code})`); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new Error(`Network error: ${error.message}`); + } + throw error; + } +} + +async function uploadChunkWithAbort( + sessionId: string, + chunkIndex: number, + chunkData: Buffer, + deviceId: string, + signal: AbortSignal, + retryCount: number = 0, +): Promise { + try { + if (signal.aborted) { + throw new Error('Request cancelled'); + } + + const form = new FormData(); + form.append('session_id', sessionId); + form.append('chunk_index', chunkIndex.toString()); + form.append('uid', deviceId); + form.append('chunk', chunkData, { + filename: `chunk_${chunkIndex}`, + contentType: 'application/octet-stream', + }); + + const response = await axios.post( + `${IPFS_API_URL}/chunk/upload`, + form, + { + headers: { ...form.getHeaders() }, + timeout: TIMEOUT, + signal, + }, + ); + + const { code, msg, data } = response.data; + if (code === 200 && data) { + return data; + } + throw new Error(`Chunk upload failed: ${msg} (code: ${code})`); + } catch (error: any) { + if (error.name === 'CanceledError' || signal.aborted) { + throw new Error('Request cancelled'); + } + + if (retryCount < MAX_RETRIES) { + await delayWithAbortCheck(RETRY_DELAY, signal); + return uploadChunkWithAbort( + sessionId, + chunkIndex, + chunkData, + deviceId, + signal, + retryCount + 1, + ); + } + + throw new Error( + `Chunk ${chunkIndex + 1} upload failed after ${MAX_RETRIES} retries: ${error.message}`, + ); + } +} + +async function delayWithAbortCheck(delay: number, signal: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + if (signal.aborted) { + reject(new Error('Request cancelled')); + } else { + resolve(); + } + }, delay); + + if (signal.aborted) { + clearTimeout(timeoutId); + reject(new Error('Request cancelled')); + return; + } + + const checkInterval = setInterval(() => { + if (signal.aborted) { + clearTimeout(timeoutId); + clearInterval(checkInterval); + reject(new Error('Request cancelled')); + } + }, 50); + }); +} + +async function uploadFileChunks( + filePath: string, + sessionId: string, + totalChunks: number, + chunkSize: number, + deviceId: string, + progressBar: StepProgressBar, +): Promise { + const fileData = fs.readFileSync(filePath); + const abortController = new AbortController(); + let completedCount = 0; + let hasFatalError = false; + let fatalError: string | null = null; + + const uploadTasks = Array.from({ length: totalChunks }, (_, chunkIndex) => { + const start = chunkIndex * chunkSize; + const end = Math.min(start + chunkSize, fileData.length); + const chunkData = fileData.slice(start, end); + + return async () => { + if (abortController.signal.aborted) return; + + try { + await uploadChunkWithAbort( + sessionId, + chunkIndex, + chunkData, + deviceId, + abortController.signal + ); + + if (abortController.signal.aborted) return; + + completedCount++; + progressBar.updateProgress(completedCount, totalChunks); + } catch (error: any) { + if (error.name === 'AbortError' || abortController.signal.aborted) { + return; + } + + hasFatalError = true; + fatalError = `Chunk ${chunkIndex + 1}/${totalChunks} upload failed: ${error.message}`; + abortController.abort(); + throw new Error(fatalError); + } + }; + }); + + try { + const results = await Promise.allSettled(uploadTasks.map(task => task())); + const failedResults = results.filter(result => result.status === 'rejected'); + + if (failedResults.length > 0) { + const firstFailure = failedResults[0] as PromiseRejectedResult; + throw new Error(firstFailure.reason.message || 'Error occurred during upload'); + } + + if (hasFatalError) { + throw new Error(fatalError || 'Unknown error occurred during upload'); + } + } catch (error: any) { + throw fatalError ? new Error(fatalError) : error; + } +} + +async function completeChunkUpload( + sessionId: string, + deviceId: string, +): Promise { + try { + const response = await axios.post( + `${IPFS_API_URL}/chunk/complete`, + { session_id: sessionId, uid: deviceId }, + { + timeout: TIMEOUT, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const { code, msg, data } = response.data; + if (code === 200 && data) { + return data.trace_id; + } + throw new Error(`Complete upload failed: ${msg} (code: ${code})`); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new Error(`Network error: ${error.message}`); + } + throw error; + } +} + +async function getChunkStatus( + sessionId: string, + deviceId: string, +): Promise { + try { + const response = await axios.get( + `${IPFS_API_URL}/up_status`, + { + params: { trace_id: sessionId, uid: deviceId }, + timeout: TIMEOUT, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const { code, msg, data } = response.data; + if (code === 200) { + return data; + } + throw new Error(`Server returned error: ${msg} (code: ${code})`); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new Error(`Network error: ${error.message}`); + } + throw error; + } +} + +async function monitorChunkProgress( + traceId: string, + deviceId: string, +): Promise { + let consecutiveErrors = 0; + const startTime = Date.now(); + + while (Date.now() - startTime < MAX_POLL_TIME) { + try { + const status = await getChunkStatus(traceId, deviceId); + consecutiveErrors = 0; + + if (status.is_ready && status.upload_rst.Hash) { + return { + hash: status.upload_rst.Hash, + shortUrl: status.upload_rst.ShortUrl, + }; + } + } catch (error: any) { + consecutiveErrors++; + if (consecutiveErrors > 10) { + throw new Error(`Polling failed: ${error.message}`); + } + } + + await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL)); + } + + const maxPollTimeMinutes = Math.floor(MAX_POLL_TIME / (60 * 1000)); + throw new Error(`Polling timeout after ${maxPollTimeMinutes} minutes`); +} + +// Main upload functions +async function uploadDirectoryInChunks( + directoryPath: string, + deviceId: string, +): Promise { + const sizeCheck = checkDirectorySizeLimit(directoryPath); + if (sizeCheck.exceeds) { + throw new Error( + `Directory ${directoryPath} exceeds size limit ${formatSize(sizeCheck.limit)} (size: ${formatSize(sizeCheck.size)})`, + ); + } + + const progressBar = new StepProgressBar(path.basename(directoryPath), true); + + try { + progressBar.startStep(0, 'Preparing compression'); + const compressedPath = await compressDirectory(directoryPath); + progressBar.completeStep(); + + progressBar.startStep(1, 'Initializing session'); + const sessionInfo = await initChunkSession(compressedPath, deviceId, true); + progressBar.completeStep(); + + progressBar.startStep(2, 'Chunk upload'); + await uploadFileChunks( + compressedPath, + sessionInfo.session_id, + sessionInfo.total_chunks, + sessionInfo.chunk_size, + deviceId, + progressBar, + ); + progressBar.completeStep(); + + progressBar.startStep(3, 'Completing upload'); + const traceId = await completeChunkUpload(sessionInfo.session_id, deviceId); + progressBar.completeStep(); + + progressBar.startStep(4, 'Waiting for processing'); + const result = await monitorChunkProgress(traceId, deviceId); + progressBar.completeStep(); + + // Cleanup + try { + fs.unlinkSync(compressedPath); + } catch (error) { + // Ignore cleanup errors + } + + // Save history + const uploadData = { + path: directoryPath, + filename: path.basename(directoryPath), + contentHash: result?.hash || 'unknown', + size: sizeCheck.size, + fileCount: 0, + isDirectory: true, + shortUrl: result?.shortUrl || null, + }; + saveUploadHistory(uploadData); + + if (!result?.hash) { + throw new Error('Server did not return valid hash value'); + } + + progressBar.complete(); + return result; + } catch (error: any) { + progressBar.fail(error.message); + throw error; + } +} + +async function uploadFileInChunks( + filePath: string, + deviceId: string, +): Promise { + const sizeCheck = checkFileSizeLimit(filePath); + if (sizeCheck.exceeds) { + throw new Error( + `File ${filePath} exceeds size limit ${formatSize(sizeCheck.limit)} (size: ${formatSize(sizeCheck.size)})`, + ); + } + + const fileName = path.basename(filePath); + const progressBar = new StepProgressBar(fileName, false); + + try { + progressBar.startStep(0, 'Initializing session'); + const sessionInfo = await initChunkSession(filePath, deviceId, false); + progressBar.completeStep(); + + progressBar.startStep(1, 'Chunk upload'); + await uploadFileChunks( + filePath, + sessionInfo.session_id, + sessionInfo.total_chunks, + sessionInfo.chunk_size, + deviceId, + progressBar, + ); + progressBar.completeStep(); + + progressBar.startStep(2, 'Completing upload'); + const traceId = await completeChunkUpload(sessionInfo.session_id, deviceId); + progressBar.completeStep(); + + progressBar.startStep(3, 'Waiting for processing'); + const result = await monitorChunkProgress(traceId, deviceId); + progressBar.completeStep(); + + // Save history + const uploadData = { + path: filePath, + filename: fileName, + contentHash: result?.hash || 'unknown', + previewHash: null, + size: sizeCheck.size, + fileCount: 1, + isDirectory: false, + shortUrl: result?.shortUrl || null, + }; + saveUploadHistory(uploadData); + + if (!result?.hash) { + throw new Error('Server did not return valid hash value'); + } + + progressBar.complete(); + return result; + } catch (error: any) { + progressBar.fail(error.message); + throw error; + } +} + +// Main export function +export default async function (filePath: string): Promise<{ + contentHash: string; + previewHash?: string | null; + shortUrl?: string; +} | null> { + const deviceId = getDeviceId(); + if (!deviceId) { + throw new Error('Device ID not found'); + } + + try { + const isDirectory = fs.statSync(filePath).isDirectory(); + const result = isDirectory + ? await uploadDirectoryInChunks(filePath, deviceId) + : await uploadFileInChunks(filePath, deviceId); + + if (result?.hash) { + return { + contentHash: result.hash, + previewHash: null, + shortUrl: result.shortUrl, + }; + } + return null; + } catch (error: any) { + return null; + } +} diff --git a/package.json b/package.json index fb28a38..31fd7d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pinme", - "version": "1.1.2", + "version": "1.1.3", "publishConfig": { "access": "public" }, @@ -26,6 +26,7 @@ "author": "Glitter Protocol", "license": "MIT", "dependencies": { + "archiver": "^7.0.1", "axios": "^1.3.2", "base-x": "^5.0.1", "bip39": "^3.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db30bd8..9e9aa5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + archiver: + specifier: ^7.0.1 + version: 7.0.1 axios: specifier: ^1.3.2 version: 1.3.2 @@ -363,6 +366,10 @@ packages: '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -400,6 +407,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@rollup/plugin-commonjs@22.0.2': resolution: {integrity: sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==} engines: {node: '>= 12.0.0'} @@ -447,6 +458,10 @@ packages: '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -475,6 +490,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -483,6 +502,18 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -502,6 +533,9 @@ packages: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -512,9 +546,15 @@ packages: axios@1.3.2: resolution: {integrity: sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.6.1: + resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} @@ -539,6 +579,9 @@ packages: brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -546,12 +589,19 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -624,16 +674,36 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -691,12 +761,18 @@ packages: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es-abstract@1.21.1: resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} @@ -835,6 +911,14 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -845,6 +929,9 @@ packages: fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -898,6 +985,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -943,6 +1034,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -1110,6 +1205,10 @@ packages: is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -1129,9 +1228,15 @@ packages: is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-worker@26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -1165,6 +1270,10 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1187,6 +1296,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -1226,9 +1338,21 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1238,6 +1362,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -1292,6 +1420,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1311,6 +1442,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1332,6 +1467,13 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -1345,10 +1487,20 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} @@ -1406,6 +1558,9 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1439,6 +1594,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -1454,16 +1613,26 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -1475,6 +1644,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -1495,11 +1668,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + terser@5.31.0: resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} engines: {node: '>=10'} hasBin: true + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -1579,6 +1758,14 @@ packages: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -1598,6 +1785,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + snapshots: '@babel/code-frame@7.22.10': @@ -1969,6 +2160,15 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -2005,6 +2205,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + '@pkgjs/parseargs@0.11.0': + optional: true + '@rollup/plugin-commonjs@22.0.2(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.2) @@ -2061,6 +2264,10 @@ snapshots: dependencies: '@types/node': 16.18.12 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.8.2): dependencies: acorn: 8.8.2 @@ -2084,6 +2291,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -2092,6 +2301,28 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.1: {} + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.10 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + argparse@2.0.1: {} array-includes@3.1.6: @@ -2118,6 +2349,8 @@ snapshots: es-abstract: 1.21.1 es-shim-unscopables: 1.0.0 + async@3.2.6: {} + asynckit@0.4.0: {} available-typed-arrays@1.0.5: {} @@ -2130,8 +2363,13 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.7: {} + balanced-match@1.0.2: {} + bare-events@2.6.1: + optional: true + base-x@5.0.1: {} base64-js@1.5.1: {} @@ -2157,12 +2395,18 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.2: dependencies: fill-range: 7.0.1 brorand@1.1.0: {} + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -2170,6 +2414,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} call-bind@1.0.2: @@ -2230,16 +2479,39 @@ snapshots: commondir@1.0.1: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + concat-map@0.0.1: {} confusing-browser-globals@1.0.11: {} + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-js@4.2.0: {} dayjs@1.11.7: {} @@ -2281,6 +2553,8 @@ snapshots: dotenv@16.5.0: {} + eastasianwidth@0.2.0: {} + elliptic@6.5.4: dependencies: bn.js: 4.12.1 @@ -2293,6 +2567,8 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + es-abstract@1.21.1: dependencies: available-typed-arrays: 1.0.5 @@ -2554,6 +2830,10 @@ snapshots: - bufferutil - utf-8-validate + event-target-shim@5.0.1: {} + + events@3.3.0: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -2564,6 +2844,8 @@ snapshots: fast-diff@1.2.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2612,6 +2894,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -2665,6 +2952,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2846,6 +3142,8 @@ snapshots: dependencies: call-bind: 1.0.2 + is-stream@2.0.1: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 @@ -2868,8 +3166,16 @@ snapshots: dependencies: call-bind: 1.0.2 + isarray@1.0.0: {} + isexe@2.0.0: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jest-worker@26.6.2: dependencies: '@types/node': 16.18.12 @@ -2904,6 +3210,10 @@ snapshots: optionalDependencies: graceful-fs: 4.2.10 + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -2926,6 +3236,8 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + lru-cache@10.4.3: {} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -2957,14 +3269,26 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + minimist@1.2.7: {} + minipass@7.1.2: {} + ms@2.1.2: {} mute-stream@0.0.8: {} natural-compare@1.4.0: {} + normalize-path@3.0.0: {} + object-inspect@1.12.3: {} object-keys@1.1.1: {} @@ -3040,6 +3364,8 @@ snapshots: dependencies: p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3052,6 +3378,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-type@4.0.0: {} picomatch@2.3.1: {} @@ -3064,6 +3395,10 @@ snapshots: prettier@2.8.3: {} + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + proxy-from-env@1.1.0: {} punycode@2.3.0: {} @@ -3074,12 +3409,34 @@ snapshots: dependencies: safe-buffer: 5.2.1 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.0: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + regexp.prototype.flags@1.4.3: dependencies: call-bind: 1.0.2 @@ -3142,6 +3499,8 @@ snapshots: dependencies: tslib: 2.6.1 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.0: @@ -3174,6 +3533,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + slash@3.0.0: {} source-map-support@0.5.21: @@ -3185,12 +3546,25 @@ snapshots: sourcemap-codec@1.4.8: {} + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string.prototype.trimend@1.0.6: dependencies: call-bind: 1.0.2 @@ -3203,6 +3577,10 @@ snapshots: define-properties: 1.1.4 es-abstract: 1.21.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -3215,6 +3593,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} @@ -3229,6 +3611,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + terser@5.31.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -3236,6 +3624,10 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + text-table@0.2.0: {} through@2.3.8: {} @@ -3323,8 +3715,26 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@7.4.6: {} yocto-queue@0.1.0: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0