From e06d28458a93224cd8988b440008e4d33dc8dacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:43:43 +0200 Subject: [PATCH 1/6] Cleanup --- knip.json | 7 + package.json | 12 +- src/api/Bucket.ts | 12 - src/api/Contract.ts | 20 - src/api/ExchangeReport.ts | 132 -- src/api/FileObject.ts | 4 - src/api/FileObjectUploadProtocol.ts | 7 - src/api/Shard.ts | 6 - src/api/ShardObject.ts | 217 --- src/api/constants.ts | 7 - src/api/fileinfo.ts | 2 +- src/api/index.ts | 5 - src/cli/CommandInterface.ts | 48 - src/cli/Commands.ts | 123 -- src/cli/EnvService.ts | 24 - src/cli/create-bucket.ts | 17 - src/cli/delete-bucket.ts | 17 - src/cli/download-file.ts | 60 - src/cli/get-download-links.ts | 13 - src/cli/get-filo-info.ts | 34 - src/cli/index.ts | 21 - src/cli/rename-file.ts | 19 - src/cli/upload-file-multipart.ts | 44 - src/cli/upload-file.ts | 46 - src/cli/upload-folder-zip.ts | 125 -- src/index.ts | 115 +- src/lib/core/download/dynamicStrategy.ts | 12 +- src/lib/core/download/index.ts | 4 +- src/lib/core/download/oneShardStrategy.ts | 15 +- src/lib/core/download/oneStreamStrategy.ts | 15 +- src/lib/core/download/strategy.ts | 1 - src/lib/core/upload/index.ts | 2 +- src/lib/core/upload/uploadV2.ts | 4 +- src/lib/models/Contract.ts | 13 - src/lib/models/Farmer.ts | 8 - src/lib/models/Mirror.ts | 13 - src/lib/models/ShardMeta.ts | 9 - src/lib/models/index.ts | 5 - src/lib/utils/MerkleTree.ts | 35 - src/lib/utils/concurrentQueue.ts | 65 - src/lib/utils/crypto/constants.ts | 7 - src/lib/utils/crypto/crypto.ts | 130 +- src/lib/utils/crypto/index.ts | 1 - src/lib/utils/error.ts | 2 +- src/lib/utils/index.ts | 59 - src/lib/utils/logger/logger.ts | 25 - src/lib/utils/streams/BytesCounter.ts | 23 - src/lib/utils/streams/ChunkedRequest.ts | 66 - src/lib/utils/streams/Funnel.ts | 92 -- src/lib/utils/streams/Tap.ts | 86 -- src/lib/utils/streams/index.ts | 4 - src/services/api.ts | 283 +--- src/services/proxy.ts | 6 +- src/services/request.ts | 76 -- tests/lib/concurrentQueue.unit.ts | 123 -- yarn.lock | 1404 +++++++------------- 56 files changed, 507 insertions(+), 3218 deletions(-) create mode 100644 knip.json delete mode 100644 src/api/Bucket.ts delete mode 100644 src/api/Contract.ts delete mode 100644 src/api/ExchangeReport.ts delete mode 100644 src/api/FileObjectUploadProtocol.ts delete mode 100644 src/api/ShardObject.ts delete mode 100644 src/cli/CommandInterface.ts delete mode 100644 src/cli/Commands.ts delete mode 100644 src/cli/EnvService.ts delete mode 100644 src/cli/create-bucket.ts delete mode 100644 src/cli/delete-bucket.ts delete mode 100644 src/cli/download-file.ts delete mode 100644 src/cli/get-download-links.ts delete mode 100644 src/cli/get-filo-info.ts delete mode 100644 src/cli/index.ts delete mode 100644 src/cli/rename-file.ts delete mode 100644 src/cli/upload-file-multipart.ts delete mode 100644 src/cli/upload-file.ts delete mode 100644 src/cli/upload-folder-zip.ts delete mode 100644 src/lib/models/Contract.ts delete mode 100644 src/lib/models/Farmer.ts delete mode 100644 src/lib/models/Mirror.ts delete mode 100644 src/lib/models/ShardMeta.ts delete mode 100644 src/lib/models/index.ts delete mode 100644 src/lib/utils/MerkleTree.ts delete mode 100644 src/lib/utils/concurrentQueue.ts delete mode 100644 src/lib/utils/crypto/constants.ts delete mode 100644 src/lib/utils/index.ts delete mode 100644 src/lib/utils/streams/BytesCounter.ts delete mode 100644 src/lib/utils/streams/ChunkedRequest.ts delete mode 100644 src/lib/utils/streams/Funnel.ts delete mode 100644 src/lib/utils/streams/Tap.ts delete mode 100644 tests/lib/concurrentQueue.unit.ts diff --git a/knip.json b/knip.json new file mode 100644 index 00000000..186ba87a --- /dev/null +++ b/knip.json @@ -0,0 +1,7 @@ +{ + "project": ["src/**/*.ts"], + "ignoreDependencies": ["lint-staged", "ts-node"], + "rules": { + "enumMembers": "off" + } +} diff --git a/package.json b/package.json index 6293affd..d05e694f 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "test:watch": "vitest watch", "lint": "eslint ./src", "lint:fix": "yarn run lint --fix", - "cli": "ts-node --files src/cli/index.ts", "format": "prettier --write src/**/*.{js,jsx,tsx,ts} tests/**/*.{js,jsx,tsx,ts}", + "find-deadcode": "knip", "prepare": "husky" }, "keywords": [], @@ -24,26 +24,20 @@ "devDependencies": { "@internxt/eslint-config-internxt": "2.0.1", "@internxt/prettier-config": "internxt/prettier-config#v2.0.0", - "@types/archiver": "7.0.0", "@types/async": "3.2.9", - "@types/express": "5.0.6", "@types/node": "25.6.0", "@vitest/coverage-istanbul": "4.1.4", - "archiver": "7.0.1", - "commander": "14.0.3", - "dotenv": "17.4.1", "eslint": "9.39.2", - "express": "5.2.1", "husky": "9.1.7", + "knip": "^6.11.0", "lint-staged": "16.4.0", "prettier": "3.8.2", "rimraf": "6.1.3", + "ts-node": "^10.9.2", "typescript": "5.9.3", - "uuid": "13.0.0", "vitest": "4.1.4" }, "dependencies": { - "@internxt/lib": "1.4.1", "@internxt/sdk": "1.15.10", "async": "3.2.6", "axios": "1.15.0", diff --git a/src/api/Bucket.ts b/src/api/Bucket.ts deleted file mode 100644 index 7498a531..00000000 --- a/src/api/Bucket.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface Bucket { - id: string; - user: string; - encryptionKey: string; - publicPermissions: string[]; - created: Date; - name: string; - pubkeys: string[]; - status: string; - transfer: number; - storage: number; -} diff --git a/src/api/Contract.ts b/src/api/Contract.ts deleted file mode 100644 index 0f095cbf..00000000 --- a/src/api/Contract.ts +++ /dev/null @@ -1,20 +0,0 @@ -export interface ContractMeta { - hash: string; - token: string; - operation: 'PUSH'; - farmer: { - userAgent: string; - protocol: string; - address: string; - port: number; - nodeID: string; - lastSeen: number; - }; - url: string; -} - -export class Contract { - static buildRequestUrl(contract: ContractMeta) { - return `http://${contract.farmer.address}:${contract.farmer.port}/upload/link/${contract.hash}`; - } -} diff --git a/src/api/ExchangeReport.ts b/src/api/ExchangeReport.ts deleted file mode 100644 index dd1a4cfe..00000000 --- a/src/api/ExchangeReport.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { request } from '../services/request'; -import { EnvironmentConfig, Shard } from '.'; - -export interface ExchangeReportParams { - dataHash: string | null; - reporterId: string; - farmerId: string | null; - clientId: string; - exchangeStart: Date; - exchangeEnd: Date | null; - exchangeResultCode: number; - exchangeResultMessage: string; -} - -export class ExchangeReport { - static INXT_REPORT_SUCCESS = 1000; - static INXT_REPORT_FAILURE = 1100; - - static INXT_REPORT_SHARD_UPLOADED = 'SHARD_UPLOADED'; - static INXT_REPORT_UPLOAD_ERROR = 'TRANSFER_FAILED'; - - static INXT_REPORT_SHARD_DOWNLOADED = 'SHARD_DOWNLOADED'; - static INXT_REPORT_MIRROR_FAILED = 'MIRROR_FAILED'; - static INXT_REPORT_TRANSFER_FAILED = 'TRANSFER_FAILED'; - static INXT_REPORT_MIRROR_SUCCESS = 'MIRROR_SUCCESS'; - static INXT_REPORT_DOWNLOAD_ERROR = 'DOWNLOAD_ERROR'; - static INXT_REPORT_SHARD_EXISTS = 'SHARD_EXISTS'; - static INXT_REPORT_FAILED_INTEGRITY = 'FAILED_INTEGRITY'; - static INXT_REPORT_READ_FAILED = 'READ_FAILED'; - - config: EnvironmentConfig; - params: ExchangeReportParams; - - constructor(config: EnvironmentConfig) { - this.config = config; - this.params = { - dataHash: null, - reporterId: config.bridgeUser, - farmerId: null, - clientId: config.bridgeUser, - exchangeStart: new Date(), - exchangeEnd: null, - exchangeResultCode: 1000, - exchangeResultMessage: '', - }; - } - - expectedResultCode(): number { - switch (this.params.exchangeResultMessage) { - case ExchangeReport.INXT_REPORT_SHARD_DOWNLOADED: - case ExchangeReport.INXT_REPORT_SHARD_UPLOADED: - case ExchangeReport.INXT_REPORT_MIRROR_SUCCESS: - case ExchangeReport.INXT_REPORT_SHARD_EXISTS: - return ExchangeReport.INXT_REPORT_SUCCESS; - case ExchangeReport.INXT_REPORT_FAILED_INTEGRITY: - case ExchangeReport.INXT_REPORT_DOWNLOAD_ERROR: - case ExchangeReport.INXT_REPORT_TRANSFER_FAILED: - case ExchangeReport.INXT_REPORT_MIRROR_FAILED: - case ExchangeReport.INXT_REPORT_READ_FAILED: - return ExchangeReport.INXT_REPORT_FAILURE; - default: - return 0; - } - } - - validate() { - const expectedResultCode = this.expectedResultCode(); - - if ( - !this.params.dataHash || - !this.params.farmerId || - expectedResultCode === 0 || - expectedResultCode !== this.params.exchangeResultCode - ) { - return false; - } - - return true; - } - - sendReport() { - if (this.params.exchangeEnd == null) { - this.params.exchangeEnd = new Date(); - } - - if (!this.validate()) { - return Promise.reject(Error('Not valid report to send')); - } - - return request(this.config, 'POST', `${this.config.bridgeUrl}/reports/exchanges`, { data: this.params }, false); - } - - DownloadOk() { - this.params.exchangeResultCode = ExchangeReport.INXT_REPORT_SUCCESS; - this.params.exchangeResultMessage = ExchangeReport.INXT_REPORT_SHARD_DOWNLOADED; - } - - DownloadError() { - this.params.exchangeResultCode = ExchangeReport.INXT_REPORT_FAILURE; - this.params.exchangeResultMessage = ExchangeReport.INXT_REPORT_DOWNLOAD_ERROR; - } - - UploadOk() { - this.params.exchangeResultCode = ExchangeReport.INXT_REPORT_SUCCESS; - this.params.exchangeResultMessage = ExchangeReport.INXT_REPORT_SHARD_UPLOADED; - } - - UploadError() { - this.params.exchangeResultCode = ExchangeReport.INXT_REPORT_FAILURE; - this.params.exchangeResultMessage = ExchangeReport.INXT_REPORT_UPLOAD_ERROR; - } - - static build(config: EnvironmentConfig, mirror: Shard) { - const report = new ExchangeReport(config); - - report.params.exchangeStart = new Date(); - report.params.farmerId = mirror.farmer.nodeID; - report.params.dataHash = mirror.hash; - - return report; - } - - error() { - this.DownloadError(); - this.sendReport().catch(() => {}); - } - - success() { - this.DownloadOk(); - this.sendReport().catch(() => {}); - } -} diff --git a/src/api/FileObject.ts b/src/api/FileObject.ts index e55a4855..de4891b0 100644 --- a/src/api/FileObject.ts +++ b/src/api/FileObject.ts @@ -9,12 +9,10 @@ import { Shard, EnvironmentConfig } from './'; import { logger } from '../lib/utils/logger'; import { DEFAULT_INXT_MIRRORS } from './constants'; import { wrap } from '../lib/utils/error'; -import { ShardObject } from './ShardObject'; import { DownloadStrategy, Events } from '../lib/core'; import { Abortable } from './Abortable'; export class FileObject extends EventEmitter { - shards: ShardObject[] = []; rawShards: Shard[] = []; fileInfo: FileInfo | undefined; config: EnvironmentConfig; @@ -28,8 +26,6 @@ export class FileObject extends EventEmitter { fileKey: Buffer; fileToken?: string; - totalSizeWithECs = 0; - private aborted = false; private downloader: DownloadStrategy; diff --git a/src/api/FileObjectUploadProtocol.ts b/src/api/FileObjectUploadProtocol.ts deleted file mode 100644 index de4e99b1..00000000 --- a/src/api/FileObjectUploadProtocol.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { UploadProgressCallback } from '../lib/core'; -import { ShardMeta } from '../lib/models'; - -export interface FileObjectUploadProtocol { - stage(): void; - upload(cb: UploadProgressCallback): Promise; -} diff --git a/src/api/Shard.ts b/src/api/Shard.ts index d4c8d53b..ee6b535a 100644 --- a/src/api/Shard.ts +++ b/src/api/Shard.ts @@ -17,9 +17,3 @@ export interface Shard { operation: string; url: string; } - -export function buildRequestUrl(shard: Shard) { - const { address, port } = shard.farmer; - - return `http://${address}:${port}/download/link/${shard.hash}`; -} diff --git a/src/api/ShardObject.ts b/src/api/ShardObject.ts deleted file mode 100644 index fa2450d9..00000000 --- a/src/api/ShardObject.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { Readable, Writable } from 'stream'; -import { EventEmitter } from 'events'; - -import { INXTRequest } from '../lib'; -import { ContractMeta } from '../api'; -import { ShardMeta } from '../lib/models'; -import { wrap } from '../lib/utils/error'; -import { InxtApiI, SendShardToNodeResponse } from '../services/api'; -import { Shard } from './'; -import { get } from '../services/request'; - -import { request as httpRequest } from 'http'; -import { request as httpsRequest } from 'https'; - -import { getProxy } from '../services/proxy'; - -type PutUrl = string; -type GetUrl = string; - -export class ShardObject extends EventEmitter { - private meta: ShardMeta; - private api: InxtApiI; - private frameId: string; - private requests: INXTRequest[] = []; - private shard?: Shard; - - static Events = { - NodeTransferFinished: 'node-transfer-finished', - }; - - constructor(api: InxtApiI, frameId: string | null, meta: ShardMeta | null, shard?: Shard) { - super(); - - // TODO: Clarify if meta and shard variables are both required. - this.frameId = frameId ?? ''; - this.meta = meta ?? { - hash: '', - index: 0, - parity: false, - challenges_as_str: [], - size: 0, - tree: [], - challenges: [], - }; - this.api = api; - this.shard = shard; - } - - get size(): number { - return this.meta.size; - } - - get hash(): string { - return this.meta.hash; - } - - get index(): number { - return this.meta.index; - } - - static requestPutTwo(url: string, cb: (err: Error | null, url: PutUrl) => void, useProxy: boolean) { - get<{ result: string }>(url, { useProxy }) - .then((res) => { - cb(null, res.result); - }) - .catch((err) => { - cb(err, ''); - }); - } - - static requestPut(url: string): Promise { - return get<{ result: string }>(url, { useProxy: true }).then((res) => res.result); - } - - static requestGet(url: string, useProxy = true): Promise { - return get<{ result: string }>(url, { useProxy }).then((res) => res.result); - } - - static async getPutStream(url: PutUrl, useProxy: boolean): Promise { - let free: undefined | (() => void); - let targetUrl = url; - - if (useProxy) { - const proxy = await getProxy(); - free = proxy.free; - targetUrl = `${proxy.url}/${targetUrl}`; - } - const formattedUrl = new URL(targetUrl); - const request = formattedUrl.protocol === 'http:' ? httpRequest : httpsRequest; - - return request( - { - headers: { - 'Content-Type': 'application/octet-stream', - }, - hostname: formattedUrl.hostname, - port: formattedUrl.port, - protocol: formattedUrl.protocol, - path: formattedUrl.pathname + '?' + formattedUrl.searchParams.toString(), - method: 'PUT', - }, - (res) => { - if (res.statusCode !== 200) { - console.log('Request failed with status ' + res.statusCode); - } - - const chunks: Buffer[] = []; - - res.on('data', chunks.push.bind(chunks)); - res.once('error', (err) => { - console.log('err', err); - }); - res.once('end', () => { - // const body = Buffer.concat(chunks); - // console.log(body.toString()); - free?.(); - }); - }, - ); - } - - static async putStreamTwo( - url: PutUrl, - content: Readable, - cb: (err: Error | null) => void, - useProxy: boolean, - ): Promise { - let free: undefined | (() => void); - let targetUrl = url; - - if (useProxy) { - const proxy = await getProxy(); - free = proxy.free; - targetUrl = `${proxy.url}/${targetUrl}`; - } - const formattedUrl = new URL(targetUrl); - const request = formattedUrl.protocol === 'http:' ? httpRequest : httpsRequest; - const putRequest = request( - { - headers: { - 'Content-Type': 'application/octet-stream', - }, - hostname: formattedUrl.hostname, - port: formattedUrl.port, - protocol: formattedUrl.protocol, - path: formattedUrl.pathname + '?' + formattedUrl.searchParams.toString(), - method: 'PUT', - }, - (res) => { - if (res.statusCode !== 200) { - return cb(new Error('Request failed with status ' + res.statusCode)); - } - - const chunks: Buffer[] = []; - - res.on('data', chunks.push.bind(chunks)); - res.once('error', cb); - res.once('end', () => { - // const body = Buffer.concat(chunks); - // console.log(body.toString()); - free?.(); - cb(null); - }); - }, - ); - content.once('error', (err) => { - content.unpipe(putRequest); - cb(err); - }); - putRequest.once('error', (err) => { - content.unpipe(putRequest); - cb(err); - }); - - content.pipe(putRequest); - } - - negotiateContract(): Promise { - const req = this.api.addShardToFrame(this.frameId, this.meta); - this.requests.push(req); - - return req.start().catch((err) => { - throw wrap('Contract negotiation error', err); - }); - } - - private sendShardToNode(content: Buffer, shard: Shard): Promise { - const req = this.api.sendShardToNode(shard, content); - this.requests.push(req); - - let success = true; - - return req - .start() - .catch((err: any) => { - if (err.response && err.response.status < 400) { - return { result: err.response.data && err.response.data.error }; - } - - success = false; - - throw wrap('Farmer request error', err); - }) - .finally(() => { - const hash = shard.hash; - const nodeID = shard.farmer.nodeID; - - this.emit(ShardObject.Events.NodeTransferFinished, { hash, nodeID, success }); - }); - } - - abort(): void { - this.requests.forEach((r) => { - r.abort(); - }); - } -} diff --git a/src/api/constants.ts b/src/api/constants.ts index 535bfb1c..640cecec 100644 --- a/src/api/constants.ts +++ b/src/api/constants.ts @@ -1,12 +1,5 @@ export const DEFAULT_INXT_MIRRORS = 6; -/* EVENTS */ -export const UPLOAD_CANCELLED = 'UPLOAD CANCELLED'; - /* ERRORS */ export const ENCRYPTION_KEY_NOT_PROVIDED = 'Encryption key was not provided'; export const BUCKET_ID_NOT_PROVIDED = 'Bucket id was not provided'; - -export const MIN_SHARD_SIZE = 2097152; -export const MAX_SHARD_SIZE = 4294967296; -export const SHARD_MULTIPLE_BACK = 4; diff --git a/src/api/fileinfo.ts b/src/api/fileinfo.ts index 87e95c0d..8b6ebeee 100644 --- a/src/api/fileinfo.ts +++ b/src/api/fileinfo.ts @@ -41,7 +41,7 @@ export function GetFileInfo( }); } -export async function GetFileMirror( +async function GetFileMirror( config: EnvironmentConfig, bucketId: string, fileId: string, diff --git a/src/api/index.ts b/src/api/index.ts index 6a7adb69..303449f7 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,11 +1,6 @@ export * from './ActionState'; export * from './Abortable'; -export * from './Bucket'; -export * from './Contract'; export * from './EnvironmentConfig'; -export * from './ExchangeReport'; export * from './FileObject'; export * from './fileinfo'; -export * from './FileObjectUploadProtocol'; export * from './Shard'; -export * from './ShardObject'; diff --git a/src/cli/CommandInterface.ts b/src/cli/CommandInterface.ts deleted file mode 100644 index cb58d0fd..00000000 --- a/src/cli/CommandInterface.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Command } from 'commander'; -import { EnvironmentConfig } from '../api'; -import { Environment } from '..'; -import { EnvService } from './EnvService'; - -export interface CommandOpts { - version: string; - command: string; - name?: string; - description: string; - options: Option[]; -} - -interface Option { - required?: boolean; - flags: string; - description?: string; - defaultValue?: string | boolean; -} - -export function getEnvironment(): Environment { - const envConfig: EnvironmentConfig = { - bridgePass: EnvService.instance.get('BRIDGE_PASS'), - bridgeUser: EnvService.instance.get('BRIDGE_USER'), - encryptionKey: EnvService.instance.get('MNEMONIC'), - bridgeUrl: EnvService.instance.get('BRIDGE_URL'), - appDetails: { - clientName: 'inxt-js', - clientVersion: '1.0', - }, - }; - - return new Environment(envConfig); -} - -export function buildCommand(opts: CommandOpts): Command { - const command = new Command().command(opts.command).version(opts.version).description(opts.description); - - opts.options.forEach((option) => { - if (option.required) { - command.requiredOption(option.flags, option.description, option.defaultValue); - } else { - command.option(option.flags, option.description, option.defaultValue); - } - }); - - return command; -} diff --git a/src/cli/Commands.ts b/src/cli/Commands.ts deleted file mode 100644 index 1210923d..00000000 --- a/src/cli/Commands.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { logger } from '../lib/utils/logger'; -import { buildCommand } from './CommandInterface'; -import { createBucket } from './create-bucket'; -import { deleteBucket } from './delete-bucket'; -import { downloadFile } from './download-file'; -import { getDownloadLinks } from './get-download-links'; -import { getFileInfo } from './get-filo-info'; -import { renameFile } from './rename-file'; -import { uploadFile } from './upload-file'; -import { uploadFileMultipart } from './upload-file-multipart'; -import { uploadFolder } from './upload-folder-zip'; - -function notifyProgramFinished(programName: string) { - return () => { - logger.info('Program "%s" finished', programName); - }; -} - -export const uploadFileCommand = buildCommand({ - version: '0.0.1', - command: 'upload-file ', - description: 'Upload a file', - options: [], -}).action((path) => { - return uploadFile(path); -}); - -export const uploadFileMultipartCommand = buildCommand({ - version: '0.0.1', - command: 'upload-file-multipart ', - description: 'Upload a file using multipart', - options: [], -}).action((path) => { - return uploadFileMultipart(path); -}); - -export const uploadFolderZipCommand = buildCommand({ - version: '0.0.1', - command: 'upload-folder-zip ', - description: 'Upload a folder zipped', - options: [], -}).action((path: string) => { - uploadFolder(path).finally(notifyProgramFinished('upload-folder-zip')); -}); - -export const downloadFileCommand = buildCommand({ - version: '0.0.1', - command: 'download-file ', - description: 'Download a file', - options: [], -}).action((fileId, path) => { - downloadFile(fileId, path, 1).finally(notifyProgramFinished('download-file')); -}); - -export const downloadFileCommandParallel = buildCommand({ - version: '0.0.1', - command: 'download-file-parallel ', - description: 'Download a file', - options: [], -}).action((fileId, path) => { - downloadFile(fileId, path, 10).finally(notifyProgramFinished('download-file-parallel')); -}); - -export const renameFileCommand = buildCommand({ - version: '0.0.1', - command: 'rename-file ', - description: 'Renames a file in the network', - options: [], -}).action((fileId, newName) => { - renameFile(fileId, newName).finally(notifyProgramFinished('rename-file')); -}); - -export const getFileInfoCommand = buildCommand({ - version: '0.0.1', - command: 'get-file-info ', - description: 'Gets file info', - options: [], -}).action((fileId) => { - getFileInfo(fileId).finally(notifyProgramFinished('get-file-info')); -}); - -export const createBucketCommand = buildCommand({ - version: '0.0.1', - command: 'create-bucket ', - description: 'Creates a bucket with the given name', - options: [], -}).action((bucketName: string) => { - createBucket(bucketName).finally(notifyProgramFinished('create-bucket')); -}); - -export const deleteBucketCommand = buildCommand({ - version: '0.0.1', - command: 'delete-bucket ', - description: 'Deletes a bucket given its id', - options: [], -}).action((bucketId: string) => { - deleteBucket(bucketId).finally(notifyProgramFinished('delete-bucket')); -}); - -export const getDownloadLinksCommand = buildCommand({ - version: '0.0.1', - command: 'get-download-links ', - description: 'Gets download links of file ids', - options: [], -}).action((bucketId: string, fileIdsSeparatedByCommas: string) => { - getDownloadLinks(bucketId, fileIdsSeparatedByCommas.split(',')).finally(notifyProgramFinished('get-download-links')); -}); - -// export const downloadFolderZippedCommand = buildCommand({ -// version: '0.0.1', -// name: 'download-folder-zip', -// description: 'Download a folder zipped', -// options: [ -// { -// flags: '-f, --fileId ', -// description: 'Internxt Network file id of the zipped folder' -// }, -// { -// flags: '-p, --path ', -// description: 'path where zipped folder is going to be downloaded' -// } -// ] -// }); diff --git a/src/cli/EnvService.ts b/src/cli/EnvService.ts deleted file mode 100644 index 341c3117..00000000 --- a/src/cli/EnvService.ts +++ /dev/null @@ -1,24 +0,0 @@ -export interface EnvKeys { - readonly BRIDGE_USER: string; - readonly BRIDGE_PASS: string; - readonly MNEMONIC: string; - readonly BUCKET_ID: string; - readonly BRIDGE_URL: string; - readonly STAGE: string; -} - -export class EnvService { - public static readonly instance: EnvService = new EnvService(); - - /** - * Gets the value from an environment key - * @param key The environment key to retrieve - * @throws {Error} If key is not found in process.env - * @returns The value from the environment variable - **/ - public get = (key: keyof EnvKeys): string => { - const value = process.env[key]; - if (!value) throw new Error(`Config key ${key} was not found in process.env`); - return value; - }; -} diff --git a/src/cli/create-bucket.ts b/src/cli/create-bucket.ts deleted file mode 100644 index 88b7111a..00000000 --- a/src/cli/create-bucket.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; - -export function createBucket(bucketName: string): Promise { - logger.info('Creating bucket %s', bucketName); - - const network = getEnvironment(); - - return network - .createBucket(bucketName) - .then((bucketId: string) => { - logger.info('Bucket %s created with id %s', bucketName, bucketId); - }) - .catch((err) => { - logger.error('Bucket creation error: %s', err.message); - }); -} diff --git a/src/cli/delete-bucket.ts b/src/cli/delete-bucket.ts deleted file mode 100644 index 69884724..00000000 --- a/src/cli/delete-bucket.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; - -export function deleteBucket(bucketId: string): Promise { - logger.info('Deleting bucket %s', bucketId); - - const network = getEnvironment(); - - return network - .deleteBucket(bucketId) - .then(() => { - logger.info('Bucket %s deleted', bucketId); - }) - .catch((err) => { - logger.error('Bucket deletion error: %s', err.message); - }); -} diff --git a/src/cli/download-file.ts b/src/cli/download-file.ts deleted file mode 100644 index 3d5fecb2..00000000 --- a/src/cli/download-file.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { createWriteStream } from 'fs'; -import { pipeline, Readable } from 'stream'; - -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; -import { EnvService } from './EnvService'; - -export async function downloadFile(fileId: string, path: string, concurrency: number) { - logger.info('Downloading file %s', fileId); - - const network = getEnvironment(); - const bucketId = EnvService.instance.get('BUCKET_ID'); - - const destination = createWriteStream(path); - - try { - await new Promise((resolve, reject) => { - const state = network.download( - bucketId as string, - fileId, - { - progressCallback: (progress: number) => { - logger.info('Progress: %s %', (progress * 100).toFixed(2)); - }, - finishedCallback: (err: Error | null, downloadStream: Readable | null) => { - if (err) { - return reject(err); - } - - pipeline(downloadStream as Readable, destination, (err) => { - if (err) { - return reject(err); - } - resolve(null); - }); - }, - }, - { - label: 'Dynamic', - params: { - useProxy: false, - concurrency, - // chunkSize: 30000, - }, - }, - ); - - process.on('SIGINT', () => { - network.downloadCancel(state); - }); - }); - logger.info('File downloaded on path %s', path); - - process.exit(0); - } catch (err) { - logger.error('Error downloading file %s', (err as Error).message ?? ''); - - process.exit(1); - } -} diff --git a/src/cli/get-download-links.ts b/src/cli/get-download-links.ts deleted file mode 100644 index f0006380..00000000 --- a/src/cli/get-download-links.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; - -export async function getDownloadLinks(bucketId: string, fileIds: string[]): Promise { - const network = getEnvironment(); - - try { - const response = await network.getDownloadLinks(bucketId, fileIds); - logger.info(`getDownloadLinks response: ${JSON.stringify(response, null, 2)}`); - } catch (err) { - logger.error(`Something went wrong while getting download links ${(err as Error).message ?? ''}`); - } -} diff --git a/src/cli/get-filo-info.ts b/src/cli/get-filo-info.ts deleted file mode 100644 index 5d5aa4d2..00000000 --- a/src/cli/get-filo-info.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { FileInfo } from '../api/fileinfo'; - -import { DecryptFileName } from '../lib/utils/crypto'; -import { logger } from '../lib/utils/logger'; - -import { getEnvironment } from './CommandInterface'; -import { EnvService } from './EnvService'; - -export function getFileInfo(fileId: string): Promise { - logger.info('Retrieving info for file %s', fileId); - - const network = getEnvironment(); - const bucketId = EnvService.instance.get('BUCKET_ID'); - - if (!network.config.encryptionKey) { - logger.error('Mnemonic not provided'); - } - - let fileInfo: FileInfo; - - return network - .getFileInfo(bucketId, fileId) - .then((info) => { - fileInfo = info; - - return DecryptFileName(network.config.encryptionKey ?? '', bucketId, fileInfo.filename); - }) - .then((plainFilename) => { - logger.info(JSON.stringify({ ...fileInfo, plainFilename }, null, 2)); - }) - .catch((err) => { - logger.error('Error retrieving info for file %s: %s', fileId, err.message); - }); -} diff --git a/src/cli/index.ts b/src/cli/index.ts deleted file mode 100644 index 015c3a66..00000000 --- a/src/cli/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Command } from 'commander'; -import { config } from 'dotenv'; -config({ quiet: true }); - -import * as commands from './Commands'; - -const program = new Command(); - -program.addCommand(commands.uploadFileCommand); -program.addCommand(commands.uploadFileMultipartCommand); -program.addCommand(commands.uploadFolderZipCommand); -program.addCommand(commands.downloadFileCommand); -program.addCommand(commands.downloadFileCommandParallel); -program.addCommand(commands.renameFileCommand); -program.addCommand(commands.getFileInfoCommand); -program.addCommand(commands.createBucketCommand); -program.addCommand(commands.deleteBucketCommand); -program.addCommand(commands.getDownloadLinksCommand); -// program.addCommand(commands.downloadFolderZippedCommand); - -program.parse(process.argv); diff --git a/src/cli/rename-file.ts b/src/cli/rename-file.ts deleted file mode 100644 index 8772ecb8..00000000 --- a/src/cli/rename-file.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; -import { EnvService } from './EnvService'; - -export function renameFile(fileId: string, newPlainName: string): Promise { - logger.info('Renaming file %s', fileId); - - const network = getEnvironment(); - const bucketId = EnvService.instance.get('BUCKET_ID'); - - return network - .renameFile(bucketId, fileId, newPlainName) - .then(() => { - logger.info('File %s renamed', fileId); - }) - .catch((err) => { - logger.error('There was an error renaming file %s: %s', fileId, err.message); - }); -} diff --git a/src/cli/upload-file-multipart.ts b/src/cli/upload-file-multipart.ts deleted file mode 100644 index 427c09ed..00000000 --- a/src/cli/upload-file-multipart.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { createReadStream, existsSync, statSync } from 'fs'; - -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; -import { EnvService } from './EnvService'; - -export async function uploadFileMultipart(filepath: string) { - if (!existsSync(filepath)) { - logger.error('File "%s" does not exist', filepath); - return process.exit(-1); - } - try { - const network = getEnvironment(); - - const bucketId = EnvService.instance.get('BUCKET_ID'); - - const fileId = await new Promise((resolve: (fileId: string) => void, reject) => { - const state = network.uploadMultipartFile(bucketId, { - progressCallback: (progress: number) => { - logger.info('Progress %s%', (progress * 100).toFixed(2)); - }, - finishedCallback: (err: Error | null, res: string | null) => { - if (err) { - return reject(err); - } - - resolve(res as string); - }, - fileSize: statSync(filepath).size, - source: createReadStream(filepath), - }); - - process.on('SIGINT', () => { - logger.info('Aborting upload'); - network.uploadCancel(state); - }); - }); - - console.log('File %s uploaded', fileId); - } catch (err) { - logger.error('Error uploading file: %s. %s', (err as Error).message ?? '', (err as Error).stack ?? ''); - process.exit(-1); - } -} diff --git a/src/cli/upload-file.ts b/src/cli/upload-file.ts deleted file mode 100644 index 2d1f973c..00000000 --- a/src/cli/upload-file.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { createReadStream, existsSync, statSync } from 'fs'; - -import { logger } from '../lib/utils/logger'; -import { getEnvironment } from './CommandInterface'; -import { EnvService } from './EnvService'; - -export async function uploadFile(filepath: string) { - if (!existsSync(filepath)) { - logger.error('File "%s" does not exist', filepath); - return process.exit(-1); - } - - try { - const network = getEnvironment(); - - const bucketId = EnvService.instance.get('BUCKET_ID'); - - const fileId = await new Promise((resolve: (fileId: string) => void, reject) => { - const state = network.upload(bucketId, { - progressCallback: (progress: number) => { - logger.info('Progress %s%', (progress * 100).toFixed(2)); - }, - finishedCallback: (err: Error | null, res: string | null) => { - if (err) { - return reject(err); - } else if (!res) { - return reject('No response received from Network download'); - } - resolve(res); - }, - fileSize: statSync(filepath).size, - source: createReadStream(filepath), - }); - - process.on('SIGINT', () => { - logger.info('Aborting upload'); - network.uploadCancel(state); - }); - }); - - console.log('File %s uploaded', fileId); - } catch (err) { - logger.error('Error uploading file: %s', (err as Error).message ?? ''); - process.exit(-1); - } -} diff --git a/src/cli/upload-folder-zip.ts b/src/cli/upload-folder-zip.ts deleted file mode 100644 index 3051d216..00000000 --- a/src/cli/upload-folder-zip.ts +++ /dev/null @@ -1,125 +0,0 @@ -import archiver from 'archiver'; -import { Cipher, createCipheriv, randomBytes } from 'crypto'; -import { pipeline } from 'stream'; -import { promisify } from 'util'; -import { v4 } from 'uuid'; - -import { Environment } from '..'; -import { EnvironmentConfig } from '../api'; -import { GenerateFileKey } from '../lib/utils/crypto'; -import { HashStream, BytesCounter } from '../lib/utils/streams'; -import { logger } from '../lib/utils/logger'; -import { UploadOptions } from '../lib/core'; -import { EnvService } from './EnvService'; - -const pipelineAsync = promisify(pipeline); -const archive = archiver('zip', { zlib: { level: 9 } }); - -function getEnvironment(fileEncryptionKey?: Buffer, index?: Buffer): Environment { - const envConfig: EnvironmentConfig = { - bridgePass: EnvService.instance.get('BRIDGE_PASS'), - bridgeUser: EnvService.instance.get('BRIDGE_USER'), - encryptionKey: EnvService.instance.get('MNEMONIC'), - bridgeUrl: EnvService.instance.get('BRIDGE_URL'), - appDetails: { - clientName: 'inxt-js', - clientVersion: '1.0', - }, - inject: {}, - }; - - if (envConfig.inject && fileEncryptionKey) { - envConfig.inject.fileEncryptionKey = fileEncryptionKey; - } - - if (envConfig.inject && index) { - envConfig.inject.index = index; - } - - return new Environment(envConfig); -} - -function getEncryptedFolderMeta(folderPath: string, cipher: Cipher): Promise<{ hash: string; size: number }> { - const hasher = new HashStream(); - const counter = new BytesCounter(); - - setTimeout(archive.finalize.bind(archive), 100); - - hasher.on('data', () => null); - - return pipelineAsync(archive.directory(folderPath + '/', false), cipher, counter, hasher).then(() => { - return { - hash: hasher.getHash().toString('hex'), - size: counter.count, - }; - }); -} - -export async function uploadFolder(path: string) { - const encryptionKey = EnvService.instance.get('MNEMONIC'); - const bucketId = EnvService.instance.get('BUCKET_ID'); - const index = randomBytes(32); - const iv = index.slice(0, 16); - const fileEncryptionKey = await GenerateFileKey(encryptionKey, bucketId, index); - - const network = getEnvironment(fileEncryptionKey, index); - - logger.info('Uploading folder "%s"', path); - logger.debug( - 'Provided params { bucketId: %s, bridgeApi: %s, bridgeUser: %s, directoryPath: %s }', - bucketId, - network.config.bridgeUrl, - network.config.bridgeUser, - path, - ); - - const cipher = createCipheriv('aes-256-ctr', fileEncryptionKey, iv); - const { hash, size } = await getEncryptedFolderMeta(path, cipher); - const networkFilename = v4(); - - const archiverSetup = archiver('zip', { zlib: { level: 9 } }); - const directoryStream = archiverSetup.directory(path + '/', false); - archiverSetup.finalize(); - - logger.debug('directory hash zipped is %s', hash); - logger.debug('directory ziped size is %s', size); - logger.info('Network name is %s', networkFilename); - - type ResolveFunction = (res: null) => void; - type RejectFunction = (err: Error) => void; - - const finishCbGenerator = (resolve: ResolveFunction, reject: RejectFunction) => { - return (err: Error | null) => { - if (err) { - reject(err); - } else { - resolve(null); - } - }; - }; - - const uploadOptionsGenerator = (resolve: ResolveFunction, reject: RejectFunction): UploadOptions => ({ - source: directoryStream, - fileSize: size, - progressCallback: (progress: number) => { - logger.debug('Progress %s%', (progress * 100).toFixed(2)); - }, - finishedCallback: finishCbGenerator(resolve, reject), - }); - - await new Promise((resolve, reject) => { - const state = network.upload(bucketId, uploadOptionsGenerator(resolve, reject)); - - process.on('SIGINT', () => network.uploadCancel(state)); - }) - .then((fileId) => { - logger.info('File upload finished. File id: %s', fileId); - - process.exit(0); - }) - .catch((err) => { - logger.error('Error uploading file: %s', err.message); - - process.exit(-1); - }); -} diff --git a/src/index.ts b/src/index.ts index 20297d2f..3e68a5e2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -import { request } from '@internxt/lib'; import { UploadStrategyFunction, UploadOptions, @@ -11,40 +10,19 @@ import { Events, } from './lib/core'; -import { EncryptFilename, GenerateFileKey } from './lib/utils/crypto'; - // TODO: Remove this import { BUCKET_ID_NOT_PROVIDED, ENCRYPTION_KEY_NOT_PROVIDED } from './api/constants'; -import { ActionState, ActionTypes, Bucket, EnvironmentConfig } from './api'; +import { ActionState, ActionTypes, EnvironmentConfig } from './api'; import { FileInfo, GetFileInfo } from './api/fileinfo'; import { Bridge, CreateFileTokenResponse, GetDownloadLinksResponse } from './services/api'; -import { HashStream } from './lib/utils/streams'; import { downloadFileV2 } from './lib/core/download/downloadV2'; import { FileVersionOneError } from '@internxt/sdk/dist/network/download'; import { upload as uploadFileV2 } from './lib/core/upload/uploadV2'; -type GetBucketsCallback = (err: Error | null, result: any) => void; - -type GetBucketIdCallback = (err: Error | null, result: any) => void; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -type DeleteBucketCallback = (err: Error | null, result: any) => void; - -type ListFilesCallback = (err: Error | null, result: any) => void; - -type DeleteFileCallback = (err: Error | null, result: any) => void; - -const utils = { - generateFileKey: GenerateFileKey, - Hasher: HashStream, -}; - export class Environment { config: EnvironmentConfig; - static utils = utils; - constructor(config: EnvironmentConfig) { this.config = config; } @@ -59,42 +37,6 @@ export class Environment { return GetFileInfo(this.config, bucketId, fileId); } - /** - * Gets list of available buckets - * @param cb Callback that will receive the list of buckets - */ - getBuckets(cb: GetBucketsCallback): void { - /* TODO */ - cb(Error('Not implemented yet'), null); - } - - /** - * Gets a bucket id by name - * @param bucketName Name of the bucket to be retrieved - * @param cb Callback that will receive the bucket id - */ - getBucketId(bucketName: string, cb: GetBucketIdCallback): void { - /* TODO */ - cb(Error('Not implemented yet'), null); - } - - /** - * Creates a bucket - * @param bucketName Name of the new bucket - * @returns Bucket id - */ - createBucket(bucketName: string): Promise { - return new Bridge(this.config) - .createBucket(bucketName) - .start() - .then((bucket) => { - return bucket.id; - }) - .catch((err) => { - throw new Error(request.extractMessageFromError(err)); - }); - } - /** * Creates file token * @param bucketId Bucket id where file is stored @@ -111,45 +53,6 @@ export class Environment { }); } - /** - * Deletes a bucket - * @param bucketId Id whose bucket is going to be deleted - * @param cb Callback that will receive the response after deletion - */ - deleteBucket(bucketId: string): Promise { - return new Bridge(this.config) - .deleteBucket(bucketId) - .start() - .catch((err) => { - throw new Error(request.extractMessageFromError(err)); - }); - } - - /** - * Deletes a file from a bucket - * @param bucketId Bucket id where file is - * @param fileId Id of the file to be deleted - * @param cb Callback that receives the response after deletion - */ - deleteFile(bucketId: string, fileId: string, cb: DeleteFileCallback): void { - /* TODO */ - cb(Error('Not implemented yet'), null); - } - - /** - * Lists files in a bucket - * @param bucketId Bucket id whose files are going to be listed - * @param cb Callback that receives the files list - */ - listFiles(bucketId: string, cb: ListFilesCallback): void { - /* TODO */ - cb(Error('Not implemented yet'), null); - } - - setEncryptionKey(newEncryptionKey: string): void { - this.config.encryptionKey = newEncryptionKey; - } - upload: UploadStrategyFunction = async (bucketId: string, opts: UploadOptions) => { if (!this.config.encryptionKey) { throw Error('Mnemonic was not provided, please, provide a mnemonic'); @@ -267,22 +170,6 @@ export class Environment { state.stop(); } - uploadCancel(state: ActionState): void { - state.stop(); - } - - renameFile(bucketId: string, fileId: string, newPlainName: string): Promise { - const mnemonic: string | undefined = this.config.encryptionKey; - - if (!mnemonic) { - throw new Error(ENCRYPTION_KEY_NOT_PROVIDED); - } - - return EncryptFilename(mnemonic, bucketId, newPlainName).then((newEncryptedName) => { - return new Bridge(this.config).renameFile(bucketId, fileId, newEncryptedName).start(); - }); - } - getDownloadLinks(bucketId: string, fileIds: string[]) { return new Bridge(this.config).getDownloadLinks(bucketId, fileIds).start(); } diff --git a/src/lib/core/download/dynamicStrategy.ts b/src/lib/core/download/dynamicStrategy.ts index 48619a76..4565f255 100644 --- a/src/lib/core/download/dynamicStrategy.ts +++ b/src/lib/core/download/dynamicStrategy.ts @@ -1,4 +1,4 @@ -import { ActionState, Shard } from '../../../api'; +import { Shard } from '../../../api'; import { DownloadStrategy } from './strategy'; import { @@ -6,21 +6,13 @@ import { DownloadOneShardStrategyParams, DownloadOneStreamStrategy, DownloadOneStreamStrategyParams, - DownloadOptions, } from '.'; import { Events } from '..'; -export type DownloadDynamicStrategyLabel = 'Dynamic'; export type DownloadDynamicStrategyObject = { - label: DownloadDynamicStrategyLabel; + label: 'Dynamic'; params: T extends DownloadOneShardStrategy ? DownloadOneShardStrategyParams : DownloadOneStreamStrategyParams; }; -export type DownloadDynamicStrategyFunction = ( - bucketId: string, - fileId: string, - opts: DownloadOptions, - strategyObj: DownloadDynamicStrategyObject, -) => ActionState; export class DownloadDynamicStrategy< T = DownloadOneShardStrategy | DownloadOneStreamStrategy, diff --git a/src/lib/core/download/index.ts b/src/lib/core/download/index.ts index 0be96e16..e7528acf 100644 --- a/src/lib/core/download/index.ts +++ b/src/lib/core/download/index.ts @@ -10,7 +10,7 @@ export * from './oneStreamStrategy'; export * from './oneShardStrategy'; export * from './dynamicStrategy'; -export type DownloadFinishedCallback = (err: Error | null, fileStream: Readable | null) => void; +type DownloadFinishedCallback = (err: Error | null, fileStream: Readable | null) => void; export type DownloadProgressCallback = ( progress: number, downloadedBytes: number | null, @@ -28,8 +28,6 @@ export interface DownloadOptions { fileEncryptionKey?: Buffer; progressCallback: DownloadProgressCallback; finishedCallback: DownloadFinishedCallback; - - chunkSize?: number; } /** diff --git a/src/lib/core/download/oneShardStrategy.ts b/src/lib/core/download/oneShardStrategy.ts index bbf8ad7f..4773040b 100644 --- a/src/lib/core/download/oneShardStrategy.ts +++ b/src/lib/core/download/oneShardStrategy.ts @@ -1,13 +1,12 @@ import { createDecipheriv, Decipheriv, randomBytes } from 'crypto'; import { Events } from '..'; -import { Abortable, ActionState, Shard } from '../../../api'; +import { Abortable, Shard } from '../../../api'; import { getStream } from '../../../services/request'; import { HashStream, ProgressNotifier, Events as ProgressEvents } from '../../utils/streams'; import { wrap } from '../../utils/error'; import { DownloadStrategy, DownloadParams } from './strategy'; -import { DownloadOptions } from '.'; import { logger } from '../../utils/logger'; export interface DownloadOneShardStrategyParams extends DownloadParams { @@ -15,18 +14,6 @@ export interface DownloadOneShardStrategyParams extends DownloadParams { chunkSize?: number; } -export type DownloadOneShardStrategyLabel = 'OneShardOnly'; -export type DownloadOneShardStrategyObject = { - label: DownloadOneShardStrategyLabel; - params: DownloadOneShardStrategyParams; -}; -export type DownloadOneShardStrategyFunction = ( - bucketId: string, - fileId: string, - opts: DownloadOptions, - strategyObj: DownloadOneShardStrategyObject, -) => ActionState; - export class DownloadOneShardStrategy extends DownloadStrategy { private abortables: Abortable[] = []; private downloadProgress = 0; diff --git a/src/lib/core/download/oneStreamStrategy.ts b/src/lib/core/download/oneStreamStrategy.ts index 8a1fddf8..cb0d046d 100644 --- a/src/lib/core/download/oneStreamStrategy.ts +++ b/src/lib/core/download/oneStreamStrategy.ts @@ -3,14 +3,13 @@ import { createDecipheriv, Decipheriv, randomBytes } from 'crypto'; import { Readable } from 'stream'; import { Events } from '..'; -import { Abortable, ActionState, Shard } from '../../../api'; +import { Abortable, Shard } from '../../../api'; import { getStream } from '../../../services/request'; import { HashStream, ProgressNotifier, Events as ProgressEvents } from '../../utils/streams'; import { wrap } from '../../utils/error'; import { logger } from '../../utils/logger'; import { DownloadStrategy, DownloadParams } from './strategy'; -import { DownloadOptions } from '.'; export interface DownloadOneStreamStrategyParams extends DownloadParams { concurrency: number; @@ -18,18 +17,6 @@ export interface DownloadOneStreamStrategyParams extends DownloadParams { chunkSize?: number; } -export type DownloadOneStreamStrategyLabel = 'OneStreamOnly'; -export type DownloadOneStreamStrategyObject = { - label: DownloadOneStreamStrategyLabel; - params: DownloadOneStreamStrategyParams; -}; -export type DownloadOneStreamStrategyFunction = ( - bucketId: string, - fileId: string, - opts: DownloadOptions, - strategyObj: DownloadOneStreamStrategyObject, -) => ActionState; - export class DownloadOneStreamStrategy extends DownloadStrategy { private abortables: Abortable[] = []; private internalBuffer: Buffer[] = []; diff --git a/src/lib/core/download/strategy.ts b/src/lib/core/download/strategy.ts index 72dd5b58..46e6e92a 100644 --- a/src/lib/core/download/strategy.ts +++ b/src/lib/core/download/strategy.ts @@ -3,7 +3,6 @@ import { EventEmitter } from 'events'; import { DownloadDynamicStrategyObject, DownloadOptions } from '.'; import { Abortable, ActionState, Shard } from '../../../api'; -export type DownloadStrategyLabel = string; export type DownloadStrategyObject = DownloadDynamicStrategyObject; export type DownloadStrategyFunction = ( bucketId: string, diff --git a/src/lib/core/upload/index.ts b/src/lib/core/upload/index.ts index e4349199..e35b9da5 100644 --- a/src/lib/core/upload/index.ts +++ b/src/lib/core/upload/index.ts @@ -7,7 +7,7 @@ export type UploadProgressCallback = ( uploadedBytes: number | null, totalBytes: number | null, ) => void; -export type EncryptProgressCallback = (progress: number) => void; +type EncryptProgressCallback = (progress: number) => void; export interface UploadOptions { progressCallback: UploadProgressCallback; diff --git a/src/lib/core/upload/uploadV2.ts b/src/lib/core/upload/uploadV2.ts index c012d1b6..48036d24 100644 --- a/src/lib/core/upload/uploadV2.ts +++ b/src/lib/core/upload/uploadV2.ts @@ -46,7 +46,7 @@ async function putFile(url: string, body: Readable, fileSize: number, signal?: A await responseBody.dump(); } -export async function uploadFileV2( +async function uploadFileV2( network: Network, fileSize: number, source: Readable, @@ -95,7 +95,7 @@ export async function uploadFileV2( ); } -export async function uploadFileMultipart( +async function uploadFileMultipart( network: Network, fileSize: number, source: Readable, diff --git a/src/lib/models/Contract.ts b/src/lib/models/Contract.ts deleted file mode 100644 index a23e021e..00000000 --- a/src/lib/models/Contract.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface Contract { - hash: string; - token: string; - operation: 'PUSH'; - farmer: { - userAgent: string; - protocol: string; - address: string; - port: number; - nodeID: string; - lastSeen: number; - }; -} diff --git a/src/lib/models/Farmer.ts b/src/lib/models/Farmer.ts deleted file mode 100644 index 65984853..00000000 --- a/src/lib/models/Farmer.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface Farmer { - userAgent: string; - protocol: string; - address: string; - port: number; - nodeID: string; - lastSeen: Date; -} diff --git a/src/lib/models/Mirror.ts b/src/lib/models/Mirror.ts deleted file mode 100644 index 28f48d63..00000000 --- a/src/lib/models/Mirror.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Farmer } from '.'; - -export interface Mirror { - index: number; - replaceCount: number; - hash: string; - size: number; - parity: boolean; - token: string; - healthy?: boolean; - farmer: Farmer; - operation: string; -} diff --git a/src/lib/models/ShardMeta.ts b/src/lib/models/ShardMeta.ts deleted file mode 100644 index 215d9cfd..00000000 --- a/src/lib/models/ShardMeta.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface ShardMeta { - hash: string; - size: number; - index: number; - parity: boolean; - challenges?: Buffer[]; - challenges_as_str: string[]; - tree: string[]; -} diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts deleted file mode 100644 index 667716a5..00000000 --- a/src/lib/models/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './Contract'; -export * from './Farmer'; -export * from './Mirror'; -// export * from './Shard'; -export * from './ShardMeta'; diff --git a/src/lib/utils/MerkleTree.ts b/src/lib/utils/MerkleTree.ts deleted file mode 100644 index b75c30e9..00000000 --- a/src/lib/utils/MerkleTree.ts +++ /dev/null @@ -1,35 +0,0 @@ -interface MerkleTree { - leaf: string[]; - challenges: Buffer[]; - challenges_as_str: string[]; - preleaf: Buffer[]; -} - -export function generateMerkleTree(): MerkleTree { - return { - leaf: [ - '0000000000000000000000000000000000000000', - '0000000000000000000000000000000000000000', - '0000000000000000000000000000000000000000', - '0000000000000000000000000000000000000000', - ], - challenges: [ - Buffer.from('00000000000000000000000000000000', 'hex'), - Buffer.from('00000000000000000000000000000000', 'hex'), - Buffer.from('00000000000000000000000000000000', 'hex'), - Buffer.from('00000000000000000000000000000000', 'hex'), - ], - challenges_as_str: [ - '00000000000000000000000000000000', - '00000000000000000000000000000000', - '00000000000000000000000000000000', - '00000000000000000000000000000000', - ], - preleaf: [ - Buffer.from('0000000000000000000000000000000000000000', 'hex'), - Buffer.from('0000000000000000000000000000000000000000', 'hex'), - Buffer.from('0000000000000000000000000000000000000000', 'hex'), - Buffer.from('0000000000000000000000000000000000000000', 'hex'), - ], - }; -} diff --git a/src/lib/utils/concurrentQueue.ts b/src/lib/utils/concurrentQueue.ts deleted file mode 100644 index e6c73480..00000000 --- a/src/lib/utils/concurrentQueue.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { QueueObject, queue, ErrorCallback } from 'async'; - -export class ConcurrentQueue { - private totalTasks: number; - protected concurrency: number; - private finishedTasks = 0; - protected queue: QueueObject; - - constructor(concurrency = 1, totalTasks = 1, task?: (content: K) => Promise) { - if (concurrency > totalTasks) { - throw new Error('ConcurrentQueue error: Concurrency can not be greater than total tasks to perform'); - } - - this.totalTasks = totalTasks; - this.concurrency = concurrency; - - if (task) { - this.queue = queue(async (content: K, cb: ErrorCallback) => { - task(content) - .then(() => { - this.finishedTasks++; - cb(); - }) - .catch(cb); - }, concurrency); - } else { - this.queue = queue(() => {}, 1); - } - } - - setQueueTask(task: (content: K) => Promise) { - this.queue = queue(async (content: K, cb: ErrorCallback) => { - task(content) - .then(() => { - this.finishedTasks++; - cb(); - }) - .catch(cb); - }, this.concurrency); - } - - push(content: K) { - return this.queue.push(content); - } - - end(cb?: () => void): void | Promise { - if (cb) { - const intervalId = setInterval(() => { - if (this.totalTasks === this.finishedTasks) { - clearInterval(intervalId); - cb(); - } - }, 500); - } else { - return new Promise((r) => { - const intervalId = setInterval(() => { - if (this.totalTasks === this.finishedTasks) { - clearInterval(intervalId); - r(); - } - }, 500); - }); - } - } -} diff --git a/src/lib/utils/crypto/constants.ts b/src/lib/utils/crypto/constants.ts deleted file mode 100644 index e73e8ac8..00000000 --- a/src/lib/utils/crypto/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const GCM_DIGEST_SIZE = 16; -export const SHA256_DIGEST_SIZE = 32; -export const BUCKET_META_MAGIC = [ - 66, 150, 71, 16, 50, 114, 88, 160, 163, 35, 154, 65, 162, 213, 226, 215, 70, 138, 57, 61, 52, 19, 210, 170, 38, 164, - 162, 200, 86, 201, 2, 81, -]; -export const BUCKET_NAME_MAGIC = '398734aab3c4c30c9f22590e83a95f7e43556a45fc2b3060e0c39fde31f50272'; diff --git a/src/lib/utils/crypto/crypto.ts b/src/lib/utils/crypto/crypto.ts index 9b88c106..2aef1733 100644 --- a/src/lib/utils/crypto/crypto.ts +++ b/src/lib/utils/crypto/crypto.ts @@ -1,136 +1,10 @@ import * as crypto from 'crypto'; import { mnemonicToSeed } from 'bip39'; -import { BUCKET_META_MAGIC, GCM_DIGEST_SIZE, SHA256_DIGEST_SIZE } from './constants'; - export function sha256(input: Buffer): Buffer { return crypto.createHash('sha256').update(input).digest(); } -export function sha256HashBuffer(): crypto.Hash { - return crypto.createHash('sha256'); -} - -export function sha512(input: Buffer): Buffer { - return crypto.createHash('sha512').update(input).digest(); -} - -export function sha512HmacBuffer(key: Buffer | string): crypto.Hmac { - return crypto.createHmac('sha512', key); -} - -export function sha512HmacBufferFromHex(key: string): crypto.Hmac { - return crypto.createHmac('sha512', Buffer.from(key, 'hex')); -} - -export function ripemd160(input: Buffer | string): Buffer { - return crypto.createHash('ripemd160').update(input).digest(); -} - -export function GetDeterministicKey(key: string, data: string): Buffer { - const sha512input = key + data; - - return crypto.createHash('sha512').update(Buffer.from(sha512input, 'hex')).digest(); -} - -export async function GenerateBucketKey(mnemonic: string, bucketId: string): Promise { - const seed = (await mnemonicToSeed(mnemonic)).toString('hex'); - - return GetDeterministicKey(seed, bucketId).toString('hex').slice(0, 64); -} - -// export async function GenerateFileKey(mnemonic: string, bucketId: string, index: Buffer): Promise { -// const bucketKey = await GenerateBucketKey(mnemonic, bucketId); - -// return GetDeterministicKey(bucketKey.slice(0, 32), index.toString('hex')).slice(0, 32); -// } - -export async function EncryptFilename(mnemonic: string, bucketId: string, filename: string): Promise { - const bucketKey = await GenerateBucketKey(mnemonic, bucketId); - - const GenerateEncryptionKey = () => { - const hasher = sha512HmacBufferFromHex(bucketKey); - hasher.update(Buffer.from(BUCKET_META_MAGIC)); - - return hasher.digest().slice(0, 32); - }; - - const GenerateEncryptionIv = () => { - const hasher = sha512HmacBufferFromHex(bucketKey); - - hasher.update(bucketId).update(filename); - - return hasher.digest().slice(0, 32); - }; - - const encryptionKey = GenerateEncryptionKey(); - const encryptionIv = GenerateEncryptionIv(); - - return EncryptMeta(filename, encryptionKey, encryptionIv); -} - -export async function DecryptFileName(mnemonic: string, bucketId: string, encryptedName: string) { - const bucketKey = await GenerateBucketKey(mnemonic, bucketId); - - if (!bucketKey) { - throw Error('Bucket key missing'); - } - - const key = crypto - .createHmac('sha512', Buffer.from(bucketKey, 'hex')) - .update(Buffer.from(BUCKET_META_MAGIC)) - .digest('hex'); - - return decryptMeta(encryptedName, key); -} - -function decryptMeta(bufferBase64: string, decryptKey: string) { - const data = Buffer.from(bufferBase64, 'base64'); - - const digest = data.slice(0, GCM_DIGEST_SIZE); - const iv = data.slice(GCM_DIGEST_SIZE, GCM_DIGEST_SIZE + SHA256_DIGEST_SIZE); - const buffer = data.slice(GCM_DIGEST_SIZE + SHA256_DIGEST_SIZE); - - const decipher = crypto.createDecipheriv('aes-256-gcm', Buffer.from(decryptKey, 'hex').slice(0, 32), iv); - decipher.setAuthTag(digest); - - try { - const dec = Buffer.concat([decipher.update(buffer), decipher.final()]); - - return dec.toString('utf8'); - } catch { - return null; - } -} - -export function EncryptMeta(fileMeta: string, key: Buffer, iv: Buffer): string { - const cipher: crypto.CipherCCM = Aes256gcmEncrypter(key, iv); - const cipherTextBuf = Buffer.concat([cipher.update(fileMeta, 'utf-8'), cipher.final()]); - const digest = cipher.getAuthTag(); - - return Buffer.concat([digest, iv, cipherTextBuf]).toString('base64'); -} - -export function EncryptMetaBuffer(fileMeta: string, encryptKey: Buffer, iv: Buffer): Buffer { - const cipher: crypto.CipherGCM = Aes256gcmEncrypter(encryptKey, iv); - const cipherTextBuf = Buffer.concat([cipher.update(fileMeta, 'utf-8'), cipher.final()]); - const digest = cipher.getAuthTag(); - - return Buffer.concat([digest, iv, cipherTextBuf]); -} - -export function Aes256ctrDecrypter(key: Buffer, iv: Buffer): crypto.Decipheriv { - return crypto.createDecipheriv('aes-256-ctr', key, iv); -} - -export function Aes256ctrEncrypter(key: Buffer, iv: Buffer): crypto.Cipheriv { - return crypto.createCipheriv('aes-256-ctr', key, iv); -} - -export function Aes256gcmEncrypter(key: Buffer, iv: Buffer): crypto.CipherGCM { - return crypto.createCipheriv('aes-256-gcm', key, iv); -} - // ENCRYPTION FOR FILE KEY export async function GenerateFileKey(mnemonic: string, bucketId: string, index: Buffer | string): Promise { const bucketKey = await GenerateFileBucketKey(mnemonic, bucketId); @@ -138,13 +12,13 @@ export async function GenerateFileKey(mnemonic: string, bucketId: string, index: return GetFileDeterministicKey(bucketKey.slice(0, 32), index).slice(0, 32); } -export async function GenerateFileBucketKey(mnemonic: string, bucketId: string): Promise { +async function GenerateFileBucketKey(mnemonic: string, bucketId: string): Promise { const seed = await mnemonicToSeed(mnemonic); return GetFileDeterministicKey(seed, Buffer.from(bucketId, 'hex')); } -export function GetFileDeterministicKey(key: Buffer | string, data: Buffer | string): Buffer { +function GetFileDeterministicKey(key: Buffer | string, data: Buffer | string): Buffer { const hash = crypto.createHash('sha512'); hash.update(key).update(data); diff --git a/src/lib/utils/crypto/index.ts b/src/lib/utils/crypto/index.ts index 0705c526..f1702475 100644 --- a/src/lib/utils/crypto/index.ts +++ b/src/lib/utils/crypto/index.ts @@ -1,2 +1 @@ -export * from './constants'; export * from './crypto'; diff --git a/src/lib/utils/error.ts b/src/lib/utils/error.ts index 719afd52..1892f401 100644 --- a/src/lib/utils/error.ts +++ b/src/lib/utils/error.ts @@ -1,4 +1,4 @@ -export class WrappedError extends Error { +class WrappedError extends Error { header = ''; constructor(message: string) { diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts deleted file mode 100644 index b022b793..00000000 --- a/src/lib/utils/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { MAX_SHARD_SIZE, MIN_SHARD_SIZE, SHARD_MULTIPLE_BACK } from '../../api/constants'; - -/** - * Determines the best concurrency number of chunks in memory to fit - * desired ram usage - * @param desiredRamUsage Desired ram usage in bytes - * @param fileSize Size of the file to work with - * @returns Concurrency number - */ -export function determineConcurrency(desiredRamUsage: number, fileSize: number): number { - const shardSize = determineShardSize(fileSize); - - return Math.floor(desiredRamUsage / shardSize); -} - -function shardSize(hops: number): number { - return MIN_SHARD_SIZE * Math.pow(2, hops); -} - -export function _determineShardSize(fileSize: number, accumulator = 0): number { - if (fileSize < 0) { - return 0; - } - - let hops = accumulator - SHARD_MULTIPLE_BACK < 0 ? 0 : accumulator - SHARD_MULTIPLE_BACK; - - const byteMultiple = shardSize(accumulator); - - const check = fileSize / byteMultiple; - - if (check > 0 && check <= 1) { - while (hops > 0 && shardSize(hops) > MAX_SHARD_SIZE) { - hops = hops - 1 <= 0 ? 0 : hops - 1; - } - - return shardSize(hops); - } - - if (accumulator > 41) { - return 0; - } - - return _determineShardSize(fileSize, ++accumulator); -} - -export function determineParityShards(totalShards: number) { - return Math.ceil((totalShards * 2) / 3); -} - -/** - * Determines the best shard size for a provided file size - * @param fileSize Size of the file to be sharded - * @returns Shard size - */ -export function determineShardSize(fileSize: number) { - const fiftyMb = 50 * 1024 * 1024; - - return Math.min(fiftyMb, _determineShardSize(fileSize)); -} diff --git a/src/lib/utils/logger/logger.ts b/src/lib/utils/logger/logger.ts index f83441c7..32ee6bd9 100644 --- a/src/lib/utils/logger/logger.ts +++ b/src/lib/utils/logger/logger.ts @@ -20,27 +20,6 @@ function parseLogLevel(level: number): string { return levelNames[valueIndex]; } -export class Logger { - private static Instance: Winston.Logger; - private static Debugger: Winston.Logger; - - static getInstance(logLevel = 1) { - if (!Logger.Instance) { - Logger.Instance = getLoggerInstance(logLevel); - } - - return Logger.Instance; - } - - static getDebugger(logLevel = 1, debugCallback: (msg: string) => void) { - if (!Logger.Debugger) { - Logger.Debugger = getDebuggerInstance(logLevel, debugCallback); - } - - return Logger.Debugger; - } -} - const getLoggerInstance = ( level: number, debug?: { enabled: boolean; debugCallback: (msg: string) => void }, @@ -73,7 +52,3 @@ const getLoggerInstance = ( }; export const logger: Winston.Logger = getLoggerInstance(1); - -export const getDebuggerInstance = (level: number, debugCallback: (msg: string) => void): Winston.Logger => { - return getLoggerInstance(1, { enabled: true, debugCallback }); -}; diff --git a/src/lib/utils/streams/BytesCounter.ts b/src/lib/utils/streams/BytesCounter.ts deleted file mode 100644 index 9a88ed8f..00000000 --- a/src/lib/utils/streams/BytesCounter.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Transform, TransformOptions } from 'stream'; - -export class BytesCounter extends Transform { - private bytesCount = 0; - - constructor(opts?: TransformOptions) { - super(opts); - } - - get count() { - return this.bytesCount; - } - - _transform(chunk: Buffer, enc: string, cb: (err: Error | null, data: Buffer) => void) { - this.bytesCount += chunk.length; - - cb(null, chunk); - } - - _flush(cb: (err: Error | null) => void) { - cb(null); - } -} diff --git a/src/lib/utils/streams/ChunkedRequest.ts b/src/lib/utils/streams/ChunkedRequest.ts deleted file mode 100644 index d842c3de..00000000 --- a/src/lib/utils/streams/ChunkedRequest.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { URL } from 'url'; -import { request } from 'https'; -import { ClientRequest, IncomingMessage } from 'http'; - -import EventEmitter from 'events'; -import { PassThrough, Readable } from 'stream'; - -interface RequestOptions { - hostname: string; - pathname: string; - method: string; - protocol: string; -} - -type FinishCallback = (res: Buffer | null, err?: Error) => void; - -export class ChunkedRequest extends EventEmitter { - private options: RequestOptions; - private stream: ClientRequest; - private passthrough = new PassThrough(); - - private response: Buffer[] = []; - - constructor(url: URL) { - super(); - - const { hostname, pathname } = url; - - this.options = { hostname, pathname, method: 'POST', protocol: 'https:' }; - - const req = request(this.options, (res: IncomingMessage) => { - res.on('data', this.response.push.bind(this)); - res.once('end', () => this.emit('request-end', this.response)); - res.once('error', (err) => { - res.removeAllListeners(); - - this.emit('err', err); - this.destroy(); - }); - }); - - this.stream = this.passthrough.pipe(req); - } - - write(b: Buffer, end = false, finishCb: FinishCallback): void { - Readable.from(b) - .pipe(this.stream, { end }) - .once('error', (err) => finishCb(null, err)) - .once('end', finishCb); - } - - end(b: Buffer, cb: FinishCallback) { - this.write(b, true, (res: Buffer | null, err?: Error) => { - if (err) { - cb(res, err); - } else { - cb(Buffer.concat(this.response)); - } - this.destroy(); - }); - } - - destroy() { - this.removeAllListeners(); - } -} diff --git a/src/lib/utils/streams/Funnel.ts b/src/lib/utils/streams/Funnel.ts deleted file mode 100644 index d660ce7c..00000000 --- a/src/lib/utils/streams/Funnel.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Transform } from 'stream'; - -export class Funnel extends Transform { - private limit: number; - - private buffer: Buffer; - private bufferOffset = 0; - private lastChunkLength = 0; - - constructor(limit = 1) { - super(); - this.limit = limit; - this.buffer = Buffer.alloc(limit); - } - - private bufferStillHasData(): boolean { - return this.bufferOffset !== 0; - } - - private bufferIsEmpty(): boolean { - return this.bufferOffset === 0; - } - - private pushToReadable(b: Buffer): void { - this.push(b); - } - - private pushBuffer(): void { - this.pushToReadable(this.buffer); - } - - _transform(chunk: Buffer, enc: string, done: (err: Error | null) => void): void { - if (this.bufferStillHasData()) { - const bytesToPush = this.limit - this.bufferOffset; - - const enoughToFillBuffer = () => chunk.length >= bytesToPush; - const completeBuffer = () => chunk.copy(this.buffer, this.bufferOffset, 0, bytesToPush); - const addToBuffer = () => chunk.copy(this.buffer, this.bufferOffset); - const resetOffset = () => (this.bufferOffset = 0); - const incrementOffset = (increment: number) => (this.bufferOffset += increment); - - if (enoughToFillBuffer()) { - completeBuffer(); - - this.pushBuffer(); - - resetOffset(); - chunk = chunk.slice(bytesToPush, chunk.length); - } else { - addToBuffer(); - incrementOffset(chunk.length); - } - } - - const pushChunks = (chunk: Buffer): Buffer => { - let offset = 0; - let chunkSize = chunk.length; - - const notIteratedEntireBuffer = () => chunkSize >= this.limit; - - while (notIteratedEntireBuffer()) { - this.pushToReadable(chunk.slice(offset, offset + this.limit)); - - offset += this.limit; - chunkSize -= this.limit; - } - - return chunk.slice(offset, offset + chunkSize); - }; - - if (this.bufferIsEmpty()) { - const remainingChunk = pushChunks(chunk); - - if (remainingChunk.length) { - // save remaining chunk for the next event - remainingChunk.copy(this.buffer); - - this.lastChunkLength = remainingChunk.byteLength; - this.bufferOffset += remainingChunk.length; - } - } - - done(null); - } - - _flush(done: () => void): void { - if (this.bufferStillHasData()) { - this.pushToReadable(this.buffer.slice(0, this.bufferOffset)); - } - done(); - } -} diff --git a/src/lib/utils/streams/Tap.ts b/src/lib/utils/streams/Tap.ts deleted file mode 100644 index fb46a3d7..00000000 --- a/src/lib/utils/streams/Tap.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Transform, TransformOptions } from 'stream'; - -export enum TapEvents { - Opened = 'tap-opened', - Closed = 'tap-closed', -} - -type ContinueCallback = (err: Error | null) => void; - -// preconditions: -// diameterSize >= chunk size on each transform -export class Tap extends Transform { - private diameterSize: number; - private bytesRead = 0; - private temporalBuffer = Buffer.alloc(0); - - private pausedInterval: NodeJS.Timeout = setTimeout(() => {}); - private shouldContinue = false; - - constructor(diameterSize: number, options?: TransformOptions) { - super(options); - - this.diameterSize = diameterSize; - } - - _transform(chunk: Buffer, enc: string, done: ContinueCallback): void { - if (chunk.length > this.diameterSize) { - done(new Error('TapStreamError: Chunk length is bigger than diameter size')); - - return; - } - - if (this.temporalBuffer.length > 0) { - const diffToRefill = this.diameterSize - this.temporalBuffer.length; - - this.pump(Buffer.concat([this.temporalBuffer, chunk.slice(0, diffToRefill)])); - - this.bytesRead = 0; - this.temporalBuffer = Buffer.alloc(0); - - chunk = chunk.slice(diffToRefill); - } - - if (chunk.length > this.diameterSize - this.bytesRead) { - if (this.diameterSize - this.bytesRead >= 0) { - this.temporalBuffer = chunk.slice(this.diameterSize - this.bytesRead); - this.pump(chunk.slice(0, this.diameterSize - this.bytesRead)); - } - this.close(done); - } else { - this.pump(chunk); - done(null); - } - } - - pump(b: Buffer) { - this.bytesRead += b.length; - this.push(b); - } - - open() { - this.emit(TapEvents.Opened); - - this.shouldContinue = true; - } - - close(cb: ContinueCallback) { - this.emit(TapEvents.Closed); - - this.pausedInterval = setInterval(() => { - if (this.shouldContinue) { - cb(null); - clearInterval(this.pausedInterval); - - this.shouldContinue = false; - } - }, 50); - } - - _flush(done: () => void): void { - if (this.temporalBuffer.length > 0) { - this.pump(this.temporalBuffer); - } - done(); - } -} diff --git a/src/lib/utils/streams/index.ts b/src/lib/utils/streams/index.ts index 77eb5d27..4b867dea 100644 --- a/src/lib/utils/streams/index.ts +++ b/src/lib/utils/streams/index.ts @@ -1,6 +1,2 @@ -export * from './BytesCounter'; -export * from './ChunkedRequest'; -export * from './Funnel'; export * from './Hasher'; export * from './ProgressNotifier'; -export * from './Tap'; diff --git a/src/services/api.ts b/src/services/api.ts index 2520bffc..4d42f963 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,278 +1,25 @@ -import { AxiosRequestConfig, AxiosResponse } from 'axios'; -import { EnvironmentConfig, ExchangeReport, Shard } from '../api'; +import { EnvironmentConfig } from '../api'; import { INXTRequest, Methods } from '../lib'; -import { ShardMeta } from '../lib/models'; - -export interface GetBucketByIdResponse { - user: string; - encryptionKey: string; - publicPermissions: string[]; - created: string; - name: string; - pubkeys: string[]; - status: 'Active' | 'Inactive'; - transfer: number; - storage: number; - id: string; -} - -export interface GetFileByIdResponse { - /* file-id */ - id: string; -} - -export interface FrameStaging { - /* frame id */ - id: string; - /* user email */ - user: string; - shards: []; - storageSize: number; - /* frame size */ - size: number; - locked: boolean; - /* created timestamp stringified */ - created: string; -} - -export interface CreateEntryFromFrameBody { - frame: string; - filename: string; - index: string; - hmac: { - type: string; - value: string; - }; - erasure?: { - type: string; - }; -} - -export interface CreateEntryFromFrameResponse { - /* bucket entry id */ - id: string; - index: string; - /* frame id */ - frame: string; - /* bucket id */ - bucket: string; - mimetype: string; - name: string; - renewal: string; - created: string; - hmac: { - value: string; - type: string; - }; - erasure: { - type: string; - }; - size: number; -} - -export interface SendShardToNodeResponse { - result: string; -} - -export interface AddShardToFrameBody { - /* shard hash */ - hash: string; - /* shard size */ - size: number; - /* shard index */ - index: number; - /* if exists a shard parity for this shard */ - parity: boolean; - /* shard challenges */ - challenges: string[]; - tree: string[]; - /* nodes excluded from being the shard's node */ - exclude: string[]; -} - -export interface SendShardToNodeResponse { - result: string; -} export interface CreateFileTokenResponse { - bucket: string; - encryptionKey: string; - expires: string; - id: string; - mimetype: string; - operation: 'PUSH' | 'PULL'; - size: number; token: string; } export type GetDownloadLinksResponse = { fileId: string; link: string; index: string }[]; -export interface InxtApiI { - getBucketById(bucketId: string, params?: AxiosRequestConfig): INXTRequest; - getFileById(bucketId: string, fileId: string, params?: AxiosRequestConfig): INXTRequest; - createFrame(params?: AxiosRequestConfig): INXTRequest; - createEntryFromFrame(bucketId: string, body: CreateEntryFromFrameBody, params?: AxiosRequestConfig): INXTRequest; - addShardToFrame(frameId: string, body: ShardMeta, params?: AxiosRequestConfig): INXTRequest; - sendUploadExchangeReport(exchangeReport: ExchangeReport): Promise>; - sendShardToNode(shard: Shard, shardContent: Buffer): INXTRequest; - createFileToken(bucketId: string, fileId: string, operation: 'PUSH' | 'PULL'): INXTRequest; - renameFile(bucketId: string, fileId: string, newName: string): INXTRequest; - createBucket(bucketName: string): INXTRequest; -} - -function emptyINXTRequest(config: EnvironmentConfig): INXTRequest { - return new INXTRequest(config, Methods.Get, '', {}, false); -} - -class InxtApi implements InxtApiI { - protected config: EnvironmentConfig; - protected url: string; - - constructor(config: EnvironmentConfig) { - this.config = config; - this.url = config.bridgeUrl ?? ''; - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getBucketById(bucketId: string, params?: AxiosRequestConfig): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getFileById(bucketId: string, fileId: string, params?: AxiosRequestConfig): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createFrame(params?: AxiosRequestConfig): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createEntryFromFrame(bucketId: string, body: CreateEntryFromFrameBody, params?: AxiosRequestConfig): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - addShardToFrame(frameId: string, body: ShardMeta, params?: AxiosRequestConfig): INXTRequest { - return emptyINXTRequest(this.config); - } - - sendUploadExchangeReport(exchangeReport: ExchangeReport): Promise> { - return exchangeReport.sendReport(); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - sendShardToNode(shard: Shard, shardContent: Buffer): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createFileToken(bucketId: string, fileId: string, operation: 'PUSH' | 'PULL'): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - renameFile(bucketId: string, fileId: string, newName: string): INXTRequest { - return emptyINXTRequest(this.config); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - createBucket(bucketName: string): INXTRequest { - return emptyINXTRequest(this.config); - } -} - -// tslint:disable-next-line: max-classes-per-file -export class EmptyBridgeUrlError extends Error { +class EmptyBridgeUrlError extends Error { constructor() { super('Empty bridge url'); } } -// tslint:disable-next-line: max-classes-per-file -export class Bridge extends InxtApi { +export class Bridge { + protected config: EnvironmentConfig; + constructor(config: EnvironmentConfig) { if (config.bridgeUrl === '') { throw new EmptyBridgeUrlError(); } - super(config); - } - - getBucketById(bucketId: string, params?: AxiosRequestConfig): INXTRequest { - const targetUrl = `${this.url}/buckets/${bucketId}`; - const defParams: AxiosRequestConfig = { - headers: { - 'Content-Type': 'application/octet-stream', - }, - }; - - const finalParams = { ...defParams, ...params }; - - return new INXTRequest(this.config, Methods.Get, targetUrl, finalParams, false); - } - - getFileById(bucketId: string, fileId: string, params?: AxiosRequestConfig): INXTRequest { - const targetUrl = `${this.url}/buckets/${bucketId}/file-ids/${fileId}`; - const defParams: AxiosRequestConfig = { - headers: { - 'Content-Type': 'application/octet-stream', - }, - }; - - const finalParams = { ...defParams, ...params }; - - return new INXTRequest(this.config, Methods.Get, targetUrl, finalParams, false); - } - - createFrame(params?: AxiosRequestConfig): INXTRequest { - const targetUrl = `${this.url}/frames`; - const defParams: AxiosRequestConfig = { - headers: { - 'Content-Type': 'application/octet-stream', - }, - }; - - const finalParams = { ...defParams, ...params }; - - return new INXTRequest(this.config, Methods.Post, targetUrl, finalParams, false); - } - - createEntryFromFrame(bucketId: string, body: CreateEntryFromFrameBody, params?: AxiosRequestConfig): INXTRequest { - const targetUrl = `${this.url}/buckets/${bucketId}/files`; - const defParams: AxiosRequestConfig = { - headers: { - 'Content-Type': 'application/json', - }, - data: body, - }; - - const finalParams = { ...defParams, ...params }; - - return new INXTRequest(this.config, Methods.Post, targetUrl, finalParams, false); - } - - addShardToFrame(frameId: string, body: ShardMeta, params?: AxiosRequestConfig): INXTRequest { - const targetUrl = `${this.url}/frames/${frameId}`; - const defParams: AxiosRequestConfig = { - headers: { - 'Content-Type': 'application/json', - }, - data: { ...body, challenges: body.challenges_as_str }, - }; - - const finalParams = { ...defParams, ...params }; - - return new INXTRequest(this.config, Methods.Put, targetUrl, finalParams, false); - } - - sendUploadExchangeReport(exchangeReport: ExchangeReport): Promise> { - return exchangeReport.sendReport(); - } - - sendShardToNode(shard: Shard, shardContent: Buffer): INXTRequest { - const targetUrl = `http://${shard.farmer.address}:${shard.farmer.port}/shards/${shard.hash}?token=${shard.token}`; - - return new INXTRequest(this.config, Methods.Post, targetUrl, { data: shardContent }, true); + this.config = config; } createFileToken(bucketId: string, fileId: string, operation: 'PUSH' | 'PULL'): INXTRequest { @@ -281,24 +28,6 @@ export class Bridge extends InxtApi { return new INXTRequest(this.config, Methods.Post, targetUrl, { data: { operation, file: fileId } }, false); } - renameFile(bucketId: string, fileId: string, newName: string): INXTRequest { - const targetUrl = `${this.config.bridgeUrl}/buckets/${bucketId}/files/${fileId}`; - - return new INXTRequest(this.config, Methods.Patch, targetUrl, { data: { name: newName } }); - } - - createBucket(bucketName: string) { - const targetUrl = `${this.config.bridgeUrl}/buckets`; - - return new INXTRequest(this.config, Methods.Post, targetUrl, { data: { name: bucketName } }); - } - - deleteBucket(bucketId: string) { - const targetUrl = `${this.config.bridgeUrl}/buckets/${bucketId}`; - - return new INXTRequest(this.config, Methods.Delete, targetUrl, {}); - } - getDownloadLinks(bucketId: string, fileIds: string[]) { const targetUrl = `${this.config.bridgeUrl}/buckets/${bucketId}/bulk-files?fileIds=${fileIds.join(',')}`; diff --git a/src/services/proxy.ts b/src/services/proxy.ts index b57a904d..ca74efa2 100644 --- a/src/services/proxy.ts +++ b/src/services/proxy.ts @@ -5,7 +5,7 @@ const wait = (ms: number) => new Promise((res) => setTimeout(res, ms)); const MAX_CONCURRENT_BROWSER_CONNECTIONS = 6; -export class ProxyBalancer { +class ProxyBalancer { private proxies: Proxy[]; constructor() { @@ -37,7 +37,7 @@ export class ProxyBalancer { } } -export class Proxy { +class Proxy { public url: string; private currentRequests: ProxyRequest[]; @@ -59,7 +59,7 @@ export class Proxy { } } -export interface ProxyRequest { +interface ProxyRequest { id: string; } diff --git a/src/services/request.ts b/src/services/request.ts index 1fad14c0..c3da1ad6 100644 --- a/src/services/request.ts +++ b/src/services/request.ts @@ -1,8 +1,6 @@ -import * as url from 'url'; import * as https from 'https'; import * as http from 'http'; import { Readable } from 'stream'; -import { ClientRequest, IncomingMessage } from 'http'; import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; import { EnvironmentConfig } from '../api'; @@ -45,80 +43,6 @@ export async function request( }); } -export function streamRequest(targetUrl: string, timeoutSeconds?: number): Readable { - const uriParts = url.parse(targetUrl); - let downloader: ClientRequest | null = null; - - function _createDownloadStream(): ClientRequest { - const requestOpts = { - protocol: uriParts.protocol, - hostname: uriParts.hostname, - port: uriParts.port, - path: uriParts.path, - headers: { - Accept: 'application/octet-stream', - }, - }; - - return uriParts.protocol === 'http:' ? http.get(requestOpts) : https.get(requestOpts); - } - - return new Readable({ - read() { - if (!downloader) { - downloader = _createDownloadStream(); - - if (timeoutSeconds) { - downloader.setTimeout(timeoutSeconds * 1000, () => { - downloader?.destroy(Error(`Request timeouted after ${timeoutSeconds} seconds`)); - }); - } - - this.once('signal', (message: string) => { - if (message === 'Destroy request') { - downloader?.destroy(); - } - - this.destroy(); - }); - - downloader - .on('response', (res: IncomingMessage) => { - res - .on('data', this.push.bind(this)) - .on('error', this.emit.bind(this, 'error')) - .on('end', () => { - this.push.bind(this, null); - this.emit('end'); - }) - .on('close', this.emit.bind(this, 'close')); - }) - .on('error', this.emit.bind(this, 'error')) - .on('timeout', () => this.emit('error', Error('Request timeout'))); - } - }, - }); -} - -export async function get(url: string, config = { useProxy: false }): Promise { - let targetUrl = url; - let free: undefined | (() => void); - - if (config.useProxy) { - const proxy = await getProxy(); - free = proxy.free; - targetUrl = `${proxy.url}/${targetUrl}`; - } - - return axios.get(targetUrl).then((res) => { - if (free) { - free(); - } - - return res.data; - }); -} - export async function getStream(url: string, config = { useProxy: false }): Promise { let targetUrl = url; let free: undefined | (() => void); diff --git a/tests/lib/concurrentQueue.unit.ts b/tests/lib/concurrentQueue.unit.ts deleted file mode 100644 index 9dffc685..00000000 --- a/tests/lib/concurrentQueue.unit.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { expect } from 'chai'; - -import { ConcurrentQueue } from '../../src/lib/concurrentQueue'; - -interface TestContent { - counter: number; -} - -const incrementCounter = (t: TestContent) => { - t.counter++; - return new Promise((resolve: (x: any) => void) => { - setTimeout(() => { - resolve(null); - }, 10); - }); -}; - -const defConcurrency = 1; -let queue: ConcurrentQueue = new ConcurrentQueue( - defConcurrency, - defConcurrency, - incrementCounter, -); - -describe('# lib/concurrentQueue tests', () => { - describe('constructor()', () => { - it('Should throw if concurrency > total tasks to perform', () => { - expect(() => { - new ConcurrentQueue(defConcurrency, 0, incrementCounter); - }).to.throw; - }); - }); - - describe('end()', () => { - it('Should end after all tasks end (concurrency = 1 = totalTasks)', function (done) { - const concurrency = 1; - const totalTasks = concurrency; - - const tasks: TestContent[] = []; - - for (let i = 0; i < totalTasks; i++) { - tasks.push({ counter: 0 }); - } - - queue = new ConcurrentQueue(concurrency, totalTasks, incrementCounter); - - tasks.forEach(queue.push.bind(queue)); - - queue.end(() => { - tasks.forEach((task) => { - expect(task.counter).to.equal(1); - }); - done(); - }); - }); - - it('Should end after all tasks end (concurrency = 1 < totalTasks)', function (done) { - const concurrency = 1; - const totalTasks = concurrency + 3; - - const tasks: TestContent[] = []; - - for (let i = 0; i < totalTasks; i++) { - tasks.push({ counter: 0 }); - } - - queue = new ConcurrentQueue(concurrency, totalTasks, incrementCounter); - - tasks.forEach(queue.push.bind(queue)); - - queue.end(() => { - tasks.forEach((task) => { - expect(task.counter).to.equal(1); - }); - done(); - }); - }); - - it('Should end after all tasks end (concurrency = totalTasks > 1)', function (done) { - const concurrency = 3; - const totalTasks = concurrency; - - const tasks: TestContent[] = []; - - for (let i = 0; i < totalTasks; i++) { - tasks.push({ counter: 0 }); - } - - queue = new ConcurrentQueue(concurrency, totalTasks, incrementCounter); - - tasks.forEach(queue.push.bind(queue)); - - queue.end(() => { - tasks.forEach((task) => { - expect(task.counter).to.equal(1); - }); - done(); - }); - }); - - it('Should end after all tasks end (totalTasks > concurrency > 1)', function (done) { - const concurrency = 3; - const totalTasks = concurrency + 6; - - const tasks: TestContent[] = []; - - for (let i = 0; i < totalTasks; i++) { - tasks.push({ counter: 0 }); - } - - queue = new ConcurrentQueue(concurrency, totalTasks, incrementCounter); - - tasks.forEach(queue.push.bind(queue)); - - queue.end(() => { - tasks.forEach((task) => { - expect(task.counter).to.equal(1); - }); - done(); - }); - }); - }); -}); diff --git a/yarn.lock b/yarn.lock index 10245530..a627fff8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,6 +146,13 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@dabh/diagnostics@^2.0.8": version "2.0.8" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e" @@ -155,6 +162,14 @@ enabled "2.0.x" kuler "^2.0.0" +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + "@emnapi/core@1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034" @@ -163,6 +178,13 @@ "@emnapi/wasi-threads" "1.2.1" tslib "^2.4.0" +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + "@emnapi/runtime@1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.9.2.tgz#8b469a3db160817cadb1de9050211a9d1ea84fa2" @@ -276,13 +298,6 @@ eslint-config-prettier "^10.1.8" typescript-eslint "^8.40.0" -"@internxt/lib@1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@internxt/lib/-/lib-1.4.1.tgz#dd4974cb49ab6bba118cf218434e69e95cc4a481" - integrity sha512-sWNp57IKCk0HjzTdPSuxOgZWvrSDWGYrzNOq90LIZTzr1HwkxObicUaZqSzmw4uDKrJhsdFdzwdywk3g8gwDDA== - dependencies: - uuid "^11.1.0" - "@internxt/prettier-config@internxt/prettier-config#v2.0.0": version "2.0.0" resolved "https://codeload.github.com/internxt/prettier-config/tar.gz/66ff94f2d78b71884eac141ae026ca3892c6c4d6" @@ -295,18 +310,6 @@ axios "1.15.0" internxt-crypto "1.0.2" -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -328,12 +331,12 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== @@ -346,6 +349,21 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@napi-rs/wasm-runtime@^1.1.1", "@napi-rs/wasm-runtime@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" + integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow== + dependencies: + "@tybys/wasm-util" "^0.10.1" + "@napi-rs/wasm-runtime@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz#1eeb8699770481306e5fcd84471f20fcb6177336" @@ -383,15 +401,221 @@ "@noble/curves" "~2.0.0" "@noble/hashes" "~2.0.0" +"@oxc-parser/binding-android-arm-eabi@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.128.0.tgz#347b05c79052fa0030415bace1fda47de933d73d" + integrity sha512-aca6ZvzmCBUGOANQRiRQRZuRKYI3ENhcit6GisnknOOmcezfQc7xJ4dxlPU7MV7mOvrC7RNR1u3LAD7xyaiCxA== + +"@oxc-parser/binding-android-arm64@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.128.0.tgz#5a3e41daf46d3661dfd1467fc6f3e0efdac3727f" + integrity sha512-BbeDmuohoJ7Rz/it5wnkj69i/OsCPS3Z51nLEzwO/Y6YshtC4JU+15oNwhY8v4LRKRYclRc7ggOikwrsJ/eOEQ== + +"@oxc-parser/binding-darwin-arm64@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.128.0.tgz#899b60a6cddb62172746dc2c0e6ed9d0ba7e8aa3" + integrity sha512-tRUHPt80417QmvNpoSslJT1VY8NUbWdrWR+L14Zn+RbOTcaqB8E6PYE/ZGN8jjWBzqporiA/H4MfO50ew/NCNA== + +"@oxc-parser/binding-darwin-x64@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.128.0.tgz#aad294a1ebf1396d28769278cce6f57b48b157ab" + integrity sha512-rWI2Hb1Nt3U/vKsjyNvZzDC8i/l144U20DKjhzaTmwIhIiSRGeroPWWiImwypmKLqrw8GuIixbWJkpGWLbkzrQ== + +"@oxc-parser/binding-freebsd-x64@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.128.0.tgz#8e2ae04d394b59f25742f81d91d5fef6533839fc" + integrity sha512-hhpdVMaNCLgQxjgNPeeFzSeJMmZPc5lKfv0NGSI3egZq9EdnEGqeC8JsYsQjK7PoQgbvZ17xlj0SO5ziH5Obkg== + +"@oxc-parser/binding-linux-arm-gnueabihf@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.128.0.tgz#2124e24ef523d0c687f2c028f15d9a4b8be14276" + integrity sha512-093zNw0zZ/e/obML+rhlSdmnzR0mVZluPcAkxunEc5E3F0yBVsFn24Y1ILfsEte11Ud041qn/gp2OJ1jxNqUng== + +"@oxc-parser/binding-linux-arm-musleabihf@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.128.0.tgz#7090830ef706900049ed8c2bb9173912a46c4a4a" + integrity sha512-fq7DmKmfC+dvD97IXrgbph6Jzwe0EDu+PYMofmzZ6fv5X1k9vtaqLpDGMuICO9MmUnyKAQmVl+wIv2RNy4Dz8g== + +"@oxc-parser/binding-linux-arm64-gnu@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.128.0.tgz#5a8d73c8c2b601de36135083bd4cd66dc31fee90" + integrity sha512-Xvm48jJah8TlIrURIjNOP/gNiGe6aKvCB+r06VliflFo8Kq7VOLE8PxtgShJzZIqubrgdMdYfvuPPozn7F6MbQ== + +"@oxc-parser/binding-linux-arm64-musl@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.128.0.tgz#cbbb2c51ef29c36a58103d0865d6c8902c21bcd8" + integrity sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA== + +"@oxc-parser/binding-linux-ppc64-gnu@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.128.0.tgz#834c0e315c0f15ff70438a4872382d7f93d6d239" + integrity sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg== + +"@oxc-parser/binding-linux-riscv64-gnu@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.128.0.tgz#25059863fd75e78fe47653ba14ff90dd9f06896c" + integrity sha512-gyHjOTFpg9bTTYjxPmQirvufb89+VdZwVfcMtAUyPr6F5H8ZswvCQshK4qOW+Q+2Xyb33hduRgY/eFHJQjU/vQ== + +"@oxc-parser/binding-linux-riscv64-musl@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.128.0.tgz#b0fd29102fa47d2789111bbb1578baae8ae4ee96" + integrity sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA== + +"@oxc-parser/binding-linux-s390x-gnu@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.128.0.tgz#87012dd9503950907151d8fbf38a0f2038f5a0e4" + integrity sha512-BdzTmqxfxoYkpgokoLaSnOX6T+R3/goL42klre2tnG+kHbG2TXS0VN+P5BPofH1axdKOHy5ei4ENZrjmCOt2lA== + +"@oxc-parser/binding-linux-x64-gnu@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.128.0.tgz#fa994d4cb8b488f2bee62e676fbfadf9b5d6669b" + integrity sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q== + +"@oxc-parser/binding-linux-x64-musl@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.128.0.tgz#55fa9fcdbc9518a9db0588cd998a2644ebeaa916" + integrity sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw== + +"@oxc-parser/binding-openharmony-arm64@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.128.0.tgz#b6f1a698d7f554d883c1b9aad3e024676dcd38c8" + integrity sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg== + +"@oxc-parser/binding-wasm32-wasi@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.128.0.tgz#5cc54e54bf70ab9af20b737ae137fab55ba430ec" + integrity sha512-L38ojghJYHmgiz6fJd7jwLB/ESDBpB02NdFxh+smqVM6P2anCEvHn0jhaSrt5eVNR1Ak8+moOeftUlofeyvniA== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@oxc-parser/binding-win32-arm64-msvc@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.128.0.tgz#b86bfb654ce712d26e8d164c1026a411b3772ee2" + integrity sha512-xgvO35GyHBtjlQ5AEpaYr7Rll1rvY7zqIhT6ty8E3ezBW2J1SFLjIDEvI/tcgDg6oaseDAqVcM+jU1HuCekgZw== + +"@oxc-parser/binding-win32-ia32-msvc@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.128.0.tgz#f06da85efa4a7bf5409ad1a812d4d32b7ff4e154" + integrity sha512-OY+3eM2SN72prHKRB22mPz8o5A/7dJ+f5DFLBVvggyZhEaNDAH9IB+ElMjmOkOIwf5MDCUAowCK7pAncNxzpBA== + +"@oxc-parser/binding-win32-x64-msvc@0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.128.0.tgz#6928f6d9a32e09dd94db7f5211e09b1a9c816898" + integrity sha512-NE9ny+cPUCCObXa0IKLfj0tCdPd7pe/dz9ZpkxpUOymB3miNeMPybdlYYTBSGJUalMWeBM85/4JcCErCNTqOXw== + "@oxc-project/types@=0.124.0": version "0.124.0" resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.124.0.tgz#1dfd7b3fbb98febc2f91b505f48c940db73c8701" integrity sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg== -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@oxc-project/types@^0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.128.0.tgz#efc7524f948ff9e8ab1404ecad1823849c6fe149" + integrity sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ== + +"@oxc-resolver/binding-android-arm-eabi@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.19.1.tgz#c44120aa5104e991e4a9969bb0b816263a6f4bc1" + integrity sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg== + +"@oxc-resolver/binding-android-arm64@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.19.1.tgz#bac86a9f2afda9cd6181ea1d1546448df579b740" + integrity sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA== + +"@oxc-resolver/binding-darwin-arm64@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.19.1.tgz#6bddb5b779cde0003dae0d703bf734e1536968f1" + integrity sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ== + +"@oxc-resolver/binding-darwin-x64@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.19.1.tgz#055331438a73b21d357fdef947b9c06ec9046104" + integrity sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ== + +"@oxc-resolver/binding-freebsd-x64@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.19.1.tgz#735ebe53bad7e935255a0eb072f74a43ffb032c4" + integrity sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw== + +"@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.19.1.tgz#2072f679e5a8485f3c0fe98f3bd57dfd4647a19d" + integrity sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A== + +"@oxc-resolver/binding-linux-arm-musleabihf@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.19.1.tgz#d74d0aa4738cc9f2af9e2015cbded0a5d34610dc" + integrity sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ== + +"@oxc-resolver/binding-linux-arm64-gnu@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.19.1.tgz#06aa9a330ecda461be6938969c1c4b67e969419e" + integrity sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig== + +"@oxc-resolver/binding-linux-arm64-musl@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.19.1.tgz#e951cb96e7f72a8b83d6379d19d4e2624fca8d6e" + integrity sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew== + +"@oxc-resolver/binding-linux-ppc64-gnu@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.19.1.tgz#b73a3d95b9b7a74d8aa95ddefc06b6ab73d8afc6" + integrity sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ== + +"@oxc-resolver/binding-linux-riscv64-gnu@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.19.1.tgz#a9d29b7ddc351824ca25c4aa9de6cd45cffb5d1f" + integrity sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w== + +"@oxc-resolver/binding-linux-riscv64-musl@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.19.1.tgz#0fcbb8ff0a09e1c61cbcd2a0803946aec0cb9b3b" + integrity sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw== + +"@oxc-resolver/binding-linux-s390x-gnu@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.19.1.tgz#1b7e32df63bf323e5ec765f536d2be14fba51787" + integrity sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA== + +"@oxc-resolver/binding-linux-x64-gnu@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.19.1.tgz#4ab2754f1b9521a3d0f00cb251d8b6603222f2f4" + integrity sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ== + +"@oxc-resolver/binding-linux-x64-musl@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.19.1.tgz#91c3ae986004131726c78ba9aef6154daa9c238e" + integrity sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw== + +"@oxc-resolver/binding-openharmony-arm64@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.19.1.tgz#305fe66843f4ba2499fdacf1aac00341b5968198" + integrity sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA== + +"@oxc-resolver/binding-wasm32-wasi@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.19.1.tgz#0e885eb1fd6e80582cf7dfb756647fbc427cce1b" + integrity sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg== + dependencies: + "@napi-rs/wasm-runtime" "^1.1.1" + +"@oxc-resolver/binding-win32-arm64-msvc@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.19.1.tgz#2e14871c6075520ebfd312eb9c6a15e753237b90" + integrity sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ== + +"@oxc-resolver/binding-win32-ia32-msvc@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.19.1.tgz#b684992dd0fc6e8f88053bfa86327b932e4cc486" + integrity sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA== + +"@oxc-resolver/binding-win32-x64-msvc@11.19.1": + version "11.19.1" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.19.1.tgz#a48dccdcb0833da4957579b0e314666407990364" + integrity sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw== "@rolldown/binding-android-arm64@1.0.0-rc.15": version "1.0.0-rc.15" @@ -503,6 +727,26 @@ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@tybys/wasm-util@^0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" @@ -510,26 +754,11 @@ dependencies: tslib "^2.4.0" -"@types/archiver@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-7.0.0.tgz#475d5aa4076ffc05f2c78dc7540b0ea4ab8c7d7a" - integrity sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg== - dependencies: - "@types/readdir-glob" "*" - "@types/async@3.2.9": version "3.2.9" resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.9.tgz#70c43999e0c3dd2100e7007b10e55a890d79670d" integrity sha512-5Jx7ifieGrZq5qtKfZfQ/7o43eC7rkAURHEZYa4DUwydToHLgMdIpMseNmYvf+BdgIDCARo+LxlBz9LDAXAwNg== -"@types/body-parser@*": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - "@types/chai@^5.2.2": version "5.2.3" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" @@ -538,13 +767,6 @@ "@types/deep-eql" "*" assertion-error "^2.0.1" -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - "@types/deep-eql@*": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" @@ -555,42 +777,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/express-serve-static-core@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" - integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" - integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "^2" - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" - integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== - dependencies: - undici-types "~7.18.0" - "@types/node@25.6.0": version "25.6.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-25.6.0.tgz#4e09bad9b469871f2d0f68140198cbd714f4edca" @@ -598,38 +789,6 @@ dependencies: undici-types "~7.19.0" -"@types/qs@*": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" - integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/readdir-glob@*": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.5.tgz#21a4a98898fc606cb568ad815f2a0eedc24d412a" - integrity sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg== - dependencies: - "@types/node" "*" - -"@types/send@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" - integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== - dependencies: - "@types/node" "*" - -"@types/serve-static@^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" - integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -807,27 +966,19 @@ convert-source-map "^2.0.0" tinyrainbow "^3.1.0" -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" - integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== - dependencies: - mime-types "^3.0.0" - negotiator "^1.0.0" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0: +acorn-walk@^8.1.1: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.15.0, acorn@^8.4.1: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== @@ -849,53 +1000,27 @@ ansi-escapes@^7.0.0: dependencies: environment "^1.0.0" -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - ansi-regex@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.1.0, ansi-styles@^6.2.1, ansi-styles@^6.2.3: +ansi-styles@^6.2.1, ansi-styles@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -archiver-utils@^5.0.0, archiver-utils@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-5.0.2.tgz#63bc719d951803efc72cf961a56ef810760dd14d" - integrity sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA== - dependencies: - glob "^10.0.0" - graceful-fs "^4.2.0" - is-stream "^2.0.1" - lazystream "^1.0.0" - lodash "^4.17.15" - normalize-path "^3.0.0" - readable-stream "^4.0.0" - -archiver@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-7.0.1.tgz#c9d91c350362040b8927379c7aa69c0655122f61" - integrity sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ== - dependencies: - archiver-utils "^5.0.2" - async "^3.2.4" - buffer-crc32 "^1.0.0" - readable-stream "^4.0.0" - readdir-glob "^1.1.2" - tar-stream "^3.0.0" - zip-stream "^6.0.1" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^2.0.1: version "2.0.1" @@ -907,7 +1032,7 @@ assertion-error@^2.0.1: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== -async@3.2.6, async@^3.2.3, async@^3.2.4: +async@3.2.6, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -926,11 +1051,6 @@ axios@1.15.0: form-data "^4.0.5" proxy-from-env "^2.1.0" -b4a@^1.6.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.0.tgz#1ca3ba0edc9469aaabef5647e769a83d50180b1a" - integrity sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -941,54 +1061,6 @@ balanced-match@^4.0.2: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== -bare-events@^2.5.4, bare-events@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" - integrity sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ== - -bare-fs@^4.5.5: - version "4.5.5" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.5.5.tgz#589a8f87a32af0266aa474413c8d7d11d50e4a65" - integrity sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w== - dependencies: - bare-events "^2.5.4" - bare-path "^3.0.0" - bare-stream "^2.6.4" - bare-url "^2.2.2" - fast-fifo "^1.3.2" - -bare-os@^3.0.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.8.0.tgz#888541d443914e861abed02657a6ef1c50bbf383" - integrity sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg== - -bare-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" - integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== - dependencies: - bare-os "^3.0.1" - -bare-stream@^2.6.4: - version "2.8.1" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.8.1.tgz#a4551375bcb01484c5a66946652ebd718b47903d" - integrity sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg== - dependencies: - streamx "^2.21.0" - teex "^1.0.1" - -bare-url@^2.2.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.3.2.tgz#4aef382efa662b2180a6fe4ca07a71b39bdf7ca3" - integrity sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw== - dependencies: - bare-path "^3.0.0" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - baseline-browser-mapping@^2.9.0: version "2.10.8" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz#23d1cea1a85b181c2b8660b6cfe626dc2fb15630" @@ -1001,21 +1073,6 @@ bip39@3.1.0: dependencies: "@noble/hashes" "^1.2.0" -body-parser@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.2.tgz#1a32cdb966beaf68de50a9dfbe5b58f83cb8890c" - integrity sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA== - dependencies: - bytes "^3.1.2" - content-type "^1.0.5" - debug "^4.4.3" - http-errors "^2.0.0" - iconv-lite "^0.7.0" - on-finished "^2.4.1" - qs "^6.14.1" - raw-body "^3.0.1" - type-is "^2.0.1" - brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -1024,13 +1081,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1, brace-expansion@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - brace-expansion@^5.0.2: version "5.0.4" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" @@ -1049,24 +1099,6 @@ browserslist@^4.24.0: node-releases "^2.0.27" update-browserslist-db "^1.2.0" -buffer-crc32@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz#a10993b9055081d55304bd9feb4a072de179f405" - integrity sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bytes@^3.1.2, bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -1075,14 +1107,6 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -call-bound@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1172,69 +1196,25 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@14.0.3, commander@^14.0.3: +commander@^14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== -compress-commons@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-6.0.2.tgz#26d31251a66b9d6ba23a84064ecd3a6a71d2609e" - integrity sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg== - dependencies: - crc-32 "^1.2.0" - crc32-stream "^6.0.0" - is-stream "^2.0.1" - normalize-path "^3.0.0" - readable-stream "^4.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -content-disposition@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.1.tgz#a8b7bbeb2904befdfb6787e5c0c086959f605f9b" - integrity sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q== - -content-type@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie-signature@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -crc32-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-6.0.0.tgz#8529a3868f8b27abb915f6c3617c0fadedbf9430" - integrity sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g== - dependencies: - crc-32 "^1.2.0" - readable-stream "^4.0.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-spawn@^7.0.6: version "7.0.6" @@ -1245,7 +1225,7 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.0, debug@^4.4.3: +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -1262,20 +1242,15 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - detect-libc@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== -dotenv@17.4.1: - version "17.4.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.1.tgz#d8e2179fe287365ef3aecb9459668454168eda88" - integrity sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw== +diff@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== dunder-proto@^1.0.1: version "1.0.1" @@ -1286,16 +1261,6 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - electron-to-chromium@^1.5.263: version "1.5.313" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz#193e9ae2c2ab6915acb41e833068381e4ef0b3e4" @@ -1306,26 +1271,11 @@ emoji-regex@^10.3.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - environment@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" @@ -1368,11 +1318,6 @@ escalade@^3.2.0: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1486,82 +1431,21 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^5.0.1: version "5.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== -events-universal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" - integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== - dependencies: - bare-events "^2.7.0" - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - expect-type@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.3.0.tgz#0d58ed361877a31bbc4dd6cf71bbfef7faf6bd68" integrity sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== -express@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" - integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.1" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.0" - depd "^2.0.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - finalhandler "^2.1.0" - fresh "^2.0.0" - http-errors "^2.0.0" - merge-descriptors "^2.0.0" - mime-types "^3.0.0" - on-finished "^2.4.1" - once "^1.4.0" - parseurl "^1.3.3" - proxy-addr "^2.0.7" - qs "^6.14.0" - range-parser "^1.2.1" - router "^2.2.0" - send "^1.1.0" - serve-static "^2.2.0" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -1572,6 +1456,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fd-package-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fd-package-json/-/fd-package-json-2.0.0.tgz#03f53ce5a0af552c2f4faf703a24e526310a2411" + integrity sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ== + dependencies: + walk-up-path "^4.0.0" + fdir@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" @@ -1589,18 +1480,6 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -finalhandler@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" - integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== - dependencies: - debug "^4.4.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - on-finished "^2.4.1" - parseurl "^1.3.3" - statuses "^2.0.1" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1637,14 +1516,6 @@ follow-redirects@^1.15.11: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" @@ -1656,15 +1527,12 @@ form-data@^4.0.5: hasown "^2.0.2" mime-types "^2.1.12" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" - integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== +formatly@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/formatly/-/formatly-0.3.0.tgz#5bb3b4e692f5a8c74ad8fe26154dd0a74aac6819" + integrity sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w== + dependencies: + fd-package-json "^2.0.0" fsevents@~2.3.3: version "2.3.3" @@ -1686,7 +1554,7 @@ get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^ resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz#ce7008fe345edcf5497a6f557cfa54bc318a9ce7" integrity sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA== -get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -1710,6 +1578,13 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" +get-tsconfig@4.14.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -1717,18 +1592,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.0.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" - integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^13.0.3: version "13.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" @@ -1748,11 +1611,6 @@ gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1787,39 +1645,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - husky@9.1.7, husky@^9.1.7: version "9.1.7" resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== -iconv-lite@^0.7.0, iconv-lite@~0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" - integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - idb@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.3.tgz#c91e558f15a8d53f1d7f53a094d226fc3ad71fd9" integrity sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg== -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -1843,7 +1678,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: +inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1864,21 +1699,11 @@ internxt-crypto@1.0.2: idb "^8.0.3" uuid "^13.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - is-fullwidth-code-point@^5.0.0, is-fullwidth-code-point@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" @@ -1893,21 +1718,11 @@ is-glob@^4.0.0, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-stream@^2.0.0, is-stream@^2.0.1: +is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1935,14 +1750,10 @@ istanbul-reports@^3.2.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" +jiti@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== js-tokens@^4.0.0: version "4.0.0" @@ -1988,18 +1799,31 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" +knip@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/knip/-/knip-6.11.0.tgz#b12d5dfc0851fdc9a0031c884846843f61a30640" + integrity sha512-84PTlN8Q5smLpTbzs8smTVh8PMbTDXtw0tFksXq/m6auGFC/KSzJykKFmnYh3As38kiWDkoDBvdTTyKk5M1TAQ== + dependencies: + fdir "^6.5.0" + formatly "^0.3.0" + get-tsconfig "4.14.0" + jiti "^2.6.0" + minimist "^1.2.8" + oxc-parser "^0.128.0" + oxc-resolver "^11.19.1" + picomatch "^4.0.4" + smol-toml "^1.6.1" + strip-json-comments "5.0.3" + tinyglobby "^0.2.16" + unbash "^3.0.0" + yaml "^2.8.2" + zod "^4.1.11" + kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -lazystream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" - integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== - dependencies: - readable-stream "^2.0.5" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2118,11 +1942,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.15: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== - log-update@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" @@ -2146,11 +1965,6 @@ logform@^2.7.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - lru-cache@^11.0.0: version "11.2.7" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.7.tgz#9127402617f34cd6767b96daee98c28e74458d35" @@ -2186,31 +2000,21 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -merge-descriptors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" - integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -2218,13 +2022,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mime-types@^3.0.0, mime-types@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" - integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== - dependencies: - mime-db "^1.54.0" - mimic-function@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" @@ -2244,21 +2041,12 @@ minimatch@^3.1.2, minimatch@^3.1.5: dependencies: brace-expansion "^1.1.7" -minimatch@^5.1.0: - version "5.1.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" - integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== - dependencies: - brace-expansion "^2.0.1" +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minimatch@^9.0.4: - version "9.0.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" - integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== - dependencies: - brace-expansion "^2.0.2" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2, minipass@^7.1.3: +minipass@^7.1.2, minipass@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== @@ -2278,45 +2066,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" - integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== - node-releases@^2.0.27: version "2.0.36" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - obug@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== -on-finished@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - one-time@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" @@ -2343,6 +2102,60 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +oxc-parser@^0.128.0: + version "0.128.0" + resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.128.0.tgz#4d1592db9f0b9e519ae7c1996c647b9e66ee1506" + integrity sha512-XkOw3eiIxAgQ19WRew/Bq9wc5Ga/guaWIzDBzq80z1PyuDNGvWBpPby9k6YGwV8A8uMw+Nlq3xqlzuDYmUFYUw== + dependencies: + "@oxc-project/types" "^0.128.0" + optionalDependencies: + "@oxc-parser/binding-android-arm-eabi" "0.128.0" + "@oxc-parser/binding-android-arm64" "0.128.0" + "@oxc-parser/binding-darwin-arm64" "0.128.0" + "@oxc-parser/binding-darwin-x64" "0.128.0" + "@oxc-parser/binding-freebsd-x64" "0.128.0" + "@oxc-parser/binding-linux-arm-gnueabihf" "0.128.0" + "@oxc-parser/binding-linux-arm-musleabihf" "0.128.0" + "@oxc-parser/binding-linux-arm64-gnu" "0.128.0" + "@oxc-parser/binding-linux-arm64-musl" "0.128.0" + "@oxc-parser/binding-linux-ppc64-gnu" "0.128.0" + "@oxc-parser/binding-linux-riscv64-gnu" "0.128.0" + "@oxc-parser/binding-linux-riscv64-musl" "0.128.0" + "@oxc-parser/binding-linux-s390x-gnu" "0.128.0" + "@oxc-parser/binding-linux-x64-gnu" "0.128.0" + "@oxc-parser/binding-linux-x64-musl" "0.128.0" + "@oxc-parser/binding-openharmony-arm64" "0.128.0" + "@oxc-parser/binding-wasm32-wasi" "0.128.0" + "@oxc-parser/binding-win32-arm64-msvc" "0.128.0" + "@oxc-parser/binding-win32-ia32-msvc" "0.128.0" + "@oxc-parser/binding-win32-x64-msvc" "0.128.0" + +oxc-resolver@^11.19.1: + version "11.19.1" + resolved "https://registry.yarnpkg.com/oxc-resolver/-/oxc-resolver-11.19.1.tgz#1b6b49812ae3469a2dcd10314444c2cb73a8d6a1" + integrity sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg== + optionalDependencies: + "@oxc-resolver/binding-android-arm-eabi" "11.19.1" + "@oxc-resolver/binding-android-arm64" "11.19.1" + "@oxc-resolver/binding-darwin-arm64" "11.19.1" + "@oxc-resolver/binding-darwin-x64" "11.19.1" + "@oxc-resolver/binding-freebsd-x64" "11.19.1" + "@oxc-resolver/binding-linux-arm-gnueabihf" "11.19.1" + "@oxc-resolver/binding-linux-arm-musleabihf" "11.19.1" + "@oxc-resolver/binding-linux-arm64-gnu" "11.19.1" + "@oxc-resolver/binding-linux-arm64-musl" "11.19.1" + "@oxc-resolver/binding-linux-ppc64-gnu" "11.19.1" + "@oxc-resolver/binding-linux-riscv64-gnu" "11.19.1" + "@oxc-resolver/binding-linux-riscv64-musl" "11.19.1" + "@oxc-resolver/binding-linux-s390x-gnu" "11.19.1" + "@oxc-resolver/binding-linux-x64-gnu" "11.19.1" + "@oxc-resolver/binding-linux-x64-musl" "11.19.1" + "@oxc-resolver/binding-openharmony-arm64" "11.19.1" + "@oxc-resolver/binding-wasm32-wasi" "11.19.1" + "@oxc-resolver/binding-win32-arm64-msvc" "11.19.1" + "@oxc-resolver/binding-win32-ia32-msvc" "11.19.1" + "@oxc-resolver/binding-win32-x64-msvc" "11.19.1" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -2357,7 +2170,7 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -package-json-from-dist@^1.0.0, package-json-from-dist@^1.0.1: +package-json-from-dist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== @@ -2369,11 +2182,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parseurl@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2384,14 +2192,6 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" @@ -2400,11 +2200,6 @@ path-scurry@^2.0.2: lru-cache "^11.0.0" minipass "^7.1.2" -path-to-regexp@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz#aa818a6981f99321003a08987d3cec9c3474cd1f" - integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== - pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" @@ -2439,24 +2234,6 @@ prettier@3.8.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.2.tgz#4f52e502193c9aa5b384c3d00852003e551bbd9f" integrity sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -proxy-addr@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - proxy-from-env@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" @@ -2467,41 +2244,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.14.0, qs@^6.14.1: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" - integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.7.0" - unpipe "~1.0.0" - -readable-stream@^2.0.5: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -2511,29 +2253,16 @@ readable-stream@^3.4.0, readable-stream@^3.6.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^4.0.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" - integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== - 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.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" - integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== - dependencies: - minimatch "^5.1.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + restore-cursor@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" @@ -2579,22 +2308,6 @@ rolldown@1.0.0-rc.15: "@rolldown/binding-win32-arm64-msvc" "1.0.0-rc.15" "@rolldown/binding-win32-x64-msvc" "1.0.0-rc.15" -router@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" - integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== - dependencies: - debug "^4.4.0" - depd "^2.0.0" - is-promise "^4.0.0" - parseurl "^1.3.3" - path-to-regexp "^8.0.0" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -2605,11 +2318,6 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -2620,38 +2328,6 @@ semver@^7.5.3, semver@^7.7.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== -send@^1.1.0, send@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" - integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== - dependencies: - debug "^4.4.3" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - fresh "^2.0.0" - http-errors "^2.0.1" - mime-types "^3.0.2" - ms "^2.1.3" - on-finished "^2.4.1" - range-parser "^1.2.1" - statuses "^2.0.2" - -serve-static@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" - integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== - dependencies: - encodeurl "^2.0.0" - escape-html "^1.0.3" - parseurl "^1.3.3" - send "^1.2.0" - -setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2664,52 +2340,12 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -2730,6 +2366,11 @@ slice-ansi@^8.0.0: ansi-styles "^6.2.3" is-fullwidth-code-point "^5.1.0" +smol-toml@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.1.tgz#4fceb5f7c4b86c2544024ef686e12ff0983465be" + integrity sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg== + source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -2745,57 +2386,16 @@ stackback@0.0.2: resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - std-env@^4.0.0-rc.1: version "4.0.0" resolved "https://registry.yarnpkg.com/std-env/-/std-env-4.0.0.tgz#ba3dc31c3a46bc5ba21138aa20a6a4ceb5bb9b7e" integrity sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ== -streamx@^2.12.5, streamx@^2.15.0, streamx@^2.21.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.23.0.tgz#7d0f3d00d4a6c5de5728aecd6422b4008d66fd0b" - integrity sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg== - dependencies: - events-universal "^1.0.0" - fast-fifo "^1.3.2" - text-decoder "^1.1.0" - string-argv@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string-width@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -2813,41 +2413,25 @@ string-width@^8.2.0: get-east-asian-width "^1.5.0" strip-ansi "^7.1.2" -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0, strip-ansi@^7.1.2: +strip-ansi@^7.1.0, strip-ansi@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: ansi-regex "^6.2.2" +strip-json-comments@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.3.tgz#b7304249dd402ee67fd518ada993ab3593458bcf" + integrity sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw== + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2860,30 +2444,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -tar-stream@^3.0.0: - version "3.1.8" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.8.tgz#a26f5b26c34dfd4936a4f8a9e694a8f5102af13d" - integrity sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ== - dependencies: - b4a "^1.6.4" - bare-fs "^4.5.5" - fast-fifo "^1.2.0" - streamx "^2.15.0" - -teex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" - integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== - dependencies: - streamx "^2.12.5" - -text-decoder@^1.1.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" - integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== - dependencies: - b4a "^1.6.4" - text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -2907,16 +2467,19 @@ tinyglobby@^0.2.15: fdir "^6.5.0" picomatch "^4.0.3" +tinyglobby@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tinyrainbow@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.1.0.tgz#1d8a623893f95cf0a2ddb9e5d11150e191409421" integrity sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw== -toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - triple-beam@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" @@ -2927,6 +2490,25 @@ ts-api-utils@^2.4.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tslib@^2.4.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" @@ -2939,15 +2521,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-is@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - typescript-eslint@^8.40.0: version "8.57.0" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.57.0.tgz#82764795d316ed1c72a489727c43c3a87373f100" @@ -2963,10 +2536,10 @@ typescript@5.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== +unbash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unbash/-/unbash-3.0.0.tgz#57efd0217212ee4abcb820372c87b64ad3af687d" + integrity sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA== undici-types@~7.19.0: version "7.19.2" @@ -2978,11 +2551,6 @@ undici@7.24.4: resolved "https://registry.yarnpkg.com/undici/-/undici-7.24.4.tgz#873bce680d7c6354c941399fd4e8ea4563de4ea7" integrity sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w== -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - update-browserslist-db@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" @@ -2998,25 +2566,20 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@13.0.0, uuid@^13.0.0: +uuid@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -vary@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== "vite@^6.0.0 || ^7.0.0 || ^8.0.0": version "8.0.8" @@ -3057,6 +2620,11 @@ vitest@4.1.4: vite "^6.0.0 || ^7.0.0 || ^8.0.0" why-is-node-running "^2.3.0" +walk-up-path@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198" + integrity sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3103,24 +2671,6 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrap-ansi@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" @@ -3130,11 +2680,6 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -3145,16 +2690,17 @@ yaml@^2.8.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zip-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-6.0.1.tgz#e141b930ed60ccaf5d7fa9c8260e0d1748a2bbfb" - integrity sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA== - dependencies: - archiver-utils "^5.0.0" - compress-commons "^6.0.2" - readable-stream "^4.0.0" +zod@^4.1.11: + version "4.4.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== From c2d4317e80eb6a647703dd4fc3e61950bb369b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:43:49 +0200 Subject: [PATCH 2/6] Update INXTRequest.ts --- src/lib/INXTRequest.ts | 66 ++---------------------------------------- 1 file changed, 2 insertions(+), 64 deletions(-) diff --git a/src/lib/INXTRequest.ts b/src/lib/INXTRequest.ts index 21498c51..50c9361a 100644 --- a/src/lib/INXTRequest.ts +++ b/src/lib/INXTRequest.ts @@ -1,10 +1,8 @@ import { ClientRequest } from 'http'; import { EventEmitter } from 'events'; -import { Readable } from 'stream'; -import axios, { AxiosRequestConfig, AxiosResponse, Canceler } from 'axios'; +import axios, { AxiosRequestConfig, Canceler } from 'axios'; -import { request, streamRequest } from '../services/request'; -import { ProxyManager, getProxy } from '../services/proxy'; +import { request } from '../services/request'; import { EnvironmentConfig } from '../api'; export enum Methods { @@ -26,11 +24,6 @@ export class INXTRequest extends EventEmitter { targetUrl: string; params: AxiosRequestConfig; - static Events = { - UploadProgress: 'upload-progress', - DownloadProgress: 'download-progress', - }; - constructor( config: EnvironmentConfig, method: Methods, @@ -67,57 +60,6 @@ export class INXTRequest extends EventEmitter { return this.req; } - async stream(content: Readable, size: number): Promise>; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async stream(): Promise; - async stream(content?: any, size?: number): Promise { - if (size) { - return this.postStream(content, size); - } - - return this.getStream(); - } - - private async getStream(): Promise { - this.streaming = true; - - let proxy: ProxyManager | undefined; - - if (this.useProxy) { - proxy = await getProxy(); - } - - const targetUrl = `${proxy && proxy.url ? proxy.url + '/' : ''}${this.targetUrl}`; - - return streamRequest(targetUrl); - } - - private async postStream(content: Readable, size: number): Promise { - this.streaming = true; - - let proxy: ProxyManager | undefined; - - if (this.useProxy) { - proxy = await getProxy(); - } - - const targetUrl = `${proxy && proxy.url ? proxy.url + '/' : ''}${this.targetUrl}`; - - return axios - .post(targetUrl, content, { - maxContentLength: Infinity, - headers: { - 'Content-Type': 'application/octet-stream', - 'Content-Length': size.toString(), - }, - }) - .then((res) => { - proxy?.free(); - - return res as unknown as K; - }); - } - abort() { if (this.streaming && this.req instanceof ClientRequest) { return this.req.destroy(); @@ -125,8 +67,4 @@ export class INXTRequest extends EventEmitter { this.cancel(); } - - isCancelled(err: Error): boolean { - return axios.isCancel(err); - } } From 8b70e90ec80f389d2ca58a46c5a10d90328a11de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:44:50 +0200 Subject: [PATCH 3/6] Commit --- src/api/FileObject.ts | 2 +- src/lib/utils/crypto/index.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/lib/utils/crypto/index.ts diff --git a/src/api/FileObject.ts b/src/api/FileObject.ts index de4891b0..22ee1f3a 100644 --- a/src/api/FileObject.ts +++ b/src/api/FileObject.ts @@ -2,7 +2,7 @@ import { Readable } from 'stream'; import { EventEmitter } from 'events'; import { doUntil, eachLimit } from 'async'; -import { GenerateFileKey } from '../lib/utils/crypto'; +import { GenerateFileKey } from '../lib/utils/crypto/crypto'; import { FileInfo, GetFileInfo, GetFileMirrors, ReplacePointer } from './fileinfo'; import { Shard, EnvironmentConfig } from './'; diff --git a/src/lib/utils/crypto/index.ts b/src/lib/utils/crypto/index.ts deleted file mode 100644 index f1702475..00000000 --- a/src/lib/utils/crypto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './crypto'; From f88c54e6d2165d584268fe8c71674488736282f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:46:22 +0200 Subject: [PATCH 4/6] Create index.ts --- src/lib/utils/crypto/index.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/lib/utils/crypto/index.ts diff --git a/src/lib/utils/crypto/index.ts b/src/lib/utils/crypto/index.ts new file mode 100644 index 00000000..f1702475 --- /dev/null +++ b/src/lib/utils/crypto/index.ts @@ -0,0 +1 @@ +export * from './crypto'; From c1eea056d130c7d986c5eb807e824a7ff55e74c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:48:21 +0200 Subject: [PATCH 5/6] Create find-deadcode.yml --- .github/workflows/find-deadcode.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/find-deadcode.yml diff --git a/.github/workflows/find-deadcode.yml b/.github/workflows/find-deadcode.yml new file mode 100644 index 00000000..03a9ea32 --- /dev/null +++ b/.github/workflows/find-deadcode.yml @@ -0,0 +1,25 @@ +name: Find deadcode + +on: + push: + +jobs: + find_deadcode: + runs-on: ubuntu-latest + timeout-minutes: 2 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '22.x' + cache: yarn + + - name: Install dependencies + run: yarn + + - name: Find deadcode + run: yarn find-deadcode From 544680267bf285f0a9533a8ebcef8db070cd5c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jim=C3=A9nez=20Rivera?= Date: Mon, 4 May 2026 18:59:05 +0200 Subject: [PATCH 6/6] Update FileObject.ts --- src/api/FileObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/FileObject.ts b/src/api/FileObject.ts index 22ee1f3a..de4891b0 100644 --- a/src/api/FileObject.ts +++ b/src/api/FileObject.ts @@ -2,7 +2,7 @@ import { Readable } from 'stream'; import { EventEmitter } from 'events'; import { doUntil, eachLimit } from 'async'; -import { GenerateFileKey } from '../lib/utils/crypto/crypto'; +import { GenerateFileKey } from '../lib/utils/crypto'; import { FileInfo, GetFileInfo, GetFileMirrors, ReplacePointer } from './fileinfo'; import { Shard, EnvironmentConfig } from './';