Remove obsolete mapMangledModule ~ modules are no longer mangled
This commit is contained in:
		
							parent
							
								
									6869705673
								
							
						
					
					
						commit
						63451bad25
					
				
					 12 changed files with 46 additions and 90 deletions
				
			
		| 
						 | 
				
			
			@ -19,11 +19,9 @@
 | 
			
		|||
import { Devs } from "@utils/constants";
 | 
			
		||||
import { insertTextIntoChatInputBox } from "@utils/discord";
 | 
			
		||||
import definePlugin from "@utils/types";
 | 
			
		||||
import { filters, mapMangledModuleLazy } from "@webpack";
 | 
			
		||||
import { findByPropsLazy } from "@webpack";
 | 
			
		||||
 | 
			
		||||
const ExpressionPickerState = mapMangledModuleLazy('name:"expression-picker-last-active-view"', {
 | 
			
		||||
    close: filters.byCode("activeView:null", "setState")
 | 
			
		||||
});
 | 
			
		||||
const { closeExpressionPicker } = findByPropsLazy("closeExpressionPicker");
 | 
			
		||||
 | 
			
		||||
export default definePlugin({
 | 
			
		||||
    name: "GifPaste",
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +39,7 @@ export default definePlugin({
 | 
			
		|||
    handleSelect(gif?: { url: string; }) {
 | 
			
		||||
        if (gif) {
 | 
			
		||||
            insertTextIntoChatInputBox(gif.url + " ");
 | 
			
		||||
            ExpressionPickerState.close();
 | 
			
		||||
            closeExpressionPicker();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ import { definePluginSettings } from "@api/Settings";
 | 
			
		|||
import { Devs } from "@utils/constants";
 | 
			
		||||
import definePlugin, { OptionType } from "@utils/types";
 | 
			
		||||
import { findByPropsLazy } from "@webpack";
 | 
			
		||||
import { ContextMenu, FluxDispatcher, Menu } from "@webpack/common";
 | 
			
		||||
import { ContextMenuApi, FluxDispatcher, Menu } from "@webpack/common";
 | 
			
		||||
import { Channel, Message } from "discord-types/general";
 | 
			
		||||
 | 
			
		||||
interface Sticker {
 | 
			
		||||
| 
						 | 
				
			
			@ -183,6 +183,6 @@ export default definePlugin({
 | 
			
		|||
        }
 | 
			
		||||
    ) {
 | 
			
		||||
        if (!(props.message as any).deleted)
 | 
			
		||||
            ContextMenu.open(event, () => <GreetMenu {...props} />);
 | 
			
		||||
            ContextMenuApi.openContextMenu(event, () => <GreetMenu {...props} />);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ import { makeRange } from "@components/PluginSettings/components";
 | 
			
		|||
import { Devs } from "@utils/constants";
 | 
			
		||||
import { debounce } from "@utils/debounce";
 | 
			
		||||
import definePlugin, { OptionType } from "@utils/types";
 | 
			
		||||
import { ContextMenu, Menu, React, ReactDOM } from "@webpack/common";
 | 
			
		||||
import { ContextMenuApi, Menu, React, ReactDOM } from "@webpack/common";
 | 
			
		||||
import type { Root } from "react-dom/client";
 | 
			
		||||
 | 
			
		||||
import { Magnifier, MagnifierProps } from "./components/Magnifier";
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = children => () => {
 | 
			
		|||
                checked={settings.store.square}
 | 
			
		||||
                action={() => {
 | 
			
		||||
                    settings.store.square = !settings.store.square;
 | 
			
		||||
                    ContextMenu.close();
 | 
			
		||||
                    ContextMenuApi.closeContextMenu();
 | 
			
		||||
                }}
 | 
			
		||||
            />
 | 
			
		||||
            <Menu.MenuCheckboxItem
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = children => () => {
 | 
			
		|||
                checked={settings.store.nearestNeighbour}
 | 
			
		||||
                action={() => {
 | 
			
		||||
                    settings.store.nearestNeighbour = !settings.store.nearestNeighbour;
 | 
			
		||||
                    ContextMenu.close();
 | 
			
		||||
                    ContextMenuApi.closeContextMenu();
 | 
			
		||||
                }}
 | 
			
		||||
            />
 | 
			
		||||
            <Menu.MenuControlItem
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ import { Flex } from "@components/Flex";
 | 
			
		|||
import { InfoIcon, OwnerCrownIcon } from "@components/Icons";
 | 
			
		||||
import { getUniqueUsername } from "@utils/discord";
 | 
			
		||||
import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal";
 | 
			
		||||
import { ContextMenu, FluxDispatcher, GuildMemberStore, Menu, PermissionsBits, Text, Tooltip, useEffect, UserStore, useState, useStateFromStores } from "@webpack/common";
 | 
			
		||||
import { ContextMenuApi, FluxDispatcher, GuildMemberStore, Menu, PermissionsBits, Text, Tooltip, useEffect, UserStore, useState, useStateFromStores } from "@webpack/common";
 | 
			
		||||
import type { Guild } from "discord-types/general";
 | 
			
		||||
 | 
			
		||||
import { settings } from "..";
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ function RolesAndUsersPermissionsComponent({ permissions, guild, modalProps, hea
 | 
			
		|||
                                            className={cl("perms-list-item", { "perms-list-item-active": selectedItemIndex === index })}
 | 
			
		||||
                                            onContextMenu={e => {
 | 
			
		||||
                                                if ((settings.store as any).unsafeViewAsRole && permission.type === PermissionType.Role)
 | 
			
		||||
                                                    ContextMenu.open(e, () => (
 | 
			
		||||
                                                    ContextMenuApi.openContextMenu(e, () => (
 | 
			
		||||
                                                        <RoleContextMenu
 | 
			
		||||
                                                            guild={guild}
 | 
			
		||||
                                                            roleId={permission.id!}
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +194,7 @@ function RoleContextMenu({ guild, roleId, onClose }: { guild: Guild; roleId: str
 | 
			
		|||
    return (
 | 
			
		||||
        <Menu.Menu
 | 
			
		||||
            navId={cl("role-context-menu")}
 | 
			
		||||
            onClose={ContextMenu.close}
 | 
			
		||||
            onClose={ContextMenuApi.closeContextMenu}
 | 
			
		||||
            aria-label="Role Options"
 | 
			
		||||
        >
 | 
			
		||||
            <Menu.MenuItem
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ import { ImageIcon, LinkIcon, OpenExternalIcon } from "@components/Icons";
 | 
			
		|||
import { debounce } from "@utils/debounce";
 | 
			
		||||
import { openImageModal } from "@utils/discord";
 | 
			
		||||
import { classes, copyWithToast } from "@utils/misc";
 | 
			
		||||
import { ContextMenu, FluxDispatcher, Forms, Menu, React, useEffect, useState, useStateFromStores } from "@webpack/common";
 | 
			
		||||
import { ContextMenuApi, FluxDispatcher, Forms, Menu, React, useEffect, useState, useStateFromStores } from "@webpack/common";
 | 
			
		||||
 | 
			
		||||
import { SpotifyStore, Track } from "./SpotifyStore";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ function CopyContextMenu({ name, path }: { name: string; path: string; }) {
 | 
			
		|||
 | 
			
		||||
function makeContextMenu(name: string, path: string) {
 | 
			
		||||
    return (e: React.MouseEvent<HTMLElement, MouseEvent>) =>
 | 
			
		||||
        ContextMenu.open(e, () => <CopyContextMenu name={name} path={path} />);
 | 
			
		||||
        ContextMenuApi.openContextMenu(e, () => <CopyContextMenu name={name} path={path} />);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Controls() {
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +277,7 @@ function Info({ track }: { track: Track; }) {
 | 
			
		|||
                    alt="Album Image"
 | 
			
		||||
                    onClick={() => setCoverExpanded(!coverExpanded)}
 | 
			
		||||
                    onContextMenu={e => {
 | 
			
		||||
                        ContextMenu.open(e, () => <AlbumContextMenu track={track} />);
 | 
			
		||||
                        ContextMenuApi.openContextMenu(e, () => <AlbumContextMenu track={track} />);
 | 
			
		||||
                    }}
 | 
			
		||||
                />
 | 
			
		||||
            )}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
import { filters, findByProps, findByPropsLazy, mapMangledModuleLazy } from "@webpack";
 | 
			
		||||
import { findByProps, findByPropsLazy } from "@webpack";
 | 
			
		||||
import type { ComponentType, PropsWithChildren, ReactNode, Ref } from "react";
 | 
			
		||||
 | 
			
		||||
import { LazyComponent } from "./react";
 | 
			
		||||
| 
						 | 
				
			
			@ -49,13 +49,7 @@ export interface ModalOptions {
 | 
			
		|||
 | 
			
		||||
type RenderFunction = (props: ModalProps) => ReactNode;
 | 
			
		||||
 | 
			
		||||
export const Modals = mapMangledModuleLazy(".closeWithCircleBackground", {
 | 
			
		||||
    ModalRoot: filters.byCode(".root"),
 | 
			
		||||
    ModalHeader: filters.byCode(".header"),
 | 
			
		||||
    ModalContent: filters.byCode(".content"),
 | 
			
		||||
    ModalFooter: filters.byCode(".footerSeparator"),
 | 
			
		||||
    ModalCloseButton: filters.byCode(".closeWithCircleBackground"),
 | 
			
		||||
}) as {
 | 
			
		||||
export const Modals = findByPropsLazy("ModalRoot", "ModalCloseButton") as {
 | 
			
		||||
    ModalRoot: ComponentType<PropsWithChildren<{
 | 
			
		||||
        transitionState: ModalTransitionState;
 | 
			
		||||
        size?: ModalSize;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,16 +17,12 @@
 | 
			
		|||
*/
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line path-alias/no-relative
 | 
			
		||||
import { filters, mapMangledModuleLazy, waitFor } from "../webpack";
 | 
			
		||||
import { findByPropsLazy, waitFor } from "../webpack";
 | 
			
		||||
import type * as t from "./types/menu";
 | 
			
		||||
 | 
			
		||||
export let Menu = {} as t.Menu;
 | 
			
		||||
 | 
			
		||||
waitFor(["MenuItem", "MenuSliderControl"], m => Menu = m);
 | 
			
		||||
 | 
			
		||||
export const ContextMenu: t.ContextMenuApi = mapMangledModuleLazy('type:"CONTEXT_MENU_OPEN"', {
 | 
			
		||||
    open: filters.byCode("stopPropagation"),
 | 
			
		||||
    openLazy: m => m.toString().length < 50,
 | 
			
		||||
    close: filters.byCode("CONTEXT_MENU_CLOSE")
 | 
			
		||||
});
 | 
			
		||||
export const ContextMenuApi: t.ContextMenuApi = findByPropsLazy("closeContextMenu", "openContextMenu");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
import type * as Stores from "discord-types/stores";
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line path-alias/no-relative
 | 
			
		||||
import { filters, findByPropsLazy, mapMangledModuleLazy } from "../webpack";
 | 
			
		||||
import { findByPropsLazy } from "../webpack";
 | 
			
		||||
import { waitForStore } from "./internal";
 | 
			
		||||
import * as t from "./types/stores";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,10 +62,6 @@ export let EmojiStore: t.EmojiStore;
 | 
			
		|||
export let WindowStore: t.WindowStore;
 | 
			
		||||
export let DraftStore: t.DraftStore;
 | 
			
		||||
 | 
			
		||||
export const MaskedLinkStore = mapMangledModuleLazy('"MaskedLinkStore"', {
 | 
			
		||||
    openUntrustedLink: filters.byCode(".apply(this,arguments)")
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * React hook that returns stateful data for one or more stores
 | 
			
		||||
 * You might need a custom comparator (4th argument) if your store data is an object
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								src/webpack/common/types/menu.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								src/webpack/common/types/menu.d.ts
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -75,14 +75,14 @@ export interface Menu {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
export interface ContextMenuApi {
 | 
			
		||||
    close(): void;
 | 
			
		||||
    open(
 | 
			
		||||
    closeContextMenu(): void;
 | 
			
		||||
    openContextMenu(
 | 
			
		||||
        event: UIEvent,
 | 
			
		||||
        render?: Menu["Menu"],
 | 
			
		||||
        options?: { enableSpellCheck?: boolean; },
 | 
			
		||||
        renderLazy?: () => Promise<Menu["Menu"]>
 | 
			
		||||
    ): void;
 | 
			
		||||
    openLazy(
 | 
			
		||||
    openContextMenuLazy(
 | 
			
		||||
        event: UIEvent,
 | 
			
		||||
        renderLazy?: () => Promise<Menu["Menu"]>,
 | 
			
		||||
        options?: { enableSpellCheck?: boolean; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								src/webpack/common/types/utils.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								src/webpack/common/types/utils.d.ts
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -161,3 +161,24 @@ export interface i18n {
 | 
			
		|||
 | 
			
		||||
    Messages: Record<i18nMessages, any>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface Clipboard {
 | 
			
		||||
    copy(text: string): void;
 | 
			
		||||
    SUPPORTS_COPY: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface NavigationRouter {
 | 
			
		||||
    back(): void;
 | 
			
		||||
    forward(): void;
 | 
			
		||||
    hasNavigated(): boolean;
 | 
			
		||||
    getHistory(): {
 | 
			
		||||
        action: string;
 | 
			
		||||
        length: 50;
 | 
			
		||||
        [key: string]: any;
 | 
			
		||||
    };
 | 
			
		||||
    transitionTo(path: string, ...args: unknown[]): void;
 | 
			
		||||
    transitionToGuild(guildId: string, ...args: unknown[]): void;
 | 
			
		||||
    replaceWith(...args: unknown[]): void;
 | 
			
		||||
    getLastRouteChangeSource(): any;
 | 
			
		||||
    getLastRouteChangeSourceLocationStack(): any;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ import { proxyLazy } from "@utils/lazy";
 | 
			
		|||
import type { Channel, User } from "discord-types/general";
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line path-alias/no-relative
 | 
			
		||||
import { _resolveReady, filters, find, findByPropsLazy, findLazy, mapMangledModuleLazy, waitFor } from "../webpack";
 | 
			
		||||
import { _resolveReady, find, findByPropsLazy, findLazy, waitFor } from "../webpack";
 | 
			
		||||
import type * as t from "./types/utils";
 | 
			
		||||
 | 
			
		||||
export let FluxDispatcher: t.FluxDispatcher;
 | 
			
		||||
| 
						 | 
				
			
			@ -102,17 +102,9 @@ export const ApplicationAssetUtils = findByPropsLazy("fetchAssetIds", "getAssetI
 | 
			
		|||
    fetchAssetIds: (applicationId: string, e: string[]) => Promise<string[]>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const Clipboard = mapMangledModuleLazy('document.queryCommandEnabled("copy")||document.queryCommandSupported("copy")', {
 | 
			
		||||
    copy: filters.byCode(".copy("),
 | 
			
		||||
    SUPPORTS_COPY: x => typeof x === "boolean",
 | 
			
		||||
});
 | 
			
		||||
export const Clipboard: t.Clipboard = findByPropsLazy("SUPPORTS_COPY", "copy");
 | 
			
		||||
 | 
			
		||||
export const NavigationRouter = mapMangledModuleLazy("transitionToGuild - ", {
 | 
			
		||||
    transitionTo: filters.byCode("transitionTo -"),
 | 
			
		||||
    transitionToGuild: filters.byCode("transitionToGuild -"),
 | 
			
		||||
    goBack: filters.byCode("goBack()"),
 | 
			
		||||
    goForward: filters.byCode("goForward()"),
 | 
			
		||||
});
 | 
			
		||||
export const NavigationRouter: t.NavigationRouter = findByPropsLazy("transitionTo", "replaceWith", "transitionToGuild");
 | 
			
		||||
 | 
			
		||||
waitFor(["dispatch", "subscribe"], m => {
 | 
			
		||||
    FluxDispatcher = m;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -312,47 +312,6 @@ export const findModuleId = traceFunction("findModuleId", function findModuleId(
 | 
			
		|||
    return null;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 Code snippet
 | 
			
		||||
 * @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==")
 | 
			
		||||
 *          })
 | 
			
		||||
 */
 | 
			
		||||
export const mapMangledModule = traceFunction("mapMangledModule", function mapMangledModule<S extends string>(code: string, mappers: Record<S, FilterFn>): Record<S, any> {
 | 
			
		||||
    const exports = {} as Record<S, any>;
 | 
			
		||||
 | 
			
		||||
    const id = findModuleId(code);
 | 
			
		||||
    if (id === null)
 | 
			
		||||
        return exports;
 | 
			
		||||
 | 
			
		||||
    const mod = wreq(id);
 | 
			
		||||
    outer:
 | 
			
		||||
    for (const key in mod) {
 | 
			
		||||
        const member = mod[key];
 | 
			
		||||
        for (const newName in mappers) {
 | 
			
		||||
            // if the current mapper matches this module
 | 
			
		||||
            if (mappers[newName](member)) {
 | 
			
		||||
                exports[newName] = member;
 | 
			
		||||
                continue outer;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return exports;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Same as {@link mapMangledModule} but lazy
 | 
			
		||||
 */
 | 
			
		||||
export function mapMangledModuleLazy<S extends string>(code: string, mappers: Record<S, FilterFn>): Record<S, any> {
 | 
			
		||||
    return proxyLazy(() => mapMangledModule(code, mappers));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Find the first module that has the specified properties
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue