Merge branch 'dev' into 'main'

Dev

See merge request illegitimate/illegitimate-bot!149
This commit is contained in:
2023-12-31 10:39:06 +00:00
30 changed files with 1133 additions and 222 deletions

View File

@@ -1,10 +1,13 @@
module.exports = {
"env": {
"node": true,
"commonjs": true,
"es2021": true
"es2021": true,
"browser": true
},
"extends": "eslint:recommended",
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"overrides": [
{
"env": {
@@ -18,9 +21,14 @@ module.exports = {
}
}
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest"
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
"indent": [
"error",
@@ -60,5 +68,7 @@ module.exports = {
"asyncArrow": "always"
}],
"comma-spacing": "error",
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/no-explicit-any": "off"
}
}

View File

@@ -3,4 +3,4 @@ FROM node:20.9.0-alpine3.18
COPY package.json ./
COPY yarn.lock ./
RUN yarn install
RUN yarn install --production

View File

@@ -12,8 +12,8 @@
"dev:build": "ts-node scripts/dev-deploy.ts",
"dev:delete": "ts-node scripts/delete-commands.ts",
"format": "prettier --write src/",
"lint": "eslint_d src",
"lint:fix": "eslint_d --fix src",
"lint": "eslint src",
"lint:fix": "eslint --fix src",
"prod:build": "ts-node scripts/deploy-commands.ts"
},
"author": "Taken",
@@ -26,13 +26,16 @@
"ioredis": "^5.3.2",
"mongoose": "^7.0.1",
"ms": "^2.1.3",
"pretty-ms": "^8.0.0"
"pretty-ms": "^8.0.0",
"typescript": "^5.3.3"
},
"devDependencies": {
"@types/ms": "^0.7.34",
"@types/node": "^20.10.5",
"@typescript-eslint/eslint-plugin": "^6.16.0",
"@typescript-eslint/parser": "^6.16.0",
"eslint": "^8.56.0",
"prettier": "^3.1.1",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
"ts-node": "^10.9.2"
}
}

View File

@@ -5,15 +5,15 @@ import env from "../src/utils/Env"
const rest = new REST({ version: "10" }).setToken(env.prod.token!)
const commands: RESTPutAPIApplicationCommandsJSONBody = []
const commandFiles = fs.readdirSync("./dist/src/commands").filter(file => file.endsWith(".js"))
const contentMenuCommands = fs.readdirSync("./dist/src/commands-contextmenu").filter(file => file.endsWith(".js"))
const commandFiles = fs.readdirSync("./src/commands").filter(file => file.endsWith(".ts"))
const contentMenuCommands = fs.readdirSync("./src/commands-contextmenu").filter(file => file.endsWith(".ts"))
for (const file of commandFiles) {
const command: Command = require(`../dist/src/commands/${file}`)
const command: Command = require(`../src/commands/${file}`)
commands.push(command.data.toJSON())
}
for (const file of contentMenuCommands) {
const command: Command = require(`../dist/src/commands-contextmenu/${file}`)
const command: Command = require(`../src/commands-contextmenu/${file}`)
commands.push(command.data.toJSON())
}

View File

@@ -35,7 +35,8 @@ export = {
.setName("ign")
.setDescription("The player's IGN.")
.setRequired(true),
),
)
.setDMPermission(false),
async execute(interaction) {
await interaction.deferReply({})
@@ -285,13 +286,6 @@ export = {
const hypixelExp = player.networkExp || 0
const level = hypixelLevel(hypixelExp)
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
embeds: [
{
@@ -311,8 +305,8 @@ export = {
url: head!,
},
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon!,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: true })!,
},
fields: statsFields,
},

View File

@@ -42,7 +42,7 @@ export = {
async execute(interaction) {
await interaction.deferReply()
const user = interaction.member as GuildMember
const user = interaction.options.getMember("user") as GuildMember
const ign = interaction.options.getString("ign")
const mod = interaction.user
const embedColor = Number(color.replace("#", "0x"))

View File

@@ -79,7 +79,8 @@ export = {
"The amount of guild members to show. [Default: 10]",
),
),
),
)
.setDMPermission(false),
async execute(interaction) {
const subcommand = interaction.options.getSubcommand()
@@ -100,21 +101,14 @@ export = {
return
}
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: true })
await interaction.reply({
embeds: [
{
description: "This command is currently under development",
color: embedColor,
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon!,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: false }) || undefined,
},
},
],

View File

@@ -191,13 +191,6 @@ async function guildInfo(
averageGuildMembersWeeklyXPUnformatted,
)
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
embeds: [
{
@@ -240,8 +233,8 @@ async function guildInfo(
],
color: embedColor,
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon!,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: false }) || undefined,
},
},
],

View File

@@ -167,13 +167,6 @@ async function guildMember(
":" +
guildMemberJoinSeconds
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
embeds: [
{
@@ -210,8 +203,8 @@ async function guildMember(
},
],
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon!,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: false })!,
},
},
],

View File

@@ -263,12 +263,6 @@ async function guildTop(
}
})
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
const cacheStatusText = cacheStatus ? " | [Cache]" : ""
await interaction.editReply({
@@ -285,8 +279,8 @@ async function guildTop(
color: embedColor,
fields: newList,
footer: {
text: footerText + " | " + devMessage + cacheStatusText,
icon_url: footerIcon!,
text: interaction.guild!.name + " | " + devMessage + cacheStatusText,
icon_url: interaction.guild!.iconURL({ forceStatic: false })!,
},
},
],

View File

@@ -12,7 +12,7 @@ export = {
data: new SlashCommandBuilder()
.setName("help")
.setDescription("List's all commands usable by a member")
.setDMPermission(true),
.setDMPermission(false),
async execute(interaction, client) {
await interaction.deferReply({ ephemeral: true })
@@ -57,12 +57,6 @@ export = {
}
const embedColor = Number(color.replace("#", "0x"))
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
embeds: [
@@ -72,13 +66,11 @@ export = {
fields: commandList,
color: embedColor,
thumbnail: {
url: interaction?.guild?.iconURL({
forceStatic: true,
})!,
url: interaction.guild!.iconURL({ forceStatic: true, })!,
},
footer: {
icon_url: footerIcon!,
text: footerText + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: false})!,
text: interaction.guild!.name + " | " + devMessage,
},
},
],

View File

@@ -12,7 +12,8 @@ export = {
data: new SlashCommandBuilder()
.setName("instructions")
.setDescription("Instructions for verification")
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
.setDMPermission(false),
async execute(interaction) {
const embedColor = Number(color.replace("#", "0x"))

View File

@@ -11,28 +11,22 @@ export = {
data: new SlashCommandBuilder()
.setName("ping")
.setDescription("Get's the bot's ping."),
.setDescription("Get's the bot's ping.")
.setDMPermission(false),
async execute(interaction, client) {
await interaction.deferReply()
const embedColor = Number(color.replace("#", "0x"))
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
embeds: [
{
description: "Ping of the bot is " + client.ws.ping + "ms.",
color: embedColor,
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon || undefined,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild?.iconURL({ forceStatic: false }) || undefined,
},
timestamp: new Date().toISOString(),
},

View File

@@ -20,20 +20,13 @@ export = {
data: new SlashCommandBuilder()
.setName("reqs")
.setDescription("Displays the requirements for the guild."),
.setDescription("Displays the requirements for the guild.")
.setDMPermission(false),
async execute(interaction) {
await interaction.deferReply({ ephemeral: true })
const embedColor = Number(color.replace("#", "0x"))
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
await interaction.editReply({
await interaction.reply({
embeds: [
{
title: "Requirements",
@@ -42,9 +35,7 @@ export = {
color: embedColor,
thumbnail: {
url:
interaction?.guild?.iconURL({
forceStatic: false,
}) || "",
interaction?.guild?.iconURL({ forceStatic: false, }) || "",
},
fields: [
{
@@ -78,8 +69,8 @@ export = {
},
],
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon || undefined,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild!.iconURL({ forceStatic: false }) || undefined,
},
},
],

View File

@@ -1,26 +1,6 @@
import verify = require("../../schemas/verifySchema")
import { color, hypixelGuildID } from "../../../config/options.json"
import {
gm,
manager,
moderator,
beast,
elite,
member,
guildRole,
guildStaff,
defaultMember,
} from "../../../config/roles.json"
const removeThese = [
gm,
manager,
moderator,
beast,
elite,
member,
guildRole,
guildStaff,
]
import removeRoles from "../../utils/functions/rolesmanage"
import { ChatInputCommandInteraction, GuildMember } from "discord.js"
import env from "../../utils/Env"
import { getGuild } from "../../utils/Hypixel"
@@ -31,13 +11,13 @@ export async function updateDiscordRoles(
): Promise<void> {
const discordMember = interaction.member as GuildMember
const embedColor = Number(color.replace("#", "0x"))
await interaction.deferReply({ ephemeral: true })
await interaction.deferReply()
if (discordMember.user.id !== env.prod.dev) {
await interaction.editReply({
embeds: [
{
description: `You do not have permission to use this command.`,
description: "You do not have permission to use this command.",
color: embedColor,
},
],
@@ -66,6 +46,17 @@ export async function updateDiscordRoles(
})
const guildMemberIDs = hypixelGuildMembers.map(gmember => gmember.uuid)
const allVerifiedUsers = (await verify.find({})) as {
userID: string
uuid: string
}[]
const verifiedUsers = allVerifiedUsers.map(user => {
return {
userID: user.userID,
uuid: user.uuid,
}
})
await interaction.editReply({
embeds: [
{
@@ -76,19 +67,23 @@ export async function updateDiscordRoles(
})
for (const gmember of guildMembers) {
const memberData = await verify.findOne({ userID: gmember.id })
const memberData = verifiedUsers.find(
user => user.userID === gmember.id,
)
if (!memberData) {
const rolesToremove = removeRoles("default").rolesToRemove
await gmember.member.roles.remove(
removeThese,
rolesToremove,
"Updating all discord members",
)
continue
}
if (!guildMemberIDs.includes(memberData?.uuid || "none")) {
const rolesToremove = removeRoles("default").rolesToRemove
await gmember.member.roles.remove(
removeThese,
rolesToremove,
"Updating all discord members",
)
continue
@@ -99,98 +94,95 @@ export async function updateDiscordRoles(
console.log("Updating roles for " + gmember.member.user.username)
if (guildMemberRank === "Guild Master") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== gm && role !== guildStaff && role !== guildRole)
// await gmember.member.roles.remove(rolesToRemove, "Updating all discord members")
// await gmember.member.roles.add( gm, "Updating all discord members",)
// await gmember.member.roles.add( guildStaff, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("gm")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
gm,
"Updating all discord members",
)
await gmember.member.roles.add(
guildStaff,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
} else if (guildMemberRank === "Manager") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== manager && role !== guildStaff && role !== guildRole)
// await gmember.member.roles.remove( rolesToRemove, "Updating all discord members",)
// await gmember.member.roles.add( manager, "Updating all discord members",)
// await gmember.member.roles.add( guildStaff, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("manager")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
manager,
"Updating all discord members",
)
await gmember.member.roles.add(
guildStaff,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
} else if (guildMemberRank === "Moderator") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== moderator && role !== guildStaff && role !== guildRole)
// await gmember.member.roles.remove( rolesToRemove, "Updating all discord members",)
// await gmember.member.roles.add( moderator, "Updating all discord members",)
// await gmember.member.roles.add( guildStaff, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("moderator")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
moderator,
"Updating all discord members",
)
await gmember.member.roles.add(
guildStaff,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
} else if (guildMemberRank === "Beast") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== beast && role !== guildRole)
// await gmember.member.roles.remove( rolesToRemove, "Updating all discord members",)
// await gmember.member.roles.add( beast, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("beast")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
beast,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
} else if (guildMemberRank === "Elite") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== elite && role !== guildRole)
// await gmember.member.roles.remove( rolesToRemove, "Updating all discord members",)
// await gmember.member.roles.add( elite, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("elite")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
elite,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
} else if (guildMemberRank === "Member") {
await gmember.member.roles.remove(
removeThese,
// const rolesToRemove = removeThese.filter(role => role !== member && role !== guildRole)
// await gmember.member.roles.remove( rolesToRemove, "Updating all discord members",)
// await gmember.member.roles.add( member, "Updating all discord members",)
// await gmember.member.roles.add( guildRole, "Updating all discord members",)
const rolesmanage = removeRoles("member")
gmember.member.roles.remove(
rolesmanage.rolesToRemove,
"Updating all discord members",
)
await gmember.member.roles.add(
member,
"Updating all discord members",
)
await gmember.member.roles.add(
guildRole,
gmember.member.roles.add(
rolesmanage.rolesToAdd,
"Updating all discord members",
)
continue
@@ -199,10 +191,12 @@ export async function updateDiscordRoles(
}
}
console.log("Successfully updated all roles.")
await interaction.editReply({
embeds: [
{
description: `Successfully updated all roles.`,
description: "Successfully updated all roles.",
color: embedColor,
},
],

View File

@@ -18,7 +18,8 @@ export = {
.setName("ign")
.setDescription("Player's name")
.setRequired(true),
),
)
.setDMPermission(false),
async execute(interaction) {
await interaction.deferReply()
@@ -29,12 +30,6 @@ export = {
const newIgn = (await getIGN(uuid)) as string
const head = await getHeadURL(ign)
const embedColor = Number(color.replace("#", "0x"))
const footerText = interaction.guild
? interaction.guild.name
: interaction.user.username
const footerIcon = interaction.guild
? interaction.guild.iconURL({ forceStatic: false })
: interaction.user.avatarURL({ forceStatic: false })
if (!uuid) {
interaction.editReply({
@@ -64,8 +59,8 @@ export = {
url: head!,
},
footer: {
text: footerText + " | " + devMessage,
icon_url: footerIcon || undefined,
text: interaction.guild!.name + " | " + devMessage,
icon_url: interaction.guild?.iconURL({ forceStatic: false }) || undefined,
},
},
],

View File

@@ -1,4 +1,4 @@
import { SlashCommandBuilder } from "discord.js"
import { GuildMember, SlashCommandBuilder } from "discord.js"
import { getUUID, getPlayer, getGuild, getHeadURL } from "../utils/Hypixel"
import { color, hypixelGuildID, devMessage } from "../../config/options.json"
import mongoose from "mongoose"
@@ -39,8 +39,7 @@ export = {
async execute(interaction) {
await interaction.deferReply()
const user1 = interaction.user
const user = interaction.guild!.members.cache.get(user1.id)!
const user = interaction.member! as GuildMember
const ign = interaction.options.getString("ign")!
const embedColor = Number(color.replace("#", "0x"))
@@ -114,10 +113,10 @@ export = {
}
let username = ""
if (user1.discriminator === "0") {
username = user1.username
if (user.user.discriminator === "0") {
username = user.user.username
} else {
username = user1.username + "#" + user1.discriminator
username = user.user.username + "#" + user.user.discriminator
}
await interaction.editReply({

View File

@@ -4,5 +4,6 @@ export default interface Autocomplete {
name: string
description: string
type: "autocomplete"
execute: (interaction: AutocompleteInteraction) => Promise<void>
// eslint-disable-next-line no-unused-vars
execute: (interacion: AutocompleteInteraction) => Promise<void>
}

View File

@@ -4,5 +4,6 @@ export default interface Button {
name: string
description: string
type: "button"
// eslint-disable-next-line no-unused-vars
execute: (interaction: ButtonInteraction) => Promise<void>
}

View File

@@ -12,8 +12,6 @@ export default interface Command {
"addSubcommand" | "addSubcommandGroup" | "addIntegerOption"
>
subcommands?: boolean
execute: (
interaction: ChatInputCommandInteraction,
client: Client,
) => Promise<void>
// eslint-disable-next-line no-unused-vars
execute: ( interaction: ChatInputCommandInteraction, client: Client,) => Promise<void>
}

View File

@@ -9,5 +9,6 @@ export default interface ContextMenu {
type: "contextmenu"
dev?: boolean
data: ContextMenuCommandBuilder
// eslint-disable-next-line no-unused-vars
execute: (interaction: ContextMenuCommandInteraction) => Promise<void>
}

View File

@@ -1,4 +1,3 @@
import { CronCommand } from "cron"
import { TimeZones } from "."
interface TimeFormat {

View File

@@ -5,5 +5,6 @@ export default interface Event {
description: string
type: "event"
event: keyof ClientEvents
// eslint-disable-next-line no-unused-vars
execute(...args: any[]): void
}

View File

@@ -4,5 +4,6 @@ export default interface Modal {
name: string
description: string
type: "modal"
// eslint-disable-next-line no-unused-vars
execute: (interaction: ModalSubmitInteraction) => Promise<void>
}

View File

@@ -8,8 +8,6 @@ const client = new Client()
const redis = new Redis(env.prod.redisURI!)
class Bot {
constructor() {}
async start() {
init()
client.start()

View File

@@ -0,0 +1,92 @@
import {
gm,
manager,
moderator,
beast,
elite,
member,
guildStaff,
guildRole,
} from "../../../config/roles.json"
const roles = [
gm,
manager,
moderator,
beast,
elite,
member,
guildStaff,
guildRole,
]
type RoleType =
| "gm"
| "manager"
| "moderator"
| "beast"
| "elite"
| "member"
| "default"
export default function removeRoles(role: RoleType): {
rolesToRemove: string[]
rolesToAdd: string[]
} {
if (role === "gm") {
const rolesToRemove = roles.filter(
role => role !== gm && role !== guildStaff && role !== guildRole,
)
const rolesToAdd = [gm, guildStaff, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "manager") {
const rolesToRemove = roles.filter(
role =>
role !== manager && role !== guildStaff && role !== guildRole,
)
const rolesToAdd = [manager, guildStaff, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "moderator") {
const rolesToRemove = roles.filter(
role =>
role !== moderator && role !== guildStaff && role !== guildRole,
)
const rolesToAdd = [moderator, guildStaff, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "beast") {
const rolesToRemove = roles.filter(
role => role !== beast && role !== guildRole,
)
const rolesToAdd = [beast, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "elite") {
const rolesToRemove = roles.filter(
role => role !== elite && role !== guildRole,
)
const rolesToAdd = [elite, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "member") {
const rolesToRemove = roles.filter(
role => role !== member && role !== guildRole,
)
const rolesToAdd = [member, guildRole]
return { rolesToRemove, rolesToAdd }
}
if (role === "default") {
const rolesToRemove = roles
const rolesToAdd: string[] = []
return { rolesToRemove, rolesToAdd }
}
return { rolesToRemove: [], rolesToAdd: [] }
}

View File

@@ -9,6 +9,8 @@
"skipLibCheck": true,
"strictNullChecks": true,
"resolveJsonModule": true,
"removeComments": true,
"noUnusedLocals": true,
"outDir": "dist"
},
"include": ["src"],

876
yarn.lock

File diff suppressed because it is too large Load Diff