feat: version 1.1.3 split package

This commit is contained in:
junchi.zhang
2025-08-19 16:54:25 +08:00
parent e8009f1da2
commit 462d035ca1
6 changed files with 1078 additions and 5 deletions
+2 -1
View File
@@ -2,4 +2,5 @@ node_modules
/dist
.DS_Store
.env
/test
/test
/temp
+5 -2
View File
@@ -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<void> => {
);
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<void> => {
);
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}`));
+1 -1
View File
@@ -30,7 +30,7 @@ interface UploadData {
path: string;
filename?: string;
contentHash: string;
previewHash: string | null;
previewHash?: string | null;
size: number;
fileCount?: number;
isDirectory?: boolean;
+658
View File
@@ -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<string> {
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<string> {
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<ChunkSessionResponse['data']> {
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<ChunkSessionResponse>(
`${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<ChunkUploadResponse['data']> {
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<ChunkUploadResponse>(
`${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<void> {
return new Promise<void>((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<void> {
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<string> {
try {
const response = await axios.post<ChunkCompleteResponse>(
`${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<ChunkStatusResponse['data']> {
try {
const response = await axios.get<ChunkStatusResponse>(
`${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<UploadResult | null> {
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<UploadResult | null> {
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<UploadResult | null> {
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;
}
}
+2 -1
View File
@@ -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",
+410
View File
@@ -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