diff --git a/.gitignore b/.gitignore index 6a3100f..4c75802 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ config/development.json CMakeLists.txt.user* /dist + +_.ts diff --git a/generateExports.js b/generateExports.js new file mode 100644 index 0000000..36910be --- /dev/null +++ b/generateExports.js @@ -0,0 +1,42 @@ +const fs = require('fs'); +const path = require('path'); + +function collectModules(dir, extname) { + let modules = []; + fs.readdirSync(`./src/${dir}/`).forEach(function (file) { + // Load the module if it's a script. + if (path.extname(file) === extname) { + if (file.includes(".disabled")) { + console.info(`Did not load disabled module: ${file}`); + } else { + const moduleName = path.basename(file, extname); + if (moduleName === "_") return; + modules.push(moduleName); + console.info(`Scanning ${moduleName} from ${file} ...`); + } + } + }); + return modules; +} + +const header = '// GENERATED FILE. DO NOT EDIT!\n// See generateExports.js for details.\n' + +console.info('Generating module loader ...'); + +let modules = collectModules('commands', '.ts'); +let loader_content = header; +for (let mod of modules) { + loader_content += `import * as ${mod} from "./${mod}";\n`; +} +let loader_map = modules.map((moduleName) => `${moduleName}: ${moduleName}`).join(', '); +loader_content += `\nexport default { ${loader_map} };\n`; +fs.writeFileSync("./src/commands/_.ts", loader_content); + +let triggers = collectModules('triggers', '.ts'); +loader_content = header; +for (let mod of triggers) { + loader_content += `import * as ${mod} from "./${mod}";\n`; +} +loader_map = triggers.join(', '); +loader_content += `\nexport default [ ${loader_map} ];\n`; +fs.writeFileSync("./src/triggers/_.ts", loader_content); diff --git a/package.json b/package.json index ce7e7bc..3150006 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,10 @@ "winston": "^3.8.2" }, "devDependencies": { + "@rollup/plugin-commonjs": "^22.0.2", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^14.1.0", + "@rollup/plugin-typescript": "^8.5.0", "@tsconfig/node14": "^1.0.3", "@types/ip": "^1.1.0", "@types/node": "^18.7.18", @@ -34,10 +38,13 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.1", "eslint-plugin-standard": "^5.0.0", + "rollup": "^2.79.0", "ts-node": "^10.9.1" }, "scripts": { - "build": "yarn run tsc", + "postinstall": "node generateExports.js", + "build": "yarn run rollup -c", + "check": "yarn run tsc --noEmit", "serve": "yarn run ts-node ./src/server.ts" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..0c67cd3 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,25 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; + +export default { + input: 'src/server.ts', + external: ['discord.js'], + output: { + dir: 'dist', + format: 'cjs', + }, + plugins: [ + resolve({ + browser: false + }), + commonjs({ dynamicRequireTargets: [ + 'node_modules/logform/*.js', + './src/responses/citra.json', + './src/responses/yuzu.json', + ], extensions: ['.mjs', '.js', '.ts'], transformMixedEsModules: true }), + json(), + typescript() + ] +}; diff --git a/src/commands/ban.ts b/src/commands/ban.ts index cd0d74a..19973e5 100644 --- a/src/commands/ban.ts +++ b/src/commands/ban.ts @@ -1,5 +1,6 @@ import { ban } from '../common'; -import discord = require('discord.js'); +import { IModule } from '../models/interfaces'; +import * as discord from 'discord.js'; export const roles = ['Admins', 'Moderators', 'CitraBot']; export function command (message: discord.Message) { diff --git a/src/commands/clearWarnings.ts b/src/commands/clearWarnings.ts index b6e9f51..6baa8a9 100644 --- a/src/commands/clearWarnings.ts +++ b/src/commands/clearWarnings.ts @@ -1,7 +1,7 @@ import state from '../state'; import * as data from '../data'; import logger from '../logging'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; export const roles = ['Admins', 'Moderators']; export function command (message: discord.Message) { diff --git a/src/commands/game.ts b/src/commands/game.ts index 3a7b432..29bd5a6 100644 --- a/src/commands/game.ts +++ b/src/commands/game.ts @@ -1,6 +1,6 @@ import fetch from 'node-fetch'; -import discord = require('discord.js'); -import stringSimilarity = require('string-similarity'); +import * as discord from 'discord.js'; +import * as stringSimilarity from 'string-similarity'; import logger from '../logging'; import state from '../state'; diff --git a/src/commands/grantDeveloper.ts b/src/commands/grantDeveloper.ts index a4dc24f..45ddb49 100644 --- a/src/commands/grantDeveloper.ts +++ b/src/commands/grantDeveloper.ts @@ -1,6 +1,6 @@ import state from '../state'; import logger from '../logging'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; export const roles = ['Admins', 'Moderators', 'CitraBot']; export function command (message: discord.Message) { diff --git a/src/commands/info.ts b/src/commands/info.ts index a7fa348..90a070d 100644 --- a/src/commands/info.ts +++ b/src/commands/info.ts @@ -1,7 +1,7 @@ import state from '../state'; import UserBan from '../models/UserBan'; import UserWarning from '../models/UserWarning'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; export const roles = ['Admins', 'Moderators']; diff --git a/src/commands/quote.ts b/src/commands/quote.ts index 208dc98..ae554b1 100644 --- a/src/commands/quote.ts +++ b/src/commands/quote.ts @@ -1,7 +1,7 @@ -import discord = require('discord.js'); +import * as discord from 'discord.js'; export const roles = ['Admins', 'Moderators']; -export async function command (message: discord.Message, reply: string) { +export async function command (message: discord.Message, reply: string | undefined) { let replyMessage; if (reply == null) { replyMessage = message.content.substr(message.content.indexOf(' ') + 1); diff --git a/src/commands/status.ts b/src/commands/status.ts index c441e43..72731b1 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -1,5 +1,5 @@ import fetch from 'node-fetch'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; const fetchOptions = { headers: { 'User-Agent': 'Citra-Emu/CitraBot (Node.js)', Accept: 'application/vnd.github.antiope-preview+json' } diff --git a/src/commands/warn.ts b/src/commands/warn.ts index 713dcd2..e641f5c 100644 --- a/src/commands/warn.ts +++ b/src/commands/warn.ts @@ -2,10 +2,10 @@ import state from '../state'; import * as data from '../data'; import logger from '../logging'; import UserWarning from '../models/UserWarning'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; -exports.roles = ['Admins', 'Moderators']; -exports.command = function (message: discord.Message) { +export const roles = ['Admins', 'Moderators']; +export function command(message: discord.Message) { const silent = message.content.includes('silent'); message.mentions.users.map(async (user) => { diff --git a/src/commands/warnings.ts b/src/commands/warnings.ts index ce6d57e..ad27918 100644 --- a/src/commands/warnings.ts +++ b/src/commands/warnings.ts @@ -1,7 +1,7 @@ import state from '../state'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; -exports.command = function (message: discord.Message) { +export function command(message: discord.Message) { message.mentions.users.map(async (user) => { const warnings = state.warnings.filter(x => x.id === user.id && !x.cleared); await message.channel.send(`${user.toString()}, you have ${warnings.length} total warnings.`); diff --git a/src/common.ts b/src/common.ts index 8117a51..a125e03 100644 --- a/src/common.ts +++ b/src/common.ts @@ -2,7 +2,7 @@ import state from './state'; import * as data from './data'; import logger from './logging'; import UserBan from './models/UserBan'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; export async function ban (user: discord.User, moderator: discord.User, guild: discord.Guild | null) { const count = state.warnings.filter(x => x.id === user.id && !x.cleared).length || 0; diff --git a/src/logging.ts b/src/logging.ts index d6a0940..333b284 100644 --- a/src/logging.ts +++ b/src/logging.ts @@ -1,4 +1,4 @@ -import winston = require('winston'); +import * as winston from 'winston'; import * as ip from 'ip'; import * as os from 'os'; diff --git a/src/server.ts b/src/server.ts index d070ff5..28d0e86 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,38 +1,39 @@ -// Check for environmental variables. -import discord = require('discord.js'); -import path = require('path'); -import fs = require('fs'); +import * as discord from 'discord.js'; import logger from './logging'; import state from './state'; import * as data from './data'; import { IModule, ITrigger } from './models/interfaces'; +import modules from './commands/_'; +import triggers from './triggers/_'; -require('checkenv').check(); +// Check for environmental variables. +// eslint-disable-next-line +import * as checkenv from 'checkenv'; +checkenv.setConfig(require('../env.json')); +checkenv.check(); interface IModuleMap { [name: string]: IModule; } -let cachedModules: IModuleMap = {}; -let cachedTriggers: ITrigger[] = []; -const client = new discord.Client({ intents: discord.GatewayIntentBits.GuildMembers | discord.GatewayIntentBits.Guilds | discord.GatewayIntentBits.GuildBans | discord.GatewayIntentBits.GuildMessages }); +const cachedModules: IModuleMap = modules; +const cachedTriggers: ITrigger[] = triggers; +const client = new discord.Client({ intents: discord.GatewayIntentBits.GuildMembers | discord.GatewayIntentBits.Guilds | discord.GatewayIntentBits.GuildBans | discord.GatewayIntentBits.GuildMessages | discord.GatewayIntentBits.DirectMessages | discord.GatewayIntentBits.MessageContent }); const rulesTrigger = process.env.DISCORD_RULES_TRIGGER; -const rluesRole = process.env.DISCORD_RULES_ROLE; +const rulesRole = process.env.DISCORD_RULES_ROLE; const mediaUsers = new Map(); logger.info('Application startup. Configuring environment.'); if (!rulesTrigger) { throw new Error('DISCORD_RULES_TRIGGER somehow became undefined.'); } -if (!rluesRole) { +if (!rulesRole) { throw new Error('DISCORD_RULES_ROLE somehow became undefined.'); } function findArray(haystack: string | any[], arr: any[]) { - return arr.some(function (v: any) { - return haystack.indexOf(v) >= 0; - }); + return arr.some((v: any) => haystack.indexOf(v) >= 0); } function IsIgnoredCategory(categoryName: string) { @@ -175,7 +176,7 @@ client.on('messageCreate', async (message) => { if (message.content.toLowerCase().includes(rulesTrigger)) { // We want to remove the 'Unauthorized' role from them once they agree to the rules. logger.verbose(`${message.author.username} ${message.author} has accepted the rules, removing role ${process.env.DISCORD_RULES_ROLE}.`); - await message.member?.roles.remove(rluesRole, 'Accepted the rules.'); + await message.member?.roles.remove(rulesRole, 'Accepted the rules.'); } // Delete the message in the channel to force a cleanup. @@ -227,40 +228,6 @@ client.on('messageCreate', async (message) => { } }); -// Cache all command modules. -cachedModules = {}; -fs.readdirSync('./commands/').forEach(function (file) { - // Load the module if it's a script. - if (path.extname(file) === '.js') { - if (file.includes('.disabled')) { - logger.info(`Did not load disabled module: ${file}`); - } else { - const moduleName = path.basename(file, '.js').toLowerCase(); - logger.info(`Loaded module: ${moduleName} from ${file}`); - cachedModules[moduleName] = require(`./commands/${file}`); - } - } -}); - -// Cache all triggers. -cachedTriggers = []; -fs.readdirSync('./triggers/').forEach(function (file) { - // Load the module if it's a script. - if (path.extname(file) === '.js') { - if (file.includes('.disabled')) { - logger.info(`Did not load disabled trigger: ${file}`); - } else { - const moduleName = path.basename(file, '.js').toLowerCase(); - logger.info(`Loaded trigger: ${moduleName} from ${file}`); - try { - cachedTriggers.push(require(`./triggers/${file}`)); - } catch (e) { - logger.error(`Could not load trigger ${moduleName}: ${e}`); - } - } - } -}); - data.readWarnings(); data.readBans(); diff --git a/src/state.ts b/src/state.ts index e12c0b3..a76fb29 100644 --- a/src/state.ts +++ b/src/state.ts @@ -1,7 +1,7 @@ import UserWarning from './models/UserWarning'; import UserBan from './models/UserBan'; import { IGameDBEntry, IResponses } from './models/interfaces'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; /* Application State */ class State { diff --git a/src/triggers/pingBomb.ts b/src/triggers/pingBomb.ts index e1b1f0c..3f5b4c2 100644 --- a/src/triggers/pingBomb.ts +++ b/src/triggers/pingBomb.ts @@ -1,7 +1,7 @@ import { ban } from '../common'; import state from '../state'; import logger from '../logging'; -import discord = require('discord.js'); +import * as discord from 'discord.js'; export function trigger (message: discord.Message) { return message.mentions.users.size > 10; diff --git a/tsconfig.json b/tsconfig.json index 60a8f94..336ff72 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "@tsconfig/node14/tsconfig.json", "compilerOptions": { - "module": "CommonJS", + "module": "esnext", "noImplicitAny": true, "strictNullChecks": true, "removeComments": true, diff --git a/yarn.lock b/yarn.lock index a62b0b2..b140be2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,6 +146,55 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@rollup/plugin-commonjs@^22.0.2": + version "22.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz#ee8ca8415cda30d383b4096aad5222435b4b69b6" + integrity sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-14.1.0.tgz#f2fa475405cd7fed6420bf438fe393f988a9bc96" + integrity sha512-5G2niJroNCz/1zqwXtk0t9+twOSDlG00k1Wfd7bkbbXmwg8H8dvgHdIWAun53Ps/rckfvOC7scDBjuGFg5OaWw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + deepmerge "^4.2.2" + is-builtin-module "^3.1.0" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-typescript@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz#7ea11599a15b0a30fa7ea69ce3b791d41b862515" + integrity sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + resolve "^1.17.0" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + "@sapphire/async-queue@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" @@ -189,6 +238,16 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/ip@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@types/ip/-/ip-1.1.0.tgz#aec4f5bfd49e4a4c53b590d88c36eb078827a7c0" @@ -219,6 +278,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.18.tgz#633184f55c322e4fb08612307c274ee6d5ed3154" integrity sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg== +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + "@types/string-similarity@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/string-similarity/-/string-similarity-4.0.0.tgz#8cc03d5d1baad2b74530fe6c7d849d5768d391ad" @@ -466,6 +532,11 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -568,6 +639,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -613,6 +689,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -941,6 +1022,16 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -1052,6 +1143,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1108,7 +1204,7 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -1272,6 +1368,13 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-builtin-module@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.5.tgz#6123e0b1fef5d7591514b371bb018204892f1a2b" @@ -1310,6 +1413,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -1327,6 +1435,13 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -1504,6 +1619,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -1691,7 +1813,7 @@ peek-readable@^5.0.0: resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== -picomatch@^2.3.1: +picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -1746,7 +1868,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.0: +resolve@^1.10.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -1767,6 +1889,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.0.tgz#9177992c9f09eb58c5e56cbfa641607a12b57ce2" + integrity sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA== + optionalDependencies: + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -1829,6 +1958,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"