Use Reflection, deleted any wpm references from plugin api for now

This commit is contained in:
Jiiks 2018-08-24 19:05:27 +03:00
parent 5c493d413b
commit f46694f2d0
24 changed files with 87 additions and 178 deletions

View File

@ -9,7 +9,7 @@
*/ */
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules, ReactComponents } from 'modules'; import { Patcher, MonkeyPatch, Reflection, ReactComponents } from 'modules';
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`); const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
@ -21,7 +21,7 @@ export default new class TwentyFourHour extends BuiltinModule {
async enabled(e) { async enabled(e) {
if (Patcher.getPatchesByCaller('BD:TwentyFourHour').length) return; if (Patcher.getPatchesByCaller('BD:TwentyFourHour').length) return;
const TimeFormatter = WebpackModules.getModuleByName('TimeFormatter'); const { TimeFormatter } = Reflection.modules;
MonkeyPatch('BD:TwentyFourHour', TimeFormatter).after('calendarFormat', (thisObject, args, returnValue) => { MonkeyPatch('BD:TwentyFourHour', TimeFormatter).after('calendarFormat', (thisObject, args, returnValue) => {
const matched = returnValue.match(twelveHour); const matched = returnValue.match(twelveHour);
if (!matched || matched.length != 4) return; if (!matched || matched.length != 4) return;

View File

@ -9,7 +9,7 @@
*/ */
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules, ReactComponents } from 'modules'; import { Patcher, MonkeyPatch, Reflection, ReactComponents } from 'modules';
export default new class BlockedMessages extends BuiltinModule { export default new class BlockedMessages extends BuiltinModule {
@ -18,16 +18,16 @@ export default new class BlockedMessages extends BuiltinModule {
} }
static isBlocked(id) { static isBlocked(id) {
const RelationshipStore = WebpackModules.getModuleByName('RelationshipStore'); const { RelationshipStore } = Reflection.modules;
return RelationshipStore.isBlocked(id); return RelationshipStore.isBlocked(id);
} }
async enabled(e) { async enabled(e) {
if (Patcher.getPatchesByCaller('BD:BlockedMessages').length) return; if (Patcher.getPatchesByCaller('BD:BlockedMessages').length) return;
const MessageActions = WebpackModules.getModuleByName('MessageActions'); const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:BlockedMessages', MessageActions).instead('receiveMessage', this.processMessage); MonkeyPatch('BD:BlockedMessages', MessageActions).instead('receiveMessage', this.processMessage);
const MessageListComponents = WebpackModules.getModuleByProps(['BlockedMessageGroup']); const MessageListComponents = Reflection.module.byProps('BlockedMessageGroup');
MessageListComponents.OriginalBlockedMessageGroup = MessageListComponents.BlockedMessageGroup; MessageListComponents.OriginalBlockedMessageGroup = MessageListComponents.BlockedMessageGroup;
MessageListComponents.BlockedMessageGroup = () => {return null;}; MessageListComponents.BlockedMessageGroup = () => {return null;};
this.cancelBlockedMessages = () => { this.cancelBlockedMessages = () => {

View File

@ -11,7 +11,7 @@
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { Utils } from 'common'; import { Utils } from 'common';
import { Settings, Patcher, MonkeyPatch, WebpackModules, ReactComponents, DiscordApi } from 'modules'; import { Settings, Patcher, MonkeyPatch, Reflection, ReactComponents, DiscordApi } from 'modules';
export default new class ColoredText extends BuiltinModule { export default new class ColoredText extends BuiltinModule {
@ -44,13 +44,13 @@ export default new class ColoredText extends BuiltinModule {
async enabled(e) { async enabled(e) {
if (Patcher.getPatchesByCaller('BD:ColoredText').length) return; if (Patcher.getPatchesByCaller('BD:ColoredText').length) return;
this.intensitySetting.on('setting-updated', this._intensityUpdated); this.intensitySetting.on('setting-updated', this._intensityUpdated);
this.MessageContent = await ReactComponents.getComponent('MessageContent', { selector: WebpackModules.getSelector('container', 'containerCozy', 'containerCompact', 'edited') }); this.MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
MonkeyPatch('BD:ColoredText', this.MessageContent.component.prototype).after('render', this.injectColoredText); MonkeyPatch('BD:ColoredText', this.MessageContent.component.prototype).after('render', this.injectColoredText);
this.MessageContent.forceUpdateAll(); this.MessageContent.forceUpdateAll();
} }
injectColoredText(thisObject, args, returnValue) { injectColoredText(thisObject, args, returnValue) {
const TinyColor = WebpackModules.getModuleByName('TinyColor'); const { TinyColor } = Reflection.modules;
const markup = Utils.findInReactTree(returnValue, m => m && m.props && m.props.className && m.props.className.includes('da-markup')); const markup = Utils.findInReactTree(returnValue, m => m && m.props && m.props.className && m.props.className.includes('da-markup'));
const roleColor = thisObject.props.message.colorString; const roleColor = thisObject.props.message.colorString;
if (markup && roleColor) markup.props.style = {color: TinyColor.mix(roleColor, this.defaultColor, this.intensity)}; if (markup && roleColor) markup.props.style = {color: TinyColor.mix(roleColor, this.defaultColor, this.intensity)};

View File

@ -10,8 +10,8 @@
import { Settings, Cache, Events } from 'modules'; import { Settings, Cache, Events } from 'modules';
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { WebpackModules, ReactComponents, MonkeyPatch, Patcher, DiscordApi, Security } from 'modules'; import { Reflection, ReactComponents, MonkeyPatch, Patcher, DiscordApi, Security } from 'modules';
import { VueInjector, Reflection, Modals, Toasts } from 'ui'; import { VueInjector, Modals, Toasts } from 'ui';
import { ClientLogger as Logger, ClientIPC } from 'common'; import { ClientLogger as Logger, ClientIPC } from 'common';
import { request } from 'vendor'; import { request } from 'vendor';
import { Utils } from 'common'; import { Utils } from 'common';
@ -45,8 +45,7 @@ export default new class E2EE extends BuiltinModule {
Events.on('discord:MESSAGE_CREATE', this.handlePublicKey); Events.on('discord:MESSAGE_CREATE', this.handlePublicKey);
this.patchDispatcher(); this.patchDispatcher();
this.patchMessageContent(); this.patchMessageContent();
const selector = `.${WebpackModules.getClassName('channelTextArea', 'emojiButton')}`; const cta = await ReactComponents.getComponent('ChannelTextArea', { selector: Reflection.resolve('channelTextArea', 'emojiButton').selector });
const cta = await ReactComponents.getComponent('ChannelTextArea', { selector });
this.patchChannelTextArea(cta); this.patchChannelTextArea(cta);
this.patchChannelTextAreaSubmit(cta); this.patchChannelTextAreaSubmit(cta);
cta.forceUpdateAll(); cta.forceUpdateAll();
@ -188,7 +187,7 @@ export default new class E2EE extends BuiltinModule {
if (!ECDH_STORAGE.hasOwnProperty(channelId)) { if (!ECDH_STORAGE.hasOwnProperty(channelId)) {
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${this.createKeyExchange(channelId)}\n-----END PUBLIC KEY-----\n\`\`\``; const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${this.createKeyExchange(channelId)}\n-----END PUBLIC KEY-----\n\`\`\``;
if (this.encryptNewMessages) this.encryptNewMessages = false; if (this.encryptNewMessages) this.encryptNewMessages = false;
WebpackModules.getModuleByName('DraftActions').saveDraft(channelId, publicKeyMessage); Reflection.modules.DraftActions.saveDraft(channelId, publicKeyMessage);
} }
const secret = this.computeSecret(channelId, key); const secret = this.computeSecret(channelId, key);
this.setKey(channelId, secret); this.setKey(channelId, secret);
@ -202,7 +201,7 @@ export default new class E2EE extends BuiltinModule {
} }
patchDispatcher() { patchDispatcher() {
const Dispatcher = WebpackModules.getModuleByName('Dispatcher'); const { Dispatcher } = Reflection.modules;
MonkeyPatch('BD:E2EE', Dispatcher).before('dispatch', (_, [event]) => { MonkeyPatch('BD:E2EE', Dispatcher).before('dispatch', (_, [event]) => {
if (event.type !== 'MESSAGE_CREATE') return; if (event.type !== 'MESSAGE_CREATE') return;
@ -216,9 +215,8 @@ export default new class E2EE extends BuiltinModule {
decrypt = this.decrypt(this.decrypt(this.decrypt(seed, this.master), key), event.message.content); decrypt = this.decrypt(this.decrypt(this.decrypt(seed, this.master), key), event.message.content);
} catch (err) { return } // Ignore errors such as non empty } catch (err) { return } // Ignore errors such as non empty
const MessageParser = WebpackModules.getModuleByName('MessageParser'); const { MessageParser, Permissions, DiscordConstants } = Reflection.modules;
const Permissions = WebpackModules.getModuleByName('GuildPermissions');
const DiscordConstants = WebpackModules.getModuleByName('DiscordConstants');
const currentChannel = DiscordApi.Channel.fromId(event.message.channel_id).discordObject; const currentChannel = DiscordApi.Channel.fromId(event.message.channel_id).discordObject;
// Create a generic message object to parse mentions with // Create a generic message object to parse mentions with
@ -234,11 +232,10 @@ export default new class E2EE extends BuiltinModule {
} }
async patchMessageContent() { async patchMessageContent() {
const selector = `.${WebpackModules.getClassName('container', 'containerCozy', 'containerCompact', 'edited')}`; const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector });
MonkeyPatch('BD:E2EE', MessageContent.component.prototype).before('render', this.beforeRenderMessageContent.bind(this)); MonkeyPatch('BD:E2EE', MessageContent.component.prototype).before('render', this.beforeRenderMessageContent.bind(this));
MonkeyPatch('BD:E2EE', MessageContent.component.prototype).after('render', this.renderMessageContent.bind(this)); MonkeyPatch('BD:E2EE', MessageContent.component.prototype).after('render', this.renderMessageContent.bind(this));
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: `.${WebpackModules.getClassName('imageWrapper')}` }); const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: Reflection.resolve('imageWrapper').selector });
MonkeyPatch('BD:E2EE', ImageWrapper.component.prototype).before('render', this.beforeRenderImageWrapper.bind(this)); MonkeyPatch('BD:E2EE', ImageWrapper.component.prototype).before('render', this.beforeRenderImageWrapper.bind(this));
} }
@ -248,10 +245,7 @@ export default new class E2EE extends BuiltinModule {
const key = this.getKey(component.props.message.channel_id); const key = this.getKey(component.props.message.channel_id);
if (!key) return; // We don't have a key for this channel if (!key) return; // We don't have a key for this channel
const Message = WebpackModules.getModuleByPrototypes(['isMentioned']); const { Message, MessageParser, Permissions, DiscordConstants } = Reflection.modules;
const MessageParser = WebpackModules.getModuleByName('MessageParser');
const Permissions = WebpackModules.getModuleByName('GuildPermissions');
const DiscordConstants = WebpackModules.getModuleByName('DiscordConstants');
const currentChannel = DiscordApi.Channel.fromId(component.props.message.channel_id).discordObject; const currentChannel = DiscordApi.Channel.fromId(component.props.message.channel_id).discordObject;
if (typeof component.props.message.content !== 'string') return; // Ignore any non string content if (typeof component.props.message.content !== 'string') return; // Ignore any non string content

View File

@ -39,7 +39,7 @@
<script> <script>
import { Utils, FileUtils, ClientIPC } from 'common'; import { Utils, FileUtils, ClientIPC } from 'common';
import { E2EE } from 'builtin'; import { E2EE } from 'builtin';
import { DiscordApi, WebpackModules } from 'modules'; import { DiscordApi, Reflection } from 'modules';
import { Toasts } from 'ui'; import { Toasts } from 'ui';
import { MiLock, MiImagePlus, MiIcVpnKey } from '../ui/components/common/MaterialIcon'; import { MiLock, MiImagePlus, MiIcVpnKey } from '../ui/components/common/MaterialIcon';
@ -61,8 +61,8 @@
if (!dialogResult || !dialogResult.length) return; if (!dialogResult || !dialogResult.length) return;
const readFile = await FileUtils.readFileBuffer(dialogResult[0]); const readFile = await FileUtils.readFileBuffer(dialogResult[0]);
const FileActions = WebpackModules.getModuleByProps(['makeFile']); const FileActions = Reflection.module.byProps('makeFile');
const Uploader = WebpackModules.getModuleByProps(['instantBatchUpload']); const Uploader = Reflection.module.byProps('instantBatchUpload');
const img = await Utils.getImageFromBuffer(readFile); const img = await Utils.getImageFromBuffer(readFile);
@ -93,7 +93,7 @@
E2EE.preExchangeState = E2EE.encryptNewMessages; E2EE.preExchangeState = E2EE.encryptNewMessages;
E2EE.encryptNewMessages = false; // Disable encrypting new messages so we won't encrypt public keys E2EE.encryptNewMessages = false; // Disable encrypting new messages so we won't encrypt public keys
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${keyExchange}\n-----END PUBLIC KEY-----\n\`\`\``; const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${keyExchange}\n-----END PUBLIC KEY-----\n\`\`\``;
WebpackModules.getModuleByName('DraftActions').saveDraft(DiscordApi.currentChannel.id, publicKeyMessage); Reflection.modules.DraftActions.saveDraft(DiscordApi.currentChannel.id, publicKeyMessage);
Toasts.info('Key exchange started. Expires in 30 seconds'); Toasts.info('Key exchange started. Expires in 30 seconds');
} }
}, },

View File

@ -13,7 +13,7 @@ import path from 'path';
import { request } from 'vendor'; import { request } from 'vendor';
import { Utils, FileUtils, ClientLogger as Logger } from 'common'; import { Utils, FileUtils, ClientLogger as Logger } from 'common';
import { DiscordApi, Settings, Globals, WebpackModules, ReactComponents, MonkeyPatch, Cache, Patcher, Database } from 'modules'; import { DiscordApi, Settings, Globals, Reflection, ReactComponents, MonkeyPatch, Cache, Patcher, Database } from 'modules';
import { VueInjector, DiscordContextMenu } from 'ui'; import { VueInjector, DiscordContextMenu } from 'ui';
import Emote from './EmoteComponent.js'; import Emote from './EmoteComponent.js';
@ -79,7 +79,7 @@ export default new class EmoteModule extends BuiltinModule {
this.patchMessageContent(); this.patchMessageContent();
this.patchSendAndEdit(); this.patchSendAndEdit();
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: WebpackModules.getSelector('imageWrapper') }); const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: Reflection.resolve('imageWrapper').selector });
MonkeyPatch('BD:EMOTEMODULE', ImageWrapper.component.prototype).after('render', this.beforeRenderImageWrapper.bind(this)); MonkeyPatch('BD:EMOTEMODULE', ImageWrapper.component.prototype).after('render', this.beforeRenderImageWrapper.bind(this));
} }
@ -155,7 +155,7 @@ export default new class EmoteModule extends BuiltinModule {
* Patches MessageContent render method * Patches MessageContent render method
*/ */
async patchMessageContent() { async patchMessageContent() {
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: WebpackModules.getSelector('container', 'containerCozy', 'containerCompact', 'edited') }); const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
MonkeyPatch('BD:EMOTEMODULE', MessageContent.component.prototype).after('render', this.afterRenderMessageContent.bind(this)); MonkeyPatch('BD:EMOTEMODULE', MessageContent.component.prototype).after('render', this.afterRenderMessageContent.bind(this));
MessageContent.forceUpdateAll(); MessageContent.forceUpdateAll();
} }
@ -177,8 +177,9 @@ export default new class EmoteModule extends BuiltinModule {
* Patches MessageActions send and edit * Patches MessageActions send and edit
*/ */
patchSendAndEdit() { patchSendAndEdit() {
MonkeyPatch('BD:EMOTEMODULE', WebpackModules.getModuleByName('MessageActions')).instead('sendMessage', this.handleSendMessage.bind(this)); const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:EMOTEMODULE', WebpackModules.getModuleByName('MessageActions')).instead('editMessage', this.handleEditMessage.bind(this)); MonkeyPatch('BD:EMOTEMODULE', MessageActions).instead('sendMessage', this.handleSendMessage.bind(this));
MonkeyPatch('BD:EMOTEMODULE', MessageActions).instead('editMessage', this.handleEditMessage.bind(this));
} }
/** /**
@ -213,8 +214,8 @@ export default new class EmoteModule extends BuiltinModule {
if (!emote) return orig(...args); if (!emote) return orig(...args);
this.addToMostUsed(emote); this.addToMostUsed(emote);
const FileActions = WebpackModules.getModuleByProps(['makeFile']); const FileActions = Reflection.module.byProps('makeFile');
const Uploader = WebpackModules.getModuleByProps(['instantBatchUpload']); const Uploader = Reflection.module.byProps('instantBatchUpload');
request.get(emote.props.src, { encoding: 'binary' }).then(res => { request.get(emote.props.src, { encoding: 'binary' }).then(res => {
const arr = new Uint8Array(new ArrayBuffer(res.length)); const arr = new Uint8Array(new ArrayBuffer(res.length));

View File

@ -9,7 +9,7 @@
*/ */
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules } from 'modules'; import { Patcher, MonkeyPatch, Reflection } from 'modules';
export default new class KillClyde extends BuiltinModule { export default new class KillClyde extends BuiltinModule {
@ -19,7 +19,7 @@ export default new class KillClyde extends BuiltinModule {
async enabled(e) { async enabled(e) {
if (Patcher.getPatchesByCaller('BD:KillClyde').length) return; if (Patcher.getPatchesByCaller('BD:KillClyde').length) return;
const MessageActions = WebpackModules.getModuleByName('MessageActions'); const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:KillClyde', MessageActions).instead('sendBotMessage', void 0); MonkeyPatch('BD:KillClyde', MessageActions).instead('sendBotMessage', void 0);
} }

View File

@ -10,7 +10,7 @@
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules } from 'modules'; import { Patcher, MonkeyPatch, Reflection } from 'modules';
export default new class E2EE extends BuiltinModule { export default new class E2EE extends BuiltinModule {
@ -24,7 +24,7 @@ export default new class E2EE extends BuiltinModule {
enabled(e) { enabled(e) {
if (Patcher.getPatchesByCaller('BD:TrackingProtection').length) return; if (Patcher.getPatchesByCaller('BD:TrackingProtection').length) return;
const trackingModule = WebpackModules.getModuleByProps(['track']); const trackingModule = Reflection.module.byProps('track');
if (!trackingModule) return; // TODO Log it if (!trackingModule) return; // TODO Log it
MonkeyPatch('BD:TrackingProtection', trackingModule).instead('track', this.track); MonkeyPatch('BD:TrackingProtection', trackingModule).instead('track', this.track);
} }

View File

@ -9,7 +9,7 @@
*/ */
import BuiltinModule from './BuiltinModule'; import BuiltinModule from './BuiltinModule';
import { WebpackModules } from 'modules'; import { Reflection } from 'modules';
export default new class VoiceDisconnect extends BuiltinModule { export default new class VoiceDisconnect extends BuiltinModule {
@ -22,7 +22,7 @@ export default new class VoiceDisconnect extends BuiltinModule {
} }
listener() { listener() {
const VoiceChannelActions = WebpackModules.getModuleByName('VoiceChannelActions'); const { VoiceChannelActions } = Reflection.modules;
VoiceChannelActions.selectVoiceChannel(null, null); VoiceChannelActions.selectVoiceChannel(null, null);
} }

View File

@ -10,7 +10,7 @@
import { DOM, BdUI, BdMenu, Modals, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui'; import { DOM, BdUI, BdMenu, Modals, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui';
import BdCss from './styles/index.scss'; import BdCss from './styles/index.scss';
import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager, PluginManager, ThemeManager, ExtModuleManager, Vendor, WebpackModules, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi, BdWebApi, Connectivity, Cache, Reflection } from 'modules'; import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager, PluginManager, ThemeManager, ExtModuleManager, Vendor, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi, BdWebApi, Connectivity, Cache, Reflection } from 'modules';
import { ClientLogger as Logger, ClientIPC, Utils } from 'common'; import { ClientLogger as Logger, ClientIPC, Utils } from 'common';
import { BuiltinManager, EmoteModule, ReactDevtoolsModule, VueDevtoolsModule, TrackingProtection, E2EE } from 'builtin'; import { BuiltinManager, EmoteModule, ReactDevtoolsModule, VueDevtoolsModule, TrackingProtection, E2EE } from 'builtin';
import electron from 'electron'; import electron from 'electron';
@ -34,7 +34,7 @@ class BetterDiscord {
ModuleManager, PluginManager, ThemeManager, ExtModuleManager, ModuleManager, PluginManager, ThemeManager, ExtModuleManager,
Vendor, Vendor,
WebpackModules, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi,
EmoteModule, EmoteModule,
BdWebApi, BdWebApi,
Connectivity, Connectivity,
@ -49,7 +49,7 @@ class BetterDiscord {
module: Globals.require.cache[__filename], module: Globals.require.cache[__filename],
require: Globals.require, require: Globals.require,
webpack_require: __webpack_require__, // eslint-disable-line no-undef webpack_require: __webpack_require__, // eslint-disable-line no-undef
get discord_require() { return WebpackModules.require } get discord_require() { return Reflection.require }
}; };
const developermode = Settings.getSetting('core', 'advanced', 'developer-mode'); const developermode = Settings.getSetting('core', 'advanced', 'developer-mode');

View File

@ -10,11 +10,11 @@
import { List } from 'structs'; import { List } from 'structs';
import { User, Channel, Guild, Message } from 'discordstructs'; import { User, Channel, Guild, Message } from 'discordstructs';
import { WebpackModules } from './webpackmodules'; import Reflection from './reflection/index';
export const Modules = { export const Modules = {
_getModule(name) { _getModule(name) {
const foundModule = WebpackModules.getModuleByName(name); const foundModule = Reflection.module.byName(name);
if (!foundModule) return null; if (!foundModule) return null;
delete this[name]; delete this[name];
return this[name] = foundModule; return this[name] = foundModule;

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { WebpackModules } from './webpackmodules'; import Reflection from './reflection/index';
import { MonkeyPatch } from './patcher'; import { MonkeyPatch } from './patcher';
import Events from './events'; import Events from './events';
import EventListener from './eventlistener'; import EventListener from './eventlistener';
@ -37,7 +37,7 @@ export default class extends EventListener {
} }
hook() { hook() {
const Events = WebpackModules.getModuleByName('Events'); const { Events } = Reflection.modules;
MonkeyPatch('BD:EVENTS', Events.prototype).after('emit', (obj, args, retVal) => { MonkeyPatch('BD:EVENTS', Events.prototype).after('emit', (obj, args, retVal) => {
const eventId = args.length >= 3 ? args[2].id || -1 : -1; const eventId = args.length >= 3 ? args[2].id || -1 : -1;
if (eventId === this.ignoreMultiple) return; if (eventId === this.ignoreMultiple) return;

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { WebpackModules } from './webpackmodules'; import Reflection from './reflection/index';
import { ClientLogger as Logger } from 'common'; import { ClientLogger as Logger } from 'common';
/** /**
@ -64,7 +64,7 @@ export class Patcher {
static resolveModule(module) { static resolveModule(module) {
if (module instanceof Function || (module instanceof Object)) return module; if (module instanceof Function || (module instanceof Object)) return module;
if (typeof module === 'string') return WebpackModules.getModuleByName(module); if (typeof module === 'string') return Reflection.module.byName(module);
return null; return null;
} }

View File

@ -10,7 +10,7 @@
import { EmoteModule } from 'builtin'; import { EmoteModule } from 'builtin';
import { SettingsSet, SettingsCategory, Setting, SettingsScheme } from 'structs'; import { SettingsSet, SettingsCategory, Setting, SettingsScheme } from 'structs';
import { BdMenu, Modals, DOM, DOMObserver, Reflection, VueInjector, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui'; import { BdMenu, Modals, DOM, DOMObserver, VueInjector, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui';
import * as CommonComponents from 'commoncomponents'; import * as CommonComponents from 'commoncomponents';
import { Utils, Filters, ClientLogger as Logger, ClientIPC, AsyncEventEmitter } from 'common'; import { Utils, Filters, ClientLogger as Logger, ClientIPC, AsyncEventEmitter } from 'common';
import Settings from './settings'; import Settings from './settings';
@ -19,7 +19,7 @@ import PluginManager from './pluginmanager';
import ThemeManager from './thememanager'; import ThemeManager from './thememanager';
import Events from './events'; import Events from './events';
import EventsWrapper from './eventswrapper'; import EventsWrapper from './eventswrapper';
import { WebpackModules } from './webpackmodules'; import Reflection from './reflection/index';
import DiscordApi from './discordapi'; import DiscordApi from './discordapi';
import { ReactComponents, ReactHelpers } from './reactcomponents'; import { ReactComponents, ReactHelpers } from './reactcomponents';
import { Patcher, MonkeyPatch } from './patcher'; import { Patcher, MonkeyPatch } from './patcher';
@ -542,92 +542,6 @@ export default class PluginApi {
}; };
} }
/**
* WebpackModules
*/
get webpackRequire() {
return WebpackModules.require;
}
getWebpackModule(filter, first = true) {
return WebpackModules.getModule(filter, first);
}
getWebpackModuleByName(name, fallback) {
return WebpackModules.getModuleByName(name, fallback);
}
getWebpackModuleByDisplayName(name) {
return WebpackModules.getModuleByDisplayName(name);
}
getWebpackModuleByRegex(regex) {
return WebpackModules.getModuleByRegex(regex, true);
}
getWebpackModulesByRegex(regex) {
return WebpackModules.getModuleByRegex(regex, false);
}
getWebpackModuleByProperties(...props) {
return WebpackModules.getModuleByProps(props, true);
}
getWebpackModuleByPrototypeFields(...props) {
return WebpackModules.getModuleByPrototypes(props, true);
}
getWebpackModulesByProperties(...props) {
return WebpackModules.getModuleByProps(props, false);
}
getWebpackModulesByPrototypeFields(...props) {
return WebpackModules.getModuleByPrototypes(props, false);
}
waitForWebpackModule(filter) {
return WebpackModules.waitForModule(filter);
}
waitForWebpackModuleByName(name, fallback) {
return WebpackModules.waitForModuleByName(name, fallback);
}
waitForWebpackModuleByDisplayName(name) {
return WebpackModules.waitForModuleByDisplayName(name);
}
waitForWebpackModuleByRegex(regex) {
return WebpackModules.waitForModuleByRegex(regex);
}
waitForWebpackModuleByProperties(...props) {
return WebpackModules.waitForModuleByProps(props);
}
waitForWebpackModuleByPrototypeFields(...props) {
return WebpackModules.waitForModuleByPrototypes(props);
}
getWebpackClassName(...classes) {
return WebpackModules.getClassName(...classes);
}
waitForWebpackClassName(...classes) {
return WebpackModules.waitForClassName(...classes);
}
get WebpackModules() {
return new Proxy({
getModule: this.getWebpackModule.bind(this),
getModuleByName: this.getWebpackModuleByName.bind(this),
getModuleByDisplayName: this.getWebpackModuleByDisplayName.bind(this),
getModuleByRegex: this.getWebpackModuleByRegex.bind(this),
getModulesByRegex: this.getWebpackModulesByRegex.bind(this),
getModuleByProperties: this.getWebpackModuleByProperties.bind(this),
getModuleByPrototypeFields: this.getWebpackModuleByPrototypeFields.bind(this),
getModulesByProperties: this.getWebpackModulesByProperties.bind(this),
getModulesByPrototypeFields: this.getWebpackModulesByPrototypeFields.bind(this),
waitForModule: this.waitForWebpackModule.bind(this),
waitForModuleByName: this.waitForWebpackModuleByName.bind(this),
waitForModuleByDisplayName: this.waitForWebpackModuleByDisplayName.bind(this),
waitForModuleByRegex: this.waitForWebpackModuleByRegex.bind(this),
waitForModuleByProperties: this.waitForWebpackModuleByProperties.bind(this),
waitForModuleByPrototypeFields: this.waitForWebpackModuleByPrototypeFields.bind(this),
getClassName: this.getWebpackClassName.bind(this),
waitForClassName: this.waitForWebpackClassName.bind(this),
get KnownModules() { return WebpackModules.KnownModules },
get require() { return WebpackModules.require }
}, {
get(WebpackModules, property) {
return WebpackModules[property] || WebpackModules.getModuleByName(property);
}
});
}
/** /**
* Patcher * Patcher
*/ */

View File

@ -10,10 +10,10 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { DOM, Reflection, Modals } from 'ui'; import { DOM, Modals } from 'ui';
import { Utils, Filters, ClientLogger as Logger } from 'common'; import { Utils, Filters, ClientLogger as Logger } from 'common';
import { MonkeyPatch } from './patcher'; import { MonkeyPatch } from './patcher';
import { WebpackModules } from './webpackmodules'; import Reflection from './reflection/index';
import DiscordApi from './discordapi'; import DiscordApi from './discordapi';
class Helpers { class Helpers {
@ -153,11 +153,11 @@ class Helpers {
} }
static get React() { static get React() {
return WebpackModules.getModuleByName('React'); return Reflection.modules.React;
} }
static get ReactDOM() { static get ReactDOM() {
return WebpackModules.getModuleByName('ReactDOM'); return Reflection.modules.ReactDOM;
} }
} }
@ -174,7 +174,7 @@ class ReactComponent {
forceUpdateAll() { forceUpdateAll() {
if (!this.important || !this.important.selector) return; if (!this.important || !this.important.selector) return;
for (const e of document.querySelectorAll(this.important.selector)) { for (const e of document.querySelectorAll(this.important.selector)) {
Reflection(e).forceUpdate(this); Reflection.DOM(e).forceUpdate(this);
} }
} }
} }
@ -236,7 +236,7 @@ export class ReactComponents {
let component, reflect; let component, reflect;
for (const element of elements) { for (const element of elements) {
reflect = Reflection(element); reflect = Reflection.DOM(element);
component = filter ? reflect.components.find(filter) : reflect.component; component = filter ? reflect.components.find(filter) : reflect.component;
if (component) break; if (component) break;
} }
@ -310,7 +310,7 @@ export class ReactAutoPatcher {
* Also patches some known components. * Also patches some known components.
*/ */
static async autoPatch() { static async autoPatch() {
const React = await WebpackModules.waitForModuleByName('React'); const React = await Reflection.module.waitForModuleByName('React');
this.unpatchCreateElement = MonkeyPatch('BD:ReactComponents:createElement', React).before('createElement', (component, args) => ReactComponents.push(args[0])); this.unpatchCreateElement = MonkeyPatch('BD:ReactComponents:createElement', React).before('createElement', (component, args) => ReactComponents.push(args[0]));
@ -326,7 +326,7 @@ export class ReactAutoPatcher {
} }
static async patchMessage() { static async patchMessage() {
const selector = `.${WebpackModules.getClassName('message', 'messageCozy', 'messageCompact')}`; const { selector } = Reflection.resolve('message', 'messageCozy', 'messageCompact');
this.Message = await ReactComponents.getComponent('Message', {selector}, m => m.prototype && m.prototype.renderCozy); this.Message = await ReactComponents.getComponent('Message', {selector}, m => m.prototype && m.prototype.renderCozy);
this.unpatchMessageRender = MonkeyPatch('BD:ReactComponents', this.Message.component.prototype).after('render', (component, args, retVal) => { this.unpatchMessageRender = MonkeyPatch('BD:ReactComponents', this.Message.component.prototype).after('render', (component, args, retVal) => {
@ -350,7 +350,7 @@ export class ReactAutoPatcher {
} }
static async patchMessageGroup() { static async patchMessageGroup() {
const selector = `.${WebpackModules.getClassName('container', 'message', 'messageCozy')}`; const { selector } = Reflection.resolve('container', 'message', 'messageCozy');
this.MessageGroup = await ReactComponents.getComponent('MessageGroup', {selector}); this.MessageGroup = await ReactComponents.getComponent('MessageGroup', {selector});
this.unpatchMessageGroupRender = MonkeyPatch('BD:ReactComponents', this.MessageGroup.component.prototype).after('render', (component, args, retVal) => { this.unpatchMessageGroupRender = MonkeyPatch('BD:ReactComponents', this.MessageGroup.component.prototype).after('render', (component, args, retVal) => {
@ -368,7 +368,7 @@ export class ReactAutoPatcher {
} }
static async patchChannelMember() { static async patchChannelMember() {
const selector = `.${WebpackModules.getClassName('member', 'memberInner', 'activity')}`; const { selector } = Reflection.resolve('member', 'memberInner', 'activity');
this.ChannelMember = await ReactComponents.getComponent('ChannelMember', {selector}, m => m.prototype.renderActivity); this.ChannelMember = await ReactComponents.getComponent('ChannelMember', {selector}, m => m.prototype.renderActivity);
this.unpatchChannelMemberRender = MonkeyPatch('BD:ReactComponents', this.ChannelMember.component.prototype).after('render', (component, args, retVal) => { this.unpatchChannelMemberRender = MonkeyPatch('BD:ReactComponents', this.ChannelMember.component.prototype).after('render', (component, args, retVal) => {
@ -384,7 +384,7 @@ export class ReactAutoPatcher {
} }
static async patchGuild() { static async patchGuild() {
const selector = `div.${WebpackModules.getClassName('guild', 'guildsWrapper')}:not(:first-child)`; const selector = `div.${Reflection.resolve('guild', 'guildsWrapper').className}:not(:first-child)`;
this.Guild = await ReactComponents.getComponent('Guild', {selector}, m => m.prototype.renderBadge); this.Guild = await ReactComponents.getComponent('Guild', {selector}, m => m.prototype.renderBadge);
this.unpatchGuild = MonkeyPatch('BD:ReactComponents', this.Guild.component.prototype).after('render', (component, args, retVal) => { this.unpatchGuild = MonkeyPatch('BD:ReactComponents', this.Guild.component.prototype).after('render', (component, args, retVal) => {
@ -421,7 +421,7 @@ export class ReactAutoPatcher {
* The GuildTextChannel component represents a text channel in the guild channel list. * The GuildTextChannel component represents a text channel in the guild channel list.
*/ */
static async patchGuildTextChannel() { static async patchGuildTextChannel() {
const selector = `.${WebpackModules.getClassName('containerDefault', 'actionIcon')}`; const { selector } = Reflection.resolve('containerDefault', 'actionIcon');
this.GuildTextChannel = await ReactComponents.getComponent('GuildTextChannel', {selector}, c => c.prototype.renderMentionBadge); this.GuildTextChannel = await ReactComponents.getComponent('GuildTextChannel', {selector}, c => c.prototype.renderMentionBadge);
this.unpatchGuildTextChannel = MonkeyPatch('BD:ReactComponents', this.GuildTextChannel.component.prototype).after('render', this._afterChannelRender); this.unpatchGuildTextChannel = MonkeyPatch('BD:ReactComponents', this.GuildTextChannel.component.prototype).after('render', this._afterChannelRender);
@ -433,7 +433,7 @@ export class ReactAutoPatcher {
* The GuildVoiceChannel component represents a voice channel in the guild channel list. * The GuildVoiceChannel component represents a voice channel in the guild channel list.
*/ */
static async patchGuildVoiceChannel() { static async patchGuildVoiceChannel() {
const selector = `.${WebpackModules.getClassName('containerDefault', 'actionIcon')}`; const { selector } = Reflection.resolve('containerDefault', 'actionIcon');
this.GuildVoiceChannel = await ReactComponents.getComponent('GuildVoiceChannel', {selector}, c => c.prototype.handleVoiceConnect); this.GuildVoiceChannel = await ReactComponents.getComponent('GuildVoiceChannel', {selector}, c => c.prototype.handleVoiceConnect);
this.unpatchGuildVoiceChannel = MonkeyPatch('BD:ReactComponents', this.GuildVoiceChannel.component.prototype).after('render', this._afterChannelRender); this.unpatchGuildVoiceChannel = MonkeyPatch('BD:ReactComponents', this.GuildVoiceChannel.component.prototype).after('render', this._afterChannelRender);
@ -467,7 +467,7 @@ export class ReactAutoPatcher {
} }
static async patchUserProfileModal() { static async patchUserProfileModal() {
const selector = `.${WebpackModules.getClassName('root', 'topSectionNormal')}`; const { selector } = Reflection.resolve('root', 'topSectionNormal');
this.UserProfileModal = await ReactComponents.getComponent('UserProfileModal', {selector}, Filters.byPrototypeFields(['renderHeader', 'renderBadges'])); this.UserProfileModal = await ReactComponents.getComponent('UserProfileModal', {selector}, Filters.byPrototypeFields(['renderHeader', 'renderBadges']));
this.unpatchUserProfileModal = MonkeyPatch('BD:ReactComponents', this.UserProfileModal.component.prototype).after('render', (component, args, retVal) => { this.unpatchUserProfileModal = MonkeyPatch('BD:ReactComponents', this.UserProfileModal.component.prototype).after('render', (component, args, retVal) => {
@ -482,7 +482,7 @@ export class ReactAutoPatcher {
} }
static async patchUserPopout() { static async patchUserPopout() {
const selector = `.${WebpackModules.getClassName('userPopout', 'headerNormal')}`; const { selector } = Reflection.resolve('userPopout', 'headerNormal');
this.UserPopout = await ReactComponents.getComponent('UserPopout', {selector}); this.UserPopout = await ReactComponents.getComponent('UserPopout', {selector});
this.unpatchUserPopout = MonkeyPatch('BD:ReactComponents', this.UserPopout.component.prototype).after('render', (component, args, retVal) => { this.unpatchUserPopout = MonkeyPatch('BD:ReactComponents', this.UserPopout.component.prototype).after('render', (component, args, retVal) => {
@ -501,10 +501,10 @@ export class ReactAutoPatcher {
} }
static async patchUploadArea() { static async patchUploadArea() {
const selector = `.${WebpackModules.getClassName('uploadArea')}`; const { selector } = Reflection.resolve('uploadArea');
this.UploadArea = await ReactComponents.getComponent('UploadArea', {selector}); this.UploadArea = await ReactComponents.getComponent('UploadArea', {selector});
const reflect = Reflection(selector); const reflect = Reflection.DOM(selector);
const stateNode = reflect.getComponentStateNode(this.UploadArea); const stateNode = reflect.getComponentStateNode(this.UploadArea);
const callback = function(e) { const callback = function(e) {
if (!e.dataTransfer.files.length || !e.dataTransfer.files[0].name.endsWith('.bd')) return; if (!e.dataTransfer.files.length || !e.dataTransfer.files[0].name.endsWith('.bd')) return;

View File

@ -37,4 +37,8 @@ export default class Reflection {
static get DOM() { static get DOM() {
return DOM; return DOM;
} }
static get require() {
return Module.require;
}
} }

View File

@ -1,4 +1,4 @@
import { Settings, Globals, WebpackModules, ReactComponents, MonkeyPatch, Cache } from 'modules'; import { Settings, Globals, Reflection, ReactComponents, MonkeyPatch, Cache } from 'modules';
import { VueInjector } from 'ui'; import { VueInjector } from 'ui';
import AutocompleteComponent from './components/common/Autocomplete.vue'; import AutocompleteComponent from './components/common/Autocomplete.vue';
@ -11,7 +11,7 @@ export default new class Autocomplete {
} }
async init() { async init() {
this.cta = await ReactComponents.getComponent('ChannelTextArea', { selector: WebpackModules.getSelector('channelTextArea', 'emojiButton') }); this.cta = await ReactComponents.getComponent('ChannelTextArea', { selector: Reflection.resolve('channelTextArea', 'emojiButton').selector });
MonkeyPatch('BD:Autocomplete', this.cta.component.prototype).after('render', this.channelTextAreaAfterRender.bind(this)); MonkeyPatch('BD:Autocomplete', this.cta.component.prototype).after('render', this.channelTextAreaAfterRender.bind(this));
this.initialized = true; this.initialized = true;
} }

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { Module, WebpackModules } from 'modules'; import { Module, Reflection } from 'modules';
const normalizedPrefix = 'da'; const normalizedPrefix = 'da';
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`); const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
@ -16,7 +16,7 @@ const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(
export default class ClassNormaliser extends Module { export default class ClassNormaliser extends Module {
init() { init() {
this.patchClassModules(WebpackModules.getModule(this.moduleFilter.bind(this), false)); this.patchClassModules(Reflection.module.getModule(this.moduleFilter.bind(this), false));
this.normalizeElement(document.querySelector('#app-mount')); this.normalizeElement(document.querySelector('#app-mount'));
} }

View File

@ -23,7 +23,7 @@
<script> <script>
// Imports // Imports
import { WebpackModules } from 'modules'; import { Reflection } from 'modules';
import { BdMenu } from 'ui'; import { BdMenu } from 'ui';
import { shell } from 'electron'; import { shell } from 'electron';
import { MiGithubCircle, MiWeb, MiTwitterCircle, MiDiscord } from '../common'; import { MiGithubCircle, MiWeb, MiTwitterCircle, MiDiscord } from '../common';
@ -44,7 +44,7 @@
e.preventDefault(); e.preventDefault();
}, },
openUserProfileModal(discord_id) { openUserProfileModal(discord_id) {
WebpackModules.getModuleByName('UserProfileModal').open(discord_id); Reflection.modules.UserProfileModal.open(discord_id);
BdMenu.close(); BdMenu.close();
}, },
openGitHub() { openGitHub() {

View File

@ -36,7 +36,6 @@
</template> </template>
<script> <script>
import { WebpackModules } from 'modules';
export default { export default {
props: ['item'], props: ['item'],
data() { data() {
@ -44,7 +43,6 @@
}, },
methods: { methods: {
resolveThumb() { resolveThumb() {
window.momentTest = WebpackModules;
return `${this.item.repository.rawUri}/${this.item.files.previews[0].thumb}`; return `${this.item.repository.rawUri}/${this.item.files.previews[0].thumb}`;
} }
} }

View File

@ -36,8 +36,8 @@
</template> </template>
<script> <script>
import { WebpackModules, DiscordApi, Events } from 'modules'; import { Reflection, DiscordApi, Events } from 'modules';
let wtf = null;
export default { export default {
data() { data() {
return { return {

View File

@ -9,7 +9,7 @@
*/ */
import { Utils, ClientLogger as Logger } from 'common'; import { Utils, ClientLogger as Logger } from 'common';
import { ReactComponents, WebpackModules, MonkeyPatch } from 'modules'; import { ReactComponents, Reflection, MonkeyPatch } from 'modules';
import { VueInjector, Toasts } from 'ui'; import { VueInjector, Toasts } from 'ui';
import CMGroup from './components/contextmenu/Group.vue'; import CMGroup from './components/contextmenu/Group.vue';
@ -70,7 +70,7 @@ export class DiscordContextMenu {
if (this.patched) return; if (this.patched) return;
this.patched = true; this.patched = true;
const self = this; const self = this;
MonkeyPatch('BD:DiscordCMOCM', WebpackModules.getModuleByProps(['openContextMenu'])).instead('openContextMenu', (_, [e, fn], originalFn) => { MonkeyPatch('BD:DiscordCMOCM', Reflection.module.byProps('openContextMenu')).instead('openContextMenu', (_, [e, fn], originalFn) => {
const overrideFn = function () { const overrideFn = function () {
const res = fn.apply(this, arguments); const res = fn.apply(this, arguments);
if (!res.hasOwnProperty('type')) return res; if (!res.hasOwnProperty('type')) return res;
@ -96,7 +96,7 @@ export class DiscordContextMenu {
target, target,
top, top,
left, left,
closeMenu: () => WebpackModules.getModuleByProps(['closeContextMenu']).closeContextMenu(), closeMenu: () => Reflection.module.byProps('closeContextMenu').closeContextMenu(),
items: typeof menu.items === 'function' ? menu.items(target) : menu.items items: typeof menu.items === 'function' ? menu.items(target) : menu.items
})); }));
} }

View File

@ -8,8 +8,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { Module, ReactComponents, ReactHelpers, MonkeyPatch, WebpackModules } from 'modules'; import { Module, ReactComponents, ReactHelpers, MonkeyPatch, Reflection } from 'modules';
import { Reflection } from 'ui';
import { ClientLogger as Logger } from 'common'; import { ClientLogger as Logger } from 'common';
import { BdBadge } from './components/bd'; import { BdBadge } from './components/bd';
import VueInjector from './vueinjector'; import VueInjector from './vueinjector';
@ -88,7 +87,7 @@ export default class extends Module {
async patchNameTag() { async patchNameTag() {
if (this.PatchedNameTag) return this.PatchedNameTag; if (this.PatchedNameTag) return this.PatchedNameTag;
const selector = `.${WebpackModules.getClassName('nameTag', 'username', 'discriminator', 'ownerIcon')}`; const selector = Reflection.resolve('nameTag', 'username', 'discriminator', 'ownerIcon').selector;
const NameTag = await ReactComponents.getComponent('NameTag', {selector}); const NameTag = await ReactComponents.getComponent('NameTag', {selector});
this.PatchedNameTag = class extends NameTag.component { this.PatchedNameTag = class extends NameTag.component {

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { WebpackModules } from 'modules'; import { Reflection } from 'modules';
import Vue from 'vue'; import Vue from 'vue';
export default class { export default class {
@ -37,15 +37,14 @@ export default class {
* @return {React.Element} * @return {React.Element}
*/ */
static createReactElement(component, props, mountAtTop) { static createReactElement(component, props, mountAtTop) {
const React = WebpackModules.getModuleByName('React'); const { React } = Reflection.modules;
return React.createElement(this.ReactCompatibility, {component, mountAtTop, props}); return React.createElement(this.ReactCompatibility, {component, mountAtTop, props});
} }
static get ReactCompatibility() { static get ReactCompatibility() {
if (this._ReactCompatibility) return this._ReactCompatibility; if (this._ReactCompatibility) return this._ReactCompatibility;
const React = WebpackModules.getModuleByName('React'); const { React, ReactDOM} = Reflection.modules;
const ReactDOM = WebpackModules.getModuleByName('ReactDOM');
return this._ReactCompatibility = class VueComponent extends React.Component { return this._ReactCompatibility = class VueComponent extends React.Component {
render() { render() {
@ -105,12 +104,12 @@ export const ReactComponent = {
return createElement('div'); return createElement('div');
}, },
mounted() { mounted() {
const { React, ReactDOM } = WebpackModules; const { React, ReactDOM } = Reflection.modules;
ReactDOM.unmountComponentAtNode(this.$el); ReactDOM.unmountComponentAtNode(this.$el);
ReactDOM.render(this.reactElement || React.createElement(this.component, this.componentProps, ...(this.componentChildren || [])), this.$el); ReactDOM.render(this.reactElement || React.createElement(this.component, this.componentProps, ...(this.componentChildren || [])), this.$el);
}, },
beforeDestroy() { beforeDestroy() {
WebpackModules.ReactDOM.unmountComponentAtNode(this.$el); Reflection.modules.ReactDOM.unmountComponentAtNode(this.$el);
} }
}; };