mirror of
https://github.com/Vendicated/Vencord.git
synced 2025-01-10 18:06:22 +00:00
support regex finds and bit more work on reporter gui
This commit is contained in:
parent
be739d8774
commit
4a5d480acc
7 changed files with 74 additions and 15 deletions
|
@ -21,12 +21,13 @@ import esbuild from "esbuild";
|
||||||
import { readdir } from "fs/promises";
|
import { readdir } from "fs/promises";
|
||||||
import { join } from "path";
|
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, IS_COMPANION_TEST } from "./common.mjs";
|
||||||
|
|
||||||
const defines = {
|
const defines = {
|
||||||
IS_STANDALONE,
|
IS_STANDALONE,
|
||||||
IS_DEV,
|
IS_DEV,
|
||||||
IS_REPORTER,
|
IS_REPORTER,
|
||||||
|
IS_COMPANION_TEST,
|
||||||
IS_UPDATER_DISABLED,
|
IS_UPDATER_DISABLED,
|
||||||
IS_WEB: false,
|
IS_WEB: false,
|
||||||
IS_EXTENSION: false,
|
IS_EXTENSION: false,
|
||||||
|
|
|
@ -41,6 +41,7 @@ export const watch = process.argv.includes("--watch");
|
||||||
export const IS_DEV = watch || process.argv.includes("--dev");
|
export const IS_DEV = watch || process.argv.includes("--dev");
|
||||||
export const IS_REPORTER = process.argv.includes("--reporter");
|
export const IS_REPORTER = process.argv.includes("--reporter");
|
||||||
export const IS_STANDALONE = process.argv.includes("--standalone");
|
export const IS_STANDALONE = process.argv.includes("--standalone");
|
||||||
|
export const IS_COMPANION_TEST = process.argv.includes("--companion-test");
|
||||||
|
|
||||||
export const IS_UPDATER_DISABLED = process.argv.includes("--disable-updater");
|
export const IS_UPDATER_DISABLED = process.argv.includes("--disable-updater");
|
||||||
export const gitHash = process.env.VENCORD_HASH || execSync("git rev-parse --short HEAD", { encoding: "utf-8" }).trim();
|
export const gitHash = process.env.VENCORD_HASH || execSync("git rev-parse --short HEAD", { encoding: "utf-8" }).trim();
|
||||||
|
|
|
@ -5,24 +5,31 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Logger } from "@utils/Logger";
|
import { Logger } from "@utils/Logger";
|
||||||
|
import { Patch } from "@utils/types";
|
||||||
import * as Webpack from "@webpack";
|
import * as Webpack from "@webpack";
|
||||||
import { patches } from "plugins";
|
import { patches } from "plugins";
|
||||||
|
|
||||||
import { loadLazyChunks } from "./loadLazyChunks";
|
import { loadLazyChunks } from "./loadLazyChunks";
|
||||||
|
|
||||||
const ReporterLogger = new Logger("Reporter");
|
const ReporterLogger = new Logger("Reporter");
|
||||||
|
interface EvaledPatch extends Patch {
|
||||||
|
id: number | string;
|
||||||
|
}
|
||||||
interface ReporterData {
|
interface ReporterData {
|
||||||
failedPatches: {
|
failedPatches: {
|
||||||
/**
|
foundNoModule: Patch[];
|
||||||
* pluginName > array of failed modules
|
hadNoEffect: EvaledPatch[];
|
||||||
*/
|
undoingPatchGroup: EvaledPatch[];
|
||||||
foundNoModule: Record<string, string[]>;
|
erroredPatch: EvaledPatch[];
|
||||||
};
|
};
|
||||||
failedWebpack: Record<Webpack.TypeWebpackSearchHistory, string[][]>;
|
failedWebpack: Record<Webpack.TypeWebpackSearchHistory, string[][]>;
|
||||||
}
|
}
|
||||||
const reporterData: ReporterData = {
|
export const reporterData: ReporterData = {
|
||||||
failedPatches: {
|
failedPatches: {
|
||||||
foundNoModule: {}
|
foundNoModule: [],
|
||||||
|
hadNoEffect: [],
|
||||||
|
undoingPatchGroup: [],
|
||||||
|
erroredPatch: []
|
||||||
},
|
},
|
||||||
failedWebpack: {
|
failedWebpack: {
|
||||||
find: [[]],
|
find: [[]],
|
||||||
|
@ -54,6 +61,8 @@ async function runReporter() {
|
||||||
for (const patch of patches) {
|
for (const patch of patches) {
|
||||||
if (!patch.all) {
|
if (!patch.all) {
|
||||||
new Logger("WebpackInterceptor").warn(`Patch by ${patch.plugin} found no module (Module id is -): ${patch.find}`);
|
new Logger("WebpackInterceptor").warn(`Patch by ${patch.plugin} found no module (Module id is -): ${patch.find}`);
|
||||||
|
if (IS_COMPANION_TEST)
|
||||||
|
reporterData.failedPatches.foundNoModule[patch.plugin].push(String(patch.find));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +108,8 @@ async function runReporter() {
|
||||||
logMessage += `("${args[0]}", {\n${failedMappings.map(mapping => `\t${mapping}: ${args[1][mapping].toString().slice(0, 147)}...`).join(",\n")}\n})`;
|
logMessage += `("${args[0]}", {\n${failedMappings.map(mapping => `\t${mapping}: ${args[1][mapping].toString().slice(0, 147)}...`).join(",\n")}\n})`;
|
||||||
}
|
}
|
||||||
else logMessage += `(${args.map(arg => `"${arg}"`).join(", ")})`;
|
else logMessage += `(${args.map(arg => `"${arg}"`).join(", ")})`;
|
||||||
reporterData.failedWebpack[method].push(args.map(a => String(a)));
|
if (IS_COMPANION_TEST)
|
||||||
|
reporterData.failedWebpack[method].push(args.map(a => String(a)));
|
||||||
ReporterLogger.log("Webpack Find Fail:", logMessage);
|
ReporterLogger.log("Webpack Find Fail:", logMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,7 +118,9 @@ async function runReporter() {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ReporterLogger.log("A fatal error occurred:", e);
|
ReporterLogger.log("A fatal error occurred:", e);
|
||||||
}
|
}
|
||||||
|
console.log(reporterData);
|
||||||
}
|
}
|
||||||
|
|
||||||
runReporter();
|
// imported in webpack for reporterData, wrap to avoid running reporter
|
||||||
console.log(reporterData);
|
if (IS_REPORTER)
|
||||||
|
runReporter();
|
||||||
|
|
1
src/globals.d.ts
vendored
1
src/globals.d.ts
vendored
|
@ -38,6 +38,7 @@ declare global {
|
||||||
export var IS_UPDATER_DISABLED: boolean;
|
export var IS_UPDATER_DISABLED: boolean;
|
||||||
export var IS_DEV: boolean;
|
export var IS_DEV: boolean;
|
||||||
export var IS_REPORTER: boolean;
|
export var IS_REPORTER: boolean;
|
||||||
|
export var IS_COMPANION_TEST: boolean;
|
||||||
export var IS_DISCORD_DESKTOP: boolean;
|
export var IS_DISCORD_DESKTOP: boolean;
|
||||||
export var IS_VESKTOP: boolean;
|
export var IS_VESKTOP: boolean;
|
||||||
export var VERSION: string;
|
export var VERSION: string;
|
||||||
|
|
|
@ -24,7 +24,7 @@ import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches";
|
||||||
import definePlugin, { OptionType, ReporterTestable } from "@utils/types";
|
import definePlugin, { OptionType, ReporterTestable } from "@utils/types";
|
||||||
import { filters, findAll, search, wreq } from "@webpack";
|
import { filters, findAll, search, wreq } from "@webpack";
|
||||||
|
|
||||||
import { extractModule, extractOrThrow, FindData, findModuleId, parseNode, PatchData, SendData } from "./util";
|
import { extractModule, extractOrThrow, FindData, findModuleId, FindType, mkRegexFind, parseNode, PatchData, SendData } from "./util";
|
||||||
|
|
||||||
const PORT = 8485;
|
const PORT = 8485;
|
||||||
const NAV_ID = "dev-companion-reconnect";
|
const NAV_ID = "dev-companion-reconnect";
|
||||||
|
@ -149,7 +149,11 @@ function initWs(isManual = false) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "search": {
|
case "search": {
|
||||||
const moduleId = +findModuleId([idOrSearch.toString()]);
|
let moduleId;
|
||||||
|
if (data.findType === FindType.STRING)
|
||||||
|
moduleId = +findModuleId([idOrSearch.toString()]);
|
||||||
|
else
|
||||||
|
moduleId = +findModuleId(mkRegexFind(idOrSearch));
|
||||||
const p = extractOrThrow(moduleId);
|
const p = extractOrThrow(moduleId);
|
||||||
const p2 = extractModule(moduleId, false);
|
const p2 = extractModule(moduleId, false);
|
||||||
console.log(p, p2, "done");
|
console.log(p, p2, "done");
|
||||||
|
@ -188,7 +192,11 @@ function initWs(isManual = false) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "search": {
|
case "search": {
|
||||||
const moduleId = +findModuleId([idOrSearch.toString()]);
|
let moduleId;
|
||||||
|
if (data.findType === FindType.STRING)
|
||||||
|
moduleId = +findModuleId([idOrSearch.toString()]);
|
||||||
|
else
|
||||||
|
moduleId = +findModuleId(mkRegexFind(idOrSearch));
|
||||||
replyData({
|
replyData({
|
||||||
type: "extract",
|
type: "extract",
|
||||||
ok: true,
|
ok: true,
|
||||||
|
@ -259,7 +267,13 @@ function initWs(isManual = false) {
|
||||||
case "testPatch": {
|
case "testPatch": {
|
||||||
const { find, replacement } = data as PatchData;
|
const { find, replacement } = data as PatchData;
|
||||||
|
|
||||||
const candidates = search(find);
|
let candidates;
|
||||||
|
if (data.findType === FindType.STRING)
|
||||||
|
candidates = search(find.toString());
|
||||||
|
else
|
||||||
|
candidates = search(...mkRegexFind(find));
|
||||||
|
|
||||||
|
// const candidates = search(find);
|
||||||
const keys = Object.keys(candidates);
|
const keys = Object.keys(candidates);
|
||||||
if (keys.length !== 1)
|
if (keys.length !== 1)
|
||||||
return reply("Expected exactly one 'find' matches, found " + keys.length);
|
return reply("Expected exactly one 'find' matches, found " + keys.length);
|
||||||
|
@ -368,3 +382,4 @@ export default definePlugin({
|
||||||
socket = void 0;
|
socket = void 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { canonicalizeMatch } from "@utils/patches";
|
||||||
import { CodeFilter, stringMatches, wreq } from "@webpack";
|
import { CodeFilter, stringMatches, wreq } from "@webpack";
|
||||||
|
|
||||||
import { settings } from ".";
|
import { settings } from ".";
|
||||||
|
@ -21,6 +22,10 @@ export interface RegexNode {
|
||||||
flags: string;
|
flags: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
export enum FindType {
|
||||||
|
STRING,
|
||||||
|
REGEX
|
||||||
|
}
|
||||||
export interface FunctionNode {
|
export interface FunctionNode {
|
||||||
type: "function";
|
type: "function";
|
||||||
value: string;
|
value: string;
|
||||||
|
@ -93,4 +98,9 @@ export function findModuleId(find: CodeFilter) {
|
||||||
}
|
}
|
||||||
return matches[0];
|
return matches[0];
|
||||||
}
|
}
|
||||||
|
export function mkRegexFind(idOrSearch: string): RegExp[] {
|
||||||
|
const regex = idOrSearch.substring(1, idOrSearch.lastIndexOf("/"));
|
||||||
|
const flags = idOrSearch.substring(idOrSearch.lastIndexOf("/") + 1);
|
||||||
|
return [canonicalizeMatch(RegExp(regex, flags))];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { WEBPACK_CHUNK } from "@utils/constants";
|
||||||
import { Logger } from "@utils/Logger";
|
import { Logger } from "@utils/Logger";
|
||||||
import { canonicalizeReplacement } from "@utils/patches";
|
import { canonicalizeReplacement } from "@utils/patches";
|
||||||
import { PatchReplacement } from "@utils/types";
|
import { PatchReplacement } from "@utils/types";
|
||||||
|
import { reporterData } from "debug/runReporter";
|
||||||
import { WebpackInstance } from "discord-types/other";
|
import { WebpackInstance } from "discord-types/other";
|
||||||
|
|
||||||
import { traceFunction } from "../debug/Tracer";
|
import { traceFunction } from "../debug/Tracer";
|
||||||
|
@ -287,6 +288,11 @@ function patchFactories(factories: Record<string, (module: any, exports: any, re
|
||||||
if (IS_DEV) {
|
if (IS_DEV) {
|
||||||
logger.debug("Function Source:\n", code);
|
logger.debug("Function Source:\n", code);
|
||||||
}
|
}
|
||||||
|
if (IS_COMPANION_TEST)
|
||||||
|
reporterData.failedPatches.hadNoEffect.push({
|
||||||
|
...patch,
|
||||||
|
id
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (patch.group) {
|
if (patch.group) {
|
||||||
|
@ -294,6 +300,11 @@ function patchFactories(factories: Record<string, (module: any, exports: any, re
|
||||||
mod = previousMod;
|
mod = previousMod;
|
||||||
code = previousCode;
|
code = previousCode;
|
||||||
patchedBy.delete(patch.plugin);
|
patchedBy.delete(patch.plugin);
|
||||||
|
if (IS_COMPANION_TEST)
|
||||||
|
reporterData.failedPatches.undoingPatchGroup.push({
|
||||||
|
...patch,
|
||||||
|
id
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,7 +315,11 @@ function patchFactories(factories: Record<string, (module: any, exports: any, re
|
||||||
mod = (0, eval)(`// Webpack Module ${id} - Patched by ${[...patchedBy].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${id}`);
|
mod = (0, eval)(`// Webpack Module ${id} - Patched by ${[...patchedBy].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${id}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(`Patch by ${patch.plugin} errored (Module id is ${id}): ${replacement.match}\n`, err);
|
logger.error(`Patch by ${patch.plugin} errored (Module id is ${id}): ${replacement.match}\n`, err);
|
||||||
|
if (IS_COMPANION_TEST)
|
||||||
|
reporterData.failedPatches.erroredPatch.push({
|
||||||
|
...patch,
|
||||||
|
id
|
||||||
|
});
|
||||||
if (IS_DEV) {
|
if (IS_DEV) {
|
||||||
const changeSize = code.length - lastCode.length;
|
const changeSize = code.length - lastCode.length;
|
||||||
const match = lastCode.match(replacement.match)!;
|
const match = lastCode.match(replacement.match)!;
|
||||||
|
@ -342,6 +357,10 @@ function patchFactories(factories: Record<string, (module: any, exports: any, re
|
||||||
|
|
||||||
if (patch.group) {
|
if (patch.group) {
|
||||||
logger.warn(`Undoing patch group ${patch.find} by ${patch.plugin} because replacement ${replacement.match} errored`);
|
logger.warn(`Undoing patch group ${patch.find} by ${patch.plugin} because replacement ${replacement.match} errored`);
|
||||||
|
reporterData.failedPatches.undoingPatchGroup.push({
|
||||||
|
...patch,
|
||||||
|
id
|
||||||
|
});
|
||||||
mod = previousMod;
|
mod = previousMod;
|
||||||
code = previousCode;
|
code = previousCode;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue