publicServers react please.
This commit is contained in:
parent
b2bd611dee
commit
ae69111d41
|
@ -31,8 +31,8 @@ See this [gist](https://gist.github.com/ObserverOfTime/d7e60eb9aa7fe837545c8cb77
|
||||||
### Windows
|
### Windows
|
||||||
1. Download and extract this: https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip
|
1. Download and extract this: https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip
|
||||||
2. Rename `BetterDiscordApp-injector` to `app`.
|
2. Rename `BetterDiscordApp-injector` to `app`.
|
||||||
3. Go to `%localappdata%\Discord\`, and locate the directory with the largest version number (e.g. `app-0.0.306`).
|
3. Go to `%localappdata%\Discord\`, and locate the directory with the largest version number (e.g. `app-0.0.307`).
|
||||||
4. Within `app-0.0.306` navigate to `resources`.
|
4. Within `app-0.0.307` navigate to `resources`.
|
||||||
5. If an `app` folder already exists inside `resources`, delete it.
|
5. If an `app` folder already exists inside `resources`, delete it.
|
||||||
6. Move the `app` folder (the one you downloaded and renamed) inside of `resources`.
|
6. Move the `app` folder (the one you downloaded and renamed) inside of `resources`.
|
||||||
7. Fully quit Discord and restart it.
|
7. Fully quit Discord and restart it.
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,166 @@
|
||||||
|
import Utils from "./utils";
|
||||||
|
import v2 from "./v2";
|
||||||
|
import { uuidv4 } from "./distant";
|
||||||
|
import { timingSafeEqual } from "crypto";
|
||||||
|
|
||||||
|
export default new class Layers {
|
||||||
|
constructor(){
|
||||||
|
this.layers = []
|
||||||
|
window.Lightcord.BetterDiscord.Layers = this
|
||||||
|
}
|
||||||
|
|
||||||
|
get isInjected(){
|
||||||
|
return !!document.querySelector("div.Layers.injected")
|
||||||
|
}
|
||||||
|
|
||||||
|
inject(){
|
||||||
|
if(this.isInjected)return
|
||||||
|
let [
|
||||||
|
classNameLayers
|
||||||
|
] = [
|
||||||
|
Utils.removeDa(v2.WebpackModules.find(e => e.layers && e.layer).layers)
|
||||||
|
]
|
||||||
|
const layers = document.querySelector("."+classNameLayers);
|
||||||
|
if (!layers) return false;
|
||||||
|
const ReactInstance = Lightcord.Api.Utils.FindReact(layers, 1)
|
||||||
|
if(!ReactInstance)return layers
|
||||||
|
this.ReactInstance = ReactInstance
|
||||||
|
let render = ReactInstance.render
|
||||||
|
ReactInstance.render = () => {
|
||||||
|
let returnValue = render.call(ReactInstance)
|
||||||
|
let classList = returnValue.props.children[1].props.className.split(" ")
|
||||||
|
classList.push("Layers")
|
||||||
|
classList.push("injected")
|
||||||
|
returnValue.props.children[1].props.className = classList.join(" ")
|
||||||
|
|
||||||
|
this.layers.forEach(layer => {
|
||||||
|
returnValue.props.children[1].props.children.push(layer[1])
|
||||||
|
})
|
||||||
|
|
||||||
|
return returnValue
|
||||||
|
}
|
||||||
|
ReactInstance.forceUpdate()
|
||||||
|
}
|
||||||
|
|
||||||
|
createLayer(children, props = {}){
|
||||||
|
let id = uuidv4()
|
||||||
|
let layer = null
|
||||||
|
this.layers.push([id, <Layer {...props} getLayer={lay => {
|
||||||
|
layer = lay
|
||||||
|
}} key={id} id={id} remove={() => {
|
||||||
|
let index = this.layers.findIndex(e => e[0] === id)
|
||||||
|
if(index === -1)return
|
||||||
|
this.layers.splice(index, 1)
|
||||||
|
layer = null
|
||||||
|
if(this.ReactInstance)this.ReactInstance.forceUpdate()
|
||||||
|
this.inject()
|
||||||
|
}}>{children}</Layer>])
|
||||||
|
if(this.ReactInstance)this.ReactInstance.forceUpdate()
|
||||||
|
this.inject()
|
||||||
|
return {
|
||||||
|
remove: () => {
|
||||||
|
if(!layer){
|
||||||
|
let index = this.layers.findIndex(e => e[0] === id)
|
||||||
|
if(index === -1)return
|
||||||
|
this.layers.splice(index, 1)
|
||||||
|
layer = null
|
||||||
|
if(this.ReactInstance)this.ReactInstance.forceUpdate()
|
||||||
|
this.inject()
|
||||||
|
}else{
|
||||||
|
layer.remove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let LayerModules
|
||||||
|
export class Layer extends React.Component {
|
||||||
|
constructor(){
|
||||||
|
super(...arguments)
|
||||||
|
this.state = {
|
||||||
|
animation: new this.modules[0].default.Value(0)
|
||||||
|
}
|
||||||
|
this.props.getLayer(this)
|
||||||
|
this.keydown = this.keydown.bind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
keydown(e){
|
||||||
|
if (e.which === 27) {
|
||||||
|
this.remove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get modules(){
|
||||||
|
return LayerModules || (LayerModules = [
|
||||||
|
v2.WebpackModules.find(e => e.default && e.default.Value && e.default.div)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount(){
|
||||||
|
window.removeEventListener("keydown", this.keydown)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount(ev){
|
||||||
|
window.addEventListener("keydown", this.keydown)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove(){
|
||||||
|
this.props.remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillEnter(ev){
|
||||||
|
this.modules[0].default.timing(this.state.animation, {
|
||||||
|
toValue: 1,
|
||||||
|
duration: 100
|
||||||
|
}).start(ev)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillLeave(ev){
|
||||||
|
this.modules[0].default.timing(this.state.animation, {
|
||||||
|
toValue: 0,
|
||||||
|
duration: 100
|
||||||
|
}).start(ev)
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let interpolation = this.state.animation.interpolate({
|
||||||
|
inputRange: [0, 1],
|
||||||
|
outputRange: [1.07, 1]
|
||||||
|
})
|
||||||
|
let style = {
|
||||||
|
opacity: this.state.animation,
|
||||||
|
transform: [{
|
||||||
|
scale: interpolation
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
let Div = this.modules[0].default.div
|
||||||
|
return <Div className={[__SECRET_EMOTION__.css({
|
||||||
|
backgroundColor:"var(--background-primary)",
|
||||||
|
position: "absolute",
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
left: 0,
|
||||||
|
display: "flex",
|
||||||
|
overflow: "hidden",
|
||||||
|
WebkitBoxOrient: "vertical",
|
||||||
|
WebkitBoxDirection: "normal",
|
||||||
|
msFlexDirection: "column",
|
||||||
|
flexDirection: "column",
|
||||||
|
zIndex: 101
|
||||||
|
}),process.platform==="win32"?__SECRET_EMOTION__.css({
|
||||||
|
top: "-22px",
|
||||||
|
paddingTop: "22px"
|
||||||
|
}):null,...(this.props.className?this.props.className.split(" "):[])].filter(e=>e).join(" ") || null} style={style}>
|
||||||
|
{this.props.children(() => {
|
||||||
|
this.remove()
|
||||||
|
})}
|
||||||
|
</Div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Layer.defaultProps = {
|
||||||
|
id: null,
|
||||||
|
children: null
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ import Utils from "./utils";
|
||||||
import DOM from "./domtools";
|
import DOM from "./domtools";
|
||||||
|
|
||||||
import V2C_PublicServers from "../ui/publicservers/publicServers";
|
import V2C_PublicServers from "../ui/publicservers/publicServers";
|
||||||
import Layer from "../ui/publicservers/layer";
|
import Layers from "./Layers";
|
||||||
|
|
||||||
export default new class V2_PublicServers {
|
export default new class V2_PublicServers {
|
||||||
|
|
||||||
|
@ -14,38 +14,10 @@ export default new class V2_PublicServers {
|
||||||
window.Lightcord.BetterDiscord.V2_PublicServers = this
|
window.Lightcord.BetterDiscord.V2_PublicServers = this
|
||||||
}
|
}
|
||||||
|
|
||||||
get component() {
|
|
||||||
return BDV2.react.createElement(Layer, {rootId: "pubslayerroot", id: "pubslayer"}, BDV2.react.createElement(V2C_PublicServers, {rootId: "pubslayerroot"}));
|
|
||||||
}
|
|
||||||
|
|
||||||
get root() {
|
|
||||||
const _root = document.getElementById("pubslayerroot");
|
|
||||||
if (!_root) {
|
|
||||||
if (!this.injectRoot()) return null;
|
|
||||||
return this.root;
|
|
||||||
}
|
|
||||||
return _root;
|
|
||||||
}
|
|
||||||
|
|
||||||
injectRoot() {
|
|
||||||
let [
|
|
||||||
classNameLayers
|
|
||||||
] = [
|
|
||||||
Utils.removeDa(BDModules.get(e => e.layers && e.layer)[0].layers)
|
|
||||||
]
|
|
||||||
const layers = DOM.query(".layers, ."+classNameLayers);
|
|
||||||
if (!layers) return false;
|
|
||||||
layers.append(DOM.createElement("<div id='pubslayerroot'>"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const root = this.root;
|
Layers.createLayer((close) => {
|
||||||
if (!root) {
|
return BDV2.react.createElement(V2C_PublicServers, {rootId: "pubslayerroot", close})
|
||||||
console.log("FAILED TO LOCATE ROOT: .layers");
|
})
|
||||||
return;
|
|
||||||
}
|
|
||||||
BDV2.reactDom.render(this.component, root);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get button() {
|
get button() {
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
import BDV2 from "../../modules/v2";
|
|
||||||
import DOM from "../../modules/domtools";
|
|
||||||
|
|
||||||
export default class V2C_Layer extends BDV2.reactComponent {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.keyupListener = this.keyupListener.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
keyupListener(e) {
|
|
||||||
if (e.which === 27) {
|
|
||||||
BDV2.reactDom.unmountComponentAtNode(this.refs.root.parentNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
window.addEventListener("keyup", this.keyupListener);
|
|
||||||
|
|
||||||
const thisNode = DOM.query(`#${this.props.id}`);
|
|
||||||
DOM.animate({
|
|
||||||
duration: 200,
|
|
||||||
update: function(progress) {
|
|
||||||
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
|
|
||||||
thisNode.style.opacity = progress;
|
|
||||||
if (progress == 1) {
|
|
||||||
setImmediate(() => {
|
|
||||||
thisNode.style.transform = "";
|
|
||||||
thisNode.style.opacity = "";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
window.removeEventListener("keyup", this.keyupListener);
|
|
||||||
|
|
||||||
const thisNode = DOM.query(`#${this.props.id}`);
|
|
||||||
DOM.animate({
|
|
||||||
duration: 200,
|
|
||||||
update: function(progress) {
|
|
||||||
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
|
|
||||||
thisNode.style.opacity = 1 - progress;
|
|
||||||
if (progress == 1) {
|
|
||||||
setImmediate(() => {
|
|
||||||
thisNode.remove();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const layer = DOM.query(".publicServersOpen");
|
|
||||||
layer.classList.remove("publicServersOpen");
|
|
||||||
DOM.animate({
|
|
||||||
duration: 200,
|
|
||||||
update: function(progress) {
|
|
||||||
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
|
|
||||||
layer.style.opacity = progress;
|
|
||||||
if (progress == 1) {
|
|
||||||
setImmediate(() => {
|
|
||||||
layer.style.transform = "";
|
|
||||||
layer.style.opacity = "";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillMount() {
|
|
||||||
const layer = DOM.query("[class*=\"layer-\"]");
|
|
||||||
layer.classList.add("publicServersOpen");
|
|
||||||
DOM.animate({
|
|
||||||
duration: 200,
|
|
||||||
update: function(progress) {
|
|
||||||
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
|
|
||||||
layer.style.opacity = 1 - progress;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return BDV2.react.createElement(
|
|
||||||
"div",
|
|
||||||
{className: "layer bd-layer "+BDModules.get(e => e.layer && e.animating)[0].layer, id: this.props.id, ref: "root", style: {opacity: 0, transform: "scale(1.1) translateZ(0px)"}},
|
|
||||||
this.props.children
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,435 +1,450 @@
|
||||||
import BDV2 from "../../modules/v2";
|
import BDV2 from "../../modules/v2";
|
||||||
|
|
||||||
import Tools from "../tools";
|
import Tools from "../tools";
|
||||||
import SettingsTitle from "../settingsTitle";
|
import SettingsTitle from "../settingsTitle";
|
||||||
import TabBarSeparator from "../tabBarSeparator";
|
import TabBarSeparator from "../tabBarSeparator";
|
||||||
import TabBarHeader from "../tabBarHeader";
|
import TabBarHeader from "../tabBarHeader";
|
||||||
import TabBarItem from "../tabBarItem";
|
import TabBarItem from "../tabBarItem";
|
||||||
|
|
||||||
import ServerCard from "./serverCard";
|
import ServerCard from "./serverCard";
|
||||||
import SidebarView from "./sidebarView";
|
import SidebarView from "./sidebarView";
|
||||||
|
|
||||||
export default class V2C_PublicServers extends BDV2.reactComponent {
|
export default class V2C_PublicServers extends BDV2.reactComponent {
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.setInitialState();
|
this.setInitialState();
|
||||||
this.close = this.close.bind(this);
|
this.close = this.close.bind(this);
|
||||||
this.changeCategory = this.changeCategory.bind(this);
|
this.changeCategory = this.changeCategory.bind(this);
|
||||||
this.search = this.search.bind(this);
|
this.search = this.search.bind(this);
|
||||||
this.searchKeyDown = this.searchKeyDown.bind(this);
|
this.searchKeyDown = this.searchKeyDown.bind(this);
|
||||||
this.checkConnection = this.checkConnection.bind(this);
|
this.checkConnection = this.checkConnection.bind(this);
|
||||||
this.join = this.join.bind(this);
|
this.join = this.join.bind(this);
|
||||||
this.connect = this.connect.bind(this);
|
this.connect = this.connect.bind(this);
|
||||||
|
|
||||||
this.GuildStore = BDV2.WebpackModules.findByUniqueProperties(["getGuilds"]);
|
this.GuildStore = BDV2.WebpackModules.findByUniqueProperties(["getGuilds"]);
|
||||||
this.AvatarDefaults = BDV2.WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
|
this.AvatarDefaults = BDV2.WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
|
||||||
this.InviteActions = BDV2.WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
this.InviteActions = BDV2.WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
||||||
this.SortedGuildStore = BDV2.WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
|
this.SortedGuildStore = BDV2.WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.checkConnection();
|
this.checkConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
setInitialState() {
|
setInitialState() {
|
||||||
this.state = {
|
this.state = {
|
||||||
selectedCategory: -1,
|
selectedCategory: -1,
|
||||||
title: "Loading...",
|
title: "Loading...",
|
||||||
loading: true,
|
loading: true,
|
||||||
servers: [],
|
servers: [],
|
||||||
next: null,
|
next: null,
|
||||||
connection: {
|
connection: {
|
||||||
state: 0,
|
state: 0,
|
||||||
user: null
|
user: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
BDV2.reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
|
this.props.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
search(query, clear) {
|
search(query, clear) {
|
||||||
const self = this;
|
const self = this;
|
||||||
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
|
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
|
||||||
method: "get"
|
method: "get"
|
||||||
}).then(async res => {
|
}).then(async res => {
|
||||||
if(res.status !== 200)throw await res.text()
|
if(res.status !== 200)throw await res.text()
|
||||||
let data = await res.json()
|
let data = await res.json()
|
||||||
|
|
||||||
let servers = data.results.reduce((arr, server) => {
|
let servers = data.results.reduce((arr, server) => {
|
||||||
server.joined = false;
|
server.joined = false;
|
||||||
arr.push(server);
|
arr.push(server);
|
||||||
// arr.push(<ServerCard server={server} join={self.join}/>);
|
// arr.push(<ServerCard server={server} join={self.join}/>);
|
||||||
return arr;
|
return arr;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!clear) {
|
if (!clear) {
|
||||||
servers = self.state.servers.concat(servers);
|
servers = self.state.servers.concat(servers);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//servers.unshift(self.bdServer);
|
//servers.unshift(self.bdServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
let end = data.size + data.from;
|
let end = data.size + data.from;
|
||||||
data.next = `?from=${end}`;
|
data.next = `?from=${end}`;
|
||||||
if (self.state.term) data.next += `&term=${self.state.term}`;
|
if (self.state.term) data.next += `&term=${self.state.term}`;
|
||||||
if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
||||||
if (end >= data.total) {
|
if (end >= data.total) {
|
||||||
end = data.total;
|
end = data.total;
|
||||||
data.next = null;
|
data.next = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;
|
let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;
|
||||||
if (self.state.term) title += ` for ${self.state.term}`;
|
if (self.state.term) title += ` for ${self.state.term}`;
|
||||||
|
|
||||||
self.setState({
|
self.setState({
|
||||||
loading: false,
|
loading: false,
|
||||||
title: title,
|
title: title,
|
||||||
servers: servers,
|
servers: servers,
|
||||||
next: data.next
|
next: data.next
|
||||||
});
|
});
|
||||||
|
|
||||||
if (clear) {
|
if (clear) {
|
||||||
//console.log(self);
|
//console.log(self);
|
||||||
self.refs.sbv.refs.contentScroller.scrollTop = 0;
|
self.refs.sbv.refs.contentScroller.scrollTop = 0;
|
||||||
}
|
}
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
return self.setState({
|
return self.setState({
|
||||||
loading: false,
|
loading: false,
|
||||||
title: "Failed to load servers. Check console for details"
|
title: "Failed to load servers. Check console for details"
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async join(serverCard) {
|
async join(serverCard) {
|
||||||
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
|
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
|
||||||
|
|
||||||
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`,{
|
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`,{
|
||||||
method: "GET",
|
method: "GET",
|
||||||
credentials: "include",
|
credentials: "include",
|
||||||
mode: "cors",
|
mode: "cors",
|
||||||
headers: {
|
headers: {
|
||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
serverCard.setState({joined: true});
|
serverCard.setState({joined: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
connect() {
|
connect() {
|
||||||
const self = this;
|
const self = this;
|
||||||
const options = self.windowOptions;
|
const options = self.windowOptions;
|
||||||
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
|
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
|
||||||
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
|
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
|
||||||
|
|
||||||
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
|
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
|
||||||
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
|
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
|
||||||
self.joinWindow.webContents.on("did-navigate", (event, url) => {
|
self.joinWindow.webContents.on("did-navigate", (event, url) => {
|
||||||
if (url != "https://auth.discordservers.com/info") return;
|
if (url != "https://auth.discordservers.com/info") return;
|
||||||
self.joinWindow.close();
|
self.joinWindow.close();
|
||||||
self.checkConnection();
|
self.checkConnection();
|
||||||
});
|
});
|
||||||
self.joinWindow.loadURL(url);
|
self.joinWindow.loadURL(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
get windowOptions() {
|
get windowOptions() {
|
||||||
return {
|
return {
|
||||||
width: 500,
|
width: 500,
|
||||||
height: 550,
|
height: 550,
|
||||||
backgroundColor: "#282b30",
|
backgroundColor: "#282b30",
|
||||||
show: true,
|
show: true,
|
||||||
resizable: false,
|
resizable: false,
|
||||||
maximizable: false,
|
maximizable: false,
|
||||||
minimizable: false,
|
minimizable: false,
|
||||||
alwaysOnTop: true,
|
alwaysOnTop: true,
|
||||||
frame: false,
|
frame: false,
|
||||||
center: false,
|
center: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: false
|
nodeIntegration: false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
get bdServer() {
|
get bdServer() {
|
||||||
const server = {
|
const server = {
|
||||||
name: "BetterDiscord",
|
name: "BetterDiscord",
|
||||||
online: "7500+",
|
online: "30000+",
|
||||||
members: "20000+",
|
members: "70000+",
|
||||||
categories: ["community", "programming", "support"],
|
categories: ["community", "programming", "support"],
|
||||||
description: "Official BetterDiscord server for support etc",
|
description: "Official BetterDiscord server for support etc",
|
||||||
identifier: "86004744966914048",
|
identifier: "86004744966914048",
|
||||||
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
|
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
|
||||||
nativejoin: true,
|
nativejoin: true,
|
||||||
invite_code: "0Tmfo5ZbORCRqbAd",
|
invite_code: "0Tmfo5ZbORCRqbAd",
|
||||||
pinned: true
|
pinned: true
|
||||||
};
|
};
|
||||||
const server2 = {
|
const server2 = {
|
||||||
name: "Lightcord",
|
name: "Lightcord",
|
||||||
online: "30+",
|
online: "100+",
|
||||||
members: "50+",
|
members: "300+",
|
||||||
categories: ["community", "programming", "support"],
|
categories: ["community", "programming", "support"],
|
||||||
description: "Official Lightcord server for support etc",
|
description: "Official Lightcord server for support etc",
|
||||||
identifier: "86004744966914048",
|
identifier: "705908350218666117",
|
||||||
iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4",
|
iconUrl: "https://github.com/lightcord.png",
|
||||||
nativejoin: true,
|
nativejoin: true,
|
||||||
invite_code: "7eFff2A",
|
invite_code: "7eFff2A",
|
||||||
pinned: true
|
pinned: true
|
||||||
};
|
};
|
||||||
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
||||||
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
||||||
return [
|
return [
|
||||||
BDV2.react.createElement(ServerCard, {server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]}),
|
BDV2.react.createElement(ServerCard, {server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]}),
|
||||||
BDV2.react.createElement(ServerCard, {server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]})
|
BDV2.react.createElement(ServerCard, {server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]})
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
get endPoint() {
|
get endPoint() {
|
||||||
return "https://search.discordservers.com";
|
return "https://search.discordservers.com";
|
||||||
}
|
}
|
||||||
|
|
||||||
get joinEndPoint() {
|
get joinEndPoint() {
|
||||||
return "https://j.discordservers.com";
|
return "https://j.discordservers.com";
|
||||||
}
|
}
|
||||||
|
|
||||||
get connectEndPoint() {
|
get connectEndPoint() {
|
||||||
return "https://join.discordservers.com/connect";
|
return "https://join.discordservers.com/connect";
|
||||||
}
|
}
|
||||||
|
|
||||||
async checkConnection() {
|
async checkConnection() {
|
||||||
const self = this;
|
const self = this;
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`https://auth.discordservers.com/info`,{
|
const response = await fetch(`https://auth.discordservers.com/info`,{
|
||||||
method: "GET",
|
method: "GET",
|
||||||
credentials: "include",
|
credentials: "include",
|
||||||
mode: "cors",
|
mode: "cors",
|
||||||
headers: {
|
headers: {
|
||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const data = await response.json();
|
const text = await response.text()
|
||||||
self.setState({
|
if(!text){
|
||||||
selectedCategory: 0,
|
self.setState({
|
||||||
connection: {
|
title: "Not connected to discordservers.com!",
|
||||||
state: 2,
|
loading: true,
|
||||||
user: data
|
selectedCategory: -1,
|
||||||
}
|
connection: {
|
||||||
});
|
state: 1,
|
||||||
self.search("", true);
|
user: null
|
||||||
}
|
}
|
||||||
catch (error) {
|
});
|
||||||
console.error(error)
|
return
|
||||||
self.setState({
|
}
|
||||||
title: "Not connected to discordservers.com!",
|
const data = JSON.parse(text)
|
||||||
loading: true,
|
self.setState({
|
||||||
selectedCategory: -1,
|
selectedCategory: 0,
|
||||||
connection: {
|
connection: {
|
||||||
state: 1,
|
state: 2,
|
||||||
user: null
|
user: data
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
self.search("", true);
|
||||||
}
|
}
|
||||||
|
catch (error) {
|
||||||
render() {
|
console.error(error)
|
||||||
return BDV2.react.createElement(SidebarView, {ref: "sbv"}, this.component);
|
self.setState({
|
||||||
}
|
title: "Not connected to discordservers.com!",
|
||||||
|
loading: true,
|
||||||
get component() {
|
selectedCategory: -1,
|
||||||
return {
|
connection: {
|
||||||
sidebar: {
|
state: 1,
|
||||||
component: this.sidebar
|
user: null
|
||||||
},
|
}
|
||||||
content: {
|
});
|
||||||
component: this.content
|
}
|
||||||
},
|
}
|
||||||
tools: {
|
|
||||||
component: BDV2.react.createElement(Tools, {key: "pt", ref: "tools", onClick: this.close})
|
render() {
|
||||||
}
|
return BDV2.react.createElement("div", {id: "pubslayerroot"},
|
||||||
};
|
BDV2.react.createElement("div", {id: "pubslayer"}, BDV2.react.createElement(SidebarView, {ref: "sbv"}, this.component))
|
||||||
}
|
);
|
||||||
|
}
|
||||||
get sidebar() {
|
|
||||||
return BDV2.react.createElement(
|
get component() {
|
||||||
"div",
|
return {
|
||||||
{className: "sidebar", key: "ps"},
|
sidebar: {
|
||||||
BDV2.react.createElement(
|
component: this.sidebar
|
||||||
"div",
|
},
|
||||||
{className: "ui-tab-bar SIDE"},
|
content: {
|
||||||
BDV2.react.createElement(
|
component: this.content
|
||||||
"div",
|
},
|
||||||
{className: "ui-tab-bar-header", style: {fontSize: "16px"}},
|
tools: {
|
||||||
"Public Servers"
|
component: BDV2.react.createElement(Tools, {key: "pt", ref: "tools", onClick: this.close})
|
||||||
),
|
}
|
||||||
BDV2.react.createElement(TabBarSeparator, null),
|
};
|
||||||
this.searchInput,
|
}
|
||||||
BDV2.react.createElement(TabBarSeparator, null),
|
|
||||||
BDV2.react.createElement(TabBarHeader, {text: "Categories"}),
|
get sidebar() {
|
||||||
this.categoryButtons.map((value, index) => {
|
return BDV2.react.createElement(
|
||||||
return BDV2.react.createElement(TabBarItem, {id: index, onClick: this.changeCategory, key: index, text: value, selected: this.state.selectedCategory === index});
|
"div",
|
||||||
}),
|
{className: "sidebar", key: "ps"},
|
||||||
BDV2.react.createElement(TabBarSeparator, null),
|
BDV2.react.createElement(
|
||||||
this.footer,
|
"div",
|
||||||
this.connection
|
{className: "ui-tab-bar SIDE"},
|
||||||
)
|
BDV2.react.createElement(
|
||||||
);
|
"div",
|
||||||
}
|
{className: "ui-tab-bar-header", style: {fontSize: "16px"}},
|
||||||
|
"Public Servers"
|
||||||
get searchInput() {
|
),
|
||||||
return BDV2.react.createElement(
|
BDV2.react.createElement(TabBarSeparator, null),
|
||||||
"div",
|
this.searchInput,
|
||||||
{className: "ui-form-item"},
|
BDV2.react.createElement(TabBarSeparator, null),
|
||||||
BDV2.react.createElement(
|
BDV2.react.createElement(TabBarHeader, {text: "Categories"}),
|
||||||
"div",
|
this.categoryButtons.map((value, index) => {
|
||||||
{className: "ui-text-input flex-vertical", style: {width: "172px", marginLeft: "10px"}},
|
return BDV2.react.createElement(TabBarItem, {id: index, onClick: this.changeCategory, key: index, text: value, selected: this.state.selectedCategory === index});
|
||||||
BDV2.react.createElement("input", {ref: "searchinput", onKeyDown: this.searchKeyDown, onChange: () => {}, type: "text", className: "input default", placeholder: "Search...", maxLength: "50"})
|
}),
|
||||||
)
|
BDV2.react.createElement(TabBarSeparator, null),
|
||||||
);
|
this.footer,
|
||||||
}
|
this.connection
|
||||||
|
)
|
||||||
searchKeyDown(e) {
|
);
|
||||||
const self = this;
|
}
|
||||||
if (self.state.loading || e.which !== 13) return;
|
|
||||||
self.setState({
|
get searchInput() {
|
||||||
loading: true,
|
return BDV2.react.createElement(
|
||||||
title: "Loading...",
|
"div",
|
||||||
term: e.target.value
|
{className: "ui-form-item"},
|
||||||
});
|
BDV2.react.createElement(
|
||||||
let query = `?term=${e.target.value}`;
|
"div",
|
||||||
if (self.state.selectedCategory !== 0) {
|
{className: "ui-text-input flex-vertical", style: {width: "172px", marginLeft: "10px"}},
|
||||||
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
BDV2.react.createElement("input", {ref: "searchinput", onKeyDown: this.searchKeyDown, onChange: () => {}, type: "text", className: "input default", placeholder: "Search...", maxLength: "50"})
|
||||||
}
|
)
|
||||||
self.search(query, true);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
get categoryButtons() {
|
searchKeyDown(e) {
|
||||||
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
|
const self = this;
|
||||||
}
|
if (self.state.loading || e.which !== 13) return;
|
||||||
|
self.setState({
|
||||||
changeCategory(id) {
|
loading: true,
|
||||||
const self = this;
|
title: "Loading...",
|
||||||
if (self.state.loading) return;
|
term: e.target.value
|
||||||
self.refs.searchinput.value = "";
|
});
|
||||||
self.setState({
|
let query = `?term=${e.target.value}`;
|
||||||
loading: true,
|
if (self.state.selectedCategory !== 0) {
|
||||||
selectedCategory: id,
|
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
||||||
title: "Loading...",
|
}
|
||||||
term: null
|
self.search(query, true);
|
||||||
});
|
}
|
||||||
if (id === 0) {
|
|
||||||
self.search("", true);
|
get categoryButtons() {
|
||||||
return;
|
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
|
||||||
}
|
}
|
||||||
self.search(`?category=${self.categoryButtons[id]}`, true);
|
|
||||||
}
|
changeCategory(id) {
|
||||||
|
const self = this;
|
||||||
get content() {
|
if (self.state.loading) return;
|
||||||
const self = this;
|
self.refs.searchinput.value = "";
|
||||||
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
self.setState({
|
||||||
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
loading: true,
|
||||||
if (self.state.connection.state === 1) return self.notConnected;
|
selectedCategory: id,
|
||||||
let columnModule = BDModules.get(e => e.contentColumnDefault)[0]
|
title: "Loading...",
|
||||||
return [BDV2.react.createElement(
|
term: null
|
||||||
"div",
|
});
|
||||||
{ref: "content", key: "pc", className: columnModule.contentColumn+" "+columnModule.contentColumn+" content-column default"},
|
if (id === 0) {
|
||||||
BDV2.react.createElement(SettingsTitle, {text: self.state.title}),
|
self.search("", true);
|
||||||
self.bdServer,
|
return;
|
||||||
self.state.servers.map((server) => {
|
}
|
||||||
return BDV2.react.createElement(ServerCard, {key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]});
|
self.search(`?category=${self.categoryButtons[id]}`, true);
|
||||||
}),
|
}
|
||||||
self.state.next && BDV2.react.createElement(
|
|
||||||
"button",
|
get content() {
|
||||||
{type: "button", onClick: () => {
|
const self = this;
|
||||||
if (self.state.loading) return;self.setState({loading: true}); self.search(self.state.next, false);
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
||||||
}, className: "ui-button filled brand small grow", style: {width: "100%", marginTop: "10px", marginBottom: "10px"}},
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
||||||
BDV2.react.createElement(
|
if (self.state.connection.state === 1) return self.notConnected;
|
||||||
"div",
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0]
|
||||||
{className: "ui-button-contents"},
|
return [BDV2.react.createElement(
|
||||||
self.state.loading ? "Loading" : "Load More"
|
"div",
|
||||||
)
|
{ref: "content", key: "pc", className: columnModule.contentColumn+" "+columnModule.contentColumn+" content-column default"},
|
||||||
),
|
BDV2.react.createElement(SettingsTitle, {text: self.state.title}),
|
||||||
self.state.servers.length > 0 && BDV2.react.createElement(SettingsTitle, {text: self.state.title})
|
self.bdServer,
|
||||||
)];
|
self.state.servers.map((server) => {
|
||||||
}
|
return BDV2.react.createElement(ServerCard, {key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]});
|
||||||
|
}),
|
||||||
get notConnected() {
|
self.state.next && BDV2.react.createElement(
|
||||||
const self = this;
|
"button",
|
||||||
//return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
|
{type: "button", onClick: () => {
|
||||||
let columnModule = BDModules.get(e => e.contentColumnDefault)[0]
|
if (self.state.loading) return;self.setState({loading: true}); self.search(self.state.next, false);
|
||||||
return [BDV2.react.createElement(
|
}, className: "ui-button filled brand small grow", style: {width: "100%", marginTop: "10px", marginBottom: "10px"}},
|
||||||
"div",
|
BDV2.react.createElement(
|
||||||
{key: "ncc", ref: "content", className: columnModule.contentColumn+" "+columnModule.contentColumn+" content-column default"},
|
"div",
|
||||||
BDV2.react.createElement(
|
{className: "ui-button-contents"},
|
||||||
"h2",
|
self.state.loading ? "Loading" : "Load More"
|
||||||
{className: "ui-form-title h2 margin-reset margin-bottom-20"},
|
)
|
||||||
"Not connected to discordservers.com!",
|
),
|
||||||
BDV2.react.createElement(
|
self.state.servers.length > 0 && BDV2.react.createElement(SettingsTitle, {text: self.state.title})
|
||||||
"button",
|
)];
|
||||||
{
|
}
|
||||||
onClick: self.connect,
|
|
||||||
type: "button",
|
get notConnected() {
|
||||||
className: "ui-button filled brand small grow",
|
const self = this;
|
||||||
style: {
|
//return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
|
||||||
display: "inline-block",
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0]
|
||||||
minHeight: "18px",
|
return [BDV2.react.createElement(
|
||||||
marginLeft: "10px",
|
"div",
|
||||||
lineHeight: "14px"
|
{key: "ncc", ref: "content", className: columnModule.contentColumn+" "+columnModule.contentColumn+" content-column default"},
|
||||||
}
|
BDV2.react.createElement(
|
||||||
},
|
"h2",
|
||||||
BDV2.react.createElement(
|
{className: "ui-form-title h2 margin-reset margin-bottom-20"},
|
||||||
"div",
|
"Not connected to discordservers.com!",
|
||||||
{className: "ui-button-contents"},
|
BDV2.react.createElement(
|
||||||
"Connect"
|
"button",
|
||||||
)
|
{
|
||||||
)
|
onClick: self.connect,
|
||||||
), self.bdServer
|
type: "button",
|
||||||
)];
|
className: "ui-button filled brand small grow",
|
||||||
}
|
style: {
|
||||||
|
display: "inline-block",
|
||||||
get footer() {
|
minHeight: "18px",
|
||||||
return BDV2.react.createElement(
|
marginLeft: "10px",
|
||||||
"div",
|
lineHeight: "14px"
|
||||||
{className: "ui-tab-bar-header"},
|
}
|
||||||
BDV2.react.createElement(
|
},
|
||||||
"a",
|
BDV2.react.createElement(
|
||||||
{href: "https://discordservers.com", target: "_blank"},
|
"div",
|
||||||
"Discordservers.com"
|
{className: "ui-button-contents"},
|
||||||
)
|
"Connect"
|
||||||
);
|
)
|
||||||
}
|
)
|
||||||
|
), self.bdServer
|
||||||
get connection() {
|
)];
|
||||||
const self = this;
|
}
|
||||||
const {connection} = self.state;
|
|
||||||
if (connection.state !== 2) return BDV2.react.createElement("span", null);
|
get footer() {
|
||||||
|
return BDV2.react.createElement(
|
||||||
return BDV2.react.createElement(
|
"div",
|
||||||
"span",
|
{className: "ui-tab-bar-header"},
|
||||||
null,
|
BDV2.react.createElement(
|
||||||
BDV2.react.createElement(TabBarSeparator, null),
|
"a",
|
||||||
BDV2.react.createElement(
|
{href: "https://discordservers.com", target: "_blank"},
|
||||||
"span",
|
"Discordservers.com"
|
||||||
{style: {color: "#b9bbbe", fontSize: "10px", marginLeft: "10px"}},
|
)
|
||||||
"Connected as: ",
|
);
|
||||||
`${connection.user.username}#${connection.user.discriminator}`
|
}
|
||||||
),
|
|
||||||
BDV2.react.createElement(
|
get connection() {
|
||||||
"div",
|
const self = this;
|
||||||
{style: {padding: "5px 10px 0 10px"}},
|
const {connection} = self.state;
|
||||||
BDV2.react.createElement(
|
if (connection.state !== 2) return BDV2.react.createElement("span", null);
|
||||||
"button",
|
|
||||||
{style: {width: "100%", minHeight: "20px"}, type: "button", className: "ui-button filled brand small grow"},
|
return BDV2.react.createElement(
|
||||||
BDV2.react.createElement(
|
"span",
|
||||||
"div",
|
null,
|
||||||
{className: "ui-button-contents", onClick: self.connect},
|
BDV2.react.createElement(TabBarSeparator, null),
|
||||||
"Reconnect"
|
BDV2.react.createElement(
|
||||||
)
|
"span",
|
||||||
)
|
{style: {color: "#b9bbbe", fontSize: "10px", marginLeft: "10px"}},
|
||||||
)
|
"Connected as: ",
|
||||||
);
|
`${connection.user.username}#${connection.user.discriminator}`
|
||||||
}
|
),
|
||||||
|
BDV2.react.createElement(
|
||||||
|
"div",
|
||||||
|
{style: {padding: "5px 10px 0 10px"}},
|
||||||
|
BDV2.react.createElement(
|
||||||
|
"button",
|
||||||
|
{style: {width: "100%", minHeight: "20px"}, type: "button", className: "ui-button filled brand small grow"},
|
||||||
|
BDV2.react.createElement(
|
||||||
|
"div",
|
||||||
|
{className: "ui-button-contents", onClick: self.connect},
|
||||||
|
"Reconnect"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = window["__SECRET_EMOTION__"]
|
|
@ -1238,6 +1238,12 @@
|
||||||
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"typescript": {
|
||||||
|
"version": "3.9.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
|
||||||
|
"integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"universalify": {
|
"universalify": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
"cross-spawn": "^7.0.3",
|
"cross-spawn": "^7.0.3",
|
||||||
"electron": "^8.4.0",
|
"electron": "^8.4.0",
|
||||||
"terser": "^4.7.0",
|
"terser": "^4.7.0",
|
||||||
|
"typescript": "^3.9.7",
|
||||||
"yazl": "^2.5.1"
|
"yazl": "^2.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue