diff --git a/scripts/generateReport.ts b/scripts/generateReport.ts index 6a424ff13..b39b0700e 100644 --- a/scripts/generateReport.ts +++ b/scripts/generateReport.ts @@ -42,8 +42,8 @@ const page = await browser.newPage(); await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"); async function maybeGetError(handle: JSHandle) { - return (handle as JSHandle)?.getProperty("message") - .then(m => m.jsonValue()); + return (handle as JSHandle).getProperty("message") + .then(m => m?.jsonValue() ?? "Unknown Error"); } const report = { @@ -354,7 +354,9 @@ async function runtime(token: string) { // setImmediate to avoid blocking the factory patching execution while checking for lazy chunks setTimeout(() => { let isResolved = false; - searchAndLoadLazyChunks(String(factory)).then(() => isResolved = true); + searchAndLoadLazyChunks(String(factory)) + .then(() => isResolved = true) + .catch(() => isResolved = true); chunksSearchPromises.push(() => isResolved); }, 0); @@ -362,7 +364,9 @@ async function runtime(token: string) { for (const factoryId in wreq.m) { let isResolved = false; - searchAndLoadLazyChunks(String(wreq.m[factoryId])).then(() => isResolved = true); + searchAndLoadLazyChunks(String(wreq.m[factoryId])) + .then(() => isResolved = true) + .catch(() => isResolved = true); chunksSearchPromises.push(() => isResolved); } diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 7a8a172ba..af2988d51 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -88,7 +88,6 @@ Reflect.defineProperty(Function.prototype, "m", { If Discord 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(moduleFactories, new Proxy(moduleFactories, moduleFactoriesHandler)); */ - } Reflect.defineProperty(this, "m", { @@ -146,13 +145,23 @@ const moduleFactoriesHandler: ProxyHandler = { get: (target, p, receiver) => { return undefined; }, + // Same thing as get + has: (target, p) => { + return false; + } */ // The set trap for patching or defining getters for the module factories when new module factories are loaded set: (target, p, newValue, receiver) => { // If the property is not a number, we are not dealing with a module factory if (Number.isNaN(Number(p))) { - return Reflect.set(target, p, newValue, receiver); + Reflect.defineProperty(target, p, { + value: newValue, + configurable: true, + enumerable: true, + writable: true + }); + return true; } const existingFactory = Reflect.get(target, p, receiver); diff --git a/src/webpack/webpack.tsx b/src/webpack/webpack.tsx index 341b54d47..0470b2973 100644 --- a/src/webpack/webpack.tsx +++ b/src/webpack/webpack.tsx @@ -94,6 +94,8 @@ export const factoryListeners = new Set<(factory: ModuleFactory) => void>(); export function _initWebpack(webpackRequire: WebpackRequire) { wreq = webpackRequire; + + if (webpackRequire.c == null) return; cache = webpackRequire.c; Reflect.defineProperty(webpackRequire.c, Symbol.toStringTag, { @@ -740,10 +742,10 @@ export function search(...filters: Array) { outer: for (const id in factories) { const factory = factories[id]; - const str = String(factory); + const factoryStr = String(factory); for (const filter of filters) { - if (typeof filter === "string" && !str.includes(filter)) continue outer; - if (filter instanceof RegExp && !filter.test(str)) continue outer; + if (typeof filter === "string" && !factoryStr.includes(filter)) continue outer; + if (filter instanceof RegExp && !filter.test(factoryStr)) continue outer; } results[id] = factory; }