diff --git a/package.json b/package.json index 4627386..5850dd8 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "scripts": { "dev": "vite", "start": "vite build && vite preview", - "build": "vite build", + "build": "yarn clean && vite build", "test": "vitest run --coverage", + "clean": "rimraf dist coverage .wrangler tsconfig.tsbuildinfo", "add:npmrc": "cp .npmrc.template .npmrc", "vercel:install": "yarn run add:npmrc && yarn install", "lint": "eslint .", @@ -18,7 +19,7 @@ }, "dependencies": { "@headlessui/react": "2.2.9", - "@internxt/lib": "1.3.1", + "@internxt/lib": "1.4.1", "@internxt/sdk": "1.11.12", "@sentry/react": "10.22.0", "async": "3.2.6", @@ -89,6 +90,7 @@ "lint-staged": "16.2.6", "postcss": "8.5.6", "prettier": "3.6.2", + "rimraf": "6.1.0", "tailwindcss": "4.1.16", "vite": "7.1.12", "vite-plugin-bundle-obfuscator": "1.8.0", diff --git a/src/lib/stringUtils.test.ts b/src/lib/stringUtils.test.ts deleted file mode 100644 index 37ddde3..0000000 --- a/src/lib/stringUtils.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { base64UrlSafetoUUID, fromBase64UrlSafe, generateRandomStringUrlSafe, toBase64UrlSafe } from './stringUtils'; - -describe('stringUtils', () => { - describe('toBase64UrlSafe', () => { - it('converts standard Base64 to URL-safe Base64', () => { - const base64 = 'KHh+VVwlYjs/J3E='; - const urlSafe = toBase64UrlSafe(base64); - expect(urlSafe).toBe('KHh-VVwlYjs_J3E'); - }); - - it('removes trailing "=" characters', () => { - const base64 = 'KHh+VVwlYjs/J3FiYw=='; - const urlSafe = toBase64UrlSafe(base64); - expect(urlSafe).toBe('KHh-VVwlYjs_J3FiYw'); - }); - - it('does not modify already URL-safe Base64 strings', () => { - const base64 = 'KHh-VVwlYjs_J3E'; - const urlSafe = toBase64UrlSafe(base64); - expect(urlSafe).toBe(base64); - }); - }); - - describe('fromBase64UrlSafe', () => { - it('converts URL-safe Base64 back to standard Base64', () => { - const urlSafe = 'KHh-VVwlYjs_J3E'; - const base64 = fromBase64UrlSafe(urlSafe); - expect(base64).toBe('KHh+VVwlYjs/J3E='); - }); - - it('does not modify already standard Base64 strings', () => { - const urlSafe = 'KHh+VVwlYjs/J3FiYw=='; - const base64 = fromBase64UrlSafe(urlSafe); - expect(base64).toBe(urlSafe); - }); - }); - - describe('generateRandomStringUrlSafe', () => { - const getRandomNumber = (min: number, max: number) => { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min + 1)) + min; - }; - - it('generates a string of the specified length', () => { - const length = getRandomNumber(1, 1000); - const randomString = generateRandomStringUrlSafe(length); - expect(randomString).toHaveLength(length); - }); - - it('generates a URL-safe string', () => { - const randomString = generateRandomStringUrlSafe(1000); - expect(randomString).not.toMatch(/[+/=]/); - }); - - it('throws an error if size is not positive', () => { - expect(() => generateRandomStringUrlSafe(0)).toThrow('Size must be a positive integer'); - expect(() => generateRandomStringUrlSafe(-5)).toThrow('Size must be a positive integer'); - }); - }); - - describe('base64UrlSafetoUUID', () => { - it('converts a Base64 URL-safe string to a UUID v4 format', () => { - const base64UrlSafe = '8yqR2seZThOqF4xNngMjyQ'; - const uuid = base64UrlSafetoUUID(base64UrlSafe); - expect(uuid).toBe('f32a91da-c799-4e13-aa17-8c4d9e0323c9'); - }); - }); -}); diff --git a/src/lib/stringUtils.ts b/src/lib/stringUtils.ts deleted file mode 100644 index 55af110..0000000 --- a/src/lib/stringUtils.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { randomBytes } from 'crypto'; -import { Buffer } from 'buffer'; -import { validate as validateUuidv4 } from 'uuid'; - -/** - * Converts a standard Base64 string into a URL-safe Base64 variant: - * - Replaces all "+" characters with "-" - * - Replaces all "/" characters with "_" - * - Strips any trailing "=" padding characters - * - * @param base64 - A standard Base64–encoded string - * @returns The URL-safe Base64 string - */ -export const toBase64UrlSafe = (base64: string): string => { - return base64 - .replace(/\+/g, '-') // converts "+" to "-" - .replace(/\//g, '_') // converts "/" to "_" - .replace(/=+$/, ''); // removes trailing "=" -}; - -/** - * Converts a URL-safe Base64 string back into a standard Base64 variant: - * - Replaces all "-" characters with "+" - * - Replaces all "_" characters with "/" - * - Adds "=" padding characters at the end until length is a multiple of 4 - * - * @param urlSafe - A URL-safe Base64–encoded string - * @returns The standard Base64 string, including any necessary "=" padding - */ -export const fromBase64UrlSafe = (urlSafe: string): string => { - let base64 = urlSafe - .replace(/-/g, '+') // convert "-" back to "+" - .replace(/_/g, '/'); // convert "_" back to "/" - - const missingPadding = (4 - (base64.length % 4)) % 4; - if (missingPadding > 0) { - base64 += '='.repeat(missingPadding); - } - return base64; -}; - -/** - * Generates a cryptographically secure, URL-safe string of a given length. - * - * Internally: - * 1. Calculates how many raw bytes are needed to generate at least `size` Base64 chars. - * 2. Generates secure random bytes with `crypto.randomBytes()`. - * 3. Encodes to standard Base64, then makes it URL-safe. - * 4. Truncates the result to `size` characters. - * - * @param size - Desired length of the output string (must be ≥1) - * @returns A URL-safe string exactly `size` characters long - */ -export const generateRandomStringUrlSafe = (size: number): string => { - if (size <= 0) { - throw new Error('Size must be a positive integer'); - } - // Base64 yields 4 chars per 3 bytes, so it computes the minimum bytes required - const numBytes = Math.ceil((size * 3) / 4); - const buf = randomBytes(numBytes).toString('base64'); - - return toBase64UrlSafe(buf).substring(0, size); -}; - -/** - * Converts a base64 url safe string to uuid v4 - * - * @example in: `8yqR2seZThOqF4xNngMjyQ` out: `f32a91da-c799-4e13-aa17-8c4d9e0323c9` - */ -export function base64UrlSafetoUUID(base64UrlSafe: string): string { - const hex = Buffer.from(fromBase64UrlSafe(base64UrlSafe), 'base64').toString('hex'); - - // eslint-disable-next-line max-len - return `${hex.substring(0, 8)}-${hex.substring(8, 12)}-${hex.substring(12, 16)}-${hex.substring(16, 20)}-${hex.substring(20)}`; -} - -/** - * Extracts a send ID from the provided parameter. If the parameter is not a valid UUIDv4, - * it converts the parameter from a Base64 URL-safe string to a UUID. - * - * @param param - The input parameter, which can be either a UUIDv4 or a Base64 URL-safe string. - * @returns The send ID as a UUID string. - */ -export const decodeSendId = (param: string) => { - if (!validateUuidv4(param)) { - return base64UrlSafetoUUID(param); - } - return param; -}; - -/** - * Encodes a send ID by removing hyphens, converting it from hexadecimal to Base64, - * and then making it URL-safe. - * - * @param sendId - The send ID to be encoded, expected to be a UUID string. - * @returns The encoded send ID as a URL-safe Base64 string. - */ -export const encodeSendId = (sendId: string) => { - if (!validateUuidv4(sendId)) { - throw new Error('Send id is not valid'); - } - const removedUuidDecoration = sendId.replace(/-/g, ''); - const base64endoded = Buffer.from(removedUuidDecoration, 'hex').toString('base64'); - const encodedSendId = toBase64UrlSafe(base64endoded); - return encodedSendId; -}; diff --git a/src/services/upload.service.ts b/src/services/upload.service.ts index ff4db12..55214e8 100644 --- a/src/services/upload.service.ts +++ b/src/services/upload.service.ts @@ -2,13 +2,12 @@ import { randomBytes } from 'crypto'; import { queue, QueueObject } from 'async'; import { generateMnemonic } from 'bip39'; import axios from 'axios'; -import { aes } from '@internxt/lib'; +import { aes, stringUtils } from '@internxt/lib'; import { MAX_ITEMS_PER_LINK, MAX_BYTES_PER_SEND } from '../constants'; import { NetworkService } from './network.service'; import { SendItemData } from '../models/SendItem'; import { getCaptchaToken } from '../lib/auth'; -import { encodeSendId, generateRandomStringUrlSafe } from '../lib/stringUtils'; import envService from './env.service'; interface FileWithNetworkId extends File { @@ -91,7 +90,7 @@ export class UploadService { const sendLinksFiles = await UploadService.uploadFiles(itemFiles, opts); const items = [...sendLinksFolders, ...sendLinksFiles]; const randomMnemonic = generateMnemonic(256); - const code = generateRandomStringUrlSafe(8); + const code = stringUtils.generateRandomStringUrlSafe(8); const encryptedCode = aes.encrypt(code, randomMnemonic); const encryptedMnemonic = aes.encrypt(randomMnemonic, code); @@ -112,7 +111,7 @@ export class UploadService { const createSendLinkResponse = await UploadService.storeSendLinks(createSendLinksPayload); - const encodedSendId = encodeSendId(createSendLinkResponse.id); + const encodedSendId = stringUtils.encodeV4Uuid(createSendLinkResponse.id); return `${originUrl}/d/${encodedSendId}/${code}`; } diff --git a/src/views/DownloadView.tsx b/src/views/DownloadView.tsx index d5127a9..36a29e5 100644 --- a/src/views/DownloadView.tsx +++ b/src/views/DownloadView.tsx @@ -16,7 +16,7 @@ import { getAllItemsList } from '../services/items.service'; import { ProgressOptions } from '../services/network.service'; import SendBanner from '../components/SendBanner'; import moment from 'moment'; -import { decodeSendId } from '../lib/stringUtils'; +import { stringUtils } from '@internxt/lib'; export default function DownloadView() { const [state, setState] = useState< @@ -33,7 +33,7 @@ export default function DownloadView() { const params = useParams(); - const sendId = decodeSendId(params.sendId ?? ''); + const sendId = stringUtils.decodeV4Uuid(params.sendId ?? ''); const router = useNavigate(); diff --git a/yarn.lock b/yarn.lock index 44ecd88..f54c1b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -820,10 +820,12 @@ eslint-config-prettier "^10.1.8" typescript-eslint "^8.40.0" -"@internxt/lib@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@internxt/lib/-/lib-1.3.1.tgz#7ba42996afe5c91e2badf3f6a02cedaa1671f4ee" - integrity sha512-3VWPRi0G8F7QR2pP+M7lM3Resw9zGSF0dFpE86pV7VyJt2WtxJW08AdxikjaBWR6knTHLU7BZPpnKQmUD/GFnw== +"@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#v1.0.2": version "1.0.2" @@ -837,6 +839,30 @@ axios "^1.12.2" uuid "11.1.0" +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" + integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== + dependencies: + "@isaacs/balanced-match" "^4.0.1" + +"@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" @@ -1846,19 +1872,24 @@ 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.0.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== -ansi-styles@^4.1.0: +ansi-styles@^4.0.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.2.1: +ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== @@ -2622,6 +2653,11 @@ 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== + electron-to-chromium@^1.5.238: version "1.5.241" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz#350a2cdcde43829d36af245a27167243e917c6ed" @@ -2645,6 +2681,16 @@ 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== + enhanced-resolve@^5.18.3: version "5.18.3" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" @@ -3051,6 +3097,14 @@ for-each@^0.3.5: dependencies: is-callable "^1.2.7" +foreground-child@^3.3.1: + 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.4: version "4.0.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" @@ -3140,6 +3194,18 @@ glob-to-regexp@0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" + integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== + dependencies: + foreground-child "^3.3.1" + jackspeak "^4.1.1" + minimatch "^10.0.3" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -3432,6 +3498,11 @@ is-extglob@^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: version "5.1.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" @@ -3564,6 +3635,13 @@ istanbul-reports@^3.2.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" + integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + javascript-obfuscator@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz#489dec97d25bf74e4fd1a20139127eb775318ee2" @@ -3860,7 +3938,7 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^11.2.1, lru-cache@^11.2.2: +lru-cache@^11.0.0, lru-cache@^11.2.1, lru-cache@^11.2.2: version "11.2.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.2.tgz#40fd37edffcfae4b2940379c0722dc6eeaa75f24" integrity sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg== @@ -4298,6 +4376,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" + integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== + dependencies: + "@isaacs/brace-expansion" "^5.0.0" + minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4312,6 +4397,11 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mkdirp@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.3.tgz#b083ff37be046fd3d6552468c1f0ff44c1545d1f" @@ -4499,6 +4589,11 @@ 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: + 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== + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -4572,6 +4667,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" @@ -4912,6 +5015,14 @@ rfdc@^1.4.1: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rimraf@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.0.tgz#b9168360a26e10ffaca0c8b803f47069f99ca47e" + integrity sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A== + dependencies: + glob "^11.0.3" + package-json-from-dist "^1.0.1" + ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" @@ -5126,7 +5237,7 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^4.1.0: +signal-exit@^4.0.1, 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== @@ -5225,6 +5336,33 @@ string-template@1.0.0: resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" integrity sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg== +"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" @@ -5271,7 +5409,21 @@ stringz@2.1.0: dependencies: char-regex "^1.0.2" -strip-ansi@^7.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: version "7.1.2" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== @@ -5612,7 +5764,7 @@ util@0.12.5, util@^0.12.0, util@^0.12.4, util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -uuid@11.1.0: +uuid@11.1.0, 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== @@ -5809,6 +5961,24 @@ wrangler@4.45.2: optionalDependencies: fsevents "~2.3.2" +"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"