Further refactoring, renaming, and more...

Note: Repository is currently in an unusable state at this point
pull/2/head
BakedPVP 4 years ago
parent 8920e9626d
commit 6a7d290d69

@ -16,6 +16,8 @@
* • NaN !== NaN -> true
* • .2 + .1 -> 0.30000000000000004
* • true + true -> 2
* • {} === {} -> false
* • [] === [] -> false
*/
/**

@ -99,5 +99,6 @@
"files.watcherExclude": {
"**/.cache": true
},
"eslint.run": "onSave"
"eslint.lintTask.enable": true,
"eslint.alwaysShowStatus": true
}

@ -1,17 +1,11 @@
/* eslint-disable no-unused-vars */
const { settings: { TextInput }, ContextMenu, Divider, Icons: { Overflow } } = require('@components');
const { React, getModule, contextMenu, i18n: { Messages } } = require('@webpack');
const { string: { toHeaderCase, toPlural } } = require('@util');
const { DIR: { PLUGINS_DIR, THEMES_DIR } } = require('@constants');
const { shell } = require('electron');
const { join } = require('path');
class Base extends React.PureComponent {
const { React, Webpack, Localize, Util, Constants, Components } = require('@modules');
module.exports = class Base extends React.PureComponent {
constructor () {
super();
this.state = {
key: this.constructor.name.toLowerCase().slice(0, -1),
search: ''
@ -19,13 +13,13 @@ class Base extends React.PureComponent {
}
render () {
const { colorStandard } = getModule('colorStandard');
const { colorStandard } = Webpack.getModule('colorStandard');
return (
<div className={`vizality-entities-manage ${colorStandard}`}>
<div className='vizality-entities-manage-header'>
{this.renderHeader()}
</div>
<Divider/>
<Components.Divider/>
{this.renderBody()}
</div>
);
@ -33,14 +27,14 @@ class Base extends React.PureComponent {
renderHeader () {
return (
<span>{Messages.VIZALITY_ENTITIES_INSTALLED.format({ entityType: toHeaderCase(this.state.key) })}</span>
<span>{Localize.VIZALITY_ENTITIES_INSTALLED.format({ entityType: Util.String.toPascalCase(this.state.key) })}</span>
);
}
renderButtons () {
return (
<div className='vizality-entities-manage-buttons'>
<Overflow onClick={e => this.openOverflowMenu(e)} onContextMenu={e => this.openOverflowMenu(e)}/>
<Components.Icons.Overflow onClick={e => this.openOverflowMenu(e)} onContextMenu={e => this.openOverflowMenu(e)}/>
</div>
);
}
@ -52,9 +46,9 @@ class Base extends React.PureComponent {
{this.renderSearch()}
{items.length === 0
? <div className='vizality-entities-manage-items-empty'>
<div className={getModule('emptyStateImage').emptyStateImage}/>
<p>{Messages.GIFT_CONFIRMATION_HEADER_FAIL}</p>
<p>{Messages.SEARCH_NO_RESULTS}</p>
<div className={Webpack.getModule('emptyStateImage').emptyStateImage}/>
<p>{Localize.GIFT_CONFIRMATION_HEADER_FAIL}</p>
<p>{Localize.SEARCH_NO_RESULTS}</p>
</div>
: items.map(item => this.renderItem(item))}
</div>
@ -65,13 +59,13 @@ class Base extends React.PureComponent {
return (
<div className='vizality-entities-manage-search'>
{/* @todo: Figure out how to use SearchBar component instead */}
<TextInput
<Components.settings.TextInput
value={this.state.search}
onChange={search => this.setState({ search })}
placeholder={Messages.VIZALITY_ENTITIES_FILTER_PLACEHOLDER}
placeholder={Localize.VIZALITY_ENTITIES_FILTER_PLACEHOLDER}
>
{Messages.VIZALITY_ENTITIES_FILTER.format({ entityType: this.state.key })}
</TextInput>
{Localize.VIZALITY_ENTITIES_FILTER.format({ entityType: this.state.key })}
</Components.settings.TextInput>
</div>
);
}
@ -85,20 +79,20 @@ class Base extends React.PureComponent {
}
openOverflowMenu (e) {
contextMenu.openContextMenu(e, () =>
React.createElement(ContextMenu, {
Webpack.contextMenu.openContextMenu(e, () =>
React.createElement(Components.ContextMenu, {
width: '50px',
itemGroups: [ [
{
type: 'button',
name: Messages.VIZALITY_ENTITIES_OPEN_FOLDER.format({ entityType: toHeaderCase(this.state.key) }),
name: Localize.VIZALITY_ENTITIES_OPEN_FOLDER.format({ entityType: Util.String.toPascalCase(this.state.key) }),
onClick: () => {
shell.openItem(eval(`${toPlural(this.state.key).toUpperCase()}_FOLDER`));
shell.openItem(eval(`${Util.String.toPlural(this.state.key).toUpperCase()}_FOLDER`));
}
},
{
type: 'button',
name: Messages.VIZALITY_ENTITIES_LOAD_MISSING.format({ entityType: toHeaderCase(this.state.key) }),
name: Localize.VIZALITY_ENTITIES_LOAD_MISSING.format({ entityType: Util.String.toPascalCase(this.state.key) }),
onClick: () => this.fetchMissing(this.state.key)
}
] ]
@ -109,18 +103,18 @@ class Base extends React.PureComponent {
async fetchMissing (type) {
vizality.api.notices.closeToast('vz-addons-manager-fetch-entities');
const missingEntities = vizality.manager[toPlural(type)].start(true);
const missingEntities = vizality.manager[Util.String.toPlural(type)].start(true);
const missingEntitiesList = missingEntities.length
? React.createElement('div', null,
Messages.VIZALITY_MISSING_ENTITIES_RETRIEVED.format({ entity: type, count: missingEntities.length }),
Localize.VIZALITY_MISSING_ENTITIES_RETRIEVED.format({ entity: type, count: missingEntities.length }),
React.createElement('ul', null, missingEntities.map(entity =>
React.createElement('li', null, ` ${entity}`))
)
)
: Messages.VIZALITY_MISSING_ENTITIES_NONE;
: Localize.VIZALITY_MISSING_ENTITIES_NONE;
vizality.api.notices.sendToast('vz-addons-manager-fetch-entities', {
header: Messages.VIZALITY_MISSING_ENTITIES_FOUND.format({ entity: type, count: missingEntities.length }),
header: Localize.VIZALITY_MISSING_ENTITIES_FOUND.format({ entity: type, count: missingEntities.length }),
content: missingEntitiesList,
type: missingEntities.length > 0 && 'success',
icon: type,
@ -158,6 +152,4 @@ class Base extends React.PureComponent {
return 0;
});
}
}
module.exports = Base;
};

@ -1,43 +1,37 @@
const { React, constants: { Permissions }, getModule, getModuleByDisplayName, i18n: { Messages } } = require('@webpack');
const { GUILD: { CHANNEL: { PLUGINS_CHANNEL, THEMES_CHANNEL } } } = require('@constants');
const { Icons: { Plugin: PluginIcon, Theme } } = require('@components');
const { react : { forceUpdateElement } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');
const { Webpack, React, Patcher, Localize, Constants, Components, Util, Entities: { Plugin } } = require('@modules');
const Plugins = require('./components/manage/Plugins');
const Themes = require('./components/manage/Themes');
const Store = require('./components/store/Store');
const deeplinks = require('./deeplinks');
const commands = require('./commands');
const i18n = require('./i18n');
class AddonsManager extends Plugin {
module.exports = class AddonsManager extends Plugin {
async onStart () {
this.injectStyles('scss/style.scss');
vizality.api.i18n.loadAllStrings(i18n);
Object.values(commands).forEach(cmd => vizality.api.commands.registerCommand(cmd));
this.injectStyles('scss/style.scss');
vizality.api.settings.registerSettings('Plugins', {
category: this.entityID,
label: () => Messages.VIZALITY_ENTITIES.format({ entityType: 'Plugin' }),
label: () => Localize.VIZALITY_ENTITIES.format({ entityType: 'Plugin' }),
render: Plugins
});
vizality.api.settings.registerSettings('Themes', {
category: this.entityID,
label: () => Messages.VIZALITY_ENTITIES.format({ entityType: 'Theme' }),
label: () => Localize.VIZALITY_ENTITIES.format({ entityType: 'Theme' }),
render: Themes
});
deeplinks();
this._injectCommunityContent();
vizality.api.router.registerRoute({
path: '/store/plugins',
render: Store,
noSidebar: true
});
vizality.api.router.registerRoute({
path: '/store/themes',
render: Store,
@ -51,15 +45,15 @@ class AddonsManager extends Plugin {
vizality.api.settings.unregisterSettings('Plugins');
vizality.api.settings.unregisterSettings('Themes');
Object.values(commands).forEach(cmd => vizality.api.commands.unregisterCommand(cmd.command));
unpatch('vz-addons-manager-channelItem');
unpatch('vz-addons-manager-channelProps');
Patcher.unpatch('vz-addons-manager-channelItem');
Patcher.unpatch('vz-addons-manager-channelProps');
}
async _injectCommunityContent () {
const permissionsModule = getModule('can');
patch('vz-addons-manager-channelItem', permissionsModule, 'can', (args, res) => {
const permissionsModule = Webpack.getModule('can');
Patcher.patch('vz-addons-manager-channelItem', permissionsModule, 'can', (args, res) => {
const id = args[1].channelId || args[1].id;
if (id === PLUGINS_CHANNEL || id === THEMES_CHANNEL) {
if (id === Constants.Channels.PLUGINS || id === Constants.Channels.THEMES) {
// return args[0] === Permissions.VIEW_CHANNEL;
}
@ -67,22 +61,22 @@ class AddonsManager extends Plugin {
});
// const { transitionTo } = getModule('transitionTo');
const ChannelItem = getModuleByDisplayName('ChannelItem');
const ChannelItem = Webpack.getModuleByDisplayName('ChannelItem');
patch('vz-addons-manager-channelProps', ChannelItem.prototype, 'render', function (_, res) {
const data = {
[PLUGINS_CHANNEL]: {
icon: PluginIcon,
name: Messages.VIZALITY_ENTITIES.format({ entityType: 'Plugin' }),
[Constants.Channels.PLUGINS]: {
icon: Components.Icons.Plugin,
name: Localize.VIZALITY_ENTITIES.format({ entityType: 'Plugin' }),
route: '/_vizality/store/plugins'
},
[THEMES_CHANNEL]: {
icon: Theme,
name: Messages.VIZALITY_ENTITIES.format({ entityType: 'Theme' }),
[Constants.Channels.THEMES]: {
icon: Components.Icons.Theme,
name: Localize.VIZALITY_ENTITIES.format({ entityType: 'Theme' }),
route: '/_vizality/store/themes'
}
};
if (this.props.channel.id === PLUGINS_CHANNEL || this.props.channel.id === THEMES_CHANNEL) {
if (this.props.channel.id === Constants.Channels.PLUGINS || this.props.channel.id === Constants.Channels.THEMES) {
res.props.children[1].props.children[0].props.children[1].props.children = data[this.props.channel.id].name;
res.props.children[1].props.children[0].props.children[0] = React.createElement(data[this.props.channel.id].icon, {
className: res.props.children[1].props.children[0].props.children[0].props.className,
@ -98,9 +92,7 @@ class AddonsManager extends Plugin {
return res;
});
const { containerDefault } = getModule('containerDefault');
forceUpdateElement(`.${containerDefault}`, true);
const { containerDefault } = Webpack.getModule('containerDefault');
Util.React.forceUpdateElement(`.${containerDefault}`, true);
}
}
module.exports = AddonsManager;
};

@ -1,18 +1,15 @@
const { React, getModuleByDisplayName } = require('@webpack');
const { Text } = require('@components');
const { Webpack, Components } = require('@modules');
const Autocomplete = getModuleByDisplayName('Autocomplete');
const Autocomplete = Webpack.getModuleByDisplayName('Autocomplete');
class Command extends Autocomplete.Command {
module.exports = class Command extends Autocomplete.Command {
renderContent () {
const res = super.renderContent();
res.props.children[0] = React.createElement(Text, {
res.props.children[0] = Webpack.React.createElement(Components.Text, {
children: this.props.prefix ? this.props.prefix : vizality.api.commands.prefix,
style: { color: '#72767d' }
});
return res;
}
}
module.exports = Command;
};

@ -1,8 +1,8 @@
const { getModuleByDisplayName } = require('@webpack');
const { Webpack } = require('@modules');
const Autocomplete = getModuleByDisplayName('Autocomplete');
const Autocomplete = Webpack.getModuleByDisplayName('Autocomplete');
class Title extends Autocomplete.Title {
module.exports = class Title extends Autocomplete.Title {
render () {
const res = super.render();
if (!this.props.title[0]) {
@ -12,6 +12,4 @@ class Title extends Autocomplete.Title {
return res;
}
}
module.exports = Title;
};

@ -1,23 +1,19 @@
const { Plugin } = require('@entities');
const { unpatch } = require('@patcher');
const { Patcher, Entities: { Plugin } } = require('@modules');
const commands = require('./commands');
const monkeypatchMessages = require('./monkeypatchMessages.js');
const injectAutocomplete = require('./injectAutocomplete.js');
class Commands extends Plugin {
module.exports = class Commands extends Plugin {
onStart () {
Object.values(commands).forEach(command => vizality.api.commands.registerCommand(command));
monkeypatchMessages.call(this);
injectAutocomplete.call(this);
}
onStop () {
Object.values(commands).forEach(command => vizality.api.commands.unregisterCommand(command.command));
unpatch('vz-commands-autocomplete-prefix');
unpatch('vz-commands-autocomplete');
Patcher.unpatch('vz-commands-autocomplete-prefix');
Patcher.unpatch('vz-commands-autocomplete');
}
}
module.exports = Commands;
};

@ -1,17 +1,16 @@
const { patch } = require('@patcher');
const { React, i18n: { Messages }, typing, getModuleByDisplayName } = require('@webpack');
const { Patcher, Webpack, Localize, Util } = require('@modules');
const Title = require('./components/Title');
const Command = require('./components/Command');
const Title = require('./components/Title');
async function injectAutocomplete () {
const ChannelAutocomplete = await getModuleByDisplayName('ChannelAutocomplete', true);
const ChannelAutocomplete = await Webpack.getModuleByDisplayName('ChannelAutocomplete', true);
function renderCommandResults (query, selected, commands, onClick, onHover, formatCommand, formatHeader, customHeader) {
const renderHeader = function (query, formatHeader) {
const title = query.length > 0 ? Messages.COMMANDS_MATCHING.format({ prefix: formatHeader(query) }) : Messages.COMMANDS;
const title = query.length > 0 ? Localize.COMMANDS_MATCHING.format({ prefix: formatHeader(query) }) : Localize.COMMANDS;
return React.createElement(Title, {
return Webpack.React.createElement(Title, {
title: customHeader || [ 'Vizality ', title ]
}, `autocomplete-title-${title}`);
};
@ -20,7 +19,7 @@ async function injectAutocomplete () {
return null;
}
const results = commands.map((command, index) => React.createElement(Command, Object.assign({
const results = commands.map((command, index) => Webpack.React.createElement(Command, Object.assign({
onClick,
onHover,
selected: selected === index,
@ -30,7 +29,7 @@ async function injectAutocomplete () {
return [ renderHeader(query, formatHeader), results ];
}
patch('vz-commands-autocomplete-prefix', ChannelAutocomplete.prototype, 'getAutocompletePrefix', function (_, res) {
Patcher.patch('vz-commands-autocomplete-prefix', ChannelAutocomplete.prototype, 'getAutocompletePrefix', function (_, res) {
const { props: { textValue }, state: { autocompleteOptions } } = this;
const { prefix } = vizality.api.commands;
@ -44,7 +43,7 @@ async function injectAutocomplete () {
const currentCommand = vizality.api.commands.find(c => [ c.command, ...(c.aliases || []) ].includes(command));
if (!currentCommand || !currentCommand.showTyping) {
typing.stopTyping(this.props.channel.id);
Webpack.typing.stopTyping(this.props.channel.id);
}
currentWord.word = command && args[0] ? `${prefix}${command} ${args.join(' ')}` : textValue;
@ -62,7 +61,7 @@ async function injectAutocomplete () {
};
});
patch('vz-commands-autocomplete', ChannelAutocomplete.prototype, 'render', function (_, res) {
Patcher.patch('vz-commands-autocomplete', ChannelAutocomplete.prototype, 'render', function (_, res) {
const { props: { textValue }, state: { autocompleteOptions } } = this;
const resultFilter = (value) => c => [ c.command, ...(c.aliases || []) ].some(commandName => commandName.includes(value));
@ -105,7 +104,7 @@ async function injectAutocomplete () {
},
renderResults: (query, selected, onHover, onClick, autocompletes) => {
if (autocompletes && autocompletes.commands) {
const customHeader = Array.isArray(autocompletes.commands.__header) ? autocompletes.commands.__header : [ autocompletes.commands.__header ];
const customHeader = Util.Array.isArray(autocompletes.commands.__header) ? autocompletes.commands.__header : [ autocompletes.commands.__header ];
return renderCommandResults(query, selected, autocompletes.commands, onClick, onHover, (e) => ({
prefix: query.slice(vizality.api.commands.prefix.length - 1).split(' ')[0],

@ -1,16 +1,16 @@
const { getModule, messages, channels: { getChannelId } } = require('@webpack');
const { CDN: { IMAGES_CDN } } = require('@constants');
const Constants = require('@constants');
const Webpack = require('@webpack');
const { receiveMessage } = messages;
const { receiveMessage } = Webpack.messages;
async function monkeypatchMessages () {
const { BOT_AVATARS } = getModule('BOT_AVATARS');
const { createBotMessage } = getModule('createBotMessage');
const { BOT_AVATARS } = Webpack.getModule('BOT_AVATARS');
const { createBotMessage } = Webpack.getModule('createBotMessage');
// Create a new `BOT_AVATARS` key called 'vizality' which we'll later use to replace Clyde.
BOT_AVATARS.vizality = `${IMAGES_CDN}/logo.png`;
BOT_AVATARS.vizality = `${Constants.HTTP.IMAGES}/logo.png`;
messages.sendMessage = (sendMessage => async (id, message, ...params) => {
Webpack.messages.sendMessage = (sendMessage => async (id, message, ...params) => {
if (!message.content.startsWith(vizality.api.commands.prefix)) {
return sendMessage(id, message, ...params);
}
@ -29,7 +29,7 @@ async function monkeypatchMessages () {
if (result.send) {
message.content = result.result;
} else {
const receivedMessage = createBotMessage(getChannelId(), '');
const receivedMessage = createBotMessage(Webpack.channels.getChannelId(), '');
if (vizality.settings.get('replaceClyde', true)) {
receivedMessage.author.username = result.username || 'Vizality';
@ -51,7 +51,7 @@ async function monkeypatchMessages () {
}
return sendMessage(id, message, ...params);
})(this.oldSendMessage = messages.sendMessage);
})(this.oldSendMessage = Webpack.messages.sendMessage);
}
module.exports = monkeypatchMessages;

@ -1,5 +1,5 @@
const { React, getModule } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
/*

@ -1,6 +1,6 @@
const { React, getModule, i18n: { Messages } } = require('@webpack');
const { Icon, Tooltip } = require('@components');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
// @todo: Figure out a way to re-enable the button if the snippet gets removed. Requires reload for now.
class SnippetButton extends React.Component {

@ -1,6 +1,6 @@
const { React, getModule, i18n: { Messages } } = require('@webpack');
const { GUILD: { CHANNEL: { CSS_SNIPPETS_CHANNEL } } } = require('@constants');
const { react : { findInReactTree } } = require('@utilities');
const { react : { findInReactTree } } = require('@util');
const { PopoutWindow } = require('@components');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');

@ -1,6 +1,6 @@
const { settings: { TextInput, SwitchItem, Category, RadioGroup, SelectInput, ColorPickerInput, CopyInput, TextArea, RegionSelector, SliderInput, PermissionOverrideItem } } = require('@components');
const { React, getModule, getModuleByDisplayName } = require('@webpack');
const { sleep } = require('@utilities');
const { sleep } = require('@util');
const { clipboard } = require('electron');

@ -1,4 +1,4 @@
const { sleep, string: { toPascalCase, toCamelCase } } = require('@utilities');
const { sleep, string: { toPascalCase, toCamelCase } } = require('@util');
const { PopoutWindow, Spinner } = require('@components');
const { React, Flux, getModule } = require('@webpack');
const { CDN: { DOCS_CDN } } = require('@constants');

@ -1,6 +1,6 @@
const { AsyncComponent, Clickable, Tooltip, Icons: { ExternalLink, Pin, Unpin, Close } } = require('@components');
const { React, getModule, getModuleByDisplayName, i18n: { Messages } } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
module.exports = AsyncComponent.from((async () => {
const StandardSidebarView = getModuleByDisplayName('StandardSidebarView');

@ -1,5 +1,5 @@
const { React, getModuleByDisplayName, getModule, i18n } = require('@webpack');
const { react : { findInReactTree } } = require('@utilities');
const { react : { findInReactTree } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');

@ -1,5 +1,5 @@
const { React, getModule, getModuleByDisplayName } = require('@webpack');
const { react: { forceUpdateElement } } = require('@utilities');
const { react: { forceUpdateElement } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');

@ -1,5 +1,5 @@
const { React, getModule, getModuleByDisplayName } = require('@webpack');
const { react: { forceUpdateElement } } = require('@utilities');
const { react: { forceUpdateElement } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');

@ -1,5 +1,5 @@
const { React, getModuleByDisplayName } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
const { Tooltip } = require('@components');
const { Plugin } = require('@entities');

@ -1,6 +1,6 @@
const { AsyncComponent, Button, Tooltip, Icon } = require('@components');
const { React, getModuleByDisplayName } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const Progress = AsyncComponent.from(getModuleByDisplayName('Progress'));

@ -1,4 +1,4 @@
const { react: { forceUpdateElement, getOwnerInstance }, dom: { waitForElement } } = require('@utilities');
const { react: { forceUpdateElement, getOwnerInstance }, dom: { waitForElement } } = require('@util');
const { GUILD: { GUILD_ID, GUILD_INVITE }, DIR: { SRC_DIR } } = require('@constants');
const { React, getModule, getModuleByDisplayName } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,4 +1,4 @@
const { react : { findInReactTree } } = require('@utilities');
const { react : { findInReactTree } } = require('@util');
const { React, getModule } = require('@webpack');
const { Tooltip, Icon } = require('@components');
const { patch, unpatch } = require('@patcher');

@ -1,7 +1,4 @@
const { react: { getOwnerInstance, findInReactTree }, dom: { waitForElement } } = require('@utilities');
const { React, getModule, getModuleByDisplayName } = require('@webpack');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');
const { Util, Webpack, Patcher, Entities: { Plugin } } = require('@modules');
module.exports = class Router extends Plugin {
async onStart () {
@ -15,25 +12,25 @@ module.exports = class Router extends Plugin {
onStop () {
vizality.api.router.off('routeAdded', this._listener);
vizality.api.router.off('routeRemoved', this._listener);
unpatch('vz-router-route-side');
unpatch('vz-router-route');
unpatch('vz-router-router');
Patcher.unpatch('vz-router-route-side');
Patcher.unpatch('vz-router-route');
Patcher.unpatch('vz-router-router');
}
async _injectRouter () {
const FluxViewsWithMainInterface = getModuleByDisplayName('FluxContainer(ViewsWithMainInterface)');
const FluxViewsWithMainInterface = Webpack.getModuleByDisplayName('FluxContainer(ViewsWithMainInterface)');
const ViewsWithMainInterface = FluxViewsWithMainInterface
.prototype.render.call({ memoizedGetStateFromStores: () => ({}) }).type;
const { container } = getModule('container', 'downloadProgressCircle');
const RouteRenderer = getOwnerInstance(await waitForElement(`.${container.split(' ')[0]}`));
patch('vz-router-route', RouteRenderer.__proto__, 'render', (_, res) => {
const { children: routes } = findInReactTree(res, m => Array.isArray(m.children) && m.children.length > 5);
const { container } = Webpack.getModule('container', 'downloadProgressCircle');
const RouteRenderer = Webpack.getOwnerInstance(await Util.DOM.waitForElement(`.${container.split(' ')[0]}`));
Patcher.patch('vz-router-route', RouteRenderer.__proto__, 'render', (_, res) => {
const { children: routes } = Util.React.findInReactTree(res, m => Array.isArray(m.children) && m.children.length > 5);
routes.push(
...vizality.api.router.routes.map(route => ({
...routes[0],
props: {
// @todo: Error boundary (?)
render: () => React.createElement(route.render),
render: () => Webpack.React.createElement(route.render),
path: `/_vizality${route.path}`
}
}))
@ -41,7 +38,7 @@ module.exports = class Router extends Plugin {
return res;
});
patch('vz-router-route-side', RouteRenderer.__proto__, 'render', function (args) {
Patcher.patch('vz-router-route-side', RouteRenderer.__proto__, 'render', function (args) {
const renderer = this.renderChannelSidebar;
this.renderChannelSidebar = (props) => {
const rte = vizality.api.router.routes.find(r => r.path === props.location.pathname.slice(11));
@ -53,8 +50,8 @@ module.exports = class Router extends Plugin {
return args;
}, true);
patch('vz-router-router', ViewsWithMainInterface.prototype, 'render', (_, res) => {
const routes = findInTree(res, n => (
Patcher.patch('vz-router-router', ViewsWithMainInterface.prototype, 'render', (_, res) => {
const routes = Util.React.findInTree(res, n => (
Array.isArray(n) && n[0] &&
n[0].key &&
n[0].props.path && n[0].props.render
@ -71,8 +68,8 @@ module.exports = class Router extends Plugin {
}
async _rerender () {
const { app } = getModules([ 'app' ]).find(m => Object.keys(m).length === 1);
const instance = getOwnerInstance(await waitForElement(`.${app.split(' ')[0]}`));
findInTree(instance._reactInternalFiber, n => n && n.historyUnlisten, { walkable: [ 'child', 'stateNode' ] }).forceUpdate();
const { app } = Webpack.getModules([ 'app' ]).find(m => Object.keys(m).length === 1);
const instance = Util.React.getOwnerInstance(await Util.DOM.waitForElement(`.${app.split(' ')[0]}`));
Util.React.findInTree(instance._reactInternalFiber, n => n && n.historyUnlisten, { walkable: [ 'child', 'stateNode' ] }).forceUpdate();
}
};

@ -1,6 +1,6 @@
const { Flux, React, getModule, getModuleByDisplayName, i18n: { Messages } } = require('@webpack');
const { AsyncComponent, Tooltip, HeaderBar, Clickable, Icons } = require('@components');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const SplashScreen = require('./SplashScreen');
const Settings = require('./Settings');

@ -1,4 +1,4 @@
const { dom: { waitForElement }, joinClassNames, react: { getOwnerInstance } } = require('@utilities');
const { dom: { waitForElement }, joinClassNames, react: { getOwnerInstance } } = require('@util');
const { PopoutWindow, Tooltip, ContextMenu, Icons: { CodeBraces } } = require('@components');
const { React, getModule, getModuleByDisplayName, contextMenu } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,11 +1,9 @@
const { Webpack, React, Constants, Localize, Util } = require('@modules');
const { settings: { TextInput, SwitchItem, ButtonItem, Category } } = require('@components');
const { open: openModal, close: closeModal } = require('vizality/modal');
const { React, getModule, i18n: { Messages } } = require('@webpack');
const { file: { removeDirRecursive } } = require('@utilities');
const { DIR: { CACHE_DIR } } = require('@constants');
const { Confirm } = require('@components/modal');
class GeneralSettings extends React.Component {
module.exports = class GeneralSettings extends React.Component {
constructor (props) {
super(props);
this.state = {
@ -25,24 +23,24 @@ class GeneralSettings extends React.Component {
onBlur={({ target }) => target.value = getSetting('prefix', '.')}
error={getSetting('prefix', '.') === '/' ? 'Prefix should not be set to `/` as it is already in use by Discord and may disable Vizality autocompletions.' : ''}
>
{Messages.VIZALITY_COMMAND_PREFIX}
{Localize.VIZALITY_COMMAND_PREFIX}
</TextInput>
<Category
name={Messages.ADVANCED_SETTINGS}
description={Messages.VIZALITY_SETTINGS_ADVANCED_DESC}
name={Localize.ADVANCED_SETTINGS}
description={Localize.VIZALITY_SETTINGS_ADVANCED_DESC}
opened={getSetting('advancedSettings', false)}
onChange={() => toggleSetting('advancedSettings')}
>
<SwitchItem
note={Messages.VIZALITY_SETTINGS_DEBUG_LOGS_DESC}
note={Localize.VIZALITY_SETTINGS_DEBUG_LOGS_DESC}
value={getSetting('debugLogs', false)}
onChange={() => {
toggleSetting('debugLogs');
this.askRestart();
}}
>
{Messages.VIZALITY_SETTINGS_DEBUG_LOGS}
{Localize.VIZALITY_SETTINGS_DEBUG_LOGS}
</SwitchItem>
<SwitchItem
note={'Vizality\'s Software Development Kit (SDK) is a toolkit created to help make plugin developers\'s and theme developers\' lives easier. Once enabled, you can access it through an icon at the top right hand corner of the channel headerbar.'}
@ -52,63 +50,63 @@ class GeneralSettings extends React.Component {
Enable Software Development Kit
</SwitchItem>
<SwitchItem
note={Messages.VIZALITY_SETTINGS_OVERLAY_DESC}
note={Localize.VIZALITY_SETTINGS_OVERLAY_DESC}
value={getSetting('openOverlayDevTools', false)}
onChange={() => toggleSetting('openOverlayDevTools')}
>
{Messages.VIZALITY_SETTINGS_OVERLAY}
{Localize.VIZALITY_SETTINGS_OVERLAY}
</SwitchItem>
<SwitchItem
disabled={!!window.GlasscordApi}
note={window.GlasscordApi
? Messages.VIZALITY_SETTINGS_TRANSPARENT_GLASSCORD.format({ glasscordCfgUrl: 'https://github.com/AryToNeX/Glasscord#how-do-i-use-it' })
: Messages.VIZALITY_SETTINGS_TRANSPARENT_DESC.format()}
? Localize.VIZALITY_SETTINGS_TRANSPARENT_GLASSCORD.format({ glasscordCfgUrl: 'https://github.com/AryToNeX/Glasscord#how-do-i-use-it' })
: Localize.VIZALITY_SETTINGS_TRANSPARENT_DESC.format()}
value={getSetting('transparentWindow', false)}
onChange={() => {
toggleSetting('transparentWindow');
this.askRestart();
}}
>
{Messages.VIZALITY_SETTINGS_TRANSPARENT}
{Localize.VIZALITY_SETTINGS_TRANSPARENT}
</SwitchItem>
<SwitchItem
note={Messages.VIZALITY_SETTINGS_EXP_WEB_PLATFORM_DESC.format()}
note={Localize.VIZALITY_SETTINGS_EXP_WEB_PLATFORM_DESC.format()}
value={getSetting('experimentalWebPlatform', false)}
onChange={() => {
toggleSetting('experimentalWebPlatform');
this.askRestart();
}}
>
{Messages.VIZALITY_SETTINGS_EXP_WEB_PLATFORM}
{Localize.VIZALITY_SETTINGS_EXP_WEB_PLATFORM}
</SwitchItem>
<SwitchItem
note={Messages.VIZALITY_SETTINGS_DISCORD_EXPERIMENTS_DESC.format()}
note={Localize.VIZALITY_SETTINGS_DISCORD_EXPERIMENTS_DESC.format()}
value={getSetting('experiments', false)}
onChange={() => {
toggleSetting('experiments');
// Update modules
const experimentsModule = getModule(r => r.isDeveloper !== void 0);
const experimentsModule = Webpack.getModule(r => r.isDeveloper !== void 0);
experimentsModule._changeCallbacks.forEach(cb => cb());
}}
>
{Messages.VIZALITY_SETTINGS_DISCORD_EXPERIMENTS}
{Localize.VIZALITY_SETTINGS_DISCORD_EXPERIMENTS}
</SwitchItem>
</Category>
<ButtonItem
note={Messages.VIZALITY_SETTINGS_CACHE_VIZALITY_DESC}
button={this.state.vizalityCleared ? Messages.VIZALITY_SETTINGS_CACHE_CLEARED : Messages.VIZALITY_SETTINGS_CACHE_VIZALITY}
note={Localize.VIZALITY_SETTINGS_CACHE_VIZALITY_DESC}
button={this.state.vizalityCleared ? Localize.VIZALITY_SETTINGS_CACHE_CLEARED : Localize.VIZALITY_SETTINGS_CACHE_VIZALITY}
success={this.state.vizalityCleared}
onClick={() => this.clearVizalityCache()}
>
{Messages.VIZALITY_SETTINGS_CACHE_VIZALITY}
{Localize.VIZALITY_SETTINGS_CACHE_VIZALITY}
</ButtonItem>
<ButtonItem
note={Messages.VIZALITY_SETTINGS_CACHE_DISCORD_DESC}
button={this.state.discordCleared ? Messages.VIZALITY_SETTINGS_CACHE_CLEARED : Messages.VIZALITY_SETTINGS_CACHE_DISCORD}
note={Localize.VIZALITY_SETTINGS_CACHE_DISCORD_DESC}
button={this.state.discordCleared ? Localize.VIZALITY_SETTINGS_CACHE_CLEARED : Localize.VIZALITY_SETTINGS_CACHE_DISCORD}
success={this.state.discordCleared}
onClick={() => this.clearDiscordCache()}
>
{Messages.VIZALITY_SETTINGS_CACHE_DISCORD}
{Localize.VIZALITY_SETTINGS_CACHE_DISCORD}
</ButtonItem>
</div>
);
@ -125,7 +123,7 @@ class GeneralSettings extends React.Component {
clearVizalityCache () {
this.setState({ vizalityCleared: true });
removeDirRecursive(CACHE_DIR).then(() => {
Util.File.removeDirRecursive(Constants.Directories.CACHE).then(() => {
setTimeout(() => {
this.setState({ vizalityCleared: false });
}, 2500);
@ -133,21 +131,19 @@ class GeneralSettings extends React.Component {
}
askRestart () {
const { colorStandard } = getModule('colorStandard');
const { colorStandard } = Webpack.getModule('colorStandard');
openModal(() => <Confirm
red
header={Messages.ERRORS_RESTART_APP}
confirmText={Messages.BUNDLE_READY_RESTART}
cancelText={Messages.BUNDLE_READY_LATER}
header={Localize.ERRORS_RESTART_APP}
confirmText={Localize.BUNDLE_READY_RESTART}
cancelText={Localize.BUNDLE_READY_LATER}
onConfirm={() => DiscordNative.app.relaunch()}
onCancel={closeModal}
>
<div className={colorStandard}>
{Messages.VIZALITY_SETTINGS_RESTART}
{Localize.VIZALITY_SETTINGS_RESTART}
</div>
</Confirm>);
}
}
module.exports = GeneralSettings;
};

@ -1,21 +1,18 @@
const { React, getModuleByDisplayName, getModule, i18n: { Messages } } = require('@webpack');
const { AsyncComponent } = require('@components');
const { patch, unpatch } = require('@patcher');
const { Plugin } = require('@entities');
const { Webpack, React, Localize, Components, Patcher, Util, Entities: { Plugin } } = require('@modules');
const GeneralSettings = require('./components/GeneralSettings');
const ErrorBoundary = require('./components/ErrorBoundary');
const FormSection = AsyncComponent.from(getModuleByDisplayName('FormSection'));
const FormTitle = AsyncComponent.from(getModuleByDisplayName('FormTitle'));
const FormSection = Components.AsyncComponent.from(Webpack.getModuleByDisplayName('FormSection'));
const FormTitle = Components.AsyncComponent.from(Webpack.getModuleByDisplayName('FormTitle'));
class Settings extends Plugin {
module.exports = class Settings extends Plugin {
onStart () {
this.injectStyles('scss/style.scss');
vizality.api.settings.registerSettings('Settings', {
category: 'vz-general',
label: () => Messages.VIZALITY_GENERAL_SETTINGS,
label: () => Localize.VIZALITY_GENERAL_SETTINGS,
render: GeneralSettings
});
@ -26,14 +23,14 @@ class Settings extends Plugin {
onStop () {
vizality.api.settings.unregisterSettings('Settings');
unpatch('vz-settings-items');
unpatch('vz-settings-actions');
unpatch('vz-settings-errorHandler');
Patcher.unpatch('vz-settings-items');
Patcher.unpatch('vz-settings-actions');
Patcher.unpatch('vz-settings-errorHandler');
}
patchExperiments () {
try {
const experimentsModule = getModule(r => r.isDeveloper !== void 0);
const experimentsModule = Webpack.getModule(r => r.isDeveloper !== void 0);
Object.defineProperty(experimentsModule, 'isDeveloper', {
get: () => vizality.settings.get('experiments', false)
});
@ -46,8 +43,8 @@ class Settings extends Plugin {
}
patchSettingsComponent () {
const SettingsView = getModuleByDisplayName('SettingsView');
patch('vz-settings-items', SettingsView.prototype, 'getPredicateSections', (_, sections) => {
const SettingsView = Webpack.getModuleByDisplayName('SettingsView');
Patcher.patch('vz-settings-items', SettingsView.prototype, 'getPredicateSections', (_, sections) => {
const changelog = sections.find(c => c.section === 'changelog');
if (changelog) {
const settingsSections = Object.keys(vizality.api.settings.tabs).map(s => this._makeSection(s));
@ -107,16 +104,16 @@ class Settings extends Plugin {
}
patchSettingsContextMenu () {
const SubMenuItem = getModuleByDisplayName('FluxContainer(SubMenuItem)');
const ImageMenuItem = getModuleByDisplayName('ImageMenuItem');
const SettingsContextMenu = getModuleByDisplayName('UserSettingsCogContextMenu');
patch('vz-settings-actions', SettingsContextMenu.prototype, 'render', (_, res) => {
const SubMenuItem = Webpack.getModuleByDisplayName('FluxContainer(SubMenuItem)');
const ImageMenuItem = Webpack.getModuleByDisplayName('ImageMenuItem');
const SettingsContextMenu = Webpack.getModuleByDisplayName('UserSettingsCogContextMenu');
Patcher.patch('vz-settings-actions', SettingsContextMenu.prototype, 'render', (_, res) => {
const parent = React.createElement(SubMenuItem, {
label: 'Vizality',
render: () => vizality.api.settings.tabs.map(tab => React.createElement(ImageMenuItem, {
label: tab.label,
action: async () => {
const settingsModule = getModule('open', 'saveAccountChanges');
const settingsModule = Webpack.getModule('open', 'saveAccountChanges');
settingsModule.open(tab.section);
}
}))
@ -124,7 +121,7 @@ class Settings extends Plugin {
parent.key = 'Vizality';
const items = res.props.children.find(child => Array.isArray(child));
const items = res.props.children.find(child => Util.Array.isArray(child));
const changelog = items.find(item => item && item.key === 'changelog');
if (changelog) {
items.splice(items.indexOf(changelog), 0, parent);
@ -136,6 +133,4 @@ class Settings extends Plugin {
return res;
});
}
}
module.exports = Settings;
};

@ -1,7 +1,7 @@
const { settings: { SwitchItem, TextInput, Category, ButtonItem }, Icons: { FontAwesome }, Clickable, Button, FormNotice, FormTitle, Tooltip } = require('@components');
const { React, getModule, i18n: { Messages, chosenLocale: currentLocale } } = require('@webpack');
const { open: openModal, close: closeModal } = require('vizality/modal');
const { joinClassNames, time } = require('@utilities');
const { joinClassNames, time } = require('@util');
const { REPO: { VIZALITY_REPO }, DIR: { CACHE_DIR } } = require('@constants');
const { Confirm } = require('@components/modal');

@ -1,4 +1,4 @@
const { react: { forceUpdateElement } } = require('@utilities');
const { react: { forceUpdateElement } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { React, getModule } = require('@webpack');

@ -1,4 +1,4 @@
const { joinClassNames, dom: { waitForElement }, react: { forceUpdateElement, getOwnerInstance }, string: { toCamelCase } } = require('@utilities');
const { joinClassNames, dom: { waitForElement }, react: { forceUpdateElement, getOwnerInstance }, string: { toCamelCase } } = require('@util');
const { getModule, i18n: { Messages } } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,4 +1,4 @@
const { react: { forceUpdateElement }, joinClassNames } = require('@utilities');
const { react: { forceUpdateElement }, joinClassNames } = require('@util');
const { getModuleByDisplayName, getModule } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,4 +1,4 @@
const { joinClassNames, dom: { waitForElement }, react: { getOwnerInstance } } = require('@utilities');
const { joinClassNames, dom: { waitForElement }, react: { getOwnerInstance } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,6 +1,6 @@
/* eslint-disable no-unused-vars */
const { React, getModule } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
/*

@ -1,5 +1,5 @@
const { getModuleByDisplayName } = require('@webpack');
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
module.exports = async () => {

@ -1,4 +1,4 @@
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,4 +1,4 @@
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,6 +1,6 @@
/* eslint-disable no-unreachable */
const { getModule, getModuleByDisplayName } = require('@webpack');
const { react: { forceUpdateElement } } = require('@utilities');
const { react: { forceUpdateElement } } = require('@util');
const { patch, unpatch } = require('@patcher');
/*

@ -1,4 +1,4 @@
const { joinClassNames, dom: { waitForElement }, react: { forceUpdateElement, getOwnerInstance } } = require('@utilities');
const { joinClassNames, dom: { waitForElement }, react: { forceUpdateElement, getOwnerInstance } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,5 +1,5 @@
/* eslint-disable no-unreachable */
const { joinClassNames, react : { findInReactTree, forceUpdateElement } } = require('@utilities');
const { joinClassNames, react : { findInReactTree, forceUpdateElement } } = require('@util');
const { getModule, getModuleByDisplayName } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,4 +1,4 @@
const { react : { findInReactTree }, joinClassNames } = require('@utilities');
const { react : { findInReactTree }, joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,4 +1,4 @@
const { joinClassNames } = require('@utilities');
const { joinClassNames } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,4 +1,4 @@
const { joinClassNames, dom: { waitForElement }, react: { getOwnerInstance } } = require('@utilities');
const { joinClassNames, dom: { waitForElement }, react: { getOwnerInstance } } = require('@util');
const { patch, unpatch } = require('@patcher');
const { getModule } = require('@webpack');

@ -1,4 +1,4 @@
const { joinClassNames, string: { toCamelCase } } = require('@utilities');
const { joinClassNames, string: { toCamelCase } } = require('@util');
const { getModuleByDisplayName } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -1,4 +1,4 @@
const { joinClassNames, react: { findInReactTree }, string: { toCamelCase } } = require('@utilities');
const { joinClassNames, react: { findInReactTree }, string: { toCamelCase } } = require('@util');
const { getModuleByDisplayName, getModule } = require('@webpack');
const { patch, unpatch } = require('@patcher');

@ -6,6 +6,7 @@
"@root/*": [ "./../*" ],
"@src/*": [ "./*" ],
"vizality/*": [ "./.vizality/modules/*"],
"@api": [ "./.vizality/api"],
"@classes": [ "./.vizality/modules/classes" ],
"@compilers": [ "./.vizality/modules/compilers" ],
"@components": [ "./.vizality/modules/components" ],
@ -13,9 +14,11 @@
"@discord": [ "./.vizality/modules/discord" ],
"@entities": [ "./.vizality/modules/entities" ],
"@http": [ "./.vizality/modules/http" ],
"@localize": [ "./.vizality/modules/localize/Messages" ],
"@modules": [ "./.vizality/modules"],
"@patcher": [ "./.vizality/modules/patcher" ],
"@plugin": [ "./.vizality/modules/entities/Plugin" ],
"@react": [ "./.vizality/modules/react" ],
"@theme": [ "./.vizality/modules/entities/Theme" ],
"@typings": [ "./.vizality/typings" ],
"@updatable": [ "./.vizality/modules/entities/Updatable" ],

@ -19,6 +19,7 @@
"@root": ".",
"@src": "src",
"vizality": "src/.vizality/modules",
"@api": "src/.vizality/api",
"@classes": "src/.vizality/modules/classes",
"@compilers": "src/.vizality/modules/compilers",
"@components": "src/.vizality/modules/components",
@ -26,9 +27,11 @@
"@discord": "src/.vizality/modules/discord",
"@entities": "src/.vizality/modules/entities",
"@http": "src/.vizality/modules/http",
"@localize": "src/.vizality/modules/localize/Messages",
"@modules": "src/.vizality/modules",
"@patcher": "src/.vizality/modules/patcher",
"@plugin": "src/.vizality/modules/entities/Plugin",
"@react": "src/.vizality/modules/react",
"@theme": "src/.vizality/modules/entities/Theme",
"@typings": "src/.vizality/typings",
"@updatable": "src/.vizality/modules/entities/Updatable",

@ -1,4 +1,4 @@
const { API } = require('@entities');
const Entities = require('@entities');
/**
* @typedef VizalityChatCommand
@ -16,7 +16,7 @@ const { API } = require('@entities');
* @type {CommandsAPI}
* @property {Object.<String, VizalityChatCommand>} commands Registered commands
*/
class CommandsAPI extends API {
module.exports = class CommandsAPI extends Entities.API {
constructor () {
super();
this.commands = {};
@ -79,6 +79,4 @@ class CommandsAPI extends API {
delete this.commands[command];
}
}
}
module.exports = CommandsAPI;
};

@ -1,6 +1,6 @@
const { API } = require('@entities');
const Entities = require('@entities');
module.exports = class ConnectionsAPI extends API {
module.exports = class ConnectionsAPI extends Entities.API {
constructor () {
super();

@ -1,12 +1,12 @@
const Constants = require('@constants');
const Entities = require('@entities');
const Webpack = require('@webpack');
const { DIR: { I18N_DIR } } = require('@constants');
const { API } = require('@entities');
const strings = require(I18N_DIR);
const strings = require(Constants.Directories.I18N);
const i18n = Webpack.getModule('Messages', 'languages');
class I18nAPI extends API {
module.exports = class I18nAPI extends Entities.API {
constructor () {
super();
this.messages = {};
@ -54,6 +54,4 @@ class I18nAPI extends API {
}
this._addVizalityStrings();
}
}
module.exports = I18nAPI;
};

@ -1,10 +1,9 @@
const { DIR: { MODULES_DIR } } = require('@constants');
const { API } = require('@entities');
const { remote: { globalShortcut } } = require('electron');
const { join } = require('path');
const Constants = require('@constants');
const Entities = require('@entities');
const localShortcut = require(join(MODULES_DIR, 'keybindutils', 'localShortcut'));
const localShortcut = require(join(Constants.Directories.MODULES, '.keybindutils', 'localShortcut'));
/* @todo: Convert errors to logger. */
@ -20,10 +19,9 @@ const localShortcut = require(join(MODULES_DIR, 'keybindutils', 'localShortcut')
* Vizality Keybinds API
* @property {Object.<String, VizalityKeybind>} keybinds Keybinds
*/
class KeybindsAPI extends API {
class KeybindsAPI extends Entities.API {
constructor () {
super();
this.keybinds = {};
}

@ -1,4 +1,4 @@
const { API } = require('@entities');
const Entities = require('@entities');
/*
* @todo:
@ -40,10 +40,9 @@ const { API } = require('@entities');
* @property {object.<string, VizalityToast>} toasts
* @property {object.<string, VizalityAnnouncement>} announcements
*/
class NoticesAPI extends API {
class NoticesAPI extends Entities.API {
constructor () {
super();
this.announcements = {};
this.toasts = {};
this.alerts = {};

@ -1,6 +1,6 @@
const { logger: { warn, error } } = require('@utilities');
const { getModule } = require('@webpack');
const { API } = require('@entities');
const Entities = require('@entities');
const Webpack = require('@webpack');
const Util = require('@util');
/**
* @typedef VizalityRoute
@ -13,10 +13,9 @@ const { API } = require('@entities');
* Vizality custom router API
* @property {VizalityRoute[]} routes Registered routes
*/
class RouterAPI extends API {
module.exports = class RouterAPI extends Entities.API {
constructor () {
super();
this.routes = [];
this.shortcuts = {};
}
@ -27,7 +26,7 @@ class RouterAPI extends API {
async restorePrevious () {
const oldRoute = await DiscordNative.settings.get('_VIZALITY_ROUTE');
if (oldRoute && this.routes.find(c => c.path === oldRoute.split('/_vizality')[1])) {
const router = getModule('replaceWith');
const router = Webpack.getModule('replaceWith');
router.replaceWith(oldRoute);
}
return DiscordNative.settings.set('_VIZALITY_ROUTE', void 0);
@ -40,7 +39,7 @@ class RouterAPI extends API {
*/
registerRoute (route) {
if (this.routes.find(r => r.path === route.path)) {
return error(this._module, this._submodule, null, `Route '${route.path}' is already registered!`);
return Util.Logger.error(this._module, this._submodule, null, `Route '${route.path}' is already registered!`);
}
this.routes.push(route);
@ -57,7 +56,7 @@ class RouterAPI extends API {
this.routes = this.routes.filter(r => r.path !== path);
this.emit('routeRemoved', path);
} else {
return warn(this._module, this._submodule, null, `Route 'route.${path}' is not registered, so it cannot be unregistered!`);
return Util.Logger.warn(this._module, this._submodule, null, `Route "${path}" is not registered, so it cannot be unregistered.`);
}
}
@ -69,11 +68,11 @@ class RouterAPI extends API {
*/
registerShortcut (name, action) {
if (Object.keys(this.shortcuts).find(r => r === name)) {
return error(this._module, this._submodule, null, `Shortcut '${name}' is already registered!`);
return Util.Logger.error(this._module, this._submodule, null, `Shortcut "${name}" is already registered!`);
}
if (typeof action !== 'function') {
return error(this._module, this._submodule, null, `Argument 'action' must be a function!`);
return Util.Logger.error(this._module, this._submodule, null, `Argument "action" must be a function.`);
}
Object.keys(this.shortcuts).push(name);
@ -93,7 +92,7 @@ class RouterAPI extends API {
this.emit('shortcutRemoved', name);
} else {
return warn(this._module, this._submodule, null, `Shortcut '${name}' is not registered, so it cannot be unregistered!`);
return Util.Logger.warn(this._module, this._submodule, null, `Shortcut '${name}' is not registered, so it cannot be unregistered!`);
}
}
@ -106,6 +105,4 @@ class RouterAPI extends API {
}
}
module.exports = RouterAPI;
};

@ -1,4 +1,4 @@
const { API } = require('@entities');
const Entities = require('@entities');
/* @todo: Use logger. */
@ -16,10 +16,9 @@ const { API } = require('@entities');
* @property {Object.<String, function(String): Boolean>} scopes RPC Scopes
* @property {Object.<String, DiscordRpcEvent>} scopes RPC Scopes
*/
class RpcAPI extends API {
class RpcAPI extends Entities.API {
constructor () {
super();
this.scopes = {};
this.events = {};
}

@ -1,5 +1,5 @@
const { API } = require('@entities');
const { Flux } = require('@webpack');
const Entities = require('@entities');
const Webpack = require('@webpack');
const actions = require('./store/actions');
const store = require('./store/store');
@ -28,10 +28,9 @@ const store = require('./store/store');
* @property {Flux.Store} store Flux store
* @property {Object.<String, SettingsTab>} tabs Settings tab
*/
class SettingsAPI extends API {
module.exports = class SettingsAPI extends Entities.API {
constructor () {
super();
this.store = store;
this.tabs = {};
}
@ -87,7 +86,7 @@ class SettingsAPI extends API {
* @returns {Function}
*/
connectStores (category) {
return Flux.connectStores([ this.store ], () => this._fluxProps(category));
return Webpack.Flux.connectStores([ this.store ], () => this._fluxProps(category));
}
/** @private */
@ -99,6 +98,4 @@ class SettingsAPI extends API {
toggleSetting: (setting, defaultValue) => actions.toggleSetting(category, setting, defaultValue)
};
}
}
module.exports = SettingsAPI;
};

@ -1,10 +1,10 @@
const { FluxDispatcher } = require('@webpack');
const Webpack = require('@webpack');
const ActionTypes = require('./constants');
module.exports = {
toggleSetting (category, setting, defaultValue) {
FluxDispatcher.dispatch({
Webpack.FluxDispatcher.dispatch({
type: ActionTypes.TOGGLE_SETTING,
category,
setting,
@ -12,7 +12,7 @@ module.exports = {
});
},
updateSettings (category, settings) {
FluxDispatcher.dispatch({
Webpack.FluxDispatcher.dispatch({
type: ActionTypes.UPDATE_SETTINGS,
category,
settings
@ -20,7 +20,7 @@ module.exports = {
},
updateSetting (category, setting, value) {
FluxDispatcher.dispatch({
Webpack.FluxDispatcher.dispatch({
type: ActionTypes.UPDATE_SETTING,
category,
setting,
@ -29,7 +29,7 @@ module.exports = {
},
deleteSetting (category, setting) {
FluxDispatcher.dispatch({
Webpack.FluxDispatcher.dispatch({
type: ActionTypes.DELETE_SETTING,
category,
setting

@ -1,13 +1,13 @@
const { Flux, FluxDispatcher } = require('@webpack');
const { DIR: { SETTINGS_DIR } } = require('@constants');
const { join } = require('path');
const { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync } = require('fs');
const { join } = require('path');
const Constants = require('@constants');
const Webpack = require('@webpack');
const ActionTypes = require('./constants');
if (!existsSync(SETTINGS_DIR)) {
mkdirSync(SETTINGS_DIR);
if (!existsSync(Constants.Directories.SETTINGS)) {
mkdirSync(Constants.Directories.SETTINGS);
}
function loadSettings (file) {
@ -16,7 +16,7 @@ function loadSettings (file) {
return [
file.split('.')[0],
JSON.parse(
readFileSync(join(SETTINGS_DIR, file), 'utf8')
readFileSync(join(Constants.Directories.SETTINGS, file), 'utf8')
)
];
} catch (err) {
@ -26,7 +26,7 @@ function loadSettings (file) {
}
const settings = Object.fromEntries(
readdirSync(SETTINGS_DIR)
readdirSync(Constants.Directories.SETTINGS)
.filter(f => !f.startsWith('.') && f.endsWith('.json'))
.map(loadSettings)
);
@ -68,7 +68,7 @@ function deleteSetting (category, setting) {
delete settings[category][setting];
}
class SettingsStore extends Flux.Store {
class SettingsStore extends Webpack.Flux.Store {
constructor (Dispatcher, handlers) {
super(Dispatcher, handlers);
@ -103,14 +103,14 @@ class SettingsStore extends Flux.Store {
_persist () {
for (const category in settings) {
const file = join(SETTINGS_DIR, `${category}.json`);
const file = join(Constants.Directories.SETTINGS, `${category}.json`);
const data = JSON.stringify(settings[category], null, 2);
writeFileSync(file, data);
}
}
}
module.exports = new SettingsStore(FluxDispatcher, {
module.exports = new SettingsStore(Webpack.FluxDispatcher, {
[ActionTypes.UPDATE_SETTINGS]: ({ category, settings }) => updateSettings(category, settings),
[ActionTypes.TOGGLE_SETTING]: ({ category, setting, defaultValue }) => toggleSetting(category, setting, defaultValue),
[ActionTypes.UPDATE_SETTING]: ({ category, setting, value }) => updateSetting(category, setting, value),

@ -1,15 +1,14 @@
/* eslint-disable brace-style *//* eslint-disable no-unused-vars *//* eslint-disable jsdoc/no-undefined-types */
const childProcess = require('child_process');
const util = require('util');
const __typings__ = require('@typings');
const { CDN: { IMAGES_CDN }, DIR: { ROOT_DIR, PLUGINS_DIR, THEMES_DIR } } = require('@constants');
const { misc: { sleep }, logger: { log, warn, error } } = require('@utilities');
const { jsx: JsxCompiler } = require('@compilers');
const Constants = require('@constants');
const Updatable = require('@updatable');
const Compilers = require('@compilers');
const Webpack = require('@webpack');
const { Updatable } = require('@entities');
const { Misc: { sleep } } = require('@util');
const { promisify } = require('util');
const cp = require('child_process');
const exec = promisify(cp.exec);
const exec = util.promisify(childProcess.exec);
const AddonManager = require('./managers/addon');
const StyleManager = require('./managers/styleManager');
@ -27,7 +26,7 @@ const FluxModule = async () => {
const JsxCompilerModule = async () => {
require.extensions['.jsx'] = (module, filename) => {
const compiler = new JsxCompiler(filename);
const compiler = new Compilers.jsx(filename);
const compiled = compiler.compile();
module._compile(compiled, filename);
};
@ -49,7 +48,7 @@ const currentWebContents = require('electron').remote.getCurrentWebContents();
*/
module.exports = class Vizality extends Updatable {
constructor () {
super(ROOT_DIR, '', 'vizality');
super(Constants.Directories.ROOT, '', 'vizality');
this.api = {};
this.modules = {};
@ -58,8 +57,8 @@ module.exports = class Vizality extends Updatable {
this.styleManager = new StyleManager();
this.manager.apis = new APIManager();
this.manager.themes = new AddonManager('themes', THEMES_DIR);
this.manager.plugins = new AddonManager('plugins', PLUGINS_DIR);
this.manager.themes = new AddonManager('themes', Constants.Directories.THEMES);
this.manager.plugins = new AddonManager('plugins', Constants.Directories.PLUGINS);
this._ready = false;
this._originalLogFunc = {};
@ -95,7 +94,7 @@ module.exports = class Vizality extends Updatable {
// Startup
async start () {
// console.clear(); // To help achieve that pure console look ( ͡° ͜ʖ ͡°)
const startupBanner = `${IMAGES_CDN}/console-startup-banner.gif`;
const startupBanner = `${Constants.HTTP.IMAGES}/console-startup-banner.gif`;
// Startup banner
console.log('%c ', `background: url(${startupBanner}) no-repeat center / contain; padding: 116px 350px; font-size: 1px; margin: 10px 0;`);
@ -115,7 +114,7 @@ module.exports = class Vizality extends Updatable {
this._removeDiscordLogs();
// Setting up the modules for the global vizality object
const modules = [ 'webpack', 'classes', 'constants', 'discord', 'utilities' ];
const modules = [ 'webpack', 'classes', 'constants', 'localize', 'discord', 'util' ];
for (const mdl of modules) {
const Mdl = require(`@${mdl}`);
@ -175,15 +174,15 @@ module.exports = class Vizality extends Updatable {
const submodule = this.name;
if (type === 'info' || type === 'log') {
log(module, submodule, null, ...originalArgs);
Util.Logger.log(module, submodule, null, ...originalArgs);
}
if (type === 'error' || type === 'trace') {
error(module, submodule, null, ...originalArgs);
Util.Logger.error(module, submodule, null, ...originalArgs);
}
if (type === 'warn') {
warn(module, submodule, null, ...originalArgs);
Util.Logger.warn(module, submodule, null, ...originalArgs);
}
};
}

@ -1,8 +1,8 @@
const { file: { removeDirRecursive }, string: { toPascalCase, toSingular }, logger: { log, warn, error } } = require('@utilities');
const { readdirSync } = require('fs');
const { resolve } = require('path');
const Util = require('@util');
const _module = 'Manager';
const _submodule = 'Addon';
@ -44,7 +44,7 @@ class AddonManager {
}
isEnabled (addonId) {
return !vizality.settings.get(`disabled${toPascalCase(this._type)}`, []).includes(addonId);
return !vizality.settings.get(`disabled${Util.String.toPascalCase(this._type)}`, []).includes(addonId);
}
isInternal (addonId) {
@ -64,7 +64,7 @@ class AddonManager {
}
getAllDisabled () {
return vizality.settings.get(`disabled${toPascalCase(this._type)}`, []);
return vizality.settings.get(`disabled${Util.String.toPascalCase(this._type)}`, []);
}
// Mount/load/enable/install shit
@ -77,11 +77,11 @@ class AddonManager {
optionalDependencies: []
}, require(resolve(this._dir, pluginID, 'manifest.json')));
} catch (err) {
return this.error(`${toSingular(toPascalCase(this._type))} ${pluginID} doesn't have a valid manifest - Skipping`);
return this.error(`${Util.String.toSingular(Util.String.toPascalCase(this._type))} ${pluginID} doesn't have a valid manifest - Skipping`);
}
if (!this._requiredManifestKeys.every(key => manifest.hasOwnProperty(key))) {
return this.error(`${toSingular(toPascalCase(this._type))} ${pluginID} doesn't have a valid manifest - Skipping`);
return this.error(`${Util.String.toSingular(Util.String.toPascalCase(this._type))} ${pluginID} doesn't have a valid manifest - Skipping`);
}
try {
@ -90,13 +90,13 @@ class AddonManager {
entityID: {
get: () => pluginID,
set: () => {
throw new Error(`${toPascalCase(this._type)} cannot update their ID at runtime!`);
throw new Error(`${Util.String.toPascalCase(this._type)} cannot update their ID at runtime!`);
}
},
manifest: {
get: () => manifest,
set: () => {
throw new Error(`${toPascalCase(this._type)} cannot update manifest at runtime!`);
throw new Error(`${Util.String.toPascalCase(this._type)} cannot update manifest at runtime!`);
}
}
});
@ -120,7 +120,7 @@ class AddonManager {
async unmount (pluginID) {
const plugin = this.get(pluginID);
if (!plugin) {
throw new Error(`Tried to unmount a non-installed ${toSingular(this._type)}: ${plugin}`);
throw new Error(`Tried to unmount a non-installed ${Util.String.toSingular(this._type)}: ${plugin}`);
}
if (plugin._ready) {
await plugin._unload();
@ -138,11 +138,11 @@ class AddonManager {
const addon = this.get(addonId);
if (!addon) {
throw new Error(`Tried to enable a non-installed ${toSingular(this._type)}: (${addonId})`);
throw new Error(`Tried to enable a non-installed ${Util.String.toSingular(this._type)}: (${addonId})`);
}
if (addon._ready) {
return this.error(`Tried to load an already-loaded ${toSingular(this._type)}: (${addonId})`);
return this.error(`Tried to load an already-loaded ${Util.String.toSingular(this._type)}: (${addonId})`);
}
vizality.settings.set(
@ -157,11 +157,11 @@ class AddonManager {
const addon = this.get(addonId);
if (!addon) {
throw new Error(`Tried to disable a non-installed ${toSingular(this._type)}: (${addonId})`);
throw new Error(`Tried to disable a non-installed ${Util.String.toSingular(this._type)}: (${addonId})`);
}
if (!addon._ready) {
return this.error(`Tried to unload a non-loaded ${toSingular(this._type)}: (${plugin})`);
return this.error(`Tried to unload a non-loaded ${Util.String.toSingular(this._type)}: (${addonId})`);
}
vizality.settings.set('disabledPlugins', [
@ -178,11 +178,11 @@ class AddonManager {
async uninstall (addonId) {
if (this.isInternal(addonId)) {
throw new Error(`You cannot uninstall an internal ${toSingular(this._type)}. (Tried to uninstall: ${addonId})`);
throw new Error(`You cannot uninstall an internal ${Util.String.toSingular(this._type)}. (Tried to uninstall: ${addonId})`);
}
await this.unmount(addonId);
await removeDirRecursive(resolve(this._dir, addonId));
await Util.File.removeDirRecursive(resolve(this._dir, addonId));
}
// Start
@ -245,15 +245,15 @@ class AddonManager {
}
log (...data) {
log(_module, `${_submodule}:${toSingular(toPascalCase(this._type))}`, null, ...data);
Util.Logger.log(_module, `${_submodule}:${Util.String.toSingular(Util.String.toPascalCase(this._type))}`, null, ...data);
}
warn (...data) {
warn(_module, `${_submodule}:${toSingular(toPascalCase(this._type))}`, null, ...data);
Util.Logger.warn(_module, `${_submodule}:${Util.String.toSingular(Util.String.toPascalCase(this._type))}`, null, ...data);
}
error (...data) {
error(_module, `${_submodule}:${toSingular(toPascalCase(this._type))}`, null, ...data);
Util.Logger.error(_module, `${_submodule}:${Util.String.toSingular(Util.String.toPascalCase(this._type))}`, null, ...data);
}
}

@ -1,12 +1,12 @@
const { logger: { error } } = require('@utilities');
const { DIR: { API_DIR } } = require('@constants');
const { readdirSync, statSync, existsSync } = require('fs');
const { join } = require('path');
class APIManager {
const Constants = require('@constants');
const Util = require('@util');
module.exports = class APIManager {
constructor () {
this.dir = API_DIR;
this.dir = Constants.Directories.API;
this.apis = [];
}
@ -17,19 +17,19 @@ class APIManager {
vizality.api[api] = new APIClass();
this.apis.push(api);
} catch (err) {
error('Manager', 'API', null, `An error occurred while initializing "${api}"!`, err);
Util.Logger.error('Manager', 'API', null, `An error occurred while initializing "${api}":`, err);
}
}
async start () {
for (const api of this.apis) {
await vizality.api[api]._load();
await vizality.api[api].initialize();
}
}
async stop () {
for (const api of this.apis) {
await vizality.api[api]._unload();
await vizality.api[api].terminate();
}
}
@ -45,6 +45,4 @@ class APIManager {
}
await this.start();
}
}
module.exports = APIManager;
};

@ -1,4 +1,4 @@
const { string: { toPlural, toHeaderCase }, fil: { removeDirRecursive } } = require('@utilities');
const { string: { toPlural, toHeaderCase }, fil: { removeDirRecursive } } = require('@util');
const ErrorTypes = {
NOT_A_DIRECTORY: 'NOT A DIRECTOR',

@ -1,10 +1,9 @@
/* @todo: Use logger. */
const { Theme } = require('@entities');
const { DIR: { THEMES_DIR, SETTINGS_DIR } } = require('@constants');
const { join } = require('path');
const { promises: { readFile, lstat }, readdirSync, existsSync } = require('fs');
const { join } = require('path');
const Constants = require('@constants');
const Theme = require('@theme');
const fileRegex = /\.((s?c|le)ss|styl)$/;
@ -14,9 +13,9 @@ const ErrorTypes = Object.freeze({
INVALID_MANIFEST: 'INVALID_MANIFEST'
});
class StyleManager {
module.exports = class StyleManager {
constructor () {
this.themesDir = THEMES_DIR;
this.themesDir = Constants.Directories.THEMES;
this.themes = new Map();
if (!window.__SPLASH__) {
@ -42,7 +41,7 @@ class StyleManager {
if (!this.__settings) {
this.__settings = {};
try {
this.__settings = require(join(SETTINGS_DIR, 'vz-general.json'));
this.__settings = require(join(Constants.Directories.SETTINGS, 'vz-general.json'));
} catch (err) {
// @todo: Handled this.
}
@ -287,6 +286,4 @@ class StyleManager {
}
return errors;
}
}
module.exports = StyleManager;
};

@ -1,19 +0,0 @@
const { logger: { warn } } = require('@utilities');
const classes = require('../classes');
const _checkForUndefined = async (obj = classes, currentPath) => {
const _module = 'Module';
const _submodule = 'Classes:_checkForUndefined';
for (const key in obj) {
if (typeof obj[key] === 'object') {
const newPath = currentPath ? `${currentPath}.${key}` : key;
_checkForUndefined(obj[key], newPath);
} else if (typeof obj[key] === 'undefined') {
warn(_module, _submodule, null, `Value not found: ${currentPath}.${key}`);
}
}
};
module.exports = _checkForUndefined;

@ -1,43 +0,0 @@
const { DIR: { LIBRARIES_DIR } } = require('@constants');
const { logger: { warn } } = require('@utilities');
const { promises: { writeFile, mkdir }, existsSync } = require('fs');
const { join } = require('path');
const classes = require('../classes');
const _generateSassClasses = async (obj = classes, currentPath) => {
const module = 'Module';
const submodule = 'Classes:_generateSassClasses';
const SassClassFolder = join(LIBRARIES_DIR, 'sass', 'classes');
if (!existsSync(SassClassFolder)) {
await mkdir(SassClassFolder);
}
let generatedSass = '';
for (const key in obj) {
if (typeof obj[key] === 'object') {
const newPath = currentPath ? `${currentPath}.${key}` : key;
_generateSassClasses(obj[key], newPath);
} else if (typeof obj[key] === 'string') {
generatedSass += `$${key}: '.${obj[key].split(' ')[0]}';\n`;
} else if (typeof obj[key] === 'undefined') {
warn(module, submodule, null, `No value found for '${currentPath}.${key}'`);
}
}
const moduleFolder = join(SassClassFolder, currentPath.split('.').join('/'));
await mkdir(moduleFolder, { recursive: true });
generatedSass = generatedSass.trim().split('\n').sort().join('\n').replace(/,/g, '');
if (generatedSass) {
await writeFile(join(moduleFolder, '_index.scss'), generatedSass, 'utf8');
}
};
module.exports = _generateSassClasses;

@ -1,9 +1,9 @@
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const components = {
...getModule('attachment'),
...getModule('members'),
hunk: getModule('members').hunk
...Webpack.getModule('attachment'),
...Webpack.getModule('members'),
hunk: Webpack.getModule('members').hunk
};
module.exports = components;

@ -1,9 +0,0 @@
const { object: { findEntriesByValue } } = require('@utilities');
const classes = require('../classes');
const findClass = (value, exact = false) => {
return findEntriesByValue(classes, value, exact);
};
module.exports = findClass;

@ -1,37 +1,72 @@
const { DIR: { LIBRARIES_DIR } } = require('@constants');
const { logger: { log } } = require('@utilities');
const { promises: { writeFile, mkdir }, existsSync } = require('fs');
const { join } = require('path');
const { existsSync } = require('fs');
const _checkForUndefined = require('./_checkForUndefined');
const _generateSassClasses = require('./_generateSassClasses');
const findClass = require('./findClass');
const components = require('./components');
const layout = require('./layout');
const views = require('./views');
const plugins = require('./plugins');
const vizality = require('./vizality');
const classes = {
components,
layout,
views,
plugins,
vizality
};
module.exports = { classes, findClass };
const Constants = require('@constants');
const Util = require('@util');
_checkForUndefined();
const { components, layout, views, plugins, vizality } = require('.');
const _module = 'Module';
const _submodule = 'Classes';
const SassClassFolder = join(LIBRARIES_DIR, 'sass', 'classes');
module.exports = class Classes {
static get components () { return components; }
static get layout () { return layout; }
static get views () { return views; }
static get plugins () { return plugins; }
static get vizality () { return vizality; }
static findClass (value, exact = false) {
return Util.Object.findEntriesByValue(this, value, exact);
}
static async _checkForUndefined (obj = this, currentPath) {
for (const key in obj) {
if (typeof obj[key] === 'object') {
const newPath = currentPath ? `${currentPath}.${key}` : key;
this._checkForUndefined(obj[key], newPath);
} else if (typeof obj[key] === 'undefined') {
Util.Logger.warn(_module, `${_submodule}:_checkForUndefined`, null, `Value not found: ${currentPath}.${key}`);
}
}
}
static async _generateSassClasses (obj = this, currentPath) {
const SassClassFolder = join(Constants.Directories.LIBRARIES, 'sass', 'classes');
if (!existsSync(SassClassFolder)) {
await mkdir(SassClassFolder);
}
let generatedSass = '';
for (const key in obj) {
if (typeof obj[key] === 'object') {
const newPath = currentPath ? `${currentPath}.${key}` : key;
this._generateSassClasses(obj[key], newPath);
} else if (typeof obj[key] === 'string') {
generatedSass += `$${key}: '.${obj[key].split(' ')[0]}';\n`;
} else if (typeof obj[key] === 'undefined') {
Util.Logger.warn(_module, `${_submodule}:_generateSassClasses`, null, `No value found for '${currentPath}.${key}'`);
}
}
const moduleFolder = join(SassClassFolder, currentPath.split('.').join('/'));
await mkdir(moduleFolder, { recursive: true });
generatedSass = generatedSass.trim().split('\n').sort().join('\n').replace(/,/g, '');
if (generatedSass) {
await writeFile(join(moduleFolder, '_index.scss'), generatedSass, 'utf8');
}
}
};
module.exports._checkForUndefined();
const SassClassFolder = join(Constants.Directories.LIBRARIES, 'sass', 'classes');
if (!existsSync(SassClassFolder)) {
_generateSassClasses();
module.exports._generateSassClasses();
} else {
log(_module, _submodule, null, `Directory 'src\\.vizality\\libraries\\sass\\classes' already exists. Skipping file generation...`);
Util.Logger.log(_module, _submodule, null, `Directory 'src\\.vizality\\libraries\\sass\\classes' already exists. Skipping file generation...`);
}

@ -1,10 +1,10 @@
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const poo = require('./poo');
const attachments = {
...getModule('attachment'),
...getModule('members'),
...Webpack.getModule('attachment'),
...Webpack.getModule('members'),
iconasd: 'icon-man',
poo
};

@ -1,14 +1,14 @@
const { object: { removeEntriesByKey } } = require('@utilities');
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const Util = require('@util');
const attachments = require('./attachments');
const chat = {
...getModule('pie'),
...getModule('poop'),
textruler: getModule('emoji').textruler,
alpha: getModule('emoji').textrudler,
...removeEntriesByKey(getModule('chat'), 'chat'),
...Webpack.getModule('pie'),
...Webpack.getModule('poop'),
textruler: Webpack.getModule('emoji').textruler,
alpha: Webpack.getModule('emoji').textrudler,
...Util.Object.removeEntriesByKey(Webpack.getModule('chat'), 'chat'),
iconActiveLarge: 'iconActiveLarge-2nzn9z',
iconActiveMedium: 'iconActiveMedium-1UaEIR',
iconActiveMini: 'iconActiveMini-3PzjMn',

@ -1,8 +1,8 @@
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const plugins = {
...getModule('attachment'),
...getModule('members'),
...Webpack.getModule('attachment'),
...Webpack.getModule('members'),
test: 'iconActiveLarge-2nzn9z',
test2: 'iconActiveMedium-1UaEIR',
test3: 'iconActiveMini-3PzjMn',

@ -1,8 +1,8 @@
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const views = {
...getModule('attachment'),
...getModule('members')
...Webpack.getModule('attachment'),
...Webpack.getModule('members')
};
module.exports = views;

@ -1,13 +1,12 @@
/* eslint-disable jsdoc/require-returns *//* eslint-disable jsdoc/require-param */
const { DIR: { CACHE_DIR } } = require('@constants');
const { readFileSync, writeFileSync, existsSync, mkdirSync } = require('fs');
const { createHash } = require('crypto');
const watch = require('node-watch');
const { join } = require('path');
const watch = require('node-watch');
const Events = require('events');
const Constants = require('@constants');
// @todo: Schedule a cache cleanup?
/**
@ -25,7 +24,7 @@ class Compiler extends Events {
constructor (file) {
super();
this.file = file;
this.cacheDir = join(CACHE_DIR, this.constructor.name.toLowerCase());
this.cacheDir = join(Constants.Directories.CACHE, this.constructor.name.toLowerCase());
this.watcherEnabled = false;
this._watchers = {};
this._compiledOnce = {};

@ -1,12 +1,12 @@
const { promises: { readFile } } = require('fs');
const Compiler = require('./compiler');
const Compiler = require('./Compiler');
/**
* CSS compiler
* @extends Compiler
*/
class CSS extends Compiler {
module.exports = class CSS extends Compiler {
async compile () {
const css = await readFile(this.file, 'utf8');
if (this.watcherEnabled) { this._watchFiles(); }
@ -14,6 +14,4 @@ class CSS extends Compiler {
}
computeCacheKey () { return null; }
}
module.exports = CSS;
};

@ -1,12 +1,13 @@
const { readFileSync } = require('fs');
const sucrase = require('sucrase');
const Compiler = require('./compiler');
const Compiler = require('./Compiler');
/**
* JSX compiler
* @extends {Compiler}
* @extends Compiler
*/
class JSX extends Compiler {
module.exports = class JSX extends Compiler {
_compile () {
const jsx = readFileSync(this.file, 'utf8');
return sucrase.transform(jsx, {
@ -18,6 +19,4 @@ class JSX extends Compiler {
get _metadata () {
return `sucrase ${sucrase.getVersion()}`;
}
}
module.exports = JSX;
};

@ -1,14 +1,14 @@
const { promises: { readFile }, existsSync, statSync } = require('fs');
const { join, dirname } = require('path');
const Compiler = require('./compiler');
const sass = require('sass');
const Compiler = require('./Compiler');
/**
* SCSS compiler.
* @class
* @augments Compiler
* @extends Compiler
*/
class SCSS extends Compiler {
module.exports = class SCSS extends Compiler {
async listFiles () {
return [
this.file,
@ -128,6 +128,4 @@ class SCSS extends Compiler {
get _metadata () {
return `${sass.info}; Vizality import resolver v1`;
}
}
module.exports = SCSS;
};

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = class AsyncComponent extends React.PureComponent {
module.exports = class AsyncComponent extends Webpack.React.PureComponent {
constructor (props) {
super(props);
this.state = { Component: null };
@ -13,7 +13,7 @@ module.exports = class AsyncComponent extends React.PureComponent {
render () {
const { Component } = this.state;
if (Component) {
return React.createElement(Component, Object.assign({}, this.props, this.props._pass));
return Webpack.React.createElement(Component, Object.assign({}, this.props, this.props._pass));
}
return this.props._fallback || null;
}
@ -25,8 +25,8 @@ module.exports = class AsyncComponent extends React.PureComponent {
* @returns {AsyncComponent}
*/
static from (promise, fallback) {
return React.memo(
(props) => React.createElement(AsyncComponent, {
return Webpack.React.memo(
(props) => Webpack.React.createElement(AsyncComponent, {
_provider: () => promise,
_fallback: fallback,
...props

@ -1,8 +1,8 @@
const { joinClassNames } = require('@utilities');
const { React } = require('@webpack');
const Webpack = require('@webpack');
const Util = require('@util');
const Badge = React.memo(({ type, className, ...props }) =>
<div className={joinClassNames('vizality-badge', type, className)} {...props}></div>
const Badge = Webpack.React.memo(({ type, className, ...props }) =>
<div className={Util.Misc.joinClassNames('vizality-badge', type, className)} {...props}></div>
);
module.exports = Badge;

@ -1,7 +1,7 @@
const { dom: { waitForElement }, react: { getOwnerInstance } } = require('@utilities');
const { getModule, React, contextMenu: { closeContextMenu } } = require('@webpack');
const Webpack = require('@webpack');
const Util = require('@util');
module.exports = class ContextMenu extends React.PureComponent {
module.exports = class ContextMenu extends Webpack.React.PureComponent {
constructor (props) {
super(props);
this.state = {};
@ -27,11 +27,11 @@ module.exports = class ContextMenu extends React.PureComponent {
});
}
const { default: Menu, MenuGroup } = getModule('MenuGroup');
const { default: Menu, MenuGroup } = Webpack.getModule('MenuGroup');
return (
<Menu
navId={this.props.navId || `vz-${Math.random().toString(32).slice(2)}`}
onClose={closeContextMenu}
onClose={Webpack.contextMenu.closeContextMenu}
>
{this.props.itemGroups.map((items, i) => (
<MenuGroup>
@ -69,7 +69,7 @@ module.exports = class ContextMenu extends React.PureComponent {
}
renderButton (item, ctx) {
const { MenuItem } = getModule('MenuGroup');
const { MenuItem } = Webpack.getModule('MenuGroup');
return (
<MenuItem
id={item.id || `item-${ctx.group}-${ctx.depth}-${ctx.i}`}
@ -80,7 +80,7 @@ module.exports = class ContextMenu extends React.PureComponent {
subtext={item.subtext}
action={() => {
if (item.disabled) {
waitForElement('#app-mount > div[class] > div').then(app => getOwnerInstance(app).shake(600, 5));
Util.DOM.waitForElement('#app-mount > div[class] > div').then(app => Util.React.getOwnerInstance(app).shake(600, 5));
} else if (item.onClick) {
item.onClick();
}
@ -90,7 +90,7 @@ module.exports = class ContextMenu extends React.PureComponent {
}
renderCheckbox (item, ctx) {
const { MenuCheckboxItem } = getModule('MenuGroup');
const { MenuCheckboxItem } = Webpack.getModule('MenuGroup');
const elementKey = `active-${ctx.group}-${ctx.depth}-${ctx.i}`;
const isStandalone = !!ctx.standalone;
const active = this.state[elementKey] !== void 0
@ -112,7 +112,7 @@ module.exports = class ContextMenu extends React.PureComponent {
}
if (isStandalone) {
const el = e.target.closest('[role="menu"]');
setImmediate(() => getOwnerInstance(el).forceUpdate());
setImmediate(() => Util.React.getOwnerInstance(el).forceUpdate());
} else {
this.setState({ [elementKey]: newActive });
}
@ -122,8 +122,8 @@ module.exports = class ContextMenu extends React.PureComponent {
}
renderSlider (item, ctx) {
const { MenuControlItem } = getModule('MenuGroup');
const Slider = getModule(m => m.render && m.render.toString().includes('sliderContainer'));
const { MenuControlItem } = Webpack.getModule('MenuGroup');
const Slider = Webpack.getModule(m => m.render && m.render.toString().includes('sliderContainer'));
return (
<MenuControlItem
id={item.id || `item-${ctx.group}-${ctx.depth}-${ctx.i}`}
@ -144,7 +144,7 @@ module.exports = class ContextMenu extends React.PureComponent {
}
renderSubMenu (item, ctx) {
const { MenuItem } = getModule('MenuGroup');
const { MenuItem } = Webpack.getModule('MenuGroup');
const elementKey = `items-${ctx.group}-${ctx.depth}-${ctx.i}`;
let items = this.state[elementKey];
if (items === void 0) {

@ -1,10 +1,10 @@
const { getModule } = require('@webpack');
const Webpack = require('@webpack');
const AsyncComponent = require('./AsyncComponent');
const Divider = AsyncComponent.from((() => {
const { dividerDefault } = getModule('dividerDefault');
const { divider } = getModule(m => m.divider && Object.keys(m).length === 1);
const { dividerDefault } = Webpack.getModule('dividerDefault');
const { divider } = Webpack.getModule(m => m.divider && Object.keys(m).length === 1);
return () => <div className={`${divider} ${dividerDefault}`}/>;
})());

@ -1,9 +1,9 @@
const { joinClassNames } = require('@utilities');
const { React } = require('@webpack');
const Webpack = require('@webpack');
const Util = require('@util');
const Icon = React.memo(({ type, wrapperClassName, className, ...props }) =>
<div className={joinClassNames('vizality-icon-wrapper', wrapperClassName)}>
<icon className={joinClassNames('vizality-icon', type, className)} {...props}></icon>
const Icon = Webpack.React.memo(({ type, wrapperClassName, className, ...props }) =>
<div className={Util.Misc.joinClassNames('vizality-icon-wrapper', wrapperClassName)}>
<icon className={Util.Misc.joinClassNames('vizality-icon', type, className)} {...props}></icon>
</div>
);

@ -1,7 +1,7 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
// Btw have I told you I use Arch?
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 21" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 1024" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" {...props}>
<g fill="currentColor">
<path

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 21' {...props}>
<path
fill='none' stroke='currentColor' strokeLinecap='round' strokeLinejoin='round' strokeWidth='2'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' {...props}>
<path fill="none" d="M0 0h24v24H0z" />
<path

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<g fill="currentColor">
<path

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 245 240' {...props}>
<g fill='currentColor'>
<path d='M104.4 103.9c-5.7 0-10.2 5-10.2 11.1s4.6 11.1 10.2 11.1c5.7 0 10.2-5 10.2-11.1.1-6.1-4.5-11.1-10.2-11.1zM140.9 103.9c-5.7 0-10.2 5-10.2 11.1s4.6 11.1 10.2 11.1c5.7 0 10.2-5 10.2-11.1s-4.5-11.1-10.2-11.1z'/>

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill="currentColor"

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => {
const styles = {
regular: 'r',

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill='none' stroke='currentColor' strokeLinecap='round' strokeLinejoin='round' strokeWidth='2px'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill='currentColor'

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<g fill="none" fill-rule="evenodd">
<rect width="24" height="24"></rect>

@ -1,6 +1,6 @@
const { React } = require('@webpack');
const Webpack = require('@webpack');
module.exports = React.memo(
module.exports = Webpack.React.memo(
(props) => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
<path
fill="currentColor"

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save