From 306890aa139995947f5cb02f92ca40aa966e7fbf Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:03:18 -0300 Subject: [PATCH 01/23] WebpackPatcher: Use way less closures (#3217) --- eslint.config.mjs | 2 +- scripts/generateReport.ts | 4 - src/debug/loadLazyChunks.ts | 6 +- src/debug/runReporter.ts | 6 +- src/plugins/_core/noTrack.ts | 2 +- src/plugins/index.ts | 3 +- src/webpack/patchWebpack.ts | 445 +++++++++++++++++------------------ src/webpack/webpack.ts | 2 +- src/webpack/wreq.d.ts | 6 +- tsconfig.json | 4 +- 10 files changed, 236 insertions(+), 244 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 67327b938..d59c37532 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -134,7 +134,7 @@ export default tseslint.config( "no-unsafe-optional-chaining": "error", "no-useless-backreference": "error", "use-isnan": "error", - "prefer-const": "error", + "prefer-const": ["error", { destructuring: "all" }], "prefer-spread": "error", // Plugin Rules diff --git a/scripts/generateReport.ts b/scripts/generateReport.ts index 5cab1b46e..7bfda763b 100644 --- a/scripts/generateReport.ts +++ b/scripts/generateReport.ts @@ -16,11 +16,7 @@ * along with this program. If not, see . */ -/* eslint-disable no-fallthrough */ - -// eslint-disable-next-line spaced-comment /// -// eslint-disable-next-line spaced-comment /// import { createHmac } from "crypto"; diff --git a/src/debug/loadLazyChunks.ts b/src/debug/loadLazyChunks.ts index 212078553..427acd11a 100644 --- a/src/debug/loadLazyChunks.ts +++ b/src/debug/loadLazyChunks.ts @@ -8,7 +8,7 @@ import { Logger } from "@utils/Logger"; import { canonicalizeMatch } from "@utils/patches"; import * as Webpack from "@webpack"; import { wreq } from "@webpack"; -import { AnyModuleFactory, ModuleFactory } from "webpack"; +import { AnyModuleFactory, ModuleFactory } from "@webpack/wreq.d"; export async function loadLazyChunks() { const LazyChunkLoaderLogger = new Logger("LazyChunkLoader"); @@ -140,8 +140,8 @@ export async function loadLazyChunks() { } Webpack.factoryListeners.add(factoryListener); - for (const factoryId in wreq.m) { - factoryListener(wreq.m[factoryId]); + for (const moduleId in wreq.m) { + factoryListener(wreq.m[moduleId]); } await chunksSearchingDone; diff --git a/src/debug/runReporter.ts b/src/debug/runReporter.ts index 8d4194bc4..7a14609e1 100644 --- a/src/debug/runReporter.ts +++ b/src/debug/runReporter.ts @@ -6,9 +6,9 @@ import { Logger } from "@utils/Logger"; import * as Webpack from "@webpack"; -import { addPatch, patches } from "plugins"; -import { getBuildNumber } from "webpack/patchWebpack"; +import { getBuildNumber, patchTimings } from "@webpack/patcher"; +import { addPatch, patches } from "../plugins"; import { loadLazyChunks } from "./loadLazyChunks"; async function runReporter() { @@ -51,7 +51,7 @@ async function runReporter() { } } - for (const [plugin, moduleId, match, totalTime] of Vencord.WebpackPatcher.patchTimings) { + for (const [plugin, moduleId, match, totalTime] of patchTimings) { if (totalTime > 5) { new Logger("WebpackInterceptor").warn(`Patch by ${plugin} took ${Math.round(totalTime * 100) / 100}ms (Module id is ${String(moduleId)}): ${match}`); } diff --git a/src/plugins/_core/noTrack.ts b/src/plugins/_core/noTrack.ts index 58d8d42a3..30920a067 100644 --- a/src/plugins/_core/noTrack.ts +++ b/src/plugins/_core/noTrack.ts @@ -20,7 +20,7 @@ import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType, StartAt } from "@utils/types"; -import { WebpackRequire } from "webpack"; +import { WebpackRequire } from "@webpack/wreq.d"; const settings = definePluginSettings({ disableAnalytics: { diff --git a/src/plugins/index.ts b/src/plugins/index.ts index e1899b743..4a2688681 100644 --- a/src/plugins/index.ts +++ b/src/plugins/index.ts @@ -31,6 +31,7 @@ import { Logger } from "@utils/Logger"; import { canonicalizeFind, canonicalizeReplacement } from "@utils/patches"; import { Patch, Plugin, PluginDef, ReporterTestable, StartAt } from "@utils/types"; import { FluxDispatcher } from "@webpack/common"; +import { patches } from "@webpack/patcher"; import { FluxEvents } from "@webpack/types"; import Plugins from "~plugins"; @@ -41,7 +42,7 @@ const logger = new Logger("PluginManager", "#a6d189"); export const PMLogger = logger; export const plugins = Plugins; -export const patches = [] as Patch[]; +export { patches }; /** Whether we have subscribed to flux events of all the enabled plugins when FluxDispatcher was ready */ let enabledPluginsSubscribedFlux = false; diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 870362373..14c1888c9 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -9,32 +9,23 @@ import { makeLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { interpolateIfDefined } from "@utils/misc"; import { canonicalizeReplacement } from "@utils/patches"; -import { PatchReplacement } from "@utils/types"; +import { Patch, PatchReplacement } from "@utils/types"; import { traceFunctionWithResults } from "../debug/Tracer"; -import { patches } from "../plugins"; -import { _initWebpack, _shouldIgnoreModule, AnyModuleFactory, AnyWebpackRequire, factoryListeners, findModuleId, MaybeWrappedModuleFactory, ModuleExports, moduleListeners, waitForSubscriptions, WebpackRequire, WrappedModuleFactory, wreq } from "."; +import { _initWebpack, _shouldIgnoreModule, factoryListeners, findModuleId, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; +import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, ModuleExports, PatchedModuleFactory, WebpackRequire } from "./wreq.d"; + +export const patches = [] as Patch[]; export const SYM_ORIGINAL_FACTORY = Symbol("WebpackPatcher.originalFactory"); export const SYM_PATCHED_SOURCE = Symbol("WebpackPatcher.patchedSource"); export const SYM_PATCHED_BY = Symbol("WebpackPatcher.patchedBy"); -/** A set with all the Webpack instances */ export const allWebpackInstances = new Set(); -export const patchTimings = [] as Array<[plugin: string, moduleId: PropertyKey, match: string | RegExp, totalTime: number]>; -const logger = new Logger("WebpackInterceptor", "#8caaee"); -/** Whether we tried to fallback to factory WebpackRequire, or disabled patches */ -let wreqFallbackApplied = false; -/** Whether we should be patching factories. - * - * This should be disabled if we start searching for the module to get the build number, and then resumed once it's done. - * */ -let shouldPatchFactories = true; +export const patchTimings = [] as Array<[plugin: string, moduleId: PropertyKey, match: PatchReplacement["match"], totalTime: number]>; export const getBuildNumber = makeLazy(() => { try { - shouldPatchFactories = false; - try { if (wreq.m[128014]?.toString().includes("Trying to open a changelog for an invalid build number")) { const hardcodedGetBuildNumber = wreq(128014).b as () => number; @@ -59,13 +50,23 @@ export const getBuildNumber = makeLazy(() => { return typeof buildNumber === "number" ? buildNumber : -1; } catch { return -1; - } finally { - shouldPatchFactories = true; } }); -type Define = typeof Reflect.defineProperty; -const define: Define = (target, p, attributes) => { +export function getFactoryPatchedSource(moduleId: PropertyKey, webpackRequire = wreq as AnyWebpackRequire) { + return webpackRequire.m[moduleId]?.[SYM_PATCHED_SOURCE]; +} + +export function getFactoryPatchedBy(moduleId: PropertyKey, webpackRequire = wreq as AnyWebpackRequire) { + return webpackRequire.m[moduleId]?.[SYM_PATCHED_BY]; +} + +const logger = new Logger("WebpackInterceptor", "#8caaee"); + +/** Whether we tried to fallback to the WebpackRequire of the factory, or disabled patches */ +let wreqFallbackApplied = false; + +const define: typeof Reflect.defineProperty = (target, p, attributes) => { if (Object.hasOwn(attributes, "value")) { attributes.writable = true; } @@ -77,22 +78,17 @@ const define: Define = (target, p, attributes) => { }); }; -export function getOriginalFactory(id: PropertyKey, webpackRequire = wreq as AnyWebpackRequire) { - const moduleFactory = webpackRequire.m[id]; - return (moduleFactory?.[SYM_ORIGINAL_FACTORY] ?? moduleFactory) as AnyModuleFactory | undefined; -} +// wreq.m is the Webpack object containing module factories. It is pre-populated with factories, and is also populated via webpackGlobal.push +// We use this setter to intercept when wreq.m is defined and apply patching to its factories. -export function getFactoryPatchedSource(id: PropertyKey, webpackRequire = wreq as AnyWebpackRequire) { - return webpackRequire.m[id]?.[SYM_PATCHED_SOURCE]; -} +// Factories can be patched in two ways. Eagerly or lazily. +// If we are patching eagerly, pre-populated factories are patched immediately and new factories are patched when set. +// Else, we only patch them when called. -export function getFactoryPatchedBy(id: PropertyKey, webpackRequire = wreq as AnyWebpackRequire) { - return webpackRequire.m[id]?.[SYM_PATCHED_BY]; -} +// Factories are always wrapped in a proxy, which allows us to intercept the call to them, patch if they werent eagerly patched, +// and call them with our wrapper which notifies our listeners. -// wreq.m is the Webpack object containing module factories. It is pre-populated with module factories, and is also populated via webpackGlobal.push -// We use this setter to intercept when wreq.m is defined and apply the patching in its module factories. -// We wrap wreq.m with our proxy, which is responsible for patching the module factories when they are set, or defining getters for the patched versions. +// wreq.m is also wrapped in a proxy to intercept when new factories are set, patch them eargely, if enabled, and wrap them in the factory proxy. // If this is the main Webpack, we also set up the internal references to WebpackRequire. define(Function.prototype, "m", { @@ -131,13 +127,17 @@ define(Function.prototype, "m", { const setterTimeout = setTimeout(() => Reflect.deleteProperty(this, "e"), 0); // Patch the pre-populated factories - for (const id in originalModules) { - if (updateExistingFactory(originalModules, id, originalModules[id], true)) { + for (const moduleId in originalModules) { + const originalFactory = originalModules[moduleId]; + + if (updateExistingFactory(originalModules, moduleId, originalFactory, originalModules, true)) { continue; } - notifyFactoryListeners(originalModules[id]); - defineModulesFactoryGetter(id, Settings.eagerPatches && shouldPatchFactories ? wrapAndPatchFactory(id, originalModules[id]) : originalModules[id]); + notifyFactoryListeners(moduleId, originalFactory); + + const proxiedFactory = new Proxy(Settings.eagerPatches ? patchFactory(moduleId, originalFactory) : originalFactory, moduleFactoryHandler); + define(originalModules, moduleId, { value: proxiedFactory }); } define(originalModules, Symbol.toStringTag, { @@ -145,7 +145,6 @@ define(Function.prototype, "m", { enumerable: false }); - // The proxy responsible for patching the module factories when they are set, or defining getters for the patched versions const proxiedModuleFactories = new Proxy(originalModules, moduleFactoriesHandler); /* If Webpack ever decides to set module factories using the variable of the modules object directly, instead of wreq.m, switch the proxy to the prototype @@ -156,6 +155,7 @@ define(Function.prototype, "m", { } }); +// The proxy for patching eagerly and/or wrapping factories in their proxy. const moduleFactoriesHandler: ProxyHandler = { /* If Webpack ever decides to set module factories using the variable of the modules object directly instead of wreq.m, we need to switch the proxy to the prototype @@ -172,57 +172,96 @@ const moduleFactoriesHandler: ProxyHandler = { }, */ - // The set trap for patching or defining getters for the module factories when new module factories are loaded set(target, p, newValue, receiver) { - if (updateExistingFactory(target, p, newValue)) { + if (updateExistingFactory(target, p, newValue, receiver)) { return true; } - notifyFactoryListeners(newValue); - defineModulesFactoryGetter(p, Settings.eagerPatches && shouldPatchFactories ? wrapAndPatchFactory(p, newValue) : newValue); + notifyFactoryListeners(p, newValue); - return true; + const proxiedFactory = new Proxy(Settings.eagerPatches ? patchFactory(p, newValue) : newValue, moduleFactoryHandler); + return Reflect.set(target, p, proxiedFactory, receiver); + } +}; + +// The proxy for patching lazily and/or running factories with our wrapper. +const moduleFactoryHandler: ProxyHandler = { + apply(target, thisArg: unknown, argArray: Parameters) { + // SAFETY: Factories have `name` as their key in the module factories object, and that is always their module id + const moduleId = target.name; + + // SYM_ORIGINAL_FACTORY means the factory has already been patched + if (target[SYM_ORIGINAL_FACTORY] != null) { + return runFactoryWithWrap(moduleId, target as PatchedModuleFactory, thisArg, argArray); + } + + const patchedFactory = patchFactory(moduleId, target); + return runFactoryWithWrap(moduleId, patchedFactory, thisArg, argArray); + }, + + get(target, p, receiver) { + if (target[SYM_ORIGINAL_FACTORY] != null && (p === SYM_PATCHED_SOURCE || p === SYM_PATCHED_BY)) { + return Reflect.get(target[SYM_ORIGINAL_FACTORY], p, target[SYM_ORIGINAL_FACTORY]); + } + + const v = Reflect.get(target, p, receiver); + + // Make proxied factories `toString` return their original factory `toString` + if (p === "toString") { + return v.bind(target[SYM_ORIGINAL_FACTORY] ?? target); + } + + return v; } }; /** * Update a factory that exists in any Webpack instance with a new original factory. * - * @target The module factories where this new original factory is being set - * @param id The id of the module + * @param moduleFactoriesTarget The module factories where this new original factory is being set + * @param moduleId The id of the module * @param newFactory The new original factory + * @param receiver The receiver of the new factory * @param ignoreExistingInTarget Whether to ignore checking if the factory already exists in the moduleFactoriesTarget * @returns Whether the original factory was updated, or false if it doesn't exist in any Webpack instance */ -function updateExistingFactory(moduleFactoriesTarget: AnyWebpackRequire["m"], id: PropertyKey, newFactory: AnyModuleFactory, ignoreExistingInTarget: boolean = false) { +function updateExistingFactory(moduleFactoriesTarget: AnyWebpackRequire["m"], moduleId: PropertyKey, newFactory: AnyModuleFactory, receiver: any, ignoreExistingInTarget: boolean = false) { let existingFactory: TypedPropertyDescriptor | undefined; let moduleFactoriesWithFactory: AnyWebpackRequire["m"] | undefined; for (const wreq of allWebpackInstances) { - if (ignoreExistingInTarget && wreq.m === moduleFactoriesTarget) continue; + if (ignoreExistingInTarget && wreq.m === moduleFactoriesTarget) { + continue; + } - if (Object.hasOwn(wreq.m, id)) { - existingFactory = Reflect.getOwnPropertyDescriptor(wreq.m, id); + if (Object.hasOwn(wreq.m, moduleId)) { + existingFactory = Reflect.getOwnPropertyDescriptor(wreq.m, moduleId); moduleFactoriesWithFactory = wreq.m; break; } } if (existingFactory != null) { - // If existingFactory exists in any Webpack instance, it's either wrapped in defineModuleFactoryGetter, or it has already been required. - // So define the descriptor of it on this current Webpack instance (if it doesn't exist already), call Reflect.set with the new original, - // and let the correct logic apply (normal set, or defineModuleFactoryGetter setter) - + // If existingFactory exists in any Webpack instance, it's either wrapped in our proxy, or it has already been required. + // In the case it is wrapped in our proxy, we need the Webpack instance with this new original factory to also have our proxy. + // So, define the descriptor of the existing factory on it. if (moduleFactoriesWithFactory !== moduleFactoriesTarget) { - Reflect.defineProperty(moduleFactoriesTarget, id, existingFactory); + Reflect.defineProperty(receiver, moduleId, existingFactory); } - // Persist patched source and patched by in the new original factory, if the patched one has already been required - if (IS_DEV && existingFactory.value != null) { - newFactory[SYM_PATCHED_SOURCE] = existingFactory.value[SYM_PATCHED_SOURCE]; - newFactory[SYM_PATCHED_BY] = existingFactory.value[SYM_PATCHED_BY]; + const existingFactoryValue = moduleFactoriesWithFactory![moduleId]; + + // Update with the new original factory, if it does have a current original factory + if (existingFactoryValue[SYM_ORIGINAL_FACTORY] != null) { + existingFactoryValue[SYM_ORIGINAL_FACTORY] = newFactory; } - return Reflect.set(moduleFactoriesTarget, id, newFactory, moduleFactoriesTarget); + // Persist patched source and patched by in the new original factory + if (IS_DEV) { + newFactory[SYM_PATCHED_SOURCE] = existingFactoryValue[SYM_PATCHED_SOURCE]; + newFactory[SYM_PATCHED_BY] = existingFactoryValue[SYM_PATCHED_BY]; + } + + return true; } return false; @@ -231,12 +270,13 @@ function updateExistingFactory(moduleFactoriesTarget: AnyWebpackRequire["m"], id /** * Notify all factory listeners. * + * @param moduleId The id of the module * @param factory The original factory to notify for */ -function notifyFactoryListeners(factory: AnyModuleFactory) { +function notifyFactoryListeners(moduleId: PropertyKey, factory: AnyModuleFactory) { for (const factoryListener of factoryListeners) { try { - factoryListener(factory); + factoryListener(factory, moduleId); } catch (err) { logger.error("Error in Webpack factory listener:\n", err, factoryListener); } @@ -244,190 +284,138 @@ function notifyFactoryListeners(factory: AnyModuleFactory) { } /** - * Define the getter for returning the patched version of the module factory. + * Run a (possibly) patched module factory with a wrapper which notifies our listeners. * - * If eagerPatches is enabled, the factory argument should already be the patched version, else it will be the original - * and only be patched when accessed for the first time. - * - * @param id The id of the module - * @param factory The original or patched module factory + * @param moduleId The id of the module + * @param patchedFactory The (possibly) patched module factory + * @param thisArg The `value` of the call to the factory + * @param argArray The arguments of the call to the factory */ -function defineModulesFactoryGetter(id: PropertyKey, factory: MaybeWrappedModuleFactory) { - const descriptor: PropertyDescriptor = { - get() { - // SYM_ORIGINAL_FACTORY means the factory is already patched - if (!shouldPatchFactories || factory[SYM_ORIGINAL_FACTORY] != null) { - return factory; - } +function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModuleFactory, thisArg: unknown, argArray: Parameters) { + const originalFactory = patchedFactory[SYM_ORIGINAL_FACTORY]; - return (factory = wrapAndPatchFactory(id, factory)); - }, - set(newFactory: MaybeWrappedModuleFactory) { - if (IS_DEV) { - newFactory[SYM_PATCHED_SOURCE] = factory[SYM_PATCHED_SOURCE]; - newFactory[SYM_PATCHED_BY] = factory[SYM_PATCHED_BY]; - } - - if (factory[SYM_ORIGINAL_FACTORY] != null) { - factory.toString = newFactory.toString.bind(newFactory); - factory[SYM_ORIGINAL_FACTORY] = newFactory; - } else { - factory = newFactory; - } - } - }; - - // Define the getter in all the module factories objects. Patches are only executed once, so make sure all module factories object - // have the patched version - for (const wreq of allWebpackInstances) { - define(wreq.m, id, descriptor); + if (patchedFactory === originalFactory) { + // @ts-expect-error Clear up ORIGINAL_FACTORY if the factory did not have any patch applied + delete patchedFactory[SYM_ORIGINAL_FACTORY]; } -} -/** - * Wraps and patches a module factory. - * - * @param id The id of the module - * @param factory The original or patched module factory - * @returns The wrapper for the patched module factory - */ -function wrapAndPatchFactory(id: PropertyKey, originalFactory: AnyModuleFactory) { - const [patchedFactory, patchedSource, patchedBy] = patchFactory(id, originalFactory); + // Restore the original factory in all the module factories objects, discarding our proxy and allowing it to be garbage collected + for (const wreq of allWebpackInstances) { + define(wreq.m, moduleId, { value: originalFactory }); + } - const wrappedFactory: WrappedModuleFactory = function (...args) { - // Restore the original factory in all the module factories objects. We want to make sure the original factory is restored properly, no matter what is the Webpack instance - for (const wreq of allWebpackInstances) { - define(wreq.m, id, { value: wrappedFactory[SYM_ORIGINAL_FACTORY] }); - } + let [module, exports, require] = argArray; - // eslint-disable-next-line prefer-const - let [module, exports, require] = args; + if (wreq == null) { + if (!wreqFallbackApplied) { + wreqFallbackApplied = true; - if (wreq == null) { - if (!wreqFallbackApplied) { - wreqFallbackApplied = true; + // Make sure the require argument is actually the WebpackRequire function + if (typeof require === "function" && require.m != null) { + const { stack } = new Error(); + const webpackInstanceFileName = stack?.match(/\/assets\/(.+?\.js)/)?.[1]; - // Make sure the require argument is actually the WebpackRequire function - if (typeof require === "function" && require.m != null) { - const { stack } = new Error(); - const webpackInstanceFileName = stack?.match(/\/assets\/(.+?\.js)/)?.[1]; + logger.warn( + "WebpackRequire was not initialized, falling back to WebpackRequire passed to the first called wrapped module factory (" + + `id: ${String(moduleId)}` + interpolateIfDefined`, WebpackInstance origin: ${webpackInstanceFileName}` + + ")" + ); - logger.warn( - "WebpackRequire was not initialized, falling back to WebpackRequire passed to the first called patched module factory (" + - `id: ${String(id)}` + interpolateIfDefined`, WebpackInstance origin: ${webpackInstanceFileName}` + - ")" - ); - - _initWebpack(require as WebpackRequire); - } else if (IS_DEV) { - logger.error("WebpackRequire was not initialized, running modules without patches instead."); - return wrappedFactory[SYM_ORIGINAL_FACTORY].apply(this, args); - } + // Could technically be wrong, but it's better than nothing + _initWebpack(require as WebpackRequire); } else if (IS_DEV) { - return wrappedFactory[SYM_ORIGINAL_FACTORY].apply(this, args); + logger.error("WebpackRequire was not initialized, running modules without patches instead."); + return originalFactory.apply(thisArg, argArray); } + } else if (IS_DEV) { + return originalFactory.apply(thisArg, argArray); + } + } + + let factoryReturn: unknown; + try { + factoryReturn = patchedFactory.apply(thisArg, argArray); + } catch (err) { + // Just re-throw Discord errors + if (patchedFactory === originalFactory) { + throw err; } - let factoryReturn: unknown; - try { - // Call the patched factory - factoryReturn = patchedFactory.apply(this, args); - } catch (err) { - // Just re-throw Discord errors - if (patchedFactory === wrappedFactory[SYM_ORIGINAL_FACTORY]) { - throw err; + logger.error("Error in patched module factory:\n", err); + return originalFactory.apply(thisArg, argArray); + } + + exports = module.exports; + if (exports == null) { + return factoryReturn; + } + + if (typeof require === "function") { + const shouldIgnoreModule = _shouldIgnoreModule(exports); + + if (shouldIgnoreModule) { + if (require.c != null) { + Object.defineProperty(require.c, moduleId, { + value: require.c[moduleId], + enumerable: false, + configurable: true, + writable: true + }); } - logger.error("Error in patched module factory:\n", err); - return wrappedFactory[SYM_ORIGINAL_FACTORY].apply(this, args); - } - - exports = module.exports; - if (exports == null) { return factoryReturn; } - - if (typeof require === "function") { - const shouldIgnoreModule = _shouldIgnoreModule(exports); - - if (shouldIgnoreModule) { - if (require.c != null) { - Object.defineProperty(require.c, id, { - value: require.c[id], - enumerable: false, - configurable: true, - writable: true - }); - } - - return factoryReturn; - } - } - - for (const callback of moduleListeners) { - try { - callback(exports, id); - } catch (err) { - logger.error("Error in Webpack module listener:\n", err, callback); - } - } - - for (const [filter, callback] of waitForSubscriptions) { - try { - if (filter(exports)) { - waitForSubscriptions.delete(filter); - callback(exports, id); - continue; - } - - if (typeof exports !== "object") { - continue; - } - - for (const exportKey in exports) { - const exportValue = exports[exportKey]; - - if (exportValue != null && filter(exportValue)) { - waitForSubscriptions.delete(filter); - callback(exportValue, id); - break; - } - } - } catch (err) { - logger.error("Error while firing callback for Webpack waitFor subscription:\n", err, filter, callback); - } - } - - return factoryReturn; - }; - - wrappedFactory.toString = originalFactory.toString.bind(originalFactory); - wrappedFactory[SYM_ORIGINAL_FACTORY] = originalFactory; - - if (IS_DEV && patchedFactory !== originalFactory) { - wrappedFactory[SYM_PATCHED_SOURCE] = patchedSource; - wrappedFactory[SYM_PATCHED_BY] = patchedBy; - originalFactory[SYM_PATCHED_SOURCE] = patchedSource; - originalFactory[SYM_PATCHED_BY] = patchedBy; } - // @ts-expect-error Allow GC to get into action, if possible - originalFactory = undefined; - return wrappedFactory; + for (const callback of moduleListeners) { + try { + callback(exports, moduleId); + } catch (err) { + logger.error("Error in Webpack module listener:\n", err, callback); + } + } + + for (const [filter, callback] of waitForSubscriptions) { + try { + if (filter(exports)) { + waitForSubscriptions.delete(filter); + callback(exports, moduleId); + continue; + } + + if (typeof exports !== "object") { + continue; + } + + for (const exportKey in exports) { + const exportValue = exports[exportKey]; + + if (exportValue != null && filter(exportValue)) { + waitForSubscriptions.delete(filter); + callback(exportValue, moduleId); + break; + } + } + } catch (err) { + logger.error("Error while firing callback for Webpack waitFor subscription:\n", err, filter, callback); + } + } + + return factoryReturn; } /** * Patches a module factory. * - * @param id The id of the module - * @param factory The original module factory - * @returns The patched module factory, the patched source of it, and the plugins that patched it + * @param moduleId The id of the module + * @param originalFactory The original module factory + * @returns The patched module factory */ -function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFactory: AnyModuleFactory, patchedSource: string, patchedBy: Set] { +function patchFactory(moduleId: PropertyKey, originalFactory: AnyModuleFactory): PatchedModuleFactory { // 0, prefix to turn it into an expression: 0,function(){} would be invalid syntax without the 0, - let code: string = "0," + String(factory); + let code: string = "0," + String(originalFactory); let patchedSource = code; - let patchedFactory = factory; + let patchedFactory = originalFactory; const patchedBy = new Set(); @@ -442,8 +430,8 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto continue; } - // Reporter eagerly patches and cannot retrieve the build number because this code runs before the module for it is loaded - const buildNumber = IS_REPORTER ? -1 : getBuildNumber(); + // Eager patches cannot retrieve the build number because this code runs before the module for it is loaded + const buildNumber = Settings.eagerPatches ? -1 : getBuildNumber(); const shouldCheckBuildNumber = !Settings.eagerPatches && buildNumber !== -1; if ( @@ -463,7 +451,7 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto }); const previousCode = code; - const previousFactory = factory; + const previousFactory = originalFactory; let markedAsPatched = false; // We change all patch.replacement to array in plugins/index @@ -482,18 +470,18 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto } const lastCode = code; - const lastFactory = factory; + const lastFactory = originalFactory; try { const [newCode, totalTime] = executePatch(replacement.match, replacement.replace as string); if (IS_REPORTER) { - patchTimings.push([patch.plugin, id, replacement.match, totalTime]); + patchTimings.push([patch.plugin, moduleId, replacement.match, totalTime]); } if (newCode === code) { if (!patch.noWarn) { - logger.warn(`Patch by ${patch.plugin} had no effect (Module id is ${String(id)}): ${replacement.match}`); + logger.warn(`Patch by ${patch.plugin} had no effect (Module id is ${String(moduleId)}): ${replacement.match}`); if (IS_DEV) { logger.debug("Function Source:\n", code); } @@ -515,7 +503,7 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto } code = newCode; - patchedSource = `// Webpack Module ${String(id)} - Patched by ${[...patchedBy, patch.plugin].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${String(id)}`; + patchedSource = `// Webpack Module ${String(moduleId)} - Patched by ${[...patchedBy, patch.plugin].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${String(moduleId)}`; patchedFactory = (0, eval)(patchedSource); if (!patchedBy.has(patch.plugin)) { @@ -523,7 +511,7 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto markedAsPatched = true; } } catch (err) { - logger.error(`Patch by ${patch.plugin} errored (Module id is ${String(id)}): ${replacement.match}\n`, err); + logger.error(`Patch by ${patch.plugin} errored (Module id is ${String(moduleId)}): ${replacement.match}\n`, err); if (IS_DEV) { diffErroredPatch(code, lastCode, lastCode.match(replacement.match)!); @@ -550,7 +538,14 @@ function patchFactory(id: PropertyKey, factory: AnyModuleFactory): [patchedFacto } } - return [patchedFactory, patchedSource, patchedBy]; + patchedFactory[SYM_ORIGINAL_FACTORY] = originalFactory; + + if (IS_DEV && patchedFactory !== originalFactory) { + originalFactory[SYM_PATCHED_SOURCE] = patchedSource; + originalFactory[SYM_PATCHED_BY] = patchedBy; + } + + return patchedFactory as PatchedModuleFactory; } function diffErroredPatch(code: string, lastCode: string, match: RegExpMatchArray) { diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 8d5b3c688..09c04a2a1 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -90,7 +90,7 @@ export const filters = { }; export type CallbackFn = (module: ModuleExports, id: PropertyKey) => void; -export type FactoryListernFn = (factory: AnyModuleFactory) => void; +export type FactoryListernFn = (factory: AnyModuleFactory, moduleId: PropertyKey) => void; export const waitForSubscriptions = new Map(); export const moduleListeners = new Set(); diff --git a/src/webpack/wreq.d.ts b/src/webpack/wreq.d.ts index dbc451054..b9f5353f3 100644 --- a/src/webpack/wreq.d.ts +++ b/src/webpack/wreq.d.ts @@ -200,12 +200,10 @@ export type AnyModuleFactory = ((this: ModuleExports, module: Module, exports: M [SYM_PATCHED_BY]?: Set; }; -export type WrappedModuleFactory = AnyModuleFactory & { +export type PatchedModuleFactory = AnyModuleFactory & { [SYM_ORIGINAL_FACTORY]: AnyModuleFactory; [SYM_PATCHED_SOURCE]?: string; [SYM_PATCHED_BY]?: Set; }; -export type MaybeWrappedModuleFactory = AnyModuleFactory | WrappedModuleFactory; - -export type WrappedModuleFactories = Record; +export type MaybePatchedModuleFactory = PatchedModuleFactory | AnyModuleFactory; diff --git a/tsconfig.json b/tsconfig.json index db6d0918d..d2a42bd57 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,7 +29,9 @@ "@shared/*": ["./shared/*"], "@webpack/types": ["./webpack/common/types"], "@webpack/common": ["./webpack/common"], - "@webpack": ["./webpack/webpack"] + "@webpack": ["./webpack/webpack"], + "@webpack/patcher": ["./webpack/patchWebpack"], + "@webpack/wreq.d": ["./webpack/wreq.d"], }, "plugins": [ From 5196c2adc0fe348d66dacde7e04d3247f58dc073 Mon Sep 17 00:00:00 2001 From: v Date: Wed, 12 Feb 2025 18:09:14 +0100 Subject: [PATCH 02/23] Update esbuild to latest version (#3218) --- browser/manifest.json | 2 +- browser/monaco.ts | 2 +- browser/monacoWin.html | 4 +- package.json | 5 +- pnpm-lock.yaml | 482 +++++++++++++++------------- scripts/build/build.mjs | 99 +++--- scripts/build/buildWeb.mjs | 138 ++++---- scripts/build/common.mjs | 43 ++- scripts/build/tsconfig.esbuild.json | 7 - 9 files changed, 406 insertions(+), 376 deletions(-) delete mode 100644 scripts/build/tsconfig.esbuild.json diff --git a/browser/manifest.json b/browser/manifest.json index 357312b09..3463e46cf 100644 --- a/browser/manifest.json +++ b/browser/manifest.json @@ -36,7 +36,7 @@ "web_accessible_resources": [ { - "resources": ["dist/*", "third-party/*"], + "resources": ["dist/*", "vendor/*"], "matches": ["*://*.discord.com/*"] } ], diff --git a/browser/monaco.ts b/browser/monaco.ts index ead061d65..dc243df7d 100644 --- a/browser/monaco.ts +++ b/browser/monaco.ts @@ -15,7 +15,7 @@ declare global { const getTheme: () => string; } -const BASE = "/dist/monaco/vs"; +const BASE = "/vendor/monaco/vs"; self.MonacoEnvironment = { getWorkerUrl(_moduleId: unknown, label: string) { diff --git a/browser/monacoWin.html b/browser/monacoWin.html index a55b0e547..12523d455 100644 --- a/browser/monacoWin.html +++ b/browser/monacoWin.html @@ -24,12 +24,12 @@ diff --git a/package.json b/package.json index dca52a16f..872d7ce03 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,12 @@ "lint": "eslint", "lint-styles": "stylelint \"src/**/*.css\" --ignore-pattern src/userplugins", "lint:fix": "pnpm lint --fix", - "test": "pnpm buildStandalone && pnpm lint && pnpm lint-styles && pnpm testTsc && pnpm generatePluginJson", + "test": "pnpm buildStandalone && pnpm testTsc && pnpm lint && pnpm lint-styles && pnpm generatePluginJson", "testWeb": "pnpm lint && pnpm buildWeb && pnpm testTsc", "testTsc": "tsc --noEmit" }, "dependencies": { "@intrnl/xxhash64": "^0.1.2", - "@sapphi-red/web-noise-suppressor": "0.3.5", "@vap/core": "0.0.12", "@vap/shiki": "0.10.5", "fflate": "^0.8.2", @@ -56,7 +55,7 @@ "@types/yazl": "^2.4.5", "diff": "^7.0.0", "discord-types": "^1.3.26", - "esbuild": "^0.15.18", + "esbuild": "^0.25.0", "eslint": "^9.17.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a49df467b..169d76fcf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,9 +19,6 @@ importers: '@intrnl/xxhash64': specifier: ^0.1.2 version: 0.1.2 - '@sapphi-red/web-noise-suppressor': - specifier: 0.3.5 - version: 0.3.5 '@vap/core': specifier: 0.0.12 version: 0.0.12 @@ -75,8 +72,8 @@ importers: specifier: ^1.3.26 version: 1.3.26 esbuild: - specifier: ^0.15.18 - version: 0.15.18 + specifier: ^0.25.0 + version: 0.25.0 eslint: specifier: ^9.17.0 version: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) @@ -229,6 +226,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -241,10 +244,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.15.18': - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} - engines: {node: '>=12'} - cpu: [arm] + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] os: [android] '@esbuild/android-arm@0.17.19': @@ -259,6 +262,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -271,6 +280,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -283,6 +298,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -295,6 +316,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -307,6 +334,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -319,6 +352,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -331,6 +370,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -343,6 +388,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -355,10 +406,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.15.18': - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} - engines: {node: '>=12'} - cpu: [loong64] + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.17.19': @@ -373,6 +424,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -385,6 +442,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -397,6 +460,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -409,6 +478,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -421,6 +496,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -433,6 +514,18 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -445,12 +538,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -463,6 +568,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -475,6 +586,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -487,6 +604,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -499,6 +622,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -511,6 +640,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -609,9 +744,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sapphi-red/web-noise-suppressor@0.3.5': - resolution: {integrity: sha512-jh3+V9yM+zxLriQexoGm0GatoPaJWjs6ypFIbFYwQp+AoUb55eUXrjKtKQyuC5zShzzeAQUl0M5JzqB7SSrsRA==} - '@stylistic/eslint-plugin@2.12.1': resolution: {integrity: sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1205,131 +1337,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -1340,6 +1347,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2889,13 +2901,16 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.25.0': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.15.18': + '@esbuild/android-arm64@0.25.0': optional: true '@esbuild/android-arm@0.17.19': @@ -2904,55 +2919,79 @@ snapshots: '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.25.0': + optional: true + '@esbuild/android-x64@0.17.19': optional: true '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.25.0': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.25.0': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.25.0': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.25.0': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.25.0': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.25.0': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.25.0': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-loong64@0.15.18': + '@esbuild/linux-ia32@0.25.0': optional: true '@esbuild/linux-loong64@0.17.19': @@ -2961,75 +3000,117 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.25.0': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.25.0': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.25.0': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.25.0': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.25.0': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.25.0': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.25.0': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.25.0': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.25.0': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.25.0': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.25.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))': dependencies: eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) @@ -3135,8 +3216,6 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sapphi-red/web-noise-suppressor@0.3.5': {} - '@stylistic/eslint-plugin@2.12.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': dependencies: '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) @@ -3936,91 +4015,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-android-64@0.15.18: - optional: true - - esbuild-android-arm64@0.15.18: - optional: true - - esbuild-darwin-64@0.15.18: - optional: true - - esbuild-darwin-arm64@0.15.18: - optional: true - - esbuild-freebsd-64@0.15.18: - optional: true - - esbuild-freebsd-arm64@0.15.18: - optional: true - - esbuild-linux-32@0.15.18: - optional: true - - esbuild-linux-64@0.15.18: - optional: true - - esbuild-linux-arm64@0.15.18: - optional: true - - esbuild-linux-arm@0.15.18: - optional: true - - esbuild-linux-mips64le@0.15.18: - optional: true - - esbuild-linux-ppc64le@0.15.18: - optional: true - - esbuild-linux-riscv64@0.15.18: - optional: true - - esbuild-linux-s390x@0.15.18: - optional: true - - esbuild-netbsd-64@0.15.18: - optional: true - - esbuild-openbsd-64@0.15.18: - optional: true - - esbuild-sunos-64@0.15.18: - optional: true - - esbuild-windows-32@0.15.18: - optional: true - - esbuild-windows-64@0.15.18: - optional: true - - esbuild-windows-arm64@0.15.18: - optional: true - - esbuild@0.15.18: - optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 - esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -4073,6 +4067,34 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} diff --git a/scripts/build/build.mjs b/scripts/build/build.mjs index 623f9f940..9c2b49708 100755 --- a/scripts/build/build.mjs +++ b/scripts/build/build.mjs @@ -17,38 +17,41 @@ * along with this program. If not, see . */ -import esbuild from "esbuild"; +// @ts-check + import { readdir } from "fs/promises"; import { join } from "path"; -import { BUILD_TIMESTAMP, commonOpts, exists, globPlugins, IS_DEV, IS_REPORTER, IS_STANDALONE, IS_UPDATER_DISABLED, resolvePluginName, VERSION, commonRendererPlugins, watch } from "./common.mjs"; +import { BUILD_TIMESTAMP, commonOpts, exists, globPlugins, IS_DEV, IS_REPORTER, IS_STANDALONE, IS_UPDATER_DISABLED, resolvePluginName, VERSION, commonRendererPlugins, watch, buildOrWatchAll, stringifyValues } from "./common.mjs"; -const defines = { +const defines = stringifyValues({ IS_STANDALONE, IS_DEV, IS_REPORTER, IS_UPDATER_DISABLED, IS_WEB: false, IS_EXTENSION: false, - VERSION: JSON.stringify(VERSION), + VERSION, BUILD_TIMESTAMP -}; +}); -if (defines.IS_STANDALONE === false) +if (defines.IS_STANDALONE === "false") { // If this is a local build (not standalone), optimize // for the specific platform we're on defines["process.platform"] = JSON.stringify(process.platform); +} /** - * @type {esbuild.BuildOptions} + * @type {import("esbuild").BuildOptions} */ const nodeCommonOpts = { ...commonOpts, + define: defines, format: "cjs", platform: "node", target: ["esnext"], - external: ["electron", "original-fs", "~pluginNatives", ...commonOpts.external], - define: defines + // @ts-ignore this is never undefined + external: ["electron", "original-fs", "~pluginNatives", ...commonOpts.external] }; const sourceMapFooter = s => watch ? "" : `//# sourceMappingURL=vencord://${s}.js.map`; @@ -102,25 +105,27 @@ const globNativesPlugin = { } }; -await Promise.all([ +/** @type {import("esbuild").BuildOptions[]} */ +const buildConfigs = ([ // Discord Desktop main & renderer & preload - esbuild.build({ + { ...nodeCommonOpts, entryPoints: ["src/main/index.ts"], outfile: "dist/patcher.js", footer: { js: "//# sourceURL=VencordPatcher\n" + sourceMapFooter("patcher") }, sourcemap, - define: { - ...defines, - IS_DISCORD_DESKTOP: true, - IS_VESKTOP: false - }, plugins: [ + // @ts-ignore this is never undefined ...nodeCommonOpts.plugins, globNativesPlugin - ] - }), - esbuild.build({ + ], + define: { + ...defines, + IS_DISCORD_DESKTOP: "true", + IS_VESKTOP: "false" + } + }, + { ...commonOpts, entryPoints: ["src/Vencord.ts"], outfile: "dist/renderer.js", @@ -135,11 +140,11 @@ await Promise.all([ ], define: { ...defines, - IS_DISCORD_DESKTOP: true, - IS_VESKTOP: false + IS_DISCORD_DESKTOP: "true", + IS_VESKTOP: "false" } - }), - esbuild.build({ + }, + { ...nodeCommonOpts, entryPoints: ["src/preload.ts"], outfile: "dist/preload.js", @@ -147,29 +152,29 @@ await Promise.all([ sourcemap, define: { ...defines, - IS_DISCORD_DESKTOP: true, - IS_VESKTOP: false + IS_DISCORD_DESKTOP: "true", + IS_VESKTOP: "false" } - }), + }, // Vencord Desktop main & renderer & preload - esbuild.build({ + { ...nodeCommonOpts, entryPoints: ["src/main/index.ts"], outfile: "dist/vencordDesktopMain.js", footer: { js: "//# sourceURL=VencordDesktopMain\n" + sourceMapFooter("vencordDesktopMain") }, sourcemap, - define: { - ...defines, - IS_DISCORD_DESKTOP: false, - IS_VESKTOP: true - }, plugins: [ ...nodeCommonOpts.plugins, globNativesPlugin - ] - }), - esbuild.build({ + ], + define: { + ...defines, + IS_DISCORD_DESKTOP: "false", + IS_VESKTOP: "true" + } + }, + { ...commonOpts, entryPoints: ["src/Vencord.ts"], outfile: "dist/vencordDesktopRenderer.js", @@ -184,11 +189,11 @@ await Promise.all([ ], define: { ...defines, - IS_DISCORD_DESKTOP: false, - IS_VESKTOP: true + IS_DISCORD_DESKTOP: "false", + IS_VESKTOP: "true" } - }), - esbuild.build({ + }, + { ...nodeCommonOpts, entryPoints: ["src/preload.ts"], outfile: "dist/vencordDesktopPreload.js", @@ -196,14 +201,10 @@ await Promise.all([ sourcemap, define: { ...defines, - IS_DISCORD_DESKTOP: false, - IS_VESKTOP: true + IS_DISCORD_DESKTOP: "false", + IS_VESKTOP: "true" } - }), -]).catch(err => { - console.error("Build failed"); - console.error(err.message); - // make ci fail - if (!commonOpts.watch) - process.exitCode = 1; -}); + } +]); + +await buildOrWatchAll(buildConfigs); diff --git a/scripts/build/buildWeb.mjs b/scripts/build/buildWeb.mjs index deab86610..33168ff97 100644 --- a/scripts/build/buildWeb.mjs +++ b/scripts/build/buildWeb.mjs @@ -17,29 +17,30 @@ * along with this program. If not, see . */ -import esbuild from "esbuild"; +// @ts-check + import { readFileSync } from "fs"; import { appendFile, mkdir, readdir, readFile, rm, writeFile } from "fs/promises"; import { join } from "path"; import Zip from "zip-local"; -import { BUILD_TIMESTAMP, commonOpts, globPlugins, IS_DEV, IS_REPORTER, VERSION, commonRendererPlugins } from "./common.mjs"; +import { BUILD_TIMESTAMP, commonOpts, globPlugins, IS_DEV, IS_REPORTER, VERSION, commonRendererPlugins, buildOrWatchAll, stringifyValues } from "./common.mjs"; /** - * @type {esbuild.BuildOptions} + * @type {import("esbuild").BuildOptions} */ const commonOptions = { ...commonOpts, entryPoints: ["browser/Vencord.ts"], - globalName: "Vencord", format: "iife", + globalName: "Vencord", external: ["~plugins", "~git-hash", "/assets/*"], + target: ["esnext"], plugins: [ globPlugins("web"), ...commonRendererPlugins ], - target: ["esnext"], - define: { + define: stringifyValues({ IS_WEB: true, IS_EXTENSION: false, IS_STANDALONE: true, @@ -48,9 +49,9 @@ const commonOptions = { IS_DISCORD_DESKTOP: false, IS_VESKTOP: false, IS_UPDATER_DISABLED: true, - VERSION: JSON.stringify(VERSION), + VERSION, BUILD_TIMESTAMP - } + }) }; const MonacoWorkerEntryPoints = [ @@ -58,70 +59,59 @@ const MonacoWorkerEntryPoints = [ "vs/editor/editor.worker.js" ]; -const RnNoiseFiles = [ - "dist/rnnoise.wasm", - "dist/rnnoise_simd.wasm", - "dist/rnnoise/workletProcessor.js", - "LICENSE" +/** @type {import("esbuild").BuildOptions[]} */ +const buildConfigs = [ + { + entryPoints: MonacoWorkerEntryPoints.map(entry => `node_modules/monaco-editor/esm/${entry}`), + bundle: true, + minify: true, + format: "iife", + outbase: "node_modules/monaco-editor/esm/", + outdir: "dist/vendor/monaco" + }, + { + entryPoints: ["browser/monaco.ts"], + bundle: true, + minify: true, + format: "iife", + outfile: "dist/vendor/monaco/index.js", + loader: { + ".ttf": "file" + } + }, + { + ...commonOptions, + outfile: "dist/browser.js", + footer: { js: "//# sourceURL=VencordWeb" } + }, + { + ...commonOptions, + outfile: "dist/extension.js", + define: { + ...commonOptions.define, + IS_EXTENSION: "true" + }, + footer: { js: "//# sourceURL=VencordWeb" } + }, + { + ...commonOptions, + inject: ["browser/GMPolyfill.js", ...(commonOptions?.inject || [])], + define: { + ...commonOptions.define, + window: "unsafeWindow", + }, + outfile: "dist/Vencord.user.js", + banner: { + js: readFileSync("browser/userscript.meta.js", "utf-8").replace("%version%", `${VERSION}.${new Date().getTime()}`) + }, + footer: { + // UserScripts get wrapped in an iife, so define Vencord prop on window that returns our local + js: "Object.defineProperty(unsafeWindow,'Vencord',{get:()=>Vencord});" + } + } ]; -await Promise.all( - [ - esbuild.build({ - entryPoints: MonacoWorkerEntryPoints.map(entry => `node_modules/monaco-editor/esm/${entry}`), - bundle: true, - minify: true, - format: "iife", - outbase: "node_modules/monaco-editor/esm/", - outdir: "dist/monaco" - }), - esbuild.build({ - entryPoints: ["browser/monaco.ts"], - bundle: true, - minify: true, - format: "iife", - outfile: "dist/monaco/index.js", - loader: { - ".ttf": "file" - } - }), - esbuild.build({ - ...commonOptions, - outfile: "dist/browser.js", - footer: { js: "//# sourceURL=VencordWeb" } - }), - esbuild.build({ - ...commonOptions, - outfile: "dist/extension.js", - define: { - ...commonOptions?.define, - IS_EXTENSION: true, - }, - footer: { js: "//# sourceURL=VencordWeb" } - }), - esbuild.build({ - ...commonOptions, - inject: ["browser/GMPolyfill.js", ...(commonOptions?.inject || [])], - define: { - ...(commonOptions?.define), - window: "unsafeWindow", - }, - outfile: "dist/Vencord.user.js", - banner: { - js: readFileSync("browser/userscript.meta.js", "utf-8").replace("%version%", `${VERSION}.${new Date().getTime()}`) - }, - footer: { - // UserScripts get wrapped in an iife, so define Vencord prop on window that returns our local - js: "Object.defineProperty(unsafeWindow,'Vencord',{get:()=>Vencord});" - } - }) - ] -).catch(err => { - console.error("Build failed"); - console.error(err.message); - if (!commonOpts.watch) - process.exit(1); -});; +await buildOrWatchAll(buildConfigs); /** * @type {(dir: string) => Promise} @@ -155,16 +145,13 @@ async function buildExtension(target, files) { const entries = { "dist/Vencord.js": await readFile("dist/extension.js"), "dist/Vencord.css": await readFile("dist/extension.css"), - ...await loadDir("dist/monaco"), - ...Object.fromEntries(await Promise.all(RnNoiseFiles.map(async file => - [`third-party/rnnoise/${file.replace(/^dist\//, "")}`, await readFile(`node_modules/@sapphi-red/web-noise-suppressor/${file}`)] - ))), + ...await loadDir("dist/vendor/monaco", "dist/"), ...Object.fromEntries(await Promise.all(files.map(async f => { let content = await readFile(join("browser", f)); if (f.startsWith("manifest")) { const json = JSON.parse(content.toString("utf-8")); json.version = VERSION; - content = new TextEncoder().encode(JSON.stringify(json)); + content = Buffer.from(new TextEncoder().encode(JSON.stringify(json))); } return [ @@ -210,7 +197,6 @@ if (!process.argv.includes("--skip-extension")) { Zip.sync.zip("dist/firefox-unpacked").compress().save("dist/extension-firefox.zip"); console.info("Packed Firefox Extension written to dist/extension-firefox.zip"); - } else { await appendCssRuntime; } diff --git a/scripts/build/common.mjs b/scripts/build/common.mjs index 5e71c8c5f..920e59267 100644 --- a/scripts/build/common.mjs +++ b/scripts/build/common.mjs @@ -16,11 +16,13 @@ * along with this program. If not, see . */ +// @ts-check + import "../suppressExperimentalWarnings.js"; import "../checkNodeVersion.js"; import { exec, execSync } from "child_process"; -import esbuild from "esbuild"; +import esbuild, { build, context } from "esbuild"; import { constants as FsConstants, readFileSync } from "fs"; import { access, readdir, readFile } from "fs/promises"; import { minify as minifyHtml } from "html-minifier-terser"; @@ -31,7 +33,7 @@ import { getPluginTarget } from "../utils.mjs"; import { builtinModules } from "module"; /** @type {import("../../package.json")} */ -const PackageJSON = JSON.parse(readFileSync("package.json")); +const PackageJSON = JSON.parse(readFileSync("package.json", "utf-8")); export const VERSION = PackageJSON.version; // https://reproducible-builds.org/docs/source-date-epoch/ @@ -54,6 +56,34 @@ export const banner = { `.trim() }; +/** + * JSON.stringify all values in an object + * @type {(obj: Record) => Record} + */ +export function stringifyValues(obj) { + for (const key in obj) { + obj[key] = JSON.stringify(obj[key]); + } + return obj; +} + +/** + * @param {import("esbuild").BuildOptions[]} buildConfigs + */ +export async function buildOrWatchAll(buildConfigs) { + if (watch) { + await Promise.all(buildConfigs.map(cfg => + context(cfg).then(ctx => ctx.watch()) + )); + } else { + await Promise.all(buildConfigs.map(cfg => build(cfg))) + .catch(error => { + console.error(error.message); + process.exit(1); // exit immediately to skip the rest of the builds + }); + } +} + const PluginDefinitionNameMatcher = /definePlugin\(\{\s*(["'])?name\1:\s*(["'`])(.+?)\2/; /** * @param {string} base @@ -311,18 +341,16 @@ export const banImportPlugin = (filter, message) => ({ export const commonOpts = { logLevel: "info", bundle: true, - watch, minify: !watch && !IS_REPORTER, - sourcemap: watch ? "inline" : "", + sourcemap: watch ? "inline" : "external", legalComments: "linked", banner, plugins: [fileUrlPlugin, gitHashPlugin, gitRemotePlugin, stylePlugin], external: ["~plugins", "~git-hash", "~git-remote", "/assets/*"], inject: ["./scripts/build/inject/react.mjs"], + jsx: "transform", jsxFactory: "VencordCreateElement", - jsxFragment: "VencordFragment", - // Work around https://github.com/evanw/esbuild/issues/2460 - tsconfig: "./scripts/build/tsconfig.esbuild.json" + jsxFragment: "VencordFragment" }; const escapedBuiltinModules = builtinModules @@ -335,5 +363,6 @@ export const commonRendererPlugins = [ banImportPlugin(/^react$/, "Cannot import from react. React and hooks should be imported from @webpack/common"), banImportPlugin(/^electron(\/.*)?$/, "Cannot import electron in browser code. You need to use a native.ts file"), banImportPlugin(/^ts-pattern$/, "Cannot import from ts-pattern. match and P should be imported from @webpack/common"), + // @ts-ignore this is never undefined ...commonOpts.plugins ]; diff --git a/scripts/build/tsconfig.esbuild.json b/scripts/build/tsconfig.esbuild.json deleted file mode 100644 index e3e28a14d..000000000 --- a/scripts/build/tsconfig.esbuild.json +++ /dev/null @@ -1,7 +0,0 @@ -// Work around https://github.com/evanw/esbuild/issues/2460 -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react" - } -} From 205e07d2c5b908f29d2a463845d7a1417a4678ad Mon Sep 17 00:00:00 2001 From: Elvyra <88881326+EepyElvyra@users.noreply.github.com> Date: Mon, 10 Feb 2025 20:00:59 +0100 Subject: [PATCH 03/23] BetterFolders: Fix not disabling expanded folder background (#3214) --- src/plugins/betterFolders/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index 39c109656..ded8b6114 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -185,8 +185,8 @@ export default definePlugin({ { // Decide if we should render the expanded folder background if we are rendering the Better Folders sidebar predicate: () => settings.store.showFolderIcon !== FolderIconDisplay.Always, - match: /(?<=\.isExpanded\),children:\[)/, - replace: "$self.shouldShowFolderIconAndBackground(!!arguments[0]?.isBetterFolders,arguments[0]?.betterFoldersExpandedIds)&&" + match: /\.isExpanded\),.{0,30}children:\[/, + replace: "$&$self.shouldShowFolderIconAndBackground(!!arguments[0]?.isBetterFolders,arguments[0]?.betterFoldersExpandedIds)&&" }, { // Decide if we should render the expanded folder icon if we are rendering the Better Folders sidebar From 146a2ac77d55db354647f65474a31ff8b390ed59 Mon Sep 17 00:00:00 2001 From: v Date: Wed, 12 Feb 2025 19:10:05 +0100 Subject: [PATCH 04/23] reporter: improve display (#3220) --- scripts/generateReport.ts | 132 ++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 56 deletions(-) diff --git a/scripts/generateReport.ts b/scripts/generateReport.ts index 7bfda763b..9502d382e 100644 --- a/scripts/generateReport.ts +++ b/scripts/generateReport.ts @@ -54,14 +54,17 @@ async function maybeGetError(handle: JSHandle): Promise { .catch(() => undefined); } +interface PatchInfo { + plugin: string; + type: string; + id: string; + match: string; + error?: string; +}; + const report = { - badPatches: [] as { - plugin: string; - type: string; - id: string; - match: string; - error?: string; - }[], + badPatches: [] as PatchInfo[], + slowPatches: [] as PatchInfo[], badStarts: [] as { plugin: string; error: string; @@ -132,53 +135,67 @@ async function printReport() { console.log(); if (process.env.WEBHOOK_URL) { + const patchesToEmbed = (title: string, patches: PatchInfo[], color: number) => ({ + title, + color, + description: patches.map(p => { + const lines = [ + `**__${p.plugin} (${p.type}):__**`, + `ID: \`${p.id}\``, + `Match: ${toCodeBlock(p.match, "Match: ".length, true)}` + ]; + if (p.error) lines.push(`Error: ${toCodeBlock(p.error, "Error: ".length, true)}`); + + return lines.join("\n"); + }).join("\n\n"), + }); + + const embeds = [ + { + author: { + name: `Discord ${CANARY ? "Canary" : "Stable"} (${metaData.buildNumber})`, + url: `https://nelly.tools/builds/app/${metaData.buildHash}`, + icon_url: CANARY ? "https://cdn.discordapp.com/emojis/1252721945699549327.png?size=128" : "https://cdn.discordapp.com/emojis/1252721943463985272.png?size=128" + }, + color: CANARY ? 0xfbb642 : 0x5865f2 + }, + report.badPatches.length > 0 && patchesToEmbed("Bad Patches", report.badPatches, 0xff0000), + report.slowPatches.length > 0 && patchesToEmbed("Slow Patches", report.slowPatches, 0xf0b232), + report.badWebpackFinds.length > 0 && { + title: "Bad Webpack Finds", + description: report.badWebpackFinds.map(f => toCodeBlock(f, 0, true)).join("\n") || "None", + color: 0xff0000 + }, + report.badStarts.length > 0 && { + title: "Bad Starts", + description: report.badStarts.map(p => { + const lines = [ + `**__${p.plugin}:__**`, + toCodeBlock(p.error, 0, true) + ]; + return lines.join("\n"); + } + ).join("\n\n") || "None", + color: 0xff0000 + }, + report.otherErrors.length > 0 && { + title: "Discord Errors", + description: report.otherErrors.length ? toCodeBlock(report.otherErrors.join("\n"), 0, true) : "None", + color: 0xff0000 + } + ].filter(Boolean); + + if (embeds.length === 1) { + embeds.push({ + title: "No issues found", + description: "Seems like everything is working fine (for now) <:shipit:1330992641466433556>", + color: 0x00ff00 + }); + } + const body = JSON.stringify({ username: "Vencord Reporter" + (CANARY ? " (Canary)" : ""), - embeds: [ - { - author: { - name: `Discord ${CANARY ? "Canary" : "Stable"} (${metaData.buildNumber})`, - url: `https://nelly.tools/builds/app/${metaData.buildHash}`, - icon_url: CANARY ? "https://cdn.discordapp.com/emojis/1252721945699549327.png?size=128" : "https://cdn.discordapp.com/emojis/1252721943463985272.png?size=128" - }, - color: CANARY ? 0xfbb642 : 0x5865f2 - }, - { - title: "Bad Patches", - description: report.badPatches.map(p => { - const lines = [ - `**__${p.plugin} (${p.type}):__**`, - `ID: \`${p.id}\``, - `Match: ${toCodeBlock(p.match, "Match: ".length, true)}` - ]; - if (p.error) lines.push(`Error: ${toCodeBlock(p.error, "Error: ".length, true)}`); - return lines.join("\n"); - }).join("\n\n") || "None", - color: report.badPatches.length ? 0xff0000 : 0x00ff00 - }, - { - title: "Bad Webpack Finds", - description: report.badWebpackFinds.map(f => toCodeBlock(f, 0, true)).join("\n") || "None", - color: report.badWebpackFinds.length ? 0xff0000 : 0x00ff00 - }, - { - title: "Bad Starts", - description: report.badStarts.map(p => { - const lines = [ - `**__${p.plugin}:__**`, - toCodeBlock(p.error, 0, true) - ]; - return lines.join("\n"); - } - ).join("\n\n") || "None", - color: report.badStarts.length ? 0xff0000 : 0x00ff00 - }, - { - title: "Discord Errors", - description: report.otherErrors.length ? toCodeBlock(report.otherErrors.join("\n"), 0, true) : "None", - color: report.otherErrors.length ? 0xff0000 : 0x00ff00 - } - ] + embeds }); const headers = { @@ -245,14 +262,17 @@ page.on("console", async e => { switch (tag) { case "WebpackInterceptor:": - const patchFailMatch = message.match(/Patch by (.+?) (had no effect|errored|found no module|took [\d.]+?ms) \(Module id is (.+?)\): (.+)/)!; - if (!patchFailMatch) break; + const patchFailMatch = message.match(/Patch by (.+?) (had no effect|errored|found no module) \(Module id is (.+?)\): (.+)/); + const patchSlowMatch = message.match(/Patch by (.+?) (took [\d.]+?ms) \(Module id is (.+?)\): (.+)/); + const match = patchFailMatch ?? patchSlowMatch; + if (!match) break; logStderr(await getText()); process.exitCode = 1; - const [, plugin, type, id, regex] = patchFailMatch; - report.badPatches.push({ + const [, plugin, type, id, regex] = match; + const list = patchFailMatch ? report.badPatches : report.slowPatches; + list.push({ plugin, type, id, From fad2f1e5b4016f095029f85bcbe25b2385a6f445 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:26:47 -0300 Subject: [PATCH 05/23] Fix PatchHelper and DevCompanion not replacing $self correctly --- src/components/VencordSettings/PatchHelperTab.tsx | 2 +- src/plugins/devCompanion.dev/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/VencordSettings/PatchHelperTab.tsx b/src/components/VencordSettings/PatchHelperTab.tsx index f3a8e1ddf..2bb4047fd 100644 --- a/src/components/VencordSettings/PatchHelperTab.tsx +++ b/src/components/VencordSettings/PatchHelperTab.tsx @@ -65,7 +65,7 @@ function ReplacementComponent({ module, match, replacement, setReplacementError } const canonicalMatch = canonicalizeMatch(new RegExp(match)); try { - const canonicalReplace = canonicalizeReplace(replacement, "YourPlugin"); + const canonicalReplace = canonicalizeReplace(replacement, 'Vencord.Plugins.plugins["YourPlugin"]"'); var patched = src.replace(canonicalMatch, canonicalReplace as string); setReplacementError(void 0); } catch (e) { diff --git a/src/plugins/devCompanion.dev/index.tsx b/src/plugins/devCompanion.dev/index.tsx index d6a56fe69..d780b5928 100644 --- a/src/plugins/devCompanion.dev/index.tsx +++ b/src/plugins/devCompanion.dev/index.tsx @@ -173,7 +173,7 @@ function initWs(isManual = false) { try { const matcher = canonicalizeMatch(parseNode(match)); - const replacement = canonicalizeReplace(parseNode(replace), "PlaceHolderPluginName"); + const replacement = canonicalizeReplace(parseNode(replace), 'Vencord.Plugins.plugins["PlaceHolderPluginName"]"'); const newSource = src.replace(matcher, replacement as string); From f9cc400757a248f005913ffb5178b49772ca25ef Mon Sep 17 00:00:00 2001 From: xou09 <156519349+xou09@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:05:09 +0300 Subject: [PATCH 06/23] FriendInvites: fix not working in dms (#3226) --- src/plugins/friendInvites/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/friendInvites/index.ts b/src/plugins/friendInvites/index.ts index 3c5a324fd..0af611bc9 100644 --- a/src/plugins/friendInvites/index.ts +++ b/src/plugins/friendInvites/index.ts @@ -31,7 +31,7 @@ export default definePlugin({ { name: "create friend invite", description: "Generates a friend invite link.", - inputType: ApplicationCommandInputType.BOT, + inputType: ApplicationCommandInputType.BUILT_IN, execute: async (args, ctx) => { const invite = await FriendInvites.createFriendInvite(); @@ -48,7 +48,7 @@ export default definePlugin({ { name: "view friend invites", description: "View a list of all generated friend invites.", - inputType: ApplicationCommandInputType.BOT, + inputType: ApplicationCommandInputType.BUILT_IN, execute: async (_, ctx) => { const invites = await FriendInvites.getAllFriendInvites(); const friendInviteList = invites.map(i => @@ -67,7 +67,7 @@ export default definePlugin({ { name: "revoke friend invites", description: "Revokes all generated friend invites.", - inputType: ApplicationCommandInputType.BOT, + inputType: ApplicationCommandInputType.BUILT_IN, execute: async (_, ctx) => { await FriendInvites.revokeFriendInvites(); From 8773d057bc61e16952a5adcc8e5900279769edd3 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Fri, 14 Feb 2025 21:57:23 -0300 Subject: [PATCH 07/23] Remove trailing quote from testing patches --- src/components/VencordSettings/PatchHelperTab.tsx | 2 +- src/plugins/devCompanion.dev/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/VencordSettings/PatchHelperTab.tsx b/src/components/VencordSettings/PatchHelperTab.tsx index 2bb4047fd..f930a40d2 100644 --- a/src/components/VencordSettings/PatchHelperTab.tsx +++ b/src/components/VencordSettings/PatchHelperTab.tsx @@ -65,7 +65,7 @@ function ReplacementComponent({ module, match, replacement, setReplacementError } const canonicalMatch = canonicalizeMatch(new RegExp(match)); try { - const canonicalReplace = canonicalizeReplace(replacement, 'Vencord.Plugins.plugins["YourPlugin"]"'); + const canonicalReplace = canonicalizeReplace(replacement, 'Vencord.Plugins.plugins["YourPlugin"]'); var patched = src.replace(canonicalMatch, canonicalReplace as string); setReplacementError(void 0); } catch (e) { diff --git a/src/plugins/devCompanion.dev/index.tsx b/src/plugins/devCompanion.dev/index.tsx index d780b5928..4ac2e993d 100644 --- a/src/plugins/devCompanion.dev/index.tsx +++ b/src/plugins/devCompanion.dev/index.tsx @@ -173,7 +173,7 @@ function initWs(isManual = false) { try { const matcher = canonicalizeMatch(parseNode(match)); - const replacement = canonicalizeReplace(parseNode(replace), 'Vencord.Plugins.plugins["PlaceHolderPluginName"]"'); + const replacement = canonicalizeReplace(parseNode(replace), 'Vencord.Plugins.plugins["PlaceHolderPluginName"]'); const newSource = src.replace(matcher, replacement as string); From 94d45780f92b43b0dcdf6a0e2daa02334fc57d99 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Sat, 15 Feb 2025 03:27:21 -0300 Subject: [PATCH 08/23] Document new WebpackRequire properties --- src/webpack/wreq.d.ts | 74 +++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/src/webpack/wreq.d.ts b/src/webpack/wreq.d.ts index b9f5353f3..ff28732c6 100644 --- a/src/webpack/wreq.d.ts +++ b/src/webpack/wreq.d.ts @@ -33,27 +33,45 @@ export type AsyncModuleBody = ( asyncResult: (error?: any) => void ) => Promise; -export type ChunkHandlers = { +export type EnsureChunkHandlers = { /** * Ensures the js file for this chunk is loaded, or starts to load if it's not. * @param chunkId The chunk id * @param promises The promises array to add the loading promise to */ - j: (this: ChunkHandlers, chunkId: PropertyKey, promises: Promise) => void, + j: (this: EnsureChunkHandlers, chunkId: PropertyKey, promises: Promise) => void; /** * Ensures the css file for this chunk is loaded, or starts to load if it's not. * @param chunkId The chunk id * @param promises The promises array to add the loading promise to. This array will likely contain the promise of the js file too */ - css: (this: ChunkHandlers, chunkId: PropertyKey, promises: Promise) => void, + css: (this: EnsureChunkHandlers, chunkId: PropertyKey, promises: Promise) => void; + /** + * Trigger for prefetching next chunks. This is called after ensuring a chunk is loaded and internally looks up + * a map to see if the chunk that just loaded has next chunks to prefetch. + * + * Note that this does not add an extra promise to the promises array, and instead only executes the prefetching after + * calling Promise.all on the promises array. + * @param chunkId The chunk id + * @param promises The promises array of ensuring the chunk is loaded + */ + prefetch: (this: EnsureChunkHandlers, chunkId: PropertyKey, promises: Promise) => void; +}; + +export type PrefetchChunkHandlers = { + /** + * Prefetches the js file for this chunk. + * @param chunkId The chunk id + */ + j: (this: PrefetchChunkHandlers, chunkId: PropertyKey) => void; }; export type ScriptLoadDone = (event: Event) => void; -// export type OnChunksLoaded = ((this: WebpackRequire, result: any, chunkIds: PropertyKey[] | undefined | null, callback: () => any, priority: number) => any) & { -// /** Check if a chunk has been loaded */ -// j: (this: OnChunksLoaded, chunkId: PropertyKey) => boolean; -// }; +export type OnChunksLoaded = ((this: WebpackRequire, result: any, chunkIds: PropertyKey[] | undefined | null, callback: () => any, priority: number) => any) & { + /** Check if a chunk has been loaded */ + j: (this: OnChunksLoaded, chunkId: PropertyKey) => boolean; +}; export type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & { /** The module factories, where all modules that have been loaded are stored (pre-loaded or loaded by lazy chunks) */ @@ -135,13 +153,20 @@ export type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & { * // exports is now { exportName: someExportedValue } (but each value is actually a getter) */ d: (this: WebpackRequire, exports: AnyRecord, definiton: AnyRecord) => void; - /** The chunk handlers, which are used to ensure the files of the chunks are loaded, or load if necessary */ - f: ChunkHandlers; + /** The ensure chunk handlers, which are used to ensure the files of the chunks are loaded, or load if necessary */ + f: EnsureChunkHandlers; /** * The ensure chunk function, it ensures a chunk is loaded, or loads if needed. * Internally it uses the handlers in {@link WebpackRequire.f} to load/ensure the chunk is loaded. */ e: (this: WebpackRequire, chunkId: PropertyKey) => Promise; + /** The prefetch chunk handlers, which are used to prefetch the files of the chunks */ + F: PrefetchChunkHandlers; + /** + * The prefetch chunk function. + * Internally it uses the handlers in {@link WebpackRequire.F} to prefetch a chunk. + */ + E: (this: WebpackRequire, chunkId: PropertyKey) => void; /** Get the filename for the css part of a chunk */ k: (this: WebpackRequire, chunkId: PropertyKey) => string; /** Get the filename for the js part of a chunk */ @@ -162,18 +187,18 @@ export type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & { r: (this: WebpackRequire, exports: ModuleExports) => void; /** Node.js module decorator. Decorates a module as a Node.js module */ nmd: (this: WebpackRequire, module: Module) => any; - // /** - // * Register deferred code which will be executed when the passed chunks are loaded. - // * - // * If chunkIds is defined, it defers the execution of the callback and returns undefined. - // * - // * If chunkIds is undefined, and no deferred code exists or can be executed, it returns the value of the result argument. - // * - // * If chunkIds is undefined, and some deferred code can already be executed, it returns the result of the callback function of the last deferred code. - // * - // * When (priority & 1) it will wait for all other handlers with lower priority to be executed before itself is executed. - // */ - // O: OnChunksLoaded; + /** + * Register deferred code which will be executed when the passed chunks are loaded. + * + * If chunkIds is defined, it defers the execution of the callback and returns undefined. + * + * If chunkIds is undefined, and no deferred code exists or can be executed, it returns the value of the result argument. + * + * If chunkIds is undefined, and some deferred code can already be executed, it returns the result of the callback function of the last deferred code. + * + * When (priority & 1) it will wait for all other handlers with lower priority to be executed before itself is executed. + */ + O: OnChunksLoaded; /** * Instantiate a wasm instance with source using "wasmModuleHash", and importObject "importsObj", and then assign the exports of its instance to "exports". * @returns The exports argument, but now assigned with the exports of the wasm instance @@ -185,6 +210,13 @@ export type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & { j: string; /** Document baseURI or WebWorker location.href */ b: string; + + /* rspack only */ + + /** rspack version */ + rv: (this: WebpackRequire) => string; + /** rspack unique id */ + ruid: string; }; // Utility section for Vencord From 5ec564558ea07b356c96de996b78e5df9ad5a6dd Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Sat, 15 Feb 2025 16:33:39 -0300 Subject: [PATCH 09/23] WebpackPatcher: Avoid patching wrong instances (like Stripe) --- src/debug/loadLazyChunks.ts | 3 +- src/debug/runReporter.ts | 3 +- src/webpack/patchWebpack.ts | 243 ++++++++++++++++++++++-------------- src/webpack/webpack.ts | 4 - 4 files changed, 152 insertions(+), 101 deletions(-) diff --git a/src/debug/loadLazyChunks.ts b/src/debug/loadLazyChunks.ts index 427acd11a..9c06e3aa4 100644 --- a/src/debug/loadLazyChunks.ts +++ b/src/debug/loadLazyChunks.ts @@ -20,8 +20,7 @@ export async function loadLazyChunks() { const invalidChunks = new Set(); const deferredRequires = new Set(); - let chunksSearchingResolve: (value: void) => void; - const chunksSearchingDone = new Promise(r => chunksSearchingResolve = r); + const { promise: chunksSearchingDone, resolve: chunksSearchingResolve } = Promise.withResolvers(); // True if resolved, false otherwise const chunksSearchPromises = [] as Array<() => boolean>; diff --git a/src/debug/runReporter.ts b/src/debug/runReporter.ts index 7a14609e1..8898242e0 100644 --- a/src/debug/runReporter.ts +++ b/src/debug/runReporter.ts @@ -17,8 +17,7 @@ async function runReporter() { try { ReporterLogger.log("Starting test..."); - let loadLazyChunksResolve: (value: void) => void; - const loadLazyChunksDone = new Promise(r => loadLazyChunksResolve = r); + const { promise: loadLazyChunksDone, resolve: loadLazyChunksResolve } = Promise.withResolvers(); // The main patch for starting the reporter chunk loading addPatch({ diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 14c1888c9..9c91eee9a 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -17,6 +17,7 @@ import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, ModuleE export const patches = [] as Patch[]; +export const SYM_IS_PROXIED_FACTORY = Symbol("WebpackPatcher.isProxiedFactory"); export const SYM_ORIGINAL_FACTORY = Symbol("WebpackPatcher.originalFactory"); export const SYM_PATCHED_SOURCE = Symbol("WebpackPatcher.patchedSource"); export const SYM_PATCHED_BY = Symbol("WebpackPatcher.patchedBy"); @@ -79,7 +80,8 @@ const define: typeof Reflect.defineProperty = (target, p, attributes) => { }; // wreq.m is the Webpack object containing module factories. It is pre-populated with factories, and is also populated via webpackGlobal.push -// We use this setter to intercept when wreq.m is defined and apply patching to its factories. +// We use this setter to intercept when wreq.m is defined and setup our setters which decide whether we should patch these module factories +// and the Webpack instance where they are being defined. // Factories can be patched in two ways. Eagerly or lazily. // If we are patching eagerly, pre-populated factories are patched immediately and new factories are patched when set. @@ -97,7 +99,7 @@ define(Function.prototype, "m", { set(this: AnyWebpackRequire, originalModules: AnyWebpackRequire["m"]) { define(this, "m", { value: originalModules }); - // Ensure this is one of Discord main Webpack instances. + // Ensure this is likely one of Discord main Webpack instances. // We may catch Discord bundled libs, React Devtools or other extensions Webpack instances here. const { stack } = new Error(); if (!stack?.includes("http") || stack.match(/at \d+? \(/) || !String(this).includes("exports:{}")) { @@ -105,53 +107,90 @@ define(Function.prototype, "m", { } const fileName = stack.match(/\/assets\/(.+?\.js)/)?.[1]; - logger.info("Found Webpack module factories" + interpolateIfDefined` in ${fileName}`); - allWebpackInstances.add(this); - - // Define a setter for the ensureChunk property of WebpackRequire. Only the main Webpack (which is the only that includes chunk loading) has this property. - // So if the setter is called, this means we can initialize the internal references to WebpackRequire. - define(this, "e", { + // Define a setter for the bundlePath property of WebpackRequire. Only Webpack instances which include chunk loading functionality, + // like the main Discord Webpack, have this property. + // So if the setter is called with the Discord bundlePath, this means we should patch this instance and initialize the internal references to WebpackRequire. + define(this, "p", { enumerable: false, - set(this: WebpackRequire, ensureChunk: WebpackRequire["e"]) { - define(this, "e", { value: ensureChunk }); - clearTimeout(setterTimeout); + set(this: AnyWebpackRequire, bundlePath: NonNullable) { + define(this, "p", { value: bundlePath }); + clearTimeout(bundlePathTimeout); - logger.info("Main WebpackInstance found" + interpolateIfDefined` in ${fileName}` + ", initializing internal references to WebpackRequire"); - _initWebpack(this); + if (bundlePath !== "/assets/") { + return; + } + + patchThisInstance(); + + if (wreq == null && this.c != null) { + logger.info("Main WebpackInstance found" + interpolateIfDefined` in ${fileName}` + ", initializing internal references to WebpackRequire"); + _initWebpack(this as WebpackRequire); + } } }); - // setImmediate to clear this property setter if this is not the main Webpack. - // If this is the main Webpack, wreq.e will always be set before the timeout runs. - const setterTimeout = setTimeout(() => Reflect.deleteProperty(this, "e"), 0); - // Patch the pre-populated factories - for (const moduleId in originalModules) { - const originalFactory = originalModules[moduleId]; + // In the past, the sentry Webpack instance which we also wanted to patch used to rely on chunks being loaded before initting sentry. + // This Webpack instance did not include actual chunk loading, and only awaited for them to be loaded, which means it did not include the bundlePath property. + // To keep backwards compability, in case this is ever the case again, and keep patching this type of instance, we explicity patch instances which include wreq.O and not wreq.p. + // Since we cannot check what is the bundlePath of the instance to filter for the Discord bundlePath, we only patch it if wreq.p is not included, + // which means the instance relies on another instance which does chunk loading, and that makes it very likely to only target Discord Webpack instances like the old sentry. - if (updateExistingFactory(originalModules, moduleId, originalFactory, originalModules, true)) { - continue; + // Instead of patching when wreq.O is defined, wait for when wreq.O.j is defined, since that will be one of the last things to happen, + // which can assure wreq.p could have already been defined before. + define(this, "O", { + enumerable: false, + + set(this: AnyWebpackRequire, onChunksLoaded: NonNullable) { + define(this, "O", { value: onChunksLoaded }); + clearTimeout(onChunksLoadedTimeout); + + const wreq = this; + define(onChunksLoaded, "j", { + enumerable: false, + + set(this: NonNullable, j: NonNullable["j"]) { + define(this, "j", { value: j }); + + if (wreq.p == null) { + patchThisInstance(); + } + } + }); } - - notifyFactoryListeners(moduleId, originalFactory); - - const proxiedFactory = new Proxy(Settings.eagerPatches ? patchFactory(moduleId, originalFactory) : originalFactory, moduleFactoryHandler); - define(originalModules, moduleId, { value: proxiedFactory }); - } - - define(originalModules, Symbol.toStringTag, { - value: "ModuleFactories", - enumerable: false }); - const proxiedModuleFactories = new Proxy(originalModules, moduleFactoriesHandler); - /* - If Webpack ever decides to set module factories using the variable of the modules object directly, instead of wreq.m, switch the proxy to the prototype - Reflect.setPrototypeOf(originalModules, new Proxy(originalModules, moduleFactoriesHandler)); - */ + // If neither of these properties setters were triggered, delete them as they are not needed anymore. + const bundlePathTimeout = setTimeout(() => Reflect.deleteProperty(this, "p"), 0); + const onChunksLoadedTimeout = setTimeout(() => Reflect.deleteProperty(this, "O"), 0); - define(this, "m", { value: proxiedModuleFactories }); + /** + * Patch the current Webpack instance assigned to `this` context. + * This should only be called if this instance was later found to be one we need to patch. + */ + const patchThisInstance = () => { + logger.info("Found Webpack module factories" + interpolateIfDefined` in ${fileName}`); + allWebpackInstances.add(this); + + // Proxy (and maybe patch) pre-populated factories + for (const moduleId in originalModules) { + updateExistingOrProxyFactory(originalModules, moduleId, originalModules[moduleId], originalModules, true); + } + + define(originalModules, Symbol.toStringTag, { + value: "ModuleFactories", + enumerable: false + }); + + const proxiedModuleFactories = new Proxy(originalModules, moduleFactoriesHandler); + /* + If Webpack ever decides to set module factories using the variable of the modules object directly, instead of wreq.m, switch the proxy to the prototype + Reflect.setPrototypeOf(originalModules, new Proxy(originalModules, moduleFactoriesHandler)); + */ + + define(this, "m", { value: proxiedModuleFactories }); + }; } }); @@ -172,93 +211,102 @@ const moduleFactoriesHandler: ProxyHandler = { }, */ - set(target, p, newValue, receiver) { - if (updateExistingFactory(target, p, newValue, receiver)) { - return true; - } - - notifyFactoryListeners(p, newValue); - - const proxiedFactory = new Proxy(Settings.eagerPatches ? patchFactory(p, newValue) : newValue, moduleFactoryHandler); - return Reflect.set(target, p, proxiedFactory, receiver); - } + set: updateExistingOrProxyFactory }; // The proxy for patching lazily and/or running factories with our wrapper. const moduleFactoryHandler: ProxyHandler = { apply(target, thisArg: unknown, argArray: Parameters) { - // SAFETY: Factories have `name` as their key in the module factories object, and that is always their module id - const moduleId = target.name; - // SYM_ORIGINAL_FACTORY means the factory has already been patched if (target[SYM_ORIGINAL_FACTORY] != null) { - return runFactoryWithWrap(moduleId, target as PatchedModuleFactory, thisArg, argArray); + return runFactoryWithWrap(target as PatchedModuleFactory, thisArg, argArray); } + // SAFETY: Factories have `name` as their key in the module factories object, and that is always their module id + const moduleId: string = target.name; + const patchedFactory = patchFactory(moduleId, target); - return runFactoryWithWrap(moduleId, patchedFactory, thisArg, argArray); + return runFactoryWithWrap(patchedFactory, thisArg, argArray); }, get(target, p, receiver) { - if (target[SYM_ORIGINAL_FACTORY] != null && (p === SYM_PATCHED_SOURCE || p === SYM_PATCHED_BY)) { - return Reflect.get(target[SYM_ORIGINAL_FACTORY], p, target[SYM_ORIGINAL_FACTORY]); + if (p === SYM_IS_PROXIED_FACTORY) { + return true; } - const v = Reflect.get(target, p, receiver); + const originalFactory: AnyModuleFactory = target[SYM_ORIGINAL_FACTORY] ?? target; - // Make proxied factories `toString` return their original factory `toString` - if (p === "toString") { - return v.bind(target[SYM_ORIGINAL_FACTORY] ?? target); + // Redirect these properties to the original factory, including making `toString` return the original factory `toString` + if (p === "toString" || p === SYM_PATCHED_SOURCE || p === SYM_PATCHED_BY) { + const v = Reflect.get(originalFactory, p, originalFactory); + return p === "toString" ? v.bind(originalFactory) : v; } - return v; + return Reflect.get(target, p, receiver); } }; +function updateExistingOrProxyFactory(moduleFactories: AnyWebpackRequire["m"], moduleId: PropertyKey, newFactory: AnyModuleFactory, receiver: any, ignoreExistingInTarget = false) { + if (updateExistingFactory(moduleFactories, moduleId, newFactory, receiver, ignoreExistingInTarget)) { + return true; + } + + notifyFactoryListeners(moduleId, newFactory); + + const proxiedFactory = new Proxy(Settings.eagerPatches ? patchFactory(moduleId, newFactory) : newFactory, moduleFactoryHandler); + return Reflect.set(moduleFactories, moduleId, proxiedFactory, receiver); +} + /** - * Update a factory that exists in any Webpack instance with a new original factory. + * Update a duplicated factory that exists in any of the Webpack instances we track with a new original factory. * - * @param moduleFactoriesTarget The module factories where this new original factory is being set + * @param moduleFactories The module factories where this new original factory is being set * @param moduleId The id of the module * @param newFactory The new original factory - * @param receiver The receiver of the new factory - * @param ignoreExistingInTarget Whether to ignore checking if the factory already exists in the moduleFactoriesTarget - * @returns Whether the original factory was updated, or false if it doesn't exist in any Webpack instance + * @param receiver The receiver of the factory + * @param ignoreExistingInTarget Whether to ignore checking if the factory already exists in the moduleFactories where it is being set + * @returns Whether the original factory was updated, or false if it doesn't exist in any of the tracked Webpack instances */ -function updateExistingFactory(moduleFactoriesTarget: AnyWebpackRequire["m"], moduleId: PropertyKey, newFactory: AnyModuleFactory, receiver: any, ignoreExistingInTarget: boolean = false) { - let existingFactory: TypedPropertyDescriptor | undefined; +function updateExistingFactory(moduleFactories: AnyWebpackRequire["m"], moduleId: PropertyKey, newFactory: AnyModuleFactory, receiver: any, ignoreExistingInTarget) { + let existingFactory: AnyModuleFactory | undefined; let moduleFactoriesWithFactory: AnyWebpackRequire["m"] | undefined; for (const wreq of allWebpackInstances) { - if (ignoreExistingInTarget && wreq.m === moduleFactoriesTarget) { + if (ignoreExistingInTarget && wreq.m === moduleFactories) { continue; } if (Object.hasOwn(wreq.m, moduleId)) { - existingFactory = Reflect.getOwnPropertyDescriptor(wreq.m, moduleId); + existingFactory = wreq.m[moduleId]; moduleFactoriesWithFactory = wreq.m; break; } } if (existingFactory != null) { - // If existingFactory exists in any Webpack instance, it's either wrapped in our proxy, or it has already been required. - // In the case it is wrapped in our proxy, we need the Webpack instance with this new original factory to also have our proxy. - // So, define the descriptor of the existing factory on it. - if (moduleFactoriesWithFactory !== moduleFactoriesTarget) { - Reflect.defineProperty(receiver, moduleId, existingFactory); + // Sanity check to make sure these factories are equal + if (String(newFactory) !== String(existingFactory)) { + return false; } - const existingFactoryValue = moduleFactoriesWithFactory![moduleId]; + // If existingFactory exists in any of the Webpack instances we track, it's either wrapped in our proxy, or it has already been required. + // In the case it is wrapped in our proxy, and the instance we are setting does not already have it, we need to make sure the instance contains our proxy too. + if (moduleFactoriesWithFactory !== moduleFactories && existingFactory[SYM_IS_PROXIED_FACTORY]) { + Reflect.set(moduleFactories, moduleId, existingFactory, receiver); + } + // Else, if it is not wrapped in our proxy, set this new original factory in all the instances + else { + defineInWebpackInstances(moduleId, newFactory); + } - // Update with the new original factory, if it does have a current original factory - if (existingFactoryValue[SYM_ORIGINAL_FACTORY] != null) { - existingFactoryValue[SYM_ORIGINAL_FACTORY] = newFactory; + // Update existingFactory with the new original, if it does have a current original factory + if (existingFactory[SYM_ORIGINAL_FACTORY] != null) { + existingFactory[SYM_ORIGINAL_FACTORY] = newFactory; } // Persist patched source and patched by in the new original factory if (IS_DEV) { - newFactory[SYM_PATCHED_SOURCE] = existingFactoryValue[SYM_PATCHED_SOURCE]; - newFactory[SYM_PATCHED_BY] = existingFactoryValue[SYM_PATCHED_BY]; + newFactory[SYM_PATCHED_SOURCE] = existingFactory[SYM_PATCHED_SOURCE]; + newFactory[SYM_PATCHED_BY] = existingFactory[SYM_PATCHED_BY]; } return true; @@ -267,6 +315,18 @@ function updateExistingFactory(moduleFactoriesTarget: AnyWebpackRequire["m"], mo return false; } +/** + * Define a module factory in all the Webpack instances we track. + * + * @param moduleId The id of the module + * @param factory The factory + */ +function defineInWebpackInstances(moduleId: PropertyKey, factory: AnyModuleFactory) { + for (const wreq of allWebpackInstances) { + define(wreq.m, moduleId, { value: factory }); + } +} + /** * Notify all factory listeners. * @@ -286,12 +346,11 @@ function notifyFactoryListeners(moduleId: PropertyKey, factory: AnyModuleFactory /** * Run a (possibly) patched module factory with a wrapper which notifies our listeners. * - * @param moduleId The id of the module * @param patchedFactory The (possibly) patched module factory * @param thisArg The `value` of the call to the factory * @param argArray The arguments of the call to the factory */ -function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModuleFactory, thisArg: unknown, argArray: Parameters) { +function runFactoryWithWrap(patchedFactory: PatchedModuleFactory, thisArg: unknown, argArray: Parameters) { const originalFactory = patchedFactory[SYM_ORIGINAL_FACTORY]; if (patchedFactory === originalFactory) { @@ -299,25 +358,23 @@ function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModule delete patchedFactory[SYM_ORIGINAL_FACTORY]; } - // Restore the original factory in all the module factories objects, discarding our proxy and allowing it to be garbage collected - for (const wreq of allWebpackInstances) { - define(wreq.m, moduleId, { value: originalFactory }); - } - let [module, exports, require] = argArray; + // Restore the original factory in all the module factories objects, discarding our proxy and allowing it to be garbage collected + defineInWebpackInstances(module.id, originalFactory); + if (wreq == null) { if (!wreqFallbackApplied) { wreqFallbackApplied = true; // Make sure the require argument is actually the WebpackRequire function - if (typeof require === "function" && require.m != null) { + if (typeof require === "function" && require.m != null && require.c != null) { const { stack } = new Error(); const webpackInstanceFileName = stack?.match(/\/assets\/(.+?\.js)/)?.[1]; logger.warn( "WebpackRequire was not initialized, falling back to WebpackRequire passed to the first called wrapped module factory (" + - `id: ${String(moduleId)}` + interpolateIfDefined`, WebpackInstance origin: ${webpackInstanceFileName}` + + `id: ${String(module.id)}` + interpolateIfDefined`, WebpackInstance origin: ${webpackInstanceFileName}` + ")" ); @@ -355,8 +412,8 @@ function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModule if (shouldIgnoreModule) { if (require.c != null) { - Object.defineProperty(require.c, moduleId, { - value: require.c[moduleId], + Object.defineProperty(require.c, module.id, { + value: require.c[module.id], enumerable: false, configurable: true, writable: true @@ -369,7 +426,7 @@ function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModule for (const callback of moduleListeners) { try { - callback(exports, moduleId); + callback(exports, module.id); } catch (err) { logger.error("Error in Webpack module listener:\n", err, callback); } @@ -379,7 +436,7 @@ function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModule try { if (filter(exports)) { waitForSubscriptions.delete(filter); - callback(exports, moduleId); + callback(exports, module.id); continue; } @@ -392,7 +449,7 @@ function runFactoryWithWrap(moduleId: PropertyKey, patchedFactory: PatchedModule if (exportValue != null && filter(exportValue)) { waitForSubscriptions.delete(filter); - callback(exportValue, moduleId); + callback(exportValue, module.id); break; } } diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 09c04a2a1..fe939d9b9 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -97,10 +97,6 @@ export const moduleListeners = new Set(); export const factoryListeners = new Set(); export function _initWebpack(webpackRequire: WebpackRequire) { - if (webpackRequire.c == null) { - return; - } - wreq = webpackRequire; cache = webpackRequire.c; From 8dfbb5f9d887b7135f73cfd0a262c5ba1826e9f4 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:54:35 -0300 Subject: [PATCH 10/23] Make findStore use FluxStore.getAll instead of webpack searching --- src/webpack/webpack.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index fe939d9b9..e129b913d 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -22,6 +22,7 @@ import { Logger } from "@utils/Logger"; import { canonicalizeMatch } from "@utils/patches"; import { traceFunction } from "../debug/Tracer"; +import { Flux } from "./common"; import { AnyModuleFactory, ModuleExports, WebpackRequire } from "./wreq"; const logger = new Logger("Webpack"); @@ -405,7 +406,7 @@ export function findByCodeLazy(...code: CodeFilter) { * Find a store by its displayName */ export function findStore(name: StoreNameFilter) { - const res = find(filters.byStoreName(name), { isIndirect: true }); + const res: any = Flux.Store.getAll().find(filters.byStoreName(name)); if (!res) handleModuleNotFound("findStore", name); return res; From 6b0c02daa63a626698ab58310b024d666c406e1a Mon Sep 17 00:00:00 2001 From: v Date: Mon, 17 Feb 2025 02:10:02 +0100 Subject: [PATCH 11/23] fix issues & crashes caused by recent Discord changes (#3231) Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> --- src/debug/runReporter.ts | 4 +- src/plugins/_core/settings.tsx | 3 ++ src/webpack/common/utils.ts | 4 +- src/webpack/patchWebpack.ts | 31 ++++++------ src/webpack/webpack.ts | 86 +++++++++++++++++++++++----------- 5 files changed, 82 insertions(+), 46 deletions(-) diff --git a/src/debug/runReporter.ts b/src/debug/runReporter.ts index 8898242e0..2ca83b7fa 100644 --- a/src/debug/runReporter.ts +++ b/src/debug/runReporter.ts @@ -78,9 +78,9 @@ async function runReporter() { result = await Webpack.extractAndLoadChunks(code, matcher); if (result === false) result = null; } else if (method === "mapMangledModule") { - const [code, mapper] = args; + const [code, mapper, includeBlacklistedExports] = args; - result = Webpack.mapMangledModule(code, mapper); + result = Webpack.mapMangledModule(code, mapper, includeBlacklistedExports); if (Object.keys(result).length !== Object.keys(mapper).length) throw new Error("Webpack Find Fail"); } else { // @ts-ignore diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx index f48f38e03..a9e34f784 100644 --- a/src/plugins/_core/settings.tsx +++ b/src/plugins/_core/settings.tsx @@ -158,6 +158,9 @@ export default definePlugin({ aboveActivity: getIntlMessage("ACTIVITY_SETTINGS") }; + if (!names[settingsLocation] || names[settingsLocation].endsWith("_SETTINGS")) + return firstChild === "PREMIUM"; + return header === names[settingsLocation]; } catch { return firstChild === "PREMIUM"; diff --git a/src/webpack/common/utils.ts b/src/webpack/common/utils.ts index fe0668885..9ed1489c8 100644 --- a/src/webpack/common/utils.ts +++ b/src/webpack/common/utils.ts @@ -58,9 +58,9 @@ export const { match, P }: Pick = ma export const lodash: typeof import("lodash") = findByPropsLazy("debounce", "cloneDeep"); export const i18n = mapMangledModuleLazy('defaultLocale:"en-US"', { + t: filters.byProps(runtimeHashMessageKey("DISCORD")), intl: filters.byProps("string", "format"), - t: filters.byProps(runtimeHashMessageKey("DISCORD")) -}); +}, true); export let SnowflakeUtils: t.SnowflakeUtils; waitFor(["fromTimestamp", "extractTimestamp"], m => SnowflakeUtils = m); diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 9c91eee9a..408d3b708 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -12,7 +12,7 @@ import { canonicalizeReplacement } from "@utils/patches"; import { Patch, PatchReplacement } from "@utils/types"; import { traceFunctionWithResults } from "../debug/Tracer"; -import { _initWebpack, _shouldIgnoreModule, factoryListeners, findModuleId, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; +import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleId, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, ModuleExports, PatchedModuleFactory, WebpackRequire } from "./wreq.d"; export const patches = [] as Patch[]; @@ -190,6 +190,20 @@ define(Function.prototype, "m", { */ define(this, "m", { value: proxiedModuleFactories }); + + // Overwrite Webpack's defineExports function to define the export descriptors configurable. + // This is needed so we can later blacklist specific exports from Webpack search by making them non-enumerable + this.d = function (exports: object, getters: object) { + for (const key in getters) { + if (Object.hasOwn(getters, key) && !Object.hasOwn(exports, key)) { + Object.defineProperty(exports, key, { + enumerable: true, + configurable: true, + get: getters[key], + }); + } + } + }; }; } }); @@ -407,19 +421,8 @@ function runFactoryWithWrap(patchedFactory: PatchedModuleFactory, thisArg: unkno return factoryReturn; } - if (typeof require === "function") { - const shouldIgnoreModule = _shouldIgnoreModule(exports); - - if (shouldIgnoreModule) { - if (require.c != null) { - Object.defineProperty(require.c, module.id, { - value: require.c[module.id], - enumerable: false, - configurable: true, - writable: true - }); - } - + if (typeof require === "function" && require.c) { + if (_blacklistBadModules(require.c, exports, module.id)) { return factoryReturn; } } diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index e129b913d..30180a7e9 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -23,7 +23,7 @@ import { canonicalizeMatch } from "@utils/patches"; import { traceFunction } from "../debug/Tracer"; import { Flux } from "./common"; -import { AnyModuleFactory, ModuleExports, WebpackRequire } from "./wreq"; +import { AnyModuleFactory, AnyWebpackRequire, ModuleExports, WebpackRequire } from "./wreq"; const logger = new Logger("Webpack"); @@ -112,18 +112,38 @@ export function _initWebpack(webpackRequire: WebpackRequire) { // Credits to Zerebos for implementing this in BD, thus giving the idea for us to implement it too const TypedArray = Object.getPrototypeOf(Int8Array); -function _shouldIgnoreValue(value: any) { +const PROXY_CHECK = "is this a proxy that returns values for any key?"; +function shouldIgnoreValue(value: any) { if (value == null) return true; if (value === window) return true; if (value === document || value === document.documentElement) return true; - if (value[Symbol.toStringTag] === "DOMTokenList") return true; + if (value[Symbol.toStringTag] === "DOMTokenList" || value[Symbol.toStringTag] === "IntlMessagesProxy") return true; + // Discord might export a Proxy that returns non-null values for any property key which would pass all findByProps filters. + // One example of this is their i18n Proxy. However, that is already covered by the IntlMessagesProxy check above. + // As a fallback if they ever change the name or add a new Proxy, use a unique string to detect such proxies and ignore them + if (value[PROXY_CHECK] !== void 0) { + // their i18n Proxy "caches" by setting each accessed property to the return, so try to delete + Reflect.deleteProperty(value, PROXY_CHECK); + return true; + } if (value instanceof TypedArray) return true; return false; } -export function _shouldIgnoreModule(exports: any) { - if (_shouldIgnoreValue(exports)) { +function makePropertyNonEnumerable(target: Object, key: PropertyKey) { + const descriptor = Object.getOwnPropertyDescriptor(target, key); + if (descriptor == null) return; + + Reflect.defineProperty(target, key, { + ...descriptor, + enumerable: false + }); +} + +export function _blacklistBadModules(requireCache: NonNullable, exports: ModuleExports, moduleId: PropertyKey) { + if (shouldIgnoreValue(exports)) { + makePropertyNonEnumerable(requireCache, moduleId); return true; } @@ -131,14 +151,16 @@ export function _shouldIgnoreModule(exports: any) { return false; } - let allNonEnumerable = true; + let hasOnlyBadProperties = true; for (const exportKey in exports) { - if (!_shouldIgnoreValue(exports[exportKey])) { - allNonEnumerable = false; + if (shouldIgnoreValue(exports[exportKey])) { + makePropertyNonEnumerable(exports, exportKey); + } else { + hasOnlyBadProperties = false; } } - return allNonEnumerable; + return hasOnlyBadProperties; } let devToolsOpen = false; @@ -406,7 +428,10 @@ export function findByCodeLazy(...code: CodeFilter) { * Find a store by its displayName */ export function findStore(name: StoreNameFilter) { - const res: any = Flux.Store.getAll().find(filters.byStoreName(name)); + const res = Flux.Store.getAll + ? Flux.Store.getAll().find(filters.byStoreName(name)) + : find(filters.byStoreName(name), { isIndirect: true }); + if (!res) handleModuleNotFound("findStore", name); return res; @@ -474,12 +499,27 @@ export function findExportedComponentLazy(...props: Prop }); } +function getAllPropertyNames(object: Object, includeNonEnumerable: boolean) { + const names = new Set(); + + const getKeys = includeNonEnumerable ? Object.getOwnPropertyNames : Object.keys; + do { + getKeys(object).forEach(name => names.add(name)); + object = Object.getPrototypeOf(object); + } while (object != null); + + return names; +} + /** * Finds a mangled module by the provided code "code" (must be unique and can be anywhere in the module) * then maps it into an easily usable module via the specified mappers. * * @param code The code to look for * @param mappers Mappers to create the non mangled exports + * @param includeBlacklistedExports Whether to include blacklisted exports in the search. + * These exports are dangerous. Accessing properties on them may throw errors + * or always return values (so a byProps filter will always return true) * @returns Unmangled exports as specified in mappers * * @example mapMangledModule("headerIdIsManaged:", { @@ -487,7 +527,7 @@ export function findExportedComponentLazy(...props: Prop * closeModal: filters.byCode("key==") * }) */ -export const mapMangledModule = traceFunction("mapMangledModule", function mapMangledModule(code: string | RegExp | CodeFilter, mappers: Record): Record { +export const mapMangledModule = traceFunction("mapMangledModule", function mapMangledModule(code: string | RegExp | CodeFilter, mappers: Record, includeBlacklistedExports = false): Record { const exports = {} as Record; const id = findModuleId(...Array.isArray(code) ? code : [code]); @@ -495,8 +535,9 @@ export const mapMangledModule = traceFunction("mapMangledModule", function mapMa return exports; const mod = wreq(id as any); + const keys = getAllPropertyNames(mod, includeBlacklistedExports); outer: - for (const key in mod) { + for (const key of keys) { const member = mod[key]; for (const newName in mappers) { // if the current mapper matches this module @@ -510,24 +551,13 @@ export const mapMangledModule = traceFunction("mapMangledModule", function mapMa }); /** - * {@link mapMangledModule}, lazy. - - * Finds a mangled module by the provided code "code" (must be unique and can be anywhere in the module) - * then maps it into an easily usable module via the specified mappers. - * - * @param code The code to look for - * @param mappers Mappers to create the non mangled exports - * @returns Unmangled exports as specified in mappers - * - * @example mapMangledModule("headerIdIsManaged:", { - * openModal: filters.byCode("headerIdIsManaged:"), - * closeModal: filters.byCode("key==") - * }) + * lazy mapMangledModule + * @see {@link mapMangledModule} */ -export function mapMangledModuleLazy(code: string | RegExp | CodeFilter, mappers: Record): Record { - if (IS_REPORTER) lazyWebpackSearchHistory.push(["mapMangledModule", [code, mappers]]); +export function mapMangledModuleLazy(code: string | RegExp | CodeFilter, mappers: Record, includeBlacklistedExports = false): Record { + if (IS_REPORTER) lazyWebpackSearchHistory.push(["mapMangledModule", [code, mappers, includeBlacklistedExports]]); - return proxyLazy(() => mapMangledModule(code, mappers)); + return proxyLazy(() => mapMangledModule(code, mappers, includeBlacklistedExports)); } export const DefaultExtractAndLoadChunksRegex = /(?:(?:Promise\.all\(\[)?(\i\.e\("?[^)]+?"?\)[^\]]*?)(?:\]\))?|Promise\.resolve\(\))\.then\(\i\.bind\(\i,"?([^)]+?)"?\)\)/; From f91e2ca8740cdc489b704a3bc9c01b6bff32327f Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Feb 2025 02:41:30 +0100 Subject: [PATCH 12/23] bump to v1.11.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 872d7ce03..2f88ec1f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.11.4", + "version": "1.11.5", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": { From 1f6720318354e026fe24ed3e76935ec9e42d5193 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Feb 2025 02:46:59 +0100 Subject: [PATCH 13/23] fix ci --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba22b1230..b1cbc3028 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: - name: Clean up obsolete files run: | - rm -rf dist/*-unpacked dist/monaco Vencord.user.css vencordDesktopRenderer.css vencordDesktopRenderer.css.map + rm -rf dist/*-unpacked dist/vendor Vencord.user.css vencordDesktopRenderer.css vencordDesktopRenderer.css.map - name: Get some values needed for the release id: release_values From 1f0635ffc83d3e78e449afe05911e6d38b8ac1bd Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Sun, 16 Feb 2025 22:57:05 -0300 Subject: [PATCH 14/23] Fix lib typings with errors --- src/webpack/common/stores.ts | 2 +- src/webpack/common/types/components.d.ts | 2 +- src/webpack/common/types/stores.d.ts | 3 +-- src/webpack/patchWebpack.ts | 8 ++++---- src/webpack/webpack.ts | 4 ++-- src/webpack/wreq.d.ts | 13 +++++-------- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts index ff668425f..518f13e22 100644 --- a/src/webpack/common/stores.ts +++ b/src/webpack/common/stores.ts @@ -29,7 +29,7 @@ export type GenericStore = t.FluxStore & Record; export const DraftType = findByPropsLazy("ChannelMessage", "SlashCommand"); -export let MessageStore: Omit & { +export let MessageStore: Omit & GenericStore & { getMessages(chanId: string): any; }; diff --git a/src/webpack/common/types/components.d.ts b/src/webpack/common/types/components.d.ts index 8113e826a..469cd4289 100644 --- a/src/webpack/common/types/components.d.ts +++ b/src/webpack/common/types/components.d.ts @@ -496,7 +496,7 @@ export type Avatar = ComponentType>; type FocusLock = ComponentType; + containerRef: Ref; }>>; export type Icon = ComponentType. */ -import { DraftType } from "@webpack/common"; import { Channel, Guild, Role } from "discord-types/general"; import { FluxDispatcher, FluxEvents } from "./utils"; @@ -229,7 +228,7 @@ export class ThemeStore extends FluxStore { } export type useStateFromStores = ( - stores: t.FluxStore[], + stores: any[], mapper: () => T, dependencies?: any, isEqual?: (old: T, newer: T) => boolean diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 408d3b708..a185f1428 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -193,13 +193,13 @@ define(Function.prototype, "m", { // Overwrite Webpack's defineExports function to define the export descriptors configurable. // This is needed so we can later blacklist specific exports from Webpack search by making them non-enumerable - this.d = function (exports: object, getters: object) { - for (const key in getters) { - if (Object.hasOwn(getters, key) && !Object.hasOwn(exports, key)) { + this.d = function (exports, definition) { + for (const key in definition) { + if (Object.hasOwn(definition, key) && !Object.hasOwn(exports, key)) { Object.defineProperty(exports, key, { enumerable: true, configurable: true, - get: getters[key], + get: definition[key], }); } } diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 30180a7e9..6b17bd1d6 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -131,7 +131,7 @@ function shouldIgnoreValue(value: any) { return false; } -function makePropertyNonEnumerable(target: Object, key: PropertyKey) { +function makePropertyNonEnumerable(target: Record, key: PropertyKey) { const descriptor = Object.getOwnPropertyDescriptor(target, key); if (descriptor == null) return; @@ -499,7 +499,7 @@ export function findExportedComponentLazy(...props: Prop }); } -function getAllPropertyNames(object: Object, includeNonEnumerable: boolean) { +function getAllPropertyNames(object: Record, includeNonEnumerable: boolean) { const names = new Set(); const getKeys = includeNonEnumerable ? Object.getOwnPropertyNames : Object.keys; diff --git a/src/webpack/wreq.d.ts b/src/webpack/wreq.d.ts index ff28732c6..2b356f9d1 100644 --- a/src/webpack/wreq.d.ts +++ b/src/webpack/wreq.d.ts @@ -17,14 +17,11 @@ export type Module = { /** exports can be anything, however initially it is always an empty object */ export type ModuleFactory = (this: ModuleExports, module: Module, exports: ModuleExports, require: WebpackRequire) => void; -export type WebpackQueues = unique symbol | "__webpack_queues__"; -export type WebpackExports = unique symbol | "__webpack_exports__"; -export type WebpackError = unique symbol | "__webpack_error__"; - +/** Keys here can be symbols too, but we can't properly type them */ export type AsyncModulePromise = Promise & { - [WebpackQueues]: (fnQueue: ((queue: any[]) => any)) => any; - [WebpackExports]: ModuleExports; - [WebpackError]?: any; + "__webpack_queues__": (fnQueue: ((queue: any[]) => any)) => any; + "__webpack_exports__": ModuleExports; + "__webpack_error__"?: any; }; export type AsyncModuleBody = ( @@ -152,7 +149,7 @@ export type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & { * } * // exports is now { exportName: someExportedValue } (but each value is actually a getter) */ - d: (this: WebpackRequire, exports: AnyRecord, definiton: AnyRecord) => void; + d: (this: WebpackRequire, exports: Record, definiton: Record ModuleExports>) => void; /** The ensure chunk handlers, which are used to ensure the files of the chunks are loaded, or load if necessary */ f: EnsureChunkHandlers; /** From 6adae2044929c85d54ddff30f6d20ca77585ed5e Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Mon, 17 Feb 2025 00:13:13 -0300 Subject: [PATCH 15/23] Priority blacklist module over returning if null export --- src/webpack/patchWebpack.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index a185f1428..568ce3eba 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -417,9 +417,6 @@ function runFactoryWithWrap(patchedFactory: PatchedModuleFactory, thisArg: unkno } exports = module.exports; - if (exports == null) { - return factoryReturn; - } if (typeof require === "function" && require.c) { if (_blacklistBadModules(require.c, exports, module.id)) { @@ -427,6 +424,10 @@ function runFactoryWithWrap(patchedFactory: PatchedModuleFactory, thisArg: unkno } } + if (exports == null) { + return factoryReturn; + } + for (const callback of moduleListeners) { try { callback(exports, module.id); From 05566aed15429d86f07922df0812772a1119c80d Mon Sep 17 00:00:00 2001 From: Vendicated Date: Tue, 18 Feb 2025 14:23:02 +0100 Subject: [PATCH 16/23] update issue templates --- .github/ISSUE_TEMPLATE/blank.yml | 42 +++---- .github/ISSUE_TEMPLATE/bug_report.yml | 127 +++++++++----------- .github/ISSUE_TEMPLATE/developer-banner.png | Bin 0 -> 31992 bytes 3 files changed, 74 insertions(+), 95 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/developer-banner.png diff --git a/.github/ISSUE_TEMPLATE/blank.yml b/.github/ISSUE_TEMPLATE/blank.yml index 2439d86a7..89588f3d8 100644 --- a/.github/ISSUE_TEMPLATE/blank.yml +++ b/.github/ISSUE_TEMPLATE/blank.yml @@ -2,30 +2,24 @@ name: Blank Issue description: Create a blank issue. ALWAYS FIRST USE OUR SUPPORT CHANNEL! ONLY USE THIS FORM IF YOU ARE A CONTRIBUTOR OR WERE TOLD TO DO SO IN THE SUPPORT CHANNEL. body: - - type: markdown - attributes: - value: | - # READ THIS BEFORE OPENING AN ISSUE + - type: markdown + attributes: + value: | + ![Are you a developer? No? This form is not for you!](https://github.com/Vendicated/Vencord/blob/main/.github/ISSUE_TEMPLATE/developer-banner.png?raw=true) - This form is ONLY FOR DEVELOPERS. YOUR ISSUE WILL BE CLOSED AND YOU WILL POSSIBLY BE BLOCKED FROM THE REPOSITORY IF YOU IGNORE THIS. - - DO NOT USE THIS FORM, unless - - you are a vencord contributor - - you were given explicit permission to use this form by a moderator in our support server - - DO NOT USE THIS FORM FOR SECURITY RELATED ISSUES. [CREATE A SECURITY ADVISORY INSTEAD.](https://github.com/Vendicated/Vencord/security/advisories/new) + GitHub Issues are for development, not support! Please use our [support server](https://vencord.dev/discord) unless you are a Vencord Developer. - - type: textarea - id: content - attributes: - label: Content - validations: - required: true - - - type: checkboxes - id: agreement-check - attributes: - label: Request Agreement - options: - - label: I have read the requirements for opening an issue above + - type: textarea + id: content + attributes: + label: Content + validations: required: true + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + options: + - label: I have read the requirements for opening an issue above + required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d79f5e490..c08f46357 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -4,78 +4,63 @@ labels: [bug] title: "[Bug] " body: - - type: markdown - attributes: - value: | - # READ THIS BEFORE OPENING AN ISSUE + - type: markdown + attributes: + value: | + ![Are you a developer? No? This form is not for you!](https://github.com/Vendicated/Vencord/blob/main/.github/ISSUE_TEMPLATE/developer-banner.png?raw=true) - This form is ONLY FOR DEVELOPERS. YOUR ISSUE WILL BE CLOSED AND YOU WILL POSSIBLY BE BLOCKED FROM THE REPOSITORY IF YOU IGNORE THIS. - - DO NOT USE THIS FORM, unless - - you are a vencord contributor - - you were given explicit permission to use this form by a moderator in our support server - - DO NOT USE THIS FORM FOR SECURITY RELATED ISSUES. [CREATE A SECURITY ADVISORY INSTEAD.](https://github.com/Vendicated/Vencord/security/advisories/new) - - - type: input - id: discord - attributes: - label: Discord Account - description: Who on Discord is making this request? Not required but encouraged for easier follow-up - placeholder: username#0000 - validations: - required: false + GitHub Issues are for development, not support! Please use our [support server](https://vencord.dev/discord) unless you are a Vencord Developer. - - type: textarea - id: bug-description - attributes: - label: What happens when the bug or crash occurs? - description: Where does this bug or crash occur, when does it occur, etc. - placeholder: The bug/crash happens sometimes when I do ..., causing this to not work/the app to crash. I think it happens because of ... - validations: - required: true - - - type: textarea - id: expected-behaviour - attributes: - label: What is the expected behaviour? - description: Simply detail what the expected behaviour is. - placeholder: I expect Vencord/Discord to open the ... page instead of ..., it prevents me from doing ... - validations: - required: true - - - type: textarea - id: steps-to-take - attributes: - label: How do you recreate this bug or crash? - description: Give us a list of steps in order to recreate the bug or crash. - placeholder: | - 1. Do ... - 2. Then ... - 3. Do this ..., ... and then ... - 4. Observe "the bug" or "the crash" - validations: - required: true - - - type: textarea - id: crash-log - attributes: - label: Errors - description: Open the Developer Console with Ctrl/Cmd + Shift + i. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them between the "```". - value: | - ``` - Replace this text with your crash-log. - ``` - validations: - required: false - - - type: checkboxes - id: agreement-check - attributes: - label: Request Agreement - description: We only accept reports for bugs that happen on Discord Stable. Canary and PTB are Development branches and may be unstable - options: - - label: I am using Discord Stable or tried on Stable and this bug happens there as well + - type: textarea + id: bug-description + attributes: + label: What happens when the bug or crash occurs? + description: Where does this bug or crash occur, when does it occur, etc. + placeholder: The bug/crash happens sometimes when I do ..., causing this to not work/the app to crash. I think it happens because of ... + validations: required: true - - label: I have read the requirements for opening an issue above + + - type: textarea + id: expected-behaviour + attributes: + label: What is the expected behaviour? + description: Simply detail what the expected behaviour is. + placeholder: I expect Vencord/Discord to open the ... page instead of ..., it prevents me from doing ... + validations: required: true + + - type: textarea + id: steps-to-take + attributes: + label: How do you recreate this bug or crash? + description: Give us a list of steps in order to recreate the bug or crash. + placeholder: | + 1. Do ... + 2. Then ... + 3. Do this ..., ... and then ... + 4. Observe "the bug" or "the crash" + validations: + required: true + + - type: textarea + id: crash-log + attributes: + label: Errors + description: Open the Developer Console with Ctrl/Cmd + Shift + i. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them between the "```". + value: | + ``` + Replace this text with your crash-log. + ``` + validations: + required: false + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + description: We only accept reports for bugs that happen on Discord Stable. Canary and PTB are Development branches and may be unstable + options: + - label: I am using Discord Stable or tried on Stable and this bug happens there as well + required: true + - label: I am a Vencord Developer + required: true diff --git a/.github/ISSUE_TEMPLATE/developer-banner.png b/.github/ISSUE_TEMPLATE/developer-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa12fc370750c460f8d0959d5f73828c63b6e3d GIT binary patch literal 31992 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 WKXLqM0$yeQOioH!vP#@2=>GuWUFmuN literal 0 HcmV?d00001 From edf6480b8ff6724fb391559aaa4d6dbf567a1a5e Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Feb 2025 15:23:20 +0100 Subject: [PATCH 17/23] update dependencies and @vencord/types package --- package.json | 24 +- packages/vencord-types/package.json | 18 +- ...slint@9.17.0.patch => eslint@9.20.1.patch} | 0 pnpm-lock.yaml | 1588 ++++++----------- src/VencordNative.ts | 2 +- .../ui/components/DecorationContextMenu.tsx | 2 +- .../fixSpotifyEmbeds.desktop/native.ts | 2 +- .../fixYoutubeEmbeds.desktop/native.ts | 2 +- src/plugins/ignoreActivities/index.tsx | 2 +- src/plugins/shikiCodeblocks.desktop/shiki.css | 2 +- src/plugins/spotifyControls/SpotifyStore.ts | 22 +- src/plugins/userVoiceShow/components.tsx | 2 +- src/plugins/youtubeAdblock.desktop/native.ts | 2 +- src/utils/discord.css | 1 - 14 files changed, 606 insertions(+), 1063 deletions(-) rename patches/{eslint@9.17.0.patch => eslint@9.20.1.patch} (100%) diff --git a/package.json b/package.json index 2f88ec1f3..c2e13a93f 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "dev": "pnpm watch", "watchWeb": "pnpm buildWeb --watch", "generatePluginJson": "tsx scripts/generatePluginList.ts", - "generateTypes": "tspc --emitDeclarationOnly --declaration --outDir packages/vencord-types", + "generateTypes": "tspc --emitDeclarationOnly --declaration --outDir packages/vencord-types --allowJs false", "inject": "node scripts/runInstaller.mjs", "uninject": "node scripts/runInstaller.mjs", "lint": "eslint", @@ -45,31 +45,31 @@ "virtual-merge": "^1.0.1" }, "devDependencies": { - "@stylistic/eslint-plugin": "^2.12.1", - "@types/chrome": "^0.0.287", - "@types/diff": "^6.0.0", + "@stylistic/eslint-plugin": "^4.0.0", + "@types/chrome": "^0.0.304", + "@types/diff": "^7.0.1", "@types/lodash": "^4.17.14", "@types/node": "^22.10.5", - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "@types/yazl": "^2.4.5", "diff": "^7.0.0", "discord-types": "^1.3.26", "esbuild": "^0.25.0", - "eslint": "^9.17.0", + "eslint": "^9.20.1", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "2.1.0", "eslint-plugin-react": "^7.37.3", "eslint-plugin-simple-header": "^1.2.1", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unused-imports": "^4.1.4", - "highlight.js": "11.7.0", + "highlight.js": "11.11.1", "html-minifier-terser": "^7.2.0", "moment": "^2.22.2", - "puppeteer-core": "^23.11.1", - "standalone-electron-types": "^1.0.0", + "puppeteer-core": "^24.2.1", + "standalone-electron-types": "^34.2.0", "stylelint": "^16.12.0", - "stylelint-config-standard": "^36.0.1", + "stylelint-config-standard": "^37.0.0", "ts-patch": "^3.3.0", "ts-pattern": "^5.6.0", "tsx": "^4.19.2", @@ -82,7 +82,7 @@ "packageManager": "pnpm@9.1.0", "pnpm": { "patchedDependencies": { - "eslint@9.17.0": "patches/eslint@9.17.0.patch", + "eslint@9.20.1": "patches/eslint@9.20.1.patch", "eslint-plugin-path-alias@2.1.0": "patches/eslint-plugin-path-alias@2.1.0.patch" }, "peerDependencyRules": { diff --git a/packages/vencord-types/package.json b/packages/vencord-types/package.json index 8f9d852e4..b3bbe315e 100644 --- a/packages/vencord-types/package.json +++ b/packages/vencord-types/package.json @@ -1,7 +1,7 @@ { "name": "@vencord/types", "private": false, - "version": "0.1.3", + "version": "1.11.5", "description": "", "types": "index.d.ts", "scripts": { @@ -13,16 +13,16 @@ "license": "GPL-3.0", "devDependencies": { "@types/fs-extra": "^11.0.4", - "fs-extra": "^11.2.0", - "tsx": "^3.12.6" + "fs-extra": "^11.3.0", + "tsx": "^4.19.2" }, "dependencies": { - "@types/lodash": "^4.14.191", - "@types/node": "^18.11.18", - "@types/react": "^18.2.0", - "@types/react-dom": "^18.0.10", + "@types/lodash": "4.17.15", + "@types/node": "^22.13.4", + "@types/react": "18.3.1", + "@types/react-dom": "18.3.1", "discord-types": "^1.3.26", - "standalone-electron-types": "^1.0.0", - "type-fest": "^3.5.3" + "standalone-electron-types": "^34.2.0", + "type-fest": "^4.35.0" } } diff --git a/patches/eslint@9.17.0.patch b/patches/eslint@9.20.1.patch similarity index 100% rename from patches/eslint@9.17.0.patch rename to patches/eslint@9.20.1.patch diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 169d76fcf..1ce4f0c24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ patchedDependencies: eslint-plugin-path-alias@2.1.0: hash: japuwsqfkulviwgkm4kd2oi3ky path: patches/eslint-plugin-path-alias@2.1.0.patch - eslint@9.17.0: + eslint@9.20.1: hash: xm46kqcmdgzlmm4aifkfpxaho4 - path: patches/eslint@9.17.0.patch + path: patches/eslint@9.20.1.patch importers: @@ -36,35 +36,35 @@ importers: version: 0.52.2 nanoid: specifier: ^5.0.9 - version: 5.0.9 + version: 5.1.0 virtual-merge: specifier: ^1.0.1 - version: 1.0.1 + version: 1.0.2 devDependencies: '@stylistic/eslint-plugin': - specifier: ^2.12.1 - version: 2.12.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) + specifier: ^4.0.0 + version: 4.0.0(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) '@types/chrome': - specifier: ^0.0.287 - version: 0.0.287 + specifier: ^0.0.304 + version: 0.0.304 '@types/diff': - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^7.0.1 + version: 7.0.1 '@types/lodash': specifier: ^4.17.14 - version: 4.17.14 + version: 4.17.15 '@types/node': specifier: ^22.10.5 - version: 22.10.5 + version: 22.13.4 '@types/react': - specifier: ^19.0.2 - version: 19.0.2 + specifier: ^19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: ^19.0.2 - version: 19.0.2(@types/react@19.0.2) + specifier: ^19.0.4 + version: 19.0.4(@types/react@19.0.10) '@types/yazl': specifier: ^2.4.5 - version: 2.4.5 + version: 2.4.6 diff: specifier: ^7.0.0 version: 7.0.0 @@ -75,29 +75,29 @@ importers: specifier: ^0.25.0 version: 0.25.0 eslint: - specifier: ^9.17.0 - version: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + specifier: ^9.20.1 + version: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))) eslint-plugin-path-alias: specifier: 2.1.0 - version: 2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) eslint-plugin-react: specifier: ^7.37.3 - version: 7.37.3(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 7.37.4(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) eslint-plugin-simple-header: specifier: ^1.2.1 - version: 1.2.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 1.2.2(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 12.1.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) highlight.js: - specifier: 11.7.0 - version: 11.7.0 + specifier: 11.11.1 + version: 11.11.1 html-minifier-terser: specifier: ^7.2.0 version: 7.2.0 @@ -105,38 +105,38 @@ importers: specifier: ^2.22.2 version: 2.30.1 puppeteer-core: - specifier: ^23.11.1 - version: 23.11.1 + specifier: ^24.2.1 + version: 24.2.1 standalone-electron-types: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^34.2.0 + version: 34.2.0 stylelint: specifier: ^16.12.0 - version: 16.12.0(typescript@5.7.2) + version: 16.14.1(typescript@5.7.3) stylelint-config-standard: - specifier: ^36.0.1 - version: 36.0.1(stylelint@16.12.0(typescript@5.7.2)) + specifier: ^37.0.0 + version: 37.0.0(stylelint@16.14.1(typescript@5.7.3)) ts-patch: specifier: ^3.3.0 version: 3.3.0 ts-pattern: specifier: ^5.6.0 - version: 5.6.0 + version: 5.6.2 tsx: specifier: ^4.19.2 version: 4.19.2 type-fest: specifier: ^4.31.0 - version: 4.31.0 + version: 4.35.0 typescript: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.3 typescript-eslint: specifier: ^8.19.0 - version: 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) + version: 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) typescript-transform-paths: specifier: ^3.5.3 - version: 3.5.3(typescript@5.7.2) + version: 3.5.3(typescript@5.7.3) zip-local: specifier: ^0.3.5 version: 0.3.5 @@ -144,36 +144,36 @@ importers: packages/vencord-types: dependencies: '@types/lodash': - specifier: ^4.14.191 - version: 4.14.194 + specifier: 4.17.15 + version: 4.17.15 '@types/node': - specifier: ^18.11.18 - version: 18.16.3 + specifier: ^22.13.4 + version: 22.13.4 '@types/react': - specifier: ^18.2.0 - version: 18.2.0 + specifier: 18.3.1 + version: 18.3.1 '@types/react-dom': - specifier: ^18.0.10 - version: 18.2.1 + specifier: 18.3.1 + version: 18.3.1 discord-types: specifier: ^1.3.26 version: 1.3.26 standalone-electron-types: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^34.2.0 + version: 34.2.0 type-fest: - specifier: ^3.5.3 - version: 3.9.0 + specifier: ^4.35.0 + version: 4.35.0 devDependencies: '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 fs-extra: - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^11.3.0 + version: 11.3.0 tsx: - specifier: ^3.12.6 - version: 3.12.7 + specifier: ^4.19.2 + version: 4.19.2 packages: @@ -211,15 +211,6 @@ packages: '@dual-bundle/import-meta-resolve@4.1.0': resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} - '@esbuild-kit/cjs-loader@2.4.2': - resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} - - '@esbuild-kit/core-utils@3.1.0': - resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} - - '@esbuild-kit/esm-loader@2.5.5': - resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} - '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} @@ -232,12 +223,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.17.19': - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} @@ -250,12 +235,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.17.19': - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} @@ -268,12 +247,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.17.19': - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} @@ -286,12 +259,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.17.19': - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} @@ -304,12 +271,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.17.19': - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} @@ -322,12 +283,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.17.19': - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} @@ -340,12 +295,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.17.19': - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} @@ -358,12 +307,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.17.19': - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} @@ -376,12 +319,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.17.19': - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} @@ -394,12 +331,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.17.19': - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} @@ -412,12 +343,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.17.19': - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} @@ -430,12 +355,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.17.19': - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} @@ -448,12 +367,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.17.19': - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} @@ -466,12 +379,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.17.19': - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} @@ -484,12 +391,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.17.19': - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} @@ -502,12 +403,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.17.19': - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} @@ -526,12 +421,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.17.19': - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -556,12 +445,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.17.19': - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} @@ -574,12 +457,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.17.19': - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} @@ -592,12 +469,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.17.19': - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} @@ -610,12 +481,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.17.19': - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} @@ -628,12 +493,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.17.19': - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -656,28 +515,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.11.0': + resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.20.0': + resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -724,6 +587,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@keyv/serialize@1.0.3': + resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -736,28 +602,28 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@puppeteer/browsers@2.6.1': - resolution: {integrity: sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==} + '@puppeteer/browsers@2.7.1': + resolution: {integrity: sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ==} engines: {node: '>=18'} hasBin: true '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@stylistic/eslint-plugin@2.12.1': - resolution: {integrity: sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==} + '@stylistic/eslint-plugin@4.0.0': + resolution: {integrity: sha512-3US6mWvUrb7xrKs5TR6Ak3Mw8ghSu8gx/lOOkqxUWm1Bw89A9N6PsOUFd4N7aVmlr4VugOqgOdHfBKyt3BsEig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=8.40.0' + eslint: '>=9.0.0' '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/chrome@0.0.287': - resolution: {integrity: sha512-wWhBNPNXZHwycHKNYnexUcpSbrihVZu++0rdp6GEk5ZgAglenLx+RwdEouh6FrHS0XQiOxSd62yaujM1OoQlZQ==} + '@types/chrome@0.0.304': + resolution: {integrity: sha512-ms9CLILU+FEMK7gcmgz/Mtn2E81YQWiMIzCFF8ktp98EVNIIfoqaDTD4+ailOCq1sGjbnEmfJxQ1FAsQtk5M3A==} - '@types/diff@6.0.0': - resolution: {integrity: sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==} + '@types/diff@7.0.1': + resolution: {integrity: sha512-R/BHQFripuhW6XPXy05hIvXJQdQ4540KnTvEFHSLjXfHYM41liOLKgIJEyYYiQe796xpaMHfe4Uj/p7Uvng2vA==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -783,123 +649,83 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/lodash@4.14.194': - resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} - '@types/lodash@4.17.14': - resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} - - '@types/node@18.16.3': - resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} - - '@types/node@18.19.69': - resolution: {integrity: sha512-ECPdY1nlaiO/Y6GUnwgtAAhLNaQ53AyIVz+eILxpEo5OvuqE6yWkqWBIb5dU0DqhKQtMeny+FBD3PK6lm7L5xQ==} - - '@types/node@22.10.5': - resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + '@types/node@22.13.4': + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/prop-types@15.7.5': - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - '@types/react-dom@18.2.1': - resolution: {integrity: sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w==} - - '@types/react-dom@19.0.2': - resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: '@types/react': ^19.0.0 '@types/react@17.0.2': resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==} - '@types/react@18.2.0': - resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} - '@types/react@19.0.2': - resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} - - '@types/scheduler@0.16.3': - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@types/yazl@2.4.5': - resolution: {integrity: sha512-qpmPfx32HS7vlGJf7EsoM9qJnLZhXJBf1KH0hzfdc+D794rljQWh4H0I/UrZy+6Nhqn0l2jdBZXBGZtR1vnHqw==} + '@types/yazl@2.4.6': + resolution: {integrity: sha512-/ifFjQtcKaoZOjl5NNCQRR0fAKafB3Foxd7J/WvFPTMea46zekapcR30uzkwIkKAAuq5T6d0dkwz754RFH27hg==} - '@typescript-eslint/eslint-plugin@8.19.0': - resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} + '@typescript-eslint/eslint-plugin@8.24.1': + resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.19.0': - resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} + '@typescript-eslint/parser@8.24.1': + resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.24.1': + resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.19.0': - resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.19.0': - resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} + '@typescript-eslint/type-utils@8.24.1': + resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.24.1': + resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.19.0': - resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.24.1': + resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/typescript-estree@8.19.0': - resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.24.1': + resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.19.0': - resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.19.0': - resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} + '@typescript-eslint/visitor-keys@8.24.1': + resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vap/core@0.0.12': @@ -947,10 +773,6 @@ packages: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -1003,6 +825,10 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} @@ -1024,20 +850,30 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + bare-os@3.4.0: + resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} + engines: {bare: '>=1.6.0'} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.1: - resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1066,15 +902,18 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + cacheable@1.8.8: + resolution: {integrity: sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -1096,8 +935,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chromium-bidi@0.11.0: - resolution: {integrity: sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==} + chromium-bidi@1.3.0: + resolution: {integrity: sha512-G3x1bkST13kmbL7+dT/oRkNH/7C4UqG+0YQpmySrzXspyOhYgDNc6lhSGpj3cuexvH25WTENhTYq2Tt9JRXtbw==} peerDependencies: devtools-protocol: '*' @@ -1170,9 +1009,6 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1180,18 +1016,10 @@ packages: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} @@ -1256,8 +1084,8 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - devtools-protocol@0.0.1367902: - resolution: {integrity: sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==} + devtools-protocol@0.0.1402036: + resolution: {integrity: sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg==} diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} @@ -1298,10 +1126,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} - engines: {node: '>= 0.4'} - es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -1318,30 +1142,22 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -1410,14 +1226,14 @@ packages: peerDependencies: eslint: ^8.0.0 - eslint-plugin-react@7.37.3: - resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-simple-header@1.2.1: - resolution: {integrity: sha512-l9eEOpBkd4T6yVE09WADLVPU6eKHjQ7QjowMChsbYwsge+98NxyIlqvYpQQJWVxakgW7uooFGNVEFdFWzEMcVg==} + eslint-plugin-simple-header@1.2.2: + resolution: {integrity: sha512-LO4PejdYPraY5GKd9hutst82yAAL21MGIiFbHKIpoPDOWOW8zz3ZaDdQB3vx/yQGjWd5GifyQ/AGfNkr5c9kPw==} peerDependencies: eslint: '>=8.41.0' @@ -1447,8 +1263,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.20.1: + resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1508,8 +1324,8 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1518,15 +1334,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -1534,14 +1350,13 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@10.0.6: + resolution: {integrity: sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-entry-cache@9.1.0: - resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} - engines: {node: '>=18'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1562,15 +1377,15 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@5.0.0: - resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} - engines: {node: '>=18'} + flat-cache@6.1.6: + resolution: {integrity: sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} @@ -1580,15 +1395,10 @@ packages: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1597,10 +1407,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} - engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -1612,10 +1418,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} - engines: {node: '>= 0.4'} - get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} @@ -1632,6 +1434,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -1743,14 +1548,17 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - highlight.js@11.7.0: - resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hookified@1.7.1: + resolution: {integrity: sha512-OXcdHsXeOiD7OJ5zvWj8Oy/6RCdLwntAX+wUrfemNcMGn6sux4xbEHi2QXwqePYhjQ/yvxxq2MvCRirdlHscBw==} + html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} engines: {node: ^14.13.1 || >=16.0.0} @@ -1775,12 +1583,12 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@6.0.2: - resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + ignore@7.0.3: + resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1813,16 +1621,16 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -1880,8 +1688,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -1892,10 +1700,6 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1944,8 +1748,8 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} is-weakset@2.0.4: @@ -2026,6 +1830,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.2.3: + resolution: {integrity: sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==} + kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} @@ -2133,8 +1940,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.9: - resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + nanoid@5.1.0: + resolution: {integrity: sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==} engines: {node: ^18 || >=20} hasBin: true @@ -2164,8 +1971,8 @@ packages: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -2281,8 +2088,8 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-resolve-nested-selector@0.1.6: @@ -2294,15 +2101,15 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.0.0: - resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2330,8 +2137,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@23.11.1: - resolution: {integrity: sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==} + puppeteer-core@24.2.1: + resolution: {integrity: sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ==} engines: {node: '>=18'} q@1.5.1: @@ -2345,24 +2152,17 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - reflect.getprototypeof@1.0.9: - resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -2442,6 +2242,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2506,8 +2311,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} source-map-js@1.2.1: @@ -2540,15 +2345,15 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - standalone-electron-types@1.0.0: - resolution: {integrity: sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==} + standalone-electron-types@34.2.0: + resolution: {integrity: sha512-+BIrNe0TdZBBBRS3G/F7cPbuBipSZylSjSrJu9+sjw84+vz36a5oZ7l9NeH7aXgMWmPzPZKsTm+K0nOIvhENJQ==} static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} - streamx@2.21.1: - resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2585,20 +2390,20 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stylelint-config-recommended@14.0.1: - resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + stylelint-config-recommended@15.0.0: + resolution: {integrity: sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.1.0 + stylelint: ^16.13.0 - stylelint-config-standard@36.0.1: - resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + stylelint-config-standard@37.0.0: + resolution: {integrity: sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.1.0 + stylelint: ^16.13.0 - stylelint@16.12.0: - resolution: {integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==} + stylelint@16.14.1: + resolution: {integrity: sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==} engines: {node: '>=18.12.0'} hasBin: true @@ -2606,8 +2411,8 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-hyperlinks@3.1.0: - resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} supports-preserve-symlinks-flag@1.0.0: @@ -2621,8 +2426,8 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -2635,9 +2440,6 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} @@ -2650,18 +2452,18 @@ packages: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-patch@3.3.0: resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==} hasBin: true - ts-pattern@5.6.0: - resolution: {integrity: sha512-SL8u60X5+LoEy9tmQHWCdPc2hhb2pKI6I1tU5Jue3v8+iRqZdcT3mWPwKKJy1fMfky6uha82c8ByHAE8PMhKHw==} + ts-pattern@5.6.2: + resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2669,10 +2471,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@3.12.7: - resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} - hasBin: true - tsx@4.19.2: resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} @@ -2682,12 +2480,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@3.9.0: - resolution: {integrity: sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==} - engines: {node: '>=14.16'} - - type-fest@4.31.0: - resolution: {integrity: sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==} + type-fest@4.35.0: + resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} engines: {node: '>=16'} typed-array-buffer@1.0.3: @@ -2709,8 +2503,8 @@ packages: typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript-eslint@8.19.0: - resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} + typescript-eslint@8.24.1: + resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2721,8 +2515,8 @@ packages: peerDependencies: typescript: '>=3.6.5' - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -2730,12 +2524,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -2765,8 +2553,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - virtual-merge@1.0.1: - resolution: {integrity: sha512-h7rzV6n5fZJbDu2lP4iu+IOtsZ00uqECFUxFePK1uY0pz/S5B7FNDJpmdDVfyGL7poyJECEHfTaIpJaknNkU0Q==} + virtual-merge@1.0.2: + resolution: {integrity: sha512-5hxklfyTUWMKYaLuoriOf9Xqmt3oWtfAiZw0M3ITeeNmVdKhcnys7rYyfBHqvy/hlELP0hQ4u7o1r5HBXbm6sg==} vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -2853,8 +2641,8 @@ packages: zip-local@0.3.5: resolution: {integrity: sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} snapshots: @@ -2877,171 +2665,108 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 - '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)': + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': dependencies: - postcss-selector-parser: 7.0.0 + postcss-selector-parser: 7.1.0 '@dual-bundle/import-meta-resolve@4.1.0': {} - '@esbuild-kit/cjs-loader@2.4.2': - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.8.1 - - '@esbuild-kit/core-utils@3.1.0': - dependencies: - esbuild: 0.17.19 - source-map-support: 0.5.21 - - '@esbuild-kit/esm-loader@2.5.5': - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.8.1 - '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/aix-ppc64@0.25.0': optional: true - '@esbuild/android-arm64@0.17.19': - optional: true - '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm64@0.25.0': optional: true - '@esbuild/android-arm@0.17.19': - optional: true - '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-arm@0.25.0': optional: true - '@esbuild/android-x64@0.17.19': - optional: true - '@esbuild/android-x64@0.23.1': optional: true '@esbuild/android-x64@0.25.0': optional: true - '@esbuild/darwin-arm64@0.17.19': - optional: true - '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-arm64@0.25.0': optional: true - '@esbuild/darwin-x64@0.17.19': - optional: true - '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/darwin-x64@0.25.0': optional: true - '@esbuild/freebsd-arm64@0.17.19': - optional: true - '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.25.0': optional: true - '@esbuild/freebsd-x64@0.17.19': - optional: true - '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/freebsd-x64@0.25.0': optional: true - '@esbuild/linux-arm64@0.17.19': - optional: true - '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm64@0.25.0': optional: true - '@esbuild/linux-arm@0.17.19': - optional: true - '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-arm@0.25.0': optional: true - '@esbuild/linux-ia32@0.17.19': - optional: true - '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-ia32@0.25.0': optional: true - '@esbuild/linux-loong64@0.17.19': - optional: true - '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-loong64@0.25.0': optional: true - '@esbuild/linux-mips64el@0.17.19': - optional: true - '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-mips64el@0.25.0': optional: true - '@esbuild/linux-ppc64@0.17.19': - optional: true - '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-ppc64@0.25.0': optional: true - '@esbuild/linux-riscv64@0.17.19': - optional: true - '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-riscv64@0.25.0': optional: true - '@esbuild/linux-s390x@0.17.19': - optional: true - '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-s390x@0.25.0': optional: true - '@esbuild/linux-x64@0.17.19': - optional: true - '@esbuild/linux-x64@0.23.1': optional: true @@ -3051,9 +2776,6 @@ snapshots: '@esbuild/netbsd-arm64@0.25.0': optional: true - '@esbuild/netbsd-x64@0.17.19': - optional: true - '@esbuild/netbsd-x64@0.23.1': optional: true @@ -3066,67 +2788,56 @@ snapshots: '@esbuild/openbsd-arm64@0.25.0': optional: true - '@esbuild/openbsd-x64@0.17.19': - optional: true - '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/openbsd-x64@0.25.0': optional: true - '@esbuild/sunos-x64@0.17.19': - optional: true - '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.25.0': optional: true - '@esbuild/win32-arm64@0.17.19': - optional: true - '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-arm64@0.25.0': optional: true - '@esbuild/win32-ia32@0.17.19': - optional: true - '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-ia32@0.25.0': optional: true - '@esbuild/win32-x64@0.17.19': - optional: true - '@esbuild/win32-x64@0.23.1': optional: true '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))': dependencies: - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.11.0': dependencies: '@types/json-schema': 7.0.15 @@ -3137,19 +2848,20 @@ snapshots: espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.20.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.5': dependencies: + '@eslint/core': 0.10.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3189,6 +2901,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@keyv/serialize@1.0.3': + dependencies: + buffer: 6.0.3 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3199,27 +2915,27 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.0 - '@puppeteer/browsers@2.6.1': + '@puppeteer/browsers@2.7.1': dependencies: debug: 4.4.0 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.6.3 - tar-fs: 3.0.6 - unbzip2-stream: 1.4.3 + semver: 7.7.1 + tar-fs: 3.0.8 yargs: 17.7.2 transitivePeerDependencies: + - bare-buffer - supports-color '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin@2.12.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': + '@stylistic/eslint-plugin@4.0.0(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -3230,12 +2946,12 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/chrome@0.0.287': + '@types/chrome@0.0.304': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 - '@types/diff@6.0.0': {} + '@types/diff@7.0.1': {} '@types/estree@1.0.6': {} @@ -3248,7 +2964,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 18.16.3 + '@types/node': 22.13.4 '@types/har-format@1.2.16': {} @@ -3258,172 +2974,122 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 18.16.3 + '@types/node': 22.13.4 - '@types/lodash@4.14.194': {} + '@types/lodash@4.17.15': {} - '@types/lodash@4.17.14': {} - - '@types/node@18.16.3': {} - - '@types/node@18.19.69': - dependencies: - undici-types: 5.26.5 - - '@types/node@22.10.5': + '@types/node@22.13.4': dependencies: undici-types: 6.20.0 '@types/prop-types@15.7.14': {} - '@types/prop-types@15.7.5': {} - - '@types/react-dom@18.2.1': + '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.1 - '@types/react-dom@19.0.2(@types/react@19.0.2)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.10 '@types/react@17.0.2': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@types/react@18.2.0': + '@types/react@18.3.1': dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 + '@types/prop-types': 15.7.14 + csstype: 3.1.3 - '@types/react@19.0.2': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 - '@types/scheduler@0.16.3': {} - '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.10.5 + '@types/node': 22.13.4 optional: true - '@types/yazl@2.4.5': + '@types/yazl@2.4.6': dependencies: - '@types/node': 22.10.5 + '@types/node': 22.13.4 - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.1 + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': + '@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - typescript: 5.7.2 + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.24.1': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/scope-manager@8.19.0': + '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 - - '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.24.1': {} - '@typescript-eslint/types@8.19.0': {} - - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': + '@typescript-eslint/utils@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 - debug: 4.4.0 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': + '@typescript-eslint/visitor-keys@8.24.1': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.18.1': - dependencies: - '@typescript-eslint/types': 8.18.1 - eslint-visitor-keys: 4.2.0 - - '@typescript-eslint/visitor-keys@8.19.0': - dependencies: - '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/types': 8.24.1 eslint-visitor-keys: 4.2.0 '@vap/core@0.0.12': @@ -3454,7 +3120,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3470,11 +3136,6 @@ snapshots: arr-union@3.1.0: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - is-array-buffer: 3.0.5 - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.3 @@ -3484,9 +3145,9 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 is-string: 1.1.1 array-union@2.1.0: {} @@ -3497,10 +3158,10 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: @@ -3508,39 +3169,39 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 assign-symbols@1.0.0: {} @@ -3551,13 +3212,15 @@ snapshots: astral-regex@2.0.0: {} + async-function@1.0.0: {} + async@1.5.2: {} atob@2.1.2: {} available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 b4a@1.6.7: {} @@ -3565,27 +3228,31 @@ snapshots: balanced-match@2.0.0: {} - bare-events@2.5.0: + bare-events@2.5.4: optional: true - bare-fs@2.3.5: + bare-fs@4.0.1: dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.6.1 + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer optional: true - bare-os@2.4.4: + bare-os@3.4.0: optional: true - bare-path@2.1.3: + bare-path@3.0.0: dependencies: - bare-os: 2.4.4 + bare-os: 3.4.0 optional: true - bare-stream@2.6.1: + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.21.1 + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 optional: true base64-js@1.5.1: {} @@ -3619,7 +3286,7 @@ snapshots: buffer-from@1.1.2: {} - buffer@5.7.1: + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 @@ -3636,21 +3303,26 @@ snapshots: union-value: 1.0.1 unset-value: 1.0.0 - call-bind-apply-helpers@1.0.1: + cacheable@1.8.8: + dependencies: + hookified: 1.7.1 + keyv: 5.2.3 + + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.2.7 callsites@3.1.0: {} @@ -3665,11 +3337,11 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chromium-bidi@0.11.0(devtools-protocol@0.0.1367902): + chromium-bidi@1.3.0(devtools-protocol@0.0.1402036): dependencies: - devtools-protocol: 0.0.1367902 + devtools-protocol: 0.0.1402036 mitt: 3.0.1 - zod: 3.23.8 + zod: 3.24.2 class-utils@0.3.6: dependencies: @@ -3711,14 +3383,14 @@ snapshots: copy-descriptor@0.1.1: {} - cosmiconfig@9.0.0(typescript@5.7.2): + cosmiconfig@9.0.0(typescript@5.7.3): dependencies: env-paths: 2.2.1 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 cross-spawn@7.0.6: dependencies: @@ -3735,30 +3407,16 @@ snapshots: cssesc@3.0.0: {} - csstype@3.1.2: {} - csstype@3.1.3: {} data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.2 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.2 - data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.3 @@ -3818,7 +3476,7 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - devtools-protocol@0.0.1367902: {} + devtools-protocol@0.0.1402036: {} diff@7.0.0: {} @@ -3842,7 +3500,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -3860,57 +3518,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.6: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 - get-intrinsic: 1.2.6 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.3 - safe-regex-test: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 - es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -3923,7 +3530,7 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 @@ -3944,9 +3551,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -3988,16 +3595,10 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.6 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -4005,7 +3606,7 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -4015,31 +3616,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.17.19: - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -4107,9 +3683,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) eslint-import-resolver-node@0.3.9: dependencies: @@ -4119,17 +3695,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4138,9 +3714,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4152,22 +3728,22 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-path-alias@2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) find-pkg: 2.0.0 get-tsconfig: 4.8.1 nanomatch: 1.2.13 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.3(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-react@7.37.4(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4175,7 +3751,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4189,19 +3765,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-simple-header@1.2.2(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - eslint-plugin-simple-import-sort@12.1.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): dependencies: - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) eslint-scope@8.2.0: dependencies: @@ -4212,15 +3788,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4): + eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.11.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/js': 9.20.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -4300,7 +3876,7 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -4312,11 +3888,11 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} - fastq@1.17.1: + fastq@1.19.0: dependencies: reusify: 1.0.4 @@ -4326,14 +3902,14 @@ snapshots: fflate@0.8.2: {} + file-entry-cache@10.0.6: + dependencies: + flat-cache: 6.1.6 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - file-entry-cache@9.1.0: - dependencies: - flat-cache: 5.0.0 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -4353,17 +3929,18 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flat-cache@5.0.0: + flat-cache@6.1.6: dependencies: - flatted: 3.3.2 - keyv: 4.5.4 + cacheable: 1.8.8 + flatted: 3.3.3 + hookified: 1.7.1 - flatted@3.3.2: {} + flatted@3.3.3: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -4373,28 +3950,17 @@ snapshots: dependencies: map-cache: 0.2.2 - fs-extra@11.2.0: + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.7: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -4408,25 +3974,12 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.6: - dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - function-bind: 1.1.2 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - get-intrinsic@1.2.7: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 @@ -4437,7 +3990,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 get-stream@5.2.0: dependencies: @@ -4447,7 +4000,11 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -4514,7 +4071,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -4568,12 +4125,14 @@ snapshots: dependencies: function-bind: 1.1.2 - highlight.js@11.7.0: {} + highlight.js@11.11.1: {} homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 + hookified@1.7.1: {} + html-minifier-terser@7.2.0: dependencies: camel-case: 4.1.2 @@ -4604,9 +4163,9 @@ snapshots: ignore@5.3.2: {} - ignore@6.0.2: {} + ignore@7.0.3: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4636,19 +4195,23 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-bigint@1.1.0: dependencies: has-bigints: 1.1.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -4672,7 +4235,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -4704,9 +4267,12 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -4714,8 +4280,6 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -4763,14 +4327,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-windows@1.0.2: {} @@ -4791,7 +4355,7 @@ snapshots: iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 get-intrinsic: 1.2.7 get-proto: 1.0.1 has-symbols: 1.1.0 @@ -4842,6 +4406,10 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.2.3: + dependencies: + '@keyv/serialize': 1.0.3 + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 @@ -4927,7 +4495,7 @@ snapshots: nanoid@3.3.8: {} - nanoid@5.0.9: {} + nanoid@5.1.0: {} nanomatch@1.2.13: dependencies: @@ -4964,7 +4532,7 @@ snapshots: define-property: 0.2.5 kind-of: 3.2.2 - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -4977,7 +4545,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -4985,14 +4553,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: @@ -5009,7 +4577,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 once@1.4.0: dependencies: @@ -5099,22 +4667,22 @@ snapshots: picomatch@4.0.2: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.4.49): + postcss-safe-parser@7.0.1(postcss@8.5.2): dependencies: - postcss: 8.4.49 + postcss: 8.5.2 - postcss-selector-parser@7.0.0: + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.4.49: + postcss@8.5.2: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -5152,15 +4720,16 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@23.11.1: + puppeteer-core@24.2.1: dependencies: - '@puppeteer/browsers': 2.6.1 - chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) + '@puppeteer/browsers': 2.7.1 + chromium-bidi: 1.3.0(devtools-protocol@0.0.1402036) debug: 4.4.0 - devtools-protocol: 0.0.1367902 + devtools-protocol: 0.0.1402036 typed-query-selector: 2.12.0 ws: 8.18.0 transitivePeerDependencies: + - bare-buffer - bufferutil - supports-color - utf-8-validate @@ -5169,19 +4738,17 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - react-is@16.13.1: {} - reflect.getprototypeof@1.0.9: + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - gopd: 1.2.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 which-builtin-type: 1.2.1 regex-not@1.0.2: @@ -5189,13 +4756,6 @@ snapshots: extend-shallow: 3.0.2 safe-regex: 1.1.0 - regexp.prototype.flags@1.5.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -5232,7 +4792,7 @@ snapshots: resolve@2.0.0-next.5: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5248,7 +4808,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 @@ -5271,12 +4831,14 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -5291,7 +4853,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 set-value@2.0.1: dependencies: @@ -5309,27 +4871,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -5363,11 +4925,11 @@ snapshots: dependencies: agent-base: 7.1.3 debug: 4.4.0 - socks: 2.8.3 + socks: 2.8.4 transitivePeerDependencies: - supports-color - socks@2.8.3: + socks@2.8.4: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 @@ -5399,22 +4961,21 @@ snapshots: sprintf-js@1.1.3: {} - standalone-electron-types@1.0.0: + standalone-electron-types@34.2.0: dependencies: - '@types/node': 18.19.69 + '@types/node': 22.13.4 static-extend@0.1.2: dependencies: define-property: 0.2.5 object-copy: 0.1.0 - streamx@2.21.1: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.5.0 + bare-events: 2.5.4 string-width@4.2.3: dependencies: @@ -5429,7 +4990,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 get-intrinsic: 1.2.7 gopd: 1.2.0 has-symbols: 1.1.0 @@ -5441,7 +5002,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 string.prototype.trim@1.2.10: dependencies: @@ -5449,8 +5010,8 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: @@ -5458,13 +5019,13 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 strip-ansi@6.0.1: dependencies: @@ -5474,36 +5035,36 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-recommended@15.0.0(stylelint@16.14.1(typescript@5.7.3)): dependencies: - stylelint: 16.12.0(typescript@5.7.2) + stylelint: 16.14.1(typescript@5.7.3) - stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-standard@37.0.0(stylelint@16.14.1(typescript@5.7.3)): dependencies: - stylelint: 16.12.0(typescript@5.7.2) - stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.2)) + stylelint: 16.14.1(typescript@5.7.3) + stylelint-config-recommended: 15.0.0(stylelint@16.14.1(typescript@5.7.3)) - stylelint@16.12.0(typescript@5.7.2): + stylelint@16.14.1(typescript@5.7.3): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.7.2) + cosmiconfig: 9.0.0(typescript@5.7.3) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 9.1.0 + file-entry-cache: 10.0.6 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 6.0.2 + ignore: 7.0.3 imurmurhash: 0.1.4 is-plain-object: 5.0.0 known-css-properties: 0.35.0 @@ -5512,14 +5073,14 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.2 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.4.49) - postcss-selector-parser: 7.0.0 + postcss-safe-parser: 7.0.1(postcss@8.5.2) + postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 - supports-hyperlinks: 3.1.0 + supports-hyperlinks: 3.2.0 svg-tags: 1.0.0 table: 6.9.0 write-file-atomic: 5.0.1 @@ -5531,7 +5092,7 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.1.0: + supports-hyperlinks@3.2.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 @@ -5548,19 +5109,21 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar-fs@3.0.6: + tar-fs@3.0.8: dependencies: pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer tar-stream@3.1.7: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.22.0 terser@5.37.0: dependencies: @@ -5573,8 +5136,6 @@ snapshots: dependencies: b4a: 1.6.7 - through@2.3.8: {} - to-object-path@0.3.0: dependencies: kind-of: 3.2.2 @@ -5590,9 +5151,9 @@ snapshots: regex-not: 1.0.2 safe-regex: 1.1.0 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 ts-patch@3.3.0: dependencies: @@ -5603,7 +5164,7 @@ snapshots: semver: 7.6.3 strip-ansi: 6.0.1 - ts-pattern@5.6.0: {} + ts-pattern@5.6.2: {} tsconfig-paths@3.15.0: dependencies: @@ -5614,18 +5175,10 @@ snapshots: tslib@2.8.1: {} - tsx@3.12.7: - dependencies: - '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.1.0 - '@esbuild-kit/esm-loader': 2.5.5 - optionalDependencies: - fsevents: 2.3.2 - tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -5633,9 +5186,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@3.9.0: {} - - type-fest@4.31.0: {} + type-fest@4.35.0: {} typed-array-buffer@1.0.3: dependencies: @@ -5646,7 +5197,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -5655,39 +5206,39 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.9 + reflect.getprototypeof: 1.0.10 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.9 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 typed-query-selector@2.12.0: {} - typescript-eslint@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2): + typescript-eslint@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2))(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.2) - eslint: 9.17.0(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) - typescript: 5.7.2 + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript-transform-paths@3.5.3(typescript@5.7.2): + typescript-transform-paths@3.5.3(typescript@5.7.3): dependencies: minimatch: 9.0.5 - typescript: 5.7.2 + typescript: 5.7.3 - typescript@5.7.2: {} + typescript@5.7.3: {} unbox-primitive@1.1.0: dependencies: @@ -5696,13 +5247,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 - - undici-types@5.26.5: {} - undici-types@6.20.0: {} union-value@1.0.1: @@ -5729,7 +5273,7 @@ snapshots: util-deprecate@1.0.2: {} - virtual-merge@1.0.1: {} + virtual-merge@1.0.2: {} vscode-oniguruma@1.7.0: {} @@ -5738,7 +5282,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -5746,14 +5290,14 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.0.10 + is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -5771,7 +5315,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -5832,4 +5376,4 @@ snapshots: jszip: 2.7.0 q: 1.5.1 - zod@3.23.8: {} + zod@3.24.2: {} diff --git a/src/VencordNative.ts b/src/VencordNative.ts index 42e697452..3bed5a592 100644 --- a/src/VencordNative.ts +++ b/src/VencordNative.ts @@ -4,11 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import type { Settings } from "@api/Settings"; import { PluginIpcMappings } from "@main/ipcPlugins"; import type { UserThemeHeader } from "@main/themes"; import { IpcEvents } from "@shared/IpcEvents"; import { IpcRes } from "@utils/types"; -import type { Settings } from "api/Settings"; import { ipcRenderer } from "electron"; function invoke<T = any>(event: IpcEvents, ...args: any[]) { diff --git a/src/plugins/decor/ui/components/DecorationContextMenu.tsx b/src/plugins/decor/ui/components/DecorationContextMenu.tsx index 7451bb229..7c1542f65 100644 --- a/src/plugins/decor/ui/components/DecorationContextMenu.tsx +++ b/src/plugins/decor/ui/components/DecorationContextMenu.tsx @@ -5,7 +5,7 @@ */ import { CopyIcon, DeleteIcon } from "@components/Icons"; -import { Alerts, Clipboard, ContextMenuApi, Menu, UserStore } from "webpack/common"; +import { Alerts, Clipboard, ContextMenuApi, Menu, UserStore } from "@webpack/common"; import { Decoration } from "../../lib/api"; import { useCurrentUserDecorationsStore } from "../../lib/stores/CurrentUserDecorationsStore"; diff --git a/src/plugins/fixSpotifyEmbeds.desktop/native.ts b/src/plugins/fixSpotifyEmbeds.desktop/native.ts index e15e4a441..79602609c 100644 --- a/src/plugins/fixSpotifyEmbeds.desktop/native.ts +++ b/src/plugins/fixSpotifyEmbeds.desktop/native.ts @@ -9,7 +9,7 @@ import { app } from "electron"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { - frame.once("dom-ready", () => { + frame?.once("dom-ready", () => { if (frame.url.startsWith("https://open.spotify.com/embed/")) { const settings = RendererSettings.store.plugins?.FixSpotifyEmbeds; if (!settings?.enabled) return; diff --git a/src/plugins/fixYoutubeEmbeds.desktop/native.ts b/src/plugins/fixYoutubeEmbeds.desktop/native.ts index 003cba9e3..950940b06 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/native.ts +++ b/src/plugins/fixYoutubeEmbeds.desktop/native.ts @@ -9,7 +9,7 @@ import { app } from "electron"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { - frame.once("dom-ready", () => { + frame?.once("dom-ready", () => { if (frame.url.startsWith("https://www.youtube.com/")) { const settings = RendererSettings.store.plugins?.FixYoutubeEmbeds; if (!settings?.enabled) return; diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx index d21f05799..9e9610f6a 100644 --- a/src/plugins/ignoreActivities/index.tsx +++ b/src/plugins/ignoreActivities/index.tsx @@ -12,7 +12,7 @@ import { Devs } from "@utils/constants"; import { Margins } from "@utils/margins"; import definePlugin, { OptionType } from "@utils/types"; import { findStoreLazy } from "@webpack"; -import { Button, Forms, showToast, TextInput, Toasts, Tooltip, useEffect, useState } from "webpack/common"; +import { Button, Forms, showToast, TextInput, Toasts, Tooltip, useEffect, useState } from "@webpack/common"; const enum ActivitiesTypes { Game, diff --git a/src/plugins/shikiCodeblocks.desktop/shiki.css b/src/plugins/shikiCodeblocks.desktop/shiki.css index 3f43b4c42..32bf1c2e9 100644 --- a/src/plugins/shikiCodeblocks.desktop/shiki.css +++ b/src/plugins/shikiCodeblocks.desktop/shiki.css @@ -96,6 +96,6 @@ .vc-shiki-root .vc-shiki-table-cell:last-child { padding-left: 8px; - word-break: break-word; + overflow-wrap: break-word; width: 100%; } diff --git a/src/plugins/spotifyControls/SpotifyStore.ts b/src/plugins/spotifyControls/SpotifyStore.ts index 5c0c5fe4e..65ee2c154 100644 --- a/src/plugins/spotifyControls/SpotifyStore.ts +++ b/src/plugins/spotifyControls/SpotifyStore.ts @@ -77,7 +77,7 @@ export const SpotifyStore = proxyLazyWebpack(() => { class SpotifyStore extends Store { public mPosition = 0; - private start = 0; + public _start = 0; public track: Track | null = null; public device: Device | null = null; @@ -100,26 +100,26 @@ export const SpotifyStore = proxyLazyWebpack(() => { public get position(): number { let pos = this.mPosition; if (this.isPlaying) { - pos += Date.now() - this.start; + pos += Date.now() - this._start; } return pos; } public set position(p: number) { this.mPosition = p; - this.start = Date.now(); + this._start = Date.now(); } prev() { - this.req("post", "/previous"); + this._req("post", "/previous"); } next() { - this.req("post", "/next"); + this._req("post", "/next"); } setVolume(percent: number) { - this.req("put", "/volume", { + this._req("put", "/volume", { query: { volume_percent: Math.round(percent) } @@ -131,17 +131,17 @@ export const SpotifyStore = proxyLazyWebpack(() => { } setPlaying(playing: boolean) { - this.req("put", playing ? "/play" : "/pause"); + this._req("put", playing ? "/play" : "/pause"); } setRepeat(state: Repeat) { - this.req("put", "/repeat", { + this._req("put", "/repeat", { query: { state } }); } setShuffle(state: boolean) { - this.req("put", "/shuffle", { + this._req("put", "/shuffle", { query: { state } }).then(() => { this.shuffle = state; @@ -154,7 +154,7 @@ export const SpotifyStore = proxyLazyWebpack(() => { this.isSettingPosition = true; - return this.req("put", "/seek", { + return this._req("put", "/seek", { query: { position_ms: Math.round(ms) } @@ -164,7 +164,7 @@ export const SpotifyStore = proxyLazyWebpack(() => { }); } - private req(method: "post" | "get" | "put", route: string, data: any = {}) { + _req(method: "post" | "get" | "put", route: string, data: any = {}) { if (this.device?.is_active) (data.query ??= {}).device_id = this.device.id; diff --git a/src/plugins/userVoiceShow/components.tsx b/src/plugins/userVoiceShow/components.tsx index 4666bb907..9029cdc58 100644 --- a/src/plugins/userVoiceShow/components.tsx +++ b/src/plugins/userVoiceShow/components.tsx @@ -128,7 +128,7 @@ function VoiceChannelTooltip({ channel, isLocked }: VoiceChannelTooltipProps) { ); } -interface VoiceChannelIndicatorProps { +export interface VoiceChannelIndicatorProps { userId: string; isActionButton?: boolean; shouldHighlight?: boolean; diff --git a/src/plugins/youtubeAdblock.desktop/native.ts b/src/plugins/youtubeAdblock.desktop/native.ts index 8cc6a3232..ae05d6462 100644 --- a/src/plugins/youtubeAdblock.desktop/native.ts +++ b/src/plugins/youtubeAdblock.desktop/native.ts @@ -10,7 +10,7 @@ import adguard from "file://adguard.js?minify"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { - frame.once("dom-ready", () => { + frame?.once("dom-ready", () => { if (!RendererSettings.store.plugins?.YoutubeAdblock?.enabled) return; if (frame.url.includes("youtube.com/embed/") || (frame.url.includes("discordsays") && frame.url.includes("youtube.com"))) { diff --git a/src/utils/discord.css b/src/utils/discord.css index 12d15694b..746fb564b 100644 --- a/src/utils/discord.css +++ b/src/utils/discord.css @@ -17,7 +17,6 @@ @media(width <= 485px) { .vc-image-modal { - display: relative; overflow: visible; overflow: initial; } From 71ade7d658652522b6e8d124618b54e37b9dc039 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:31:21 -0300 Subject: [PATCH 18/23] Make sure i18n find does not match the wrong mapping --- src/webpack/common/utils.ts | 5 ++--- src/webpack/webpack.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/webpack/common/utils.ts b/src/webpack/common/utils.ts index 9ed1489c8..fd555c217 100644 --- a/src/webpack/common/utils.ts +++ b/src/webpack/common/utils.ts @@ -16,7 +16,6 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import { runtimeHashMessageKey } from "@utils/intlHash"; import type { Channel } from "discord-types/general"; // eslint-disable-next-line path-alias/no-relative @@ -58,8 +57,8 @@ export const { match, P }: Pick<typeof import("ts-pattern"), "match" | "P"> = ma export const lodash: typeof import("lodash") = findByPropsLazy("debounce", "cloneDeep"); export const i18n = mapMangledModuleLazy('defaultLocale:"en-US"', { - t: filters.byProps(runtimeHashMessageKey("DISCORD")), - intl: filters.byProps("string", "format"), + t: m => m?.[Symbol.toStringTag] === "IntlMessagesProxy", + intl: m => m != null && Object.getPrototypeOf(m)?.withFormatters != null }, true); export let SnowflakeUtils: t.SnowflakeUtils; diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 6b17bd1d6..3a7fe2a52 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -504,7 +504,7 @@ function getAllPropertyNames(object: Record<PropertyKey, any>, includeNonEnumera const getKeys = includeNonEnumerable ? Object.getOwnPropertyNames : Object.keys; do { - getKeys(object).forEach(name => names.add(name)); + getKeys(object).forEach(name => name !== "__esModule" && names.add(name)); object = Object.getPrototypeOf(object); } while (object != null); From dd714ff3c24f4464d7b3d1869e5db5b418c7c49a Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:47:21 -0300 Subject: [PATCH 19/23] Reporter: Fix wrongly loading worker chunks Also fixes duplicate patchedBy on patched modules and bumps pnpm to latest version --- package.json | 18 +++--- pnpm-lock.yaml | 112 ++++++++++++++++++------------------ src/debug/loadLazyChunks.ts | 4 +- src/webpack/patchWebpack.ts | 12 ++-- 4 files changed, 71 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index c2e13a93f..f251aeda7 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "typescript-transform-paths": "^3.5.3", "zip-local": "^0.3.5" }, - "packageManager": "pnpm@9.1.0", + "packageManager": "pnpm@10.4.1", "pnpm": { "patchedDependencies": { "eslint@9.20.1": "patches/eslint@9.20.1.patch", @@ -95,18 +95,14 @@ "source-map-resolve": "*", "resolve-url": "*", "source-map-url": "*", - "urix": "*" - } - }, - "webExt": { - "artifactsDir": "./dist", - "build": { - "overwriteDest": true + "urix": "*", + "q": "*" }, - "sourceDir": "./dist/firefox-unpacked" + "onlyBuiltDependencies": [ + "esbuild" + ] }, "engines": { - "node": ">=18", - "pnpm": ">=9" + "node": ">=18" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ce4f0c24..77680a806 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,10 +6,10 @@ settings: patchedDependencies: eslint-plugin-path-alias@2.1.0: - hash: japuwsqfkulviwgkm4kd2oi3ky + hash: 87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727 path: patches/eslint-plugin-path-alias@2.1.0.patch eslint@9.20.1: - hash: xm46kqcmdgzlmm4aifkfpxaho4 + hash: 4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215 path: patches/eslint@9.20.1.patch importers: @@ -43,7 +43,7 @@ importers: devDependencies: '@stylistic/eslint-plugin': specifier: ^4.0.0 - version: 4.0.0(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + version: 4.0.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) '@types/chrome': specifier: ^0.0.304 version: 0.0.304 @@ -76,25 +76,25 @@ importers: version: 0.25.0 eslint: specifier: ^9.20.1 - version: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + version: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))) eslint-plugin-path-alias: specifier: 2.1.0 - version: 2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-plugin-react: specifier: ^7.37.3 - version: 7.37.4(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 7.37.4(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-plugin-simple-header: specifier: ^1.2.1 - version: 1.2.2(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 1.2.2(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 12.1.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -133,7 +133,7 @@ importers: version: 5.7.3 typescript-eslint: specifier: ^8.19.0 - version: 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + version: 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) typescript-transform-paths: specifier: ^3.5.3 version: 3.5.3(typescript@5.7.3) @@ -2818,9 +2818,9 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))': dependencies: - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2932,10 +2932,10 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin@4.0.0(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': + '@stylistic/eslint-plugin@4.0.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -3015,15 +3015,15 @@ snapshots: dependencies: '@types/node': 22.13.4 - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -3032,14 +3032,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': + '@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 8.24.1 '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -3049,12 +3049,12 @@ snapshots: '@typescript-eslint/types': 8.24.1 '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -3076,13 +3076,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3)': + '@typescript-eslint/utils@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) '@typescript-eslint/scope-manager': 8.24.1 '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -3683,9 +3683,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-import-resolver-node@0.3.9: dependencies: @@ -3695,17 +3695,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3714,9 +3714,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3728,22 +3728,22 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(patch_hash=japuwsqfkulviwgkm4kd2oi3ky)(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-path-alias@2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) find-pkg: 2.0.0 get-tsconfig: 4.8.1 nanomatch: 1.2.13 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.4(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-react@7.37.4(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3751,7 +3751,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3765,19 +3765,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-simple-header@1.2.2(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - eslint-plugin-simple-import-sort@12.1.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) eslint-scope@8.2.0: dependencies: @@ -3788,9 +3788,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4): + eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/core': 0.11.0 @@ -5223,12 +5223,12 @@ snapshots: typed-query-selector@2.12.0: {} - typescript-eslint@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3): + typescript-eslint@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3))(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4))(typescript@5.7.3) - eslint: 9.20.1(patch_hash=xm46kqcmdgzlmm4aifkfpxaho4) + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.7.3) + eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) typescript: 5.7.3 transitivePeerDependencies: - supports-color diff --git a/src/debug/loadLazyChunks.ts b/src/debug/loadLazyChunks.ts index 9c06e3aa4..f8c71caea 100644 --- a/src/debug/loadLazyChunks.ts +++ b/src/debug/loadLazyChunks.ts @@ -68,7 +68,7 @@ export async function loadLazyChunks() { const isWorkerAsset = await fetch(wreq.p + wreq.u(id)) .then(r => r.text()) - .then(t => t.includes("importScripts(")); + .then(t => /importScripts\(|self\.postMessage/.test(t)); if (isWorkerAsset) { invalidChunks.add(id); @@ -174,7 +174,7 @@ export async function loadLazyChunks() { await Promise.all(chunksLeft.map(async id => { const isWorkerAsset = await fetch(wreq.p + wreq.u(id)) .then(r => r.text()) - .then(t => t.includes("importScripts(")); + .then(t => /importScripts\(|self\.postMessage/.test(t)); // Loads the chunk. Currently this only happens with the language packs which are loaded differently if (!isWorkerAsset) { diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 568ce3eba..4b9106238 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -297,11 +297,6 @@ function updateExistingFactory(moduleFactories: AnyWebpackRequire["m"], moduleId } if (existingFactory != null) { - // Sanity check to make sure these factories are equal - if (String(newFactory) !== String(existingFactory)) { - return false; - } - // If existingFactory exists in any of the Webpack instances we track, it's either wrapped in our proxy, or it has already been required. // In the case it is wrapped in our proxy, and the instance we are setting does not already have it, we need to make sure the instance contains our proxy too. if (moduleFactoriesWithFactory !== moduleFactories && existingFactory[SYM_IS_PROXIED_FACTORY]) { @@ -563,8 +558,13 @@ function patchFactory(moduleId: PropertyKey, originalFactory: AnyModuleFactory): continue; } + const pluginsList = [...patchedBy]; + if (!patchedBy.has(patch.plugin)) { + pluginsList.push(patch.plugin); + } + code = newCode; - patchedSource = `// Webpack Module ${String(moduleId)} - Patched by ${[...patchedBy, patch.plugin].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${String(moduleId)}`; + patchedSource = `// Webpack Module ${String(moduleId)} - Patched by ${pluginsList.join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${String(moduleId)}`; patchedFactory = (0, eval)(patchedSource); if (!patchedBy.has(patch.plugin)) { From 3e524f9d92500b3f9b91b6d7271652f53f1fc2c5 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Fri, 21 Feb 2025 01:14:11 -0300 Subject: [PATCH 20/23] WebpackPatcher: Improve getBuildNumber; Allow reporter to check for buildNumber Allows replacements to define noWarn too --- src/utils/types.ts | 12 +++++-- src/webpack/patchWebpack.ts | 62 ++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/utils/types.ts b/src/utils/types.ts index 4ff30b78c..6a791c86e 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -41,7 +41,12 @@ export interface PatchReplacement { match: string | RegExp; /** The replacement string or function which returns the string for the patch replacement */ replace: string | ReplaceFn; - /** A function which returns whether this patch replacement should be applied */ + /** Do not warn if this replacement did no changes */ + noWarn?: boolean; + /** + * A function which returns whether this patch replacement should be applied. + * This is ran before patches are registered, so if this returns false, the patch will never be registered. + */ predicate?(): boolean; /** The minimum build number for this patch to be applied */ fromBuild?: number; @@ -61,7 +66,10 @@ export interface Patch { noWarn?: boolean; /** Only apply this set of replacements if all of them succeed. Use this if your replacements depend on each other */ group?: boolean; - /** A function which returns whether this patch should be applied */ + /** + * A function which returns whether this patch replacement should be applied. + * This is ran before patches are registered, so if this returns false, the patch will never be registered. + */ predicate?(): boolean; /** The minimum build number for this patch to be applied */ fromBuild?: number; diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 4b9106238..9b66a5b4e 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -12,8 +12,8 @@ import { canonicalizeReplacement } from "@utils/patches"; import { Patch, PatchReplacement } from "@utils/types"; import { traceFunctionWithResults } from "../debug/Tracer"; -import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleId, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; -import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, ModuleExports, PatchedModuleFactory, WebpackRequire } from "./wreq.d"; +import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleFactory, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; +import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, PatchedModuleFactory, WebpackRequire } from "./wreq.d"; export const patches = [] as Patch[]; @@ -27,28 +27,26 @@ export const patchTimings = [] as Array<[plugin: string, moduleId: PropertyKey, export const getBuildNumber = makeLazy(() => { try { - try { - if (wreq.m[128014]?.toString().includes("Trying to open a changelog for an invalid build number")) { - const hardcodedGetBuildNumber = wreq(128014).b as () => number; - - if (typeof hardcodedGetBuildNumber === "function" && typeof hardcodedGetBuildNumber() === "number") { - return hardcodedGetBuildNumber(); - } + function matchBuildNumber(factoryStr: string) { + const buildNumberMatch = factoryStr.match(/.concat\("(\d+?)"\)/); + if (buildNumberMatch == null) { + return -1; } - } catch { } - const moduleId = findModuleId("Trying to open a changelog for an invalid build number"); - if (moduleId == null) { - return -1; + return Number(buildNumberMatch[1]); } - const exports = Object.values<ModuleExports>(wreq(moduleId)); - if (exports.length !== 1 || typeof exports[0] !== "function") { - return -1; + const hardcodedFactoryStr = String(wreq.m[128014]); + if (hardcodedFactoryStr.includes("Trying to open a changelog for an invalid build number")) { + const hardcodedBuildNumber = matchBuildNumber(hardcodedFactoryStr); + + if (hardcodedBuildNumber !== -1) { + return hardcodedBuildNumber; + } } - const buildNumber = exports[0](); - return typeof buildNumber === "number" ? buildNumber : -1; + const moduleFactory = findModuleFactory("Trying to open a changelog for an invalid build number"); + return matchBuildNumber(String(moduleFactory)); } catch { return -1; } @@ -122,12 +120,12 @@ define(Function.prototype, "m", { return; } - patchThisInstance(); - if (wreq == null && this.c != null) { logger.info("Main WebpackInstance found" + interpolateIfDefined` in ${fileName}` + ", initializing internal references to WebpackRequire"); _initWebpack(this as WebpackRequire); } + + patchThisInstance(); } }); @@ -478,23 +476,23 @@ function patchFactory(moduleId: PropertyKey, originalFactory: AnyModuleFactory): for (let i = 0; i < patches.length; i++) { const patch = patches[i]; - const moduleMatches = typeof patch.find === "string" - ? code.includes(patch.find) - : (patch.find.global && (patch.find.lastIndex = 0), patch.find.test(code)); - - if (!moduleMatches) { - continue; - } - - // Eager patches cannot retrieve the build number because this code runs before the module for it is loaded - const buildNumber = Settings.eagerPatches ? -1 : getBuildNumber(); - const shouldCheckBuildNumber = !Settings.eagerPatches && buildNumber !== -1; + const buildNumber = getBuildNumber(); + const shouldCheckBuildNumber = buildNumber !== -1; if ( shouldCheckBuildNumber && (patch.fromBuild != null && buildNumber < patch.fromBuild) || (patch.toBuild != null && buildNumber > patch.toBuild) ) { + patches.splice(i--, 1); + continue; + } + + const moduleMatches = typeof patch.find === "string" + ? code.includes(patch.find) + : (patch.find.global && (patch.find.lastIndex = 0), patch.find.test(code)); + + if (!moduleMatches) { continue; } @@ -536,7 +534,7 @@ function patchFactory(moduleId: PropertyKey, originalFactory: AnyModuleFactory): } if (newCode === code) { - if (!patch.noWarn) { + if (!(patch.noWarn || replacement.noWarn)) { logger.warn(`Patch by ${patch.plugin} had no effect (Module id is ${String(moduleId)}): ${replacement.match}`); if (IS_DEV) { logger.debug("Function Source:\n", code); From b5ef858e71c4b20cbc14b0bc1ab60be110641a21 Mon Sep 17 00:00:00 2001 From: sadan4 <117494111+sadan4@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:18:57 -0500 Subject: [PATCH 21/23] Fix plugins broken by latest Discord update (#3237) --- src/plugins/_api/dynamicImageModalApi.ts | 4 ++-- src/plugins/betterUploadButton/index.ts | 16 ++++++++++++---- src/plugins/decor/index.tsx | 18 +++++++++++++++--- src/plugins/implicitRelationships/index.ts | 6 +++--- src/plugins/memberCount/index.tsx | 16 ++++++++++++---- src/plugins/roleColorEverywhere/index.tsx | 8 +++++++- src/plugins/showHiddenChannels/index.tsx | 4 ++-- src/plugins/startupTimings/index.tsx | 22 ++++++++++++++++------ src/plugins/userMessagesPronouns/index.ts | 19 ++++++++++++++----- src/plugins/viewIcons/index.tsx | 16 ++++++++++++---- src/utils/lazy.ts | 4 ++-- src/webpack/common/components.ts | 2 +- 12 files changed, 98 insertions(+), 37 deletions(-) diff --git a/src/plugins/_api/dynamicImageModalApi.ts b/src/plugins/_api/dynamicImageModalApi.ts index 2ce51400d..4d74cff24 100644 --- a/src/plugins/_api/dynamicImageModalApi.ts +++ b/src/plugins/_api/dynamicImageModalApi.ts @@ -16,8 +16,8 @@ export default definePlugin({ { find: "SCALE_DOWN:", replacement: { - match: /!\(null==(\i)\|\|0===\i\|\|null==(\i)\|\|0===\i\)/, - replace: (_, width, height) => `!((null == ${width} || 0 === ${width}) && (null == ${height} || 0 === ${height}))` + match: /(?<="IMAGE"===\i\?)\i(?=\?)/, + replace: "true" } } ] diff --git a/src/plugins/betterUploadButton/index.ts b/src/plugins/betterUploadButton/index.ts index c08d43282..29827a5e9 100644 --- a/src/plugins/betterUploadButton/index.ts +++ b/src/plugins/betterUploadButton/index.ts @@ -26,10 +26,18 @@ export default definePlugin({ patches: [ { find: '"ChannelAttachButton"', - replacement: { - match: /\.attachButtonInner,"aria-label":.{0,50},onDoubleClick:(.+?:void 0),.{0,30}?\.\.\.(\i),/, - replace: "$&onClick:$1,onContextMenu:$2.onClick,", - }, + replacement: [ + { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /\.attachButtonInner,"aria-label":.{0,50},onDoubleClick:(.+?:void 0),.{0,30}?\.\.\.(\i),/, + replace: "$&onClick:$1,onContextMenu:$2.onClick,", + noWarn: true + }, + { + match: /\.attachButtonInner,"aria-label":.{0,50},onDoubleClick:(.+?:void 0),.{0,100}\},(\i)\).{0,100}children:\i/, + replace: "$&,onClick:$1,onContextMenu:$2.onClick,", + }, + ] }, ], }); diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index 69a7a1a59..4801cf753 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -50,12 +50,24 @@ export default definePlugin({ find: ".decorationGridItem,", replacement: [ { - match: /(?<==)\i=>{let{children.{20,100}decorationGridItem/, - replace: "$self.DecorationGridItem=$&" + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /(?<==)\i=>{let{children.{20,200}decorationGridItem/, + replace: "$self.DecorationGridItem=$&", + noWarn: true }, { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert match: /(?<==)\i=>{let{user:\i,avatarDecoration/, - replace: "$self.DecorationGridDecoration=$&" + replace: "$self.DecorationGridDecoration=$&", + noWarn: true + }, + { + match: /(?<==)\i=>{var{children.{20,200}decorationGridItem/, + replace: "$self.DecorationGridItem=$&", + }, + { + match: /(?<==)\i=>{var{user:\i,avatarDecoration/, + replace: "$self.DecorationGridDecoration=$&", }, // Remove NEW label from decor avatar decorations { diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts index cfc3818dd..f0be9ee54 100644 --- a/src/plugins/implicitRelationships/index.ts +++ b/src/plugins/implicitRelationships/index.ts @@ -34,7 +34,7 @@ export default definePlugin({ { find: "#{intl::FRIENDS_ALL_HEADER}", replacement: { - match: /toString\(\)\}\);case (\i\.\i)\.BLOCKED/, + match: /toString\(\)\}\);case (\i\.\i)\.PENDING/, replace: 'toString()});case $1.IMPLICIT:return "Implicit — "+arguments[1];case $1.BLOCKED' }, }, @@ -50,7 +50,7 @@ export default definePlugin({ { find: "#{intl::FRIENDS_SECTION_ONLINE}", replacement: { - match: /,{id:(\i\.\i)\.BLOCKED,show:.+?className:(\i\.item)/, + match: /,{id:(\i\.\i)\.PENDING,show:.+?className:(\i\.item)/, replace: (rest, relationShipTypes, className) => `,{id:${relationShipTypes}.IMPLICIT,show:true,className:${className},content:"Implicit"}${rest}` } }, @@ -58,7 +58,7 @@ export default definePlugin({ { find: '"FriendsStore"', replacement: { - match: /(?<=case (\i\.\i)\.BLOCKED:return (\i)\.type===\i\.\i\.BLOCKED)/, + match: /(?<=case (\i\.\i)\.SUGGESTIONS:return \d+===(\i)\.type)/, replace: ";case $1.IMPLICIT:return $2.type===5" }, }, diff --git a/src/plugins/memberCount/index.tsx b/src/plugins/memberCount/index.tsx index 67bbc4ce8..ad7491cc3 100644 --- a/src/plugins/memberCount/index.tsx +++ b/src/plugins/memberCount/index.tsx @@ -65,10 +65,18 @@ export default definePlugin({ patches: [ { find: "{isSidebarVisible:", - replacement: { - match: /(?<=let\{className:(\i),.+?children):\[(\i\.useMemo[^}]+"aria-multiselectable")/, - replace: ":[$1?.startsWith('members')?$self.render():null,$2" - }, + replacement: [ + { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /(?<=let\{className:(\i),.+?children):\[(\i\.useMemo[^}]+"aria-multiselectable")/, + replace: ":[$1?.startsWith('members')?$self.render():null,$2", + noWarn: true + }, + { + match: /(?<=var\{className:(\i),.+?children):\[(\i\.useMemo[^}]+"aria-multiselectable")/, + replace: ":[$1?.startsWith('members')?$self.render():null,$2", + }, + ], predicate: () => settings.store.memberList }, { diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index 7b7bcc44d..ffa2b5a25 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -84,8 +84,14 @@ export default definePlugin({ find: ".USER_MENTION)", replacement: [ { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert match: /onContextMenu:\i,color:\i,\.\.\.\i(?=,children:)(?<=user:(\i),channel:(\i).{0,500}?)/, - replace: "$&,color:$self.getColorInt($1?.id,$2?.id)" + replace: "$&,color:$self.getColorInt($1?.id,$2?.id)", + noWarn: true + }, + { + match: /(?<=onContextMenu:\i,color:)\i(?=\},\i\),\{children)(?<=user:(\i),channel:(\i).{0,500}?)/, + replace: "$self.getColorInt($1?.id,$2?.id)", } ], predicate: () => settings.store.chatMentions diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index ccaff2ad8..36abe30ec 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -204,7 +204,7 @@ export default definePlugin({ { // Hide unreads predicate: () => settings.store.hideUnreads === true, - match: /{channel:(\i),name:\i,.+?unread:(\i).+?;/, + match: /\.subtitle,.+?;(?=return\(0,\i\.jsxs?\))(?<={channel:(\i),name:\i,.+?unread:(\i).+?)/, replace: (m, channel, unread) => `${m}${unread}=$self.isHiddenChannel(${channel})?false:${unread};` } ] @@ -485,7 +485,7 @@ export default definePlugin({ } }, { - find: '="NowPlayingViewStore",', + find: '"NowPlayingViewStore"', replacement: { // Make active now voice states on hidden channels match: /(getVoiceStateForUser.{0,150}?)&&\i\.\i\.canWithPartialContext.{0,20}VIEW_CHANNEL.+?}\)(?=\?)/, diff --git a/src/plugins/startupTimings/index.tsx b/src/plugins/startupTimings/index.tsx index aabc786a4..ac7f3f0c8 100644 --- a/src/plugins/startupTimings/index.tsx +++ b/src/plugins/startupTimings/index.tsx @@ -27,12 +27,22 @@ export default definePlugin({ authors: [Devs.Megu], patches: [{ find: "#{intl::ACTIVITY_SETTINGS}", - replacement: { - match: /(?<=}\)([,;])(\i\.settings)\.forEach.+?(\i)\.push.+}\)}\))/, - replace: (_, commaOrSemi, settings, elements) => "" + - `${commaOrSemi}${settings}?.[0]==="CHANGELOG"` + - `&&${elements}.push({section:"StartupTimings",label:"Startup Timings",element:$self.StartupTimingPage})` - } + replacement: [ + { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /(?<=}\)([,;])(\i\.settings)\.forEach.+?(\i)\.push.+}\)}\))/, + replace: (_, commaOrSemi, settings, elements) => "" + + `${commaOrSemi}${settings}?.[0]==="CHANGELOG"` + + `&&${elements}.push({section:"StartupTimings",label:"Startup Timings",element:$self.StartupTimingPage})`, + noWarn: true + }, + { + match: /(?<=}\)([,;])(\i\.settings)\.forEach.+?(\i)\.push.+\)\)\}\))(?=\)\})/, + replace: (_, commaOrSemi, settings, elements) => "" + + `${commaOrSemi}${settings}?.[0]==="CHANGELOG"` + + `&&${elements}.push({section:"StartupTimings",label:"Startup Timings",element:$self.StartupTimingPage})`, + }, + ] }], StartupTimingPage }); diff --git a/src/plugins/userMessagesPronouns/index.ts b/src/plugins/userMessagesPronouns/index.ts index 27b162b90..1699251ee 100644 --- a/src/plugins/userMessagesPronouns/index.ts +++ b/src/plugins/userMessagesPronouns/index.ts @@ -41,11 +41,20 @@ export default definePlugin({ }, { find: '="SYSTEM_TAG"', - replacement: { - // Add next to username (compact mode) - match: /className:\i\(\)\(\i\.className(?:,\i\.clickable)?,\i\)}\),(?=\i)/g, - replace: "$&$self.CompactPronounsChatComponentWrapper(arguments[0])," - } + replacement: [ + { + // Add next to username (compact mode) + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /className:\i\(\)\(\i\.className(?:,\i\.clickable)?,\i\)}\),(?=\i)/g, + replace: "$&$self.CompactPronounsChatComponentWrapper(arguments[0]),", + noWarn: true + }, + { + // Add next to username (compact mode) + match: /className:\i\(\)\(\i\.className(?:,\i\.clickable)?,\i\)}\)\),(?=\i)/g, + replace: "$&$self.CompactPronounsChatComponentWrapper(arguments[0]),", + }, + ] } ], diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index 12ee18e14..afd9d48c5 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -193,10 +193,18 @@ export default definePlugin({ // Avatar component used in User DMs "User Profile" popup in the right and Profiles Modal pfp { find: ".overlay:void 0,status:", - replacement: { - match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",{...\2,/, - replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)}," - }, + replacement: [ + { + // FIXME(Bundler spread transform related): Remove old compatiblity once enough time has passed, if they don't revert + match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",{...\2,/, + replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", + noWarn: true + }, + { + match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",.{0,100}className:\i,/, + replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", + } + ], all: true }, // Banners diff --git a/src/utils/lazy.ts b/src/utils/lazy.ts index e46e44ad7..526c5514b 100644 --- a/src/utils/lazy.ts +++ b/src/utils/lazy.ts @@ -20,9 +20,9 @@ export function makeLazy<T>(factory: () => T, attempts = 5): () => T { let tries = 0; let cache: T; return () => { - if (!cache && attempts > tries++) { + if (cache === undefined && attempts > tries++) { cache = factory(); - if (!cache && attempts === tries) + if (cache === undefined && attempts === tries) console.error("Lazy factory failed:", factory); } return cache; diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index e31e167e8..2681d51d3 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -41,7 +41,7 @@ export const Switch = waitForComponent<t.Switch>("Switch", filters.componentByCo const Tooltips = mapMangledModuleLazy(".tooltipTop,bottom:", { Tooltip: filters.componentByCode("this.renderTooltip()]"), - TooltipContainer: filters.componentByCode('="div",') + TooltipContainer: filters.componentByCode('="div"') }) as { Tooltip: t.Tooltip, TooltipContainer: t.TooltipContainer; From 45c0fc48ed8174b94c811433cdd9ae2215cec942 Mon Sep 17 00:00:00 2001 From: Suffocate <70031311+lolsuffocate@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:27:31 +0000 Subject: [PATCH 22/23] SHC: fix hidden channels not muted (#3245) --- src/plugins/showHiddenChannels/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index 36abe30ec..7a38bb123 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -173,7 +173,7 @@ export default definePlugin({ replacement: [ // Make the channel appear as muted if it's hidden { - match: /{channel:(\i),name:\i,muted:(\i).+?;/, + match: /\.subtitle,.+?;(?=return\(0,\i\.jsxs?\))(?<={channel:(\i),name:\i,muted:(\i).+?;)/, replace: (m, channel, muted) => `${m}${muted}=$self.isHiddenChannel(${channel})?true:${muted};` }, // Add the hidden eye icon if the channel is hidden From 421ff8327630b886484272e1cffc3e3078313952 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:47:16 -0300 Subject: [PATCH 23/23] Fix AccountPanelServerProfile not working --- src/plugins/accountPanelServerProfile/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index a2fed5d79..c347cc982 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -85,7 +85,7 @@ export default definePlugin({ replace: "$&onRequestClose:$self.onPopoutClose," }, { - match: /(?<=\.avatarWrapper,)/, + match: /(?<=#{intl::SET_STATUS}\),)/, replace: "ref:$self.accountPanelRef,onContextMenu:$self.openAccountPanelContextMenu," } ]