type Filter = (module: any) => boolean; interface Module { exports: { default?: any; __esModule?: any; }; } let getModules: () => []; //check for hummus //TODO: nested conditional so we can *maybe* work with RN? //TODO: account for different versions of webpackJsonp, ie ones that aren't a function (if/when hummus-like things come out) if (!window.webpackChunkdiscord_app) { let modules: { c: []; } = window.webpackJsonp( [], [ (mod, _exports, req) => { mod.exports = req; } ] ); getModules = () => modules.c; } else { let modules: { c: []; }; window.webpackChunkdiscord_app.push([ [Math.random().toString(36)], {}, (e: { c: [] }) => { modules = e; } ]); getModules = () => modules.c; } function filter(filter: Filter, moduleList: Module[]) { let modules = []; for (const mod in moduleList) { const module = moduleList[mod].exports; if (module) { if (module.default && module.__esModule && filter(module.default)) { modules.push(module.default); } else if (filter(module)) { modules.push(module); } } } return modules; } let webpack = { modules: getModules(), getModules, filter: filter, find: (filter: Filter) => webpack.filter(filter, webpack.modules)[0], findAll: (filter: Filter) => webpack.filter(filter, webpack.modules), findByProps: (...props: any[]) => { return webpack.find((module) => { return props.every((prop) => module[prop] !== undefined); }); }, findByPropsAll: (...props: any[]) => { return webpack.findAll((module) => props.every((prop) => module[prop] !== undefined) ); }, findByDisplayName: (prop: any) => { return webpack.find((m) => m?.displayName === prop); }, findByDisplayNameAll: (prop: any) => { return webpack.findAll((m) => m?.displayName === prop); }, findByStrings: (...props: string[]) => { return webpack.find((module) => props.every((prop) => module.toString().contains(prop)) ); }, reloadModules: () => { //NOTE: i have no idea why this could even feasibly need to be used, but i'm adding it anyways webpack.modules = getModules(); } }; export default webpack;