diff --git a/CHANGELOG.md b/CHANGELOG.md index d626ae83..29d16486 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ v5.4.0 * Add support for `import attributes`. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1256 * Fixed `reservedNames` not preserving class method and property names when `stringArray` or `deadCodeInjection` is enabled. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1279 * Replaced `mkdirp` dependency with native `fs.mkdirSync({ recursive: true })`. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1275. Thank you https://github.com/roli-lpci! +* Replaced `conf` dependency with custom implementation using `env-paths` and native `fs` v5.3.1 --- diff --git a/package.json b/package.json index ecbf746c..70760a6b 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "chance": "1.1.13", "class-validator": "0.14.3", "commander": "12.1.0", - "conf": "15.0.2", + "env-paths": "4.0.0", "eslint-scope": "8.4.0", "eslint-visitor-keys": "4.2.1", "fast-deep-equal": "3.1.3", diff --git a/src/utils/AdvertisementUtils.ts b/src/utils/AdvertisementUtils.ts index f9c5c600..992e09a0 100644 --- a/src/utils/AdvertisementUtils.ts +++ b/src/utils/AdvertisementUtils.ts @@ -1,3 +1,10 @@ +import { Utils } from './Utils'; + +interface IConfigData { + adDisplayCount?: number; + adFirstDisplayTime?: number; +} + /** * Utility class for managing PRO advertisement display * - Limits display to first N times @@ -10,16 +17,6 @@ export class AdvertisementUtils { */ private static readonly maxDisplayCount: number = 5; - /** - * Storage key for the display count - */ - private static readonly storageKey: string = 'adDisplayCount'; - - /** - * Storage key for the timestamp of first display - */ - private static readonly timestampKey: string = 'adFirstDisplayTime'; - /** * Reset period in milliseconds (3 days) */ @@ -53,9 +50,14 @@ export class AdvertisementUtils { ]; /** - * Cached conf instance + * Config directory name for env-paths */ - private static config: any = null; + private static readonly projectName: string = 'javascript-obfuscator'; + + /** + * Cached config file path + */ + private static configPath: string | null = null; /** * Check if running in a CI environment @@ -98,36 +100,27 @@ export class AdvertisementUtils { return false; } - // Initialize config if needed - const config = this.getConfig(); - - if (!config) { - return false; - } - - // Check if reset period has passed (3 days) - const firstDisplayTime = this.getFirstDisplayTime(config); + const data = this.readConfig(); const now = Date.now(); - if (firstDisplayTime && now - firstDisplayTime >= this.resetPeriodMs) { - // Reset counter after 3 days - this.resetDisplayData(config); + // Check if reset period has passed (3 days) + if (data.adFirstDisplayTime && now - data.adFirstDisplayTime >= this.resetPeriodMs) { + data.adDisplayCount = 0; + data.adFirstDisplayTime = undefined; } - // Check display count - const count = this.getDisplayCount(config); + const count = data.adDisplayCount ?? 0; if (count >= this.maxDisplayCount) { return false; } - // Set first display time if not set - if (!firstDisplayTime || now - firstDisplayTime >= this.resetPeriodMs) { - this.setFirstDisplayTime(config, now); + if (!data.adFirstDisplayTime) { + data.adFirstDisplayTime = now; } - // Increment count for next time - this.setDisplayCount(config, count + 1); + data.adDisplayCount = count + 1; + this.writeConfig(data); return true; } @@ -140,87 +133,44 @@ export class AdvertisementUtils { } /** - * Get or create conf instance + * Get the config file path */ - private static getConfig(): any { - if (this.config) { - return this.config; + private static getConfigPath(): string { + if (!this.configPath) { + const envPaths = Utils.nodeRequire('env-paths').default; + const fs = Utils.nodeRequire('fs'); + const path = Utils.nodeRequire('path'); + const configDir: string = envPaths(this.projectName).config; + + fs.mkdirSync(configDir, { recursive: true }); + this.configPath = path.join(configDir, 'config.json'); } - if (typeof window === 'undefined') { - try { - // Dynamic import to avoid bundling in browser - // eslint-disable-next-line no-eval - const Conf = eval('require')('conf').default; - - this.config = new Conf({ - projectName: 'javascript-obfuscator' - }); - - return this.config; - } catch { - return null; - } - } - - return null; + return this.configPath!; } /** - * Get current display count from config + * Read config data from disk */ - private static getDisplayCount(config: any): number { + private static readConfig(): IConfigData { try { - const count = config.get(this.storageKey, 0); + const fs = Utils.nodeRequire('fs'); + const raw = fs.readFileSync(this.getConfigPath(), 'utf8'); - return typeof count === 'number' ? count : 0; + return JSON.parse(raw); } catch { - return 0; + return {}; } } /** - * Set display count in config + * Write config data to disk */ - private static setDisplayCount(config: any, count: number): void { + private static writeConfig(data: IConfigData): void { try { - config.set(this.storageKey, count); - } catch { - // Ignore errors - } - } + const fs = Utils.nodeRequire('fs'); - /** - * Get first display timestamp from config - */ - private static getFirstDisplayTime(config: any): number | null { - try { - const timestamp = config.get(this.timestampKey, null); - - return typeof timestamp === 'number' ? timestamp : null; - } catch { - return null; - } - } - - /** - * Set first display timestamp in config - */ - private static setFirstDisplayTime(config: any, timestamp: number): void { - try { - config.set(this.timestampKey, timestamp); - } catch { - // Ignore errors - } - } - - /** - * Reset display data (count and timestamp) - */ - private static resetDisplayData(config: any): void { - try { - config.delete(this.storageKey); - config.delete(this.timestampKey); + fs.writeFileSync(this.getConfigPath(), JSON.stringify(data)); } catch { // Ignore errors } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index fc44fa20..9800c807 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -9,6 +9,13 @@ export class Utils { */ public static readonly hexadecimalPrefix: string = '0x'; + /** + * Dynamic require that bypasses webpack bundling. + * Use for Node.js-only modules that should not be included in the browser build. + */ + // eslint-disable-next-line no-eval + public static readonly nodeRequire: NodeRequire = eval('require'); + /** * @param {string} version * @param {string} buildTimestamp diff --git a/test/unit-tests/utils/AdvertisementUtils.spec.ts b/test/unit-tests/utils/AdvertisementUtils.spec.ts index b110e2f1..079b1b76 100644 --- a/test/unit-tests/utils/AdvertisementUtils.spec.ts +++ b/test/unit-tests/utils/AdvertisementUtils.spec.ts @@ -1,8 +1,37 @@ +import * as fs from 'fs'; +import * as path from 'path'; + import { assert } from 'chai'; import { AdvertisementUtils } from '../../../src/utils/AdvertisementUtils'; +import { Utils } from '../../../src/utils/Utils'; + +const envPaths = Utils.nodeRequire('env-paths').default; describe('AdvertisementUtils', () => { + const configPath = path.join(envPaths('javascript-obfuscator').config, 'config.json'); + + function readConfig(): any { + try { + return JSON.parse(fs.readFileSync(configPath, 'utf8')); + } catch { + return {}; + } + } + + function writeConfig(data: any): void { + fs.mkdirSync(path.dirname(configPath), { recursive: true }); + fs.writeFileSync(configPath, JSON.stringify(data)); + } + + function deleteConfig(): void { + try { + fs.unlinkSync(configPath); + } catch { + // Ignore + } + } + describe('isCI', () => { const originalEnv = { ...process.env }; @@ -105,22 +134,10 @@ describe('AdvertisementUtils', () => { }); describe('Variant #3: display counter and reset', () => { - let config: any; - - before(() => { - // Get config instance using eval('require') - same as AdvertisementUtils - // conf is an ES Module, so we need to access .default - // eslint-disable-next-line no-eval - const Conf = eval('require')('conf').default; - config = new Conf({ projectName: 'javascript-obfuscator' }); - }); - beforeEach(() => { - // Clear ad-related config before each test - config.delete('adDisplayCount'); - config.delete('adFirstDisplayTime'); - // Reset cached config in AdvertisementUtils - (AdvertisementUtils as any).config = null; + deleteConfig(); + // Reset cached config path + (AdvertisementUtils as any).configPath = null; // Ensure TTY and non-CI environment process.stdout.isTTY = true; delete process.env.CI; @@ -130,10 +147,8 @@ describe('AdvertisementUtils', () => { }); afterEach(() => { - // Clean up - config.delete('adDisplayCount'); - config.delete('adFirstDisplayTime'); - (AdvertisementUtils as any).config = null; + deleteConfig(); + (AdvertisementUtils as any).configPath = null; }); it('should return true for first 5 calls', () => { @@ -154,13 +169,13 @@ describe('AdvertisementUtils', () => { it('should increment counter on each call', () => { AdvertisementUtils.shouldShowAdvertisement(); - assert.strictEqual(config.get('adDisplayCount'), 1); + assert.strictEqual(readConfig().adDisplayCount, 1); AdvertisementUtils.shouldShowAdvertisement(); - assert.strictEqual(config.get('adDisplayCount'), 2); + assert.strictEqual(readConfig().adDisplayCount, 2); AdvertisementUtils.shouldShowAdvertisement(); - assert.strictEqual(config.get('adDisplayCount'), 3); + assert.strictEqual(readConfig().adDisplayCount, 3); }); it('should set first display timestamp on first call', () => { @@ -168,7 +183,7 @@ describe('AdvertisementUtils', () => { AdvertisementUtils.shouldShowAdvertisement(); const afterTime = Date.now(); - const timestamp = config.get('adFirstDisplayTime'); + const timestamp = readConfig().adFirstDisplayTime; assert.isNumber(timestamp); assert.isAtLeast(timestamp, beforeTime); assert.isAtMost(timestamp, afterTime); @@ -183,14 +198,14 @@ describe('AdvertisementUtils', () => { // Simulate 3 days passing by setting old timestamp const threeDaysAgo = Date.now() - 3 * 24 * 60 * 60 * 1000 - 1000; - config.set('adFirstDisplayTime', threeDaysAgo); - // Reset cached config - (AdvertisementUtils as any).config = null; + const data = readConfig(); + data.adFirstDisplayTime = threeDaysAgo; + writeConfig(data); // Should return true again after reset assert.isTrue(AdvertisementUtils.shouldShowAdvertisement()); // Counter should be reset to 1 - assert.strictEqual(config.get('adDisplayCount'), 1); + assert.strictEqual(readConfig().adDisplayCount, 1); }); it('should not reset counter before 3 days', () => { @@ -201,9 +216,9 @@ describe('AdvertisementUtils', () => { // Simulate 2 days passing (less than 3 days) const twoDaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; - config.set('adFirstDisplayTime', twoDaysAgo); - // Reset cached config - (AdvertisementUtils as any).config = null; + const data = readConfig(); + data.adFirstDisplayTime = twoDaysAgo; + writeConfig(data); // Should still return false assert.isFalse(AdvertisementUtils.shouldShowAdvertisement()); diff --git a/yarn.lock b/yarn.lock index 36a02aae..45b47f68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1062,13 +1062,6 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-formats@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" - integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -1101,7 +1094,7 @@ ajv@^8.0.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^8.17.1, ajv@^8.9.0: +ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -1296,14 +1289,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -atomically@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.1.0.tgz#5a3ce8ea5ab57b65df589a3b63ef7b753cc0af07" - integrity sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q== - dependencies: - stubborn-fs "^2.0.0" - when-exit "^2.1.4" - available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz" @@ -1653,21 +1638,6 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -conf@15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/conf/-/conf-15.0.2.tgz#b983be81227a304b9f885fde6c86c7fe5902dc9d" - integrity sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw== - dependencies: - ajv "^8.17.1" - ajv-formats "^3.0.1" - atomically "^2.0.3" - debounce-fn "^6.0.0" - dot-prop "^10.0.0" - env-paths "^3.0.0" - json-schema-typed "^8.0.1" - semver "^7.7.2" - uint8array-extras "^1.5.0" - config-chain@^1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -1786,13 +1756,6 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -debounce-fn@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-6.0.0.tgz#558169aed853eb3cf3a17c0a2438e1a91a7ba44f" - integrity sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ== - dependencies: - mimic-function "^5.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -1938,13 +1901,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-10.1.0.tgz#91dbeb6771a9d2c31eab11ade3fdb1d83c4376c4" - integrity sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q== - dependencies: - type-fest "^5.0.0" - dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -2000,10 +1956,12 @@ enhanced-resolve@^5.17.3: graceful-fs "^4.2.4" tapable "^2.2.0" -env-paths@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" - integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== +env-paths@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-4.0.0.tgz#d0bb1f84a81d2542581bf7b7e8085d0683b39097" + integrity sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw== + dependencies: + is-safe-filename "^0.1.0" envinfo@^7.14.0: version "7.19.0" @@ -3339,6 +3297,11 @@ is-regex@^1.2.1: has-tostringtag "^1.0.2" hasown "^2.0.2" +is-safe-filename@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-safe-filename/-/is-safe-filename-0.1.1.tgz#fb22eead097c614c47aa674de5d79a1648a53e66" + integrity sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g== + is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" @@ -3651,11 +3614,6 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema-typed@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz#e98ee7b1899ff4a184534d1f167c288c66bbeff4" - integrity sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" @@ -3857,11 +3815,6 @@ mime-types@^2.1.27: dependencies: mime-db "1.44.0" -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -4714,7 +4667,7 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.2: +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== @@ -5098,18 +5051,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stubborn-fs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-2.0.0.tgz#628750f81c51c44c04ef50fc70ed4d1caea4f1e9" - integrity sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA== - dependencies: - stubborn-utils "^1.0.1" - -stubborn-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stubborn-utils/-/stubborn-utils-1.0.2.tgz#0d9c58ab550f40936235056c7ea6febd925c4d41" - integrity sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -5158,11 +5099,6 @@ synckit@^0.9.1: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -tagged-tag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tagged-tag/-/tagged-tag-1.0.0.tgz#a0b5917c2864cba54841495abfa3f6b13edcf4d6" - integrity sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== - tapable@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz" @@ -5338,13 +5274,6 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.3.0.tgz#9422125b3094b1087d8446ba151b72fb9f39411a" - integrity sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g== - dependencies: - tagged-tag "^1.0.0" - typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" @@ -5402,11 +5331,6 @@ typescript@5.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== -uint8array-extras@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz#10d2a85213de3ada304fea1c454f635c73839e86" - integrity sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A== - unbox-primitive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" @@ -5568,11 +5492,6 @@ webpack@5.102.1: watchpack "^2.4.4" webpack-sources "^3.3.3" -when-exit@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.5.tgz#53fa4ffa2ba4c792213fb6617eb7d08f0dcb1a9f" - integrity sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg== - which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"