diff --git a/.changeset/brave-otters-return.md b/.changeset/brave-otters-return.md new file mode 100644 index 00000000..7216c520 --- /dev/null +++ b/.changeset/brave-otters-return.md @@ -0,0 +1,16 @@ +--- +"@naverpay/safe-html-react-parser": major +--- + +[safe-html-react-parser] isomorphic-dompurify로 마이그레이션 + +업스트림 메모리 누수 이슈([kkomelin/isomorphic-dompurify#368](https://github.com/kkomelin/isomorphic-dompurify/issues/368))를 우회하기 위해 도입했던 커스텀 DOMPurify 래퍼(jsdom/happy-dom/linkedom 중 선택 지원, LRU 캐시, recreate interval 등)를 제거하고, 누수가 해결된 `isomorphic-dompurify`를 직접 사용하도록 단순화합니다. + +**Breaking Changes** + +- `configureDOMPurify` 함수 export 제거 +- `SafeParseOptions.domPurifyOptions` 옵션 제거 +- `DOMWindow`, `DOMWindowFactory`, `DOMPurifyOptions` 타입 export 제거 +- `jsdom` / `happy-dom` / `linkedom` 피어 의존성 제거 (별도 설치 불필요) + +Issue: [#202](https://github.com/NaverPayDev/pie/issues/202) diff --git a/packages/safe-html-react-parser/package.json b/packages/safe-html-react-parser/package.json index 2e6f22dc..ca72c387 100644 --- a/packages/safe-html-react-parser/package.json +++ b/packages/safe-html-react-parser/package.json @@ -19,35 +19,17 @@ ], "author": "@NaverPayDev/frontend", "dependencies": { - "dompurify": "^3.3.0", - "html-react-parser": "^5.2.7" + "html-react-parser": "^5.2.7", + "isomorphic-dompurify": "^3.12.0" }, "devDependencies": { - "@types/jsdom": "^27.0.0", "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", - "happy-dom": "^17.4.4", - "jsdom": "^27.2.0", - "linkedom": "^0.18.12", "react": "0.14 || 15 || 16 || 17 || 18 || 19" }, "peerDependencies": { "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", - "happy-dom": "^17.4.4", - "jsdom": "^27.2.0", - "linkedom": "^0.18.12", "react": "0.14 || 15 || 16 || 17 || 18 || 19" }, - "peerDependenciesMeta": { - "jsdom": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "linkedom": { - "optional": true - } - }, "scripts": { "clean": "rm -rf dist", "build": "npm run clean && vite build", diff --git a/packages/safe-html-react-parser/src/index.ts b/packages/safe-html-react-parser/src/index.ts index 2a1f0018..3f61e73a 100644 --- a/packages/safe-html-react-parser/src/index.ts +++ b/packages/safe-html-react-parser/src/index.ts @@ -4,14 +4,10 @@ */ import * as htmlReactParser from 'html-react-parser' -import {sanitizeHtml, type SanitizerOptions as DOMPurifyOptionsType, type SanitizeConfig} from './utils/dompurify' +import {sanitizeHtml, type SanitizeConfig} from './utils/dompurify' import type {DOMNode, HTMLReactParserOptions} from 'html-react-parser' -// Re-export configuration function -export {configureDOMPurify} from './utils/dompurify' -export type {DOMWindow, DOMWindowFactory, SanitizerOptions as DOMPurifyOptions} from './utils/dompurify' - // Solving the issue of html-react-parser re-exporting cjs modules in esm // In CJS: htmlReactParser.default.default is the actual function // In ESM: htmlReactParser.default is the function @@ -28,20 +24,6 @@ export interface SafeParseOptions extends HTMLReactParserOptions { * Custom tag preservation option (temporary conversion before and after DOMPurify processing) */ preserveCustomTags?: string[] - /** - * Server-side DOMPurify options (DOM implementation, caching, etc.) - * Only used on server-side. Ignored on client-side. - * - * @example - * import { Window } from 'happy-dom' - * safeParse(html, { - * domPurifyOptions: { - * domWindowFactory: () => new Window(), - * enableCache: true - * } - * }) - */ - domPurifyOptions?: DOMPurifyOptionsType } export const DEFAULT_SANITIZE_CONFIG: SanitizeConfig = { @@ -80,7 +62,7 @@ export const DEFAULT_SANITIZE_CONFIG: SanitizeConfig = { * @returns Parsed React elements */ export function safeParse(htmlString: string, options: SafeParseOptions = {}) { - const {sanitizeConfig = DEFAULT_SANITIZE_CONFIG, preserveCustomTags, domPurifyOptions, ...parserOptions} = options + const {sanitizeConfig = DEFAULT_SANITIZE_CONFIG, preserveCustomTags, ...parserOptions} = options // Temporarily convert custom tags to safe tags to preserve them during DOMPurify processing const processedHtml = @@ -92,7 +74,7 @@ export function safeParse(htmlString: string, options: SafeParseOptions = {}) { htmlString, ) || htmlString - const sanitizedHtml = sanitizeHtml(processedHtml, sanitizeConfig, domPurifyOptions) + const sanitizedHtml = sanitizeHtml(processedHtml, sanitizeConfig) if (!sanitizedHtml) { return null diff --git a/packages/safe-html-react-parser/src/utils/dompurify.ts b/packages/safe-html-react-parser/src/utils/dompurify.ts index ef2d99b4..06cba7b7 100644 --- a/packages/safe-html-react-parser/src/utils/dompurify.ts +++ b/packages/safe-html-react-parser/src/utils/dompurify.ts @@ -1,280 +1,11 @@ -import createDOMPurify from 'dompurify' +import DOMPurify from 'isomorphic-dompurify' -import {LRUCache} from './lru-cache' - -import type {Window as HappyDOMWindow} from 'happy-dom' -import type {JSDOM, DOMWindow as JSDOMWindow} from 'jsdom' -import type {parseHTML} from 'linkedom' - -/** - * DOM Window types from supported libraries - * - jsdom: JSDOM Window - * - happy-dom: Window - * - linkedom: parseHTML result - * - * @example - * import { JSDOM } from 'jsdom' - * const jsdomWindow: DOMWindow = new JSDOM('') - * - * @example - * import { Window } from 'happy-dom' - * const happyDomWindow: DOMWindow = new Window() - * - * @example - * import { parseHTML } from 'linkedom' - * const linkedomWindow: DOMWindow = parseHTML('') - */ -export type DOMWindow = JSDOMWindow | HappyDOMWindow | ReturnType - -/** - * DOM instance types that can be provided directly or via factory - */ -export type DOMInstance = JSDOM | HappyDOMWindow | ReturnType - -/** - * Factory function to create a DOM window instance, or the instance itself - * - jsdom: JSDOM instance or factory returning JSDOM - * - happy-dom: Window instance or factory returning Window - * - linkedom: parseHTML result or factory returning parseHTML result - * - * @example - * // Direct instance - * domWindowFactory: new Window() - * - * @example - * // Factory function - * domWindowFactory: () => new Window() - */ -export type DOMWindowFactory = (() => DOMInstance) | DOMInstance - -export interface SanitizerOptions { - /** - * Interval for recreating the DOMPurify instance to prevent memory leaks - * Default is 1000 sanitization calls - */ - recreateInterval?: number - /** - * Enable caching of sanitized results to improve performance - * Default is true - */ - enableCache?: boolean - /** - * Maximum size of the cache - * Default is 100 entries - */ - maxCacheSize?: number - /** - * Custom DOM window factory for server-side rendering - * Supports jsdom, happy-dom, linkedom, or any compatible DOM implementation - * - * @example - * // Using jsdom - * import { JSDOM } from 'jsdom' - * configureDOMPurify({ domWindowFactory: () => new JSDOM('') }) - * - * @example - * // Using happy-dom - * import { Window } from 'happy-dom' - * configureDOMPurify({ domWindowFactory: () => new Window() }) - * - * @example - * // Using linkedom - * import { parseHTML } from 'linkedom' - * configureDOMPurify({ domWindowFactory: () => parseHTML('') }) - */ - domWindowFactory?: DOMWindowFactory -} - -export type DomPurify = ReturnType +export type DomPurify = typeof DOMPurify type SanitizeParams = Parameters export type DirtyHtml = SanitizeParams[0] export type SanitizeConfig = SanitizeParams[1] -class OptimizedDOMPurify { - recreateInterval: number - domInstance: {window: DOMWindow} | null - domWindowFactory: DOMWindowFactory - purify: ReturnType | null - callCount: number - enableCache: boolean - cache: LRUCache | null - maxCacheSize: number - - constructor(options: SanitizerOptions = {}) { - this.recreateInterval = options?.recreateInterval || 1000 - this.enableCache = options?.enableCache !== false // Default true - this.maxCacheSize = options?.maxCacheSize || 100 - this.cache = this.enableCache ? new LRUCache(this.maxCacheSize) : null - - if (!options?.domWindowFactory) { - throw new Error( - 'No DOM implementation configured for server-side rendering.\n' + - 'Please configure DOMPurify with one of the following:\n\n' + - ' import { configureDOMPurify } from "@naverpay/safe-html-react-parser"\n' + - ' import { JSDOM } from "jsdom"\n' + - ' configureDOMPurify({ domWindowFactory: () => new JSDOM("") })\n\n' + - 'Or use happy-dom for better performance:\n' + - ' import { Window } from "happy-dom"\n' + - ' configureDOMPurify({ domWindowFactory: () => new Window() })\n\n' + - 'Or use linkedom for minimal footprint:\n' + - ' import { parseHTML } from "linkedom"\n' + - ' configureDOMPurify({ domWindowFactory: () => parseHTML("") })', - ) - } - - this.domWindowFactory = options.domWindowFactory - - this.domInstance = null - this.purify = null - this.callCount = 0 - - this.initialize() - } - - initialize() { - // Cleanup previous instance - if (this.domInstance?.window) { - try { - const doc = this.domInstance.window.document - if (doc.body) { - doc.body.innerHTML = '' - } - if (doc.head) { - doc.head.innerHTML = '' - } - if (doc.documentElement) { - doc.documentElement.innerHTML = '' - } - } catch { - // ignore cleanup errors - } - - const win = this.domInstance.window as unknown as {close?: () => void} - if (typeof win.close === 'function') { - win.close() - } - } - - this.purify = null - this.domInstance = null - - if (global.gc && typeof global.gc === 'function') { - global.gc() - } - - const result = typeof this.domWindowFactory === 'function' ? this.domWindowFactory() : this.domWindowFactory - this.domInstance = 'window' in result ? (result as {window: DOMWindow}) : {window: result} - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.purify = createDOMPurify(this.domInstance.window as any) - this.callCount = 0 - - if (this.cache) { - this.cache.clear() - } - } - - sanitize(dirty: DirtyHtml, config?: SanitizeConfig) { - if (this.enableCache && !config && this.cache) { - // Serialize Node to string for consistent cache key - const cacheKey = typeof dirty === 'string' ? dirty : dirty.toString() - const cached = this.cache.get(cacheKey) - if (cached) { - return cached - } - } - - const cleanHtml = this.purify?.sanitize(dirty, config) - - if (this.enableCache && !config && this.cache && cleanHtml) { - const cacheKey = typeof dirty === 'string' ? dirty : dirty.toString() - this.cache.set(cacheKey, cleanHtml) - } - - this.callCount++ - if (this.callCount >= this.recreateInterval) { - this.initialize() - } - - return cleanHtml - } - - cleanup() { - if (this.domInstance?.window) { - const win = this.domInstance.window as unknown as {close?: () => void} - if (typeof win.close === 'function') { - win.close() - } - } - if (this.cache) { - this.cache.clear() - } - this.domInstance = null - this.purify = null - } -} - -let instance: OptimizedDOMPurify | null = null - -function getSanitizer(options?: SanitizerOptions) { - if (!instance) { - instance = new OptimizedDOMPurify(options) - } - return instance -} - -/** - * Configure DOMPurify settings globally (optional) - * Alternatively, you can pass options directly to sanitizeHtml - * - * @example - * // Using jsdom - * import { JSDOM } from 'jsdom' - * configureDOMPurify({ - * domWindowFactory: () => new JSDOM(''), - * enableCache: true, - * maxCacheSize: 100 - * }) - * - * @example - * // Using happy-dom for better performance - * import { Window } from 'happy-dom' - * configureDOMPurify({ - * domWindowFactory: () => new Window(), - * recreateInterval: 500 - * }) - */ -export function configureDOMPurify(options: SanitizerOptions) { - // Reset instance to apply new configuration - if (instance) { - instance.cleanup() - instance = null - } - // Create new instance with provided options - instance = new OptimizedDOMPurify(options) -} - -/** - * Sanitize HTML string using DOMPurify - * - * @param dirty - HTML string to sanitize - * @param config - DOMPurify configuration - * @param options - Server-side options (DOM implementation, caching, etc.) - * - * @example - * // Client-side (automatic) - * sanitizeHtml('

Hello

') - * - * @example - * // Server-side with custom DOM - * import { Window } from 'happy-dom' - * sanitizeHtml('

Hello

', undefined, { - * domWindowFactory: () => new Window(), - * enableCache: true - * }) - */ -export function sanitizeHtml(dirty: DirtyHtml, config?: SanitizeConfig, options?: SanitizerOptions) { - const isClientSide = typeof window !== 'undefined' - const sanitizer = isClientSide ? createDOMPurify : getSanitizer(options) - return sanitizer.sanitize(dirty, config) +export function sanitizeHtml(dirty: DirtyHtml, config?: SanitizeConfig) { + return DOMPurify.sanitize(dirty as string, config) } diff --git a/packages/safe-html-react-parser/src/utils/lru-cache.ts b/packages/safe-html-react-parser/src/utils/lru-cache.ts deleted file mode 100644 index 6e720ea1..00000000 --- a/packages/safe-html-react-parser/src/utils/lru-cache.ts +++ /dev/null @@ -1,47 +0,0 @@ -export class LRUCache { - private cache: Map - private maxSize: number - - constructor(maxSize: number) { - this.cache = new Map() - this.maxSize = maxSize - } - - get(key: K): V | undefined { - if (!this.cache.has(key)) { - return undefined - } - // Move to end (most recently used) - const value = this.cache.get(key)! - this.cache.delete(key) - this.cache.set(key, value) - return value - } - - set(key: K, value: V): void { - // Remove if exists to reinsert at end - if (this.cache.has(key)) { - this.cache.delete(key) - } - // Evict oldest if at capacity - else if (this.cache.size >= this.maxSize) { - const firstKey = this.cache.keys().next().value - if (firstKey !== undefined) { - this.cache.delete(firstKey) - } - } - this.cache.set(key, value) - } - - has(key: K): boolean { - return this.cache.has(key) - } - - clear(): void { - this.cache.clear() - } - - get size(): number { - return this.cache.size - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e6c68e7..4be9f892 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,28 +249,16 @@ importers: packages/safe-html-react-parser: dependencies: - dompurify: - specifier: ^3.3.0 - version: 3.3.0 html-react-parser: specifier: ^5.2.7 version: 5.2.7(@types/react@18.3.20)(react@18.3.1) + isomorphic-dompurify: + specifier: ^3.12.0 + version: 3.12.0 devDependencies: - '@types/jsdom': - specifier: ^27.0.0 - version: 27.0.0 '@types/react': specifier: 0.14 || 15 || 16 || 17 || 18 || 19 version: 18.3.20 - happy-dom: - specifier: ^17.4.4 - version: 17.4.4 - jsdom: - specifier: ^27.2.0 - version: 27.2.0(postcss@8.5.3) - linkedom: - specifier: ^0.18.12 - version: 0.18.12 react: specifier: 0.14 || 15 || 16 || 17 || 18 || 19 version: 18.3.1 @@ -305,7 +293,7 @@ importers: version: 22.14.0 vitest: specifier: ^3.1.1 - version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@27.2.0(postcss@8.5.3))(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@29.1.1)(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) packages/utils: devDependencies: @@ -317,7 +305,7 @@ importers: version: 17.4.4 vitest: specifier: ^3.1.1 - version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@27.2.0(postcss@8.5.3))(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@29.1.1)(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) packages/vanilla-store: devDependencies: @@ -335,7 +323,7 @@ importers: version: 18.3.1 vitest: specifier: ^3.1.1 - version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@27.2.0(postcss@8.5.3))(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@29.1.1)(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1) packages: @@ -343,9 +331,6 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@acemir/cssom@0.9.23': - resolution: {integrity: sha512-2kJ1HxBKzPLbmhZpxBiTZggjtgCwKg1ma5RHShxvd6zgqhDEdEkzpiwe7jLkI2p2BrZvFCXIihdoMkl1H39VnA==} - '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -421,11 +406,17 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@4.0.5': - resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.7.4': - resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==} + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -1194,6 +1185,10 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@bufbuild/protobuf@2.2.3': resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==} @@ -1271,39 +1266,41 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@5.1.0': - resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} - engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@3.1.0': - resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} - engines: {node: '>=18'} + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.14': - resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} peerDependencies: - postcss: ^8.4 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} @@ -1909,6 +1906,15 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} @@ -3350,9 +3356,6 @@ packages: '@types/jest@29.5.12': resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - '@types/jsdom@27.0.0': - resolution: {integrity: sha512-NZyFl/PViwKzdEkQg96gtnB8wm+1ljhdDay9ahn4hgb+SfVtPCbm3TlmDUFXTA+MGN3CijicnMhG18SI5H3rFw==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3472,9 +3475,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3565,6 +3565,7 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vitejs/plugin-react@4.6.0': resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} @@ -3710,10 +3711,6 @@ packages: resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -4607,8 +4604,8 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.1.0: @@ -4652,13 +4649,6 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@5.3.3: - resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==} - engines: {node: '>=20'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4678,9 +4668,9 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-urls@6.0.0: - resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} - engines: {node: '>=20'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} @@ -4918,8 +4908,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.3.0: - resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -5025,6 +5015,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5735,20 +5729,23 @@ packages: glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.0.1: resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -5915,9 +5912,9 @@ packages: html-dom-parser@5.1.1: resolution: {integrity: sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-entities@2.5.2: resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} @@ -5925,9 +5922,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} @@ -5992,10 +5986,6 @@ packages: http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-proxy-middleware@2.0.6: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -6017,10 +6007,6 @@ packages: resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} engines: {node: '>= 6.0.0'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -6041,10 +6027,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -6427,6 +6409,10 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-dompurify@3.12.0: + resolution: {integrity: sha512-8n+j+6ypTHvriJwFOQ2qusQ6bzGjZVcR3jbe1pBpLcGI1dn4WIl0ctLBngqE5QttquQBAlKXwJeTMw+X7x7qKw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -6636,9 +6622,9 @@ packages: '@babel/preset-env': optional: true - jsdom@27.2.0: - resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -6755,15 +6741,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkedom@0.18.12: - resolution: {integrity: sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==} - engines: {node: '>=16'} - peerDependencies: - canvas: '>= 2' - peerDependenciesMeta: - canvas: - optional: true - linkify-it@4.0.1: resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} @@ -6862,14 +6839,14 @@ packages: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} - engines: {node: 20 || >=22} - lru-cache@11.2.2: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -7029,8 +7006,8 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} @@ -7629,8 +7606,8 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -9314,6 +9291,7 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -9436,8 +9414,8 @@ packages: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} tr46@0.0.3: @@ -9683,9 +9661,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - uhyphen@0.2.0: - resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -9699,6 +9674,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -9855,10 +9834,12 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -9997,8 +9978,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} webpack-bundle-analyzer@4.10.2: @@ -10075,22 +10056,18 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@15.1.0: - resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -10293,8 +10270,6 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@acemir/cssom@0.9.23': {} - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) @@ -10408,21 +10383,23 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@asamuzakjp/css-color@4.0.5': + '@asamuzakjp/css-color@5.1.11': dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@asamuzakjp/dom-selector@6.7.4': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.2 + + '@asamuzakjp/generational-cache@1.0.1': {} '@asamuzakjp/nwsapi@2.3.9': {} @@ -11457,6 +11434,10 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@bufbuild/protobuf@2.2.3': {} '@changesets/apply-release-plan@7.0.0': @@ -11589,7 +11570,7 @@ snapshots: '@changesets/parse@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 '@changesets/pre@2.0.0': @@ -11637,29 +11618,29 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.0.2': {} - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.3)': - dependencies: - postcss: 8.5.3 + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 - '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} '@discoveryjs/json-ext@0.5.7': {} @@ -13171,6 +13152,8 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@exodus/bytes@1.15.0': {} + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} '@floating-ui/core@1.6.0': @@ -15191,12 +15174,6 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 - '@types/jsdom@27.0.0': - dependencies: - '@types/node': 22.14.0 - '@types/tough-cookie': 4.0.5 - parse5: 7.1.2 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -15320,8 +15297,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/tough-cookie@4.0.5': {} - '@types/trusted-types@2.0.7': optional: true @@ -15624,8 +15599,6 @@ snapshots: agent-base@5.1.1: {} - agent-base@7.1.4: {} - aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -16670,9 +16643,9 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.1 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 css-what@6.1.0: {} @@ -16741,16 +16714,6 @@ snapshots: dependencies: css-tree: 2.2.1 - cssom@0.5.0: {} - - cssstyle@5.3.3(postcss@8.5.3): - dependencies: - '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.3) - css-tree: 3.1.0 - transitivePeerDependencies: - - postcss - csstype@3.1.3: {} csv-generate@3.4.3: {} @@ -16768,10 +16731,12 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-urls@6.0.0: + data-urls@7.0.0: dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' data-view-buffer@1.0.2: dependencies: @@ -16978,7 +16943,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.3.0: + dompurify@3.4.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -17082,6 +17047,8 @@ snapshots: entities@6.0.1: {} + entities@8.0.0: {} + env-paths@2.2.1: {} envinfo@7.12.0: {} @@ -18359,16 +18326,16 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.0.0 - html-encoding-sniffer@4.0.0: + html-encoding-sniffer@6.0.0: dependencies: - whatwg-encoding: 3.1.1 + '@exodus/bytes': 1.15.0 + transitivePeerDependencies: + - '@noble/hashes' html-entities@2.5.2: {} html-escaper@2.0.2: {} - html-escaper@3.0.3: {} - html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 @@ -18465,13 +18432,6 @@ snapshots: http-parser-js@0.5.8: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - http-proxy-middleware@2.0.6(@types/express@4.17.21)(debug@4.4.0): dependencies: '@types/http-proxy': 1.17.14 @@ -18504,13 +18464,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - human-id@1.0.2: {} human-signals@2.1.0: {} @@ -18523,10 +18476,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): dependencies: postcss: 8.5.3 @@ -18826,6 +18775,14 @@ snapshots: isobject@3.0.1: {} + isomorphic-dompurify@3.12.0: + dependencies: + dompurify: 3.4.2 + jsdom: 29.1.1 + transitivePeerDependencies: + - '@noble/hashes' + - canvas + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -19263,33 +19220,31 @@ snapshots: transitivePeerDependencies: - supports-color - jsdom@27.2.0(postcss@8.5.3): + jsdom@29.1.1: dependencies: - '@acemir/cssom': 0.9.23 - '@asamuzakjp/dom-selector': 6.7.4 - cssstyle: 5.3.3(postcss@8.5.3) - data-urls: 6.0.0 + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0 + css-tree: 3.2.1 + data-urls: 7.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 + lru-cache: 11.3.6 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 + tough-cookie: 6.0.1 + undici: 7.25.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - postcss - - supports-color - - utf-8-validate + - '@noble/hashes' jsesc@0.5.0: {} @@ -19387,14 +19342,6 @@ snapshots: lines-and-columns@1.2.4: {} - linkedom@0.18.12: - dependencies: - css-select: 5.1.0 - cssom: 0.5.0 - html-escaper: 3.0.3 - htmlparser2: 10.0.0 - uhyphen: 0.2.0 - linkify-it@4.0.1: dependencies: uc.micro: 1.0.6 @@ -19502,10 +19449,10 @@ snapshots: lru-cache@10.2.0: {} - lru-cache@11.0.2: {} - lru-cache@11.2.2: {} + lru-cache@11.3.6: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -19789,7 +19736,7 @@ snapshots: mdn-data@2.0.30: {} - mdn-data@2.12.2: {} + mdn-data@2.27.1: {} mdurl@1.0.1: {} @@ -20559,9 +20506,9 @@ snapshots: dependencies: entities: 4.5.0 - parse5@8.0.0: + parse5@8.0.1: dependencies: - entities: 6.0.1 + entities: 8.0.0 parseurl@1.3.3: {} @@ -20595,7 +20542,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.0.2 + lru-cache: 11.2.2 minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -22508,7 +22455,7 @@ snapshots: dependencies: nopt: 1.0.10 - tough-cookie@6.0.0: + tough-cookie@6.0.1: dependencies: tldts: 7.0.17 @@ -22751,8 +22698,6 @@ snapshots: uglify-js@3.17.4: optional: true - uhyphen@0.2.0: {} - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 @@ -22766,6 +22711,8 @@ snapshots: undici-types@6.21.0: {} + undici@7.25.0: {} + unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -23012,7 +22959,7 @@ snapshots: sass-embedded: 1.85.1 terser: 5.28.1 - vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@27.2.0(postcss@8.5.3))(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1): + vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@1.21.0)(jsdom@29.1.1)(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1): dependencies: '@vitest/expect': 3.1.1 '@vitest/mocker': 3.1.1(vite@6.2.0(@types/node@22.14.0)(jiti@1.21.0)(sass-embedded@1.85.1)(sass@1.75.0)(terser@5.28.1)) @@ -23038,7 +22985,7 @@ snapshots: '@types/debug': 4.1.12 '@types/node': 22.14.0 happy-dom: 17.4.4 - jsdom: 27.2.0(postcss@8.5.3) + jsdom: 29.1.1 transitivePeerDependencies: - jiti - less @@ -23082,7 +23029,7 @@ snapshots: webidl-conversions@7.0.0: {} - webidl-conversions@8.0.0: {} + webidl-conversions@8.0.1: {} webpack-bundle-analyzer@4.10.2: dependencies: @@ -23348,18 +23295,17 @@ snapshots: websocket-extensions@0.1.4: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} - whatwg-url@15.1.0: + whatwg-url@16.0.1: dependencies: + '@exodus/bytes': 1.15.0 tr46: 6.0.0 - webidl-conversions: 8.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' whatwg-url@5.0.0: dependencies: