├── .gitignore ├── config.json ├── dist ├── index.js ├── interface │ ├── ResponseInterface.js │ └── SettingsInterface.js ├── message │ ├── MessageMatcher.js │ └── MessageReader.js └── util │ ├── assertActivityType.js │ └── readJson.js ├── package-lock.json ├── package.json ├── readme.md ├── responses.json ├── src ├── index.ts ├── interface │ ├── ResponseInterface.ts │ └── SettingsInterface.ts ├── message │ ├── MessageMatcher.ts │ └── MessageReader.ts └── util │ ├── assertActivityType.ts │ └── readJson.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | *.local 12 | eng.traineddata 13 | 14 | # Editor directories and files 15 | .vscode/* 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "YOUR BOT TOKEN HERE", 3 | 4 | "bot": { 5 | "activity": "PLAYING", 6 | "activity_message": "Smart Support", 7 | "activity_status": "online" 8 | }, 9 | 10 | "support_channels": [ 11 | "SUPPORT CHANNEL ID's HERE" 12 | ], 13 | 14 | "excluded_roles": [ 15 | "EXCLUDED ROLE ID's HERE" 16 | ], 17 | 18 | "urls": { 19 | "allowed_urls": [ 20 | "https://pastebin.com", 21 | "https://termbin.com" 22 | ], 23 | "max_content_size_in_bytes": 314572 24 | }, 25 | 26 | "images": { 27 | "max_size_in_bytes": 524288 , 28 | "parse_language": "eng", 29 | "message_reaction": "\uD83D\uDC40" 30 | }, 31 | 32 | "debug": true 33 | } -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (g && (g = 0, op[0] && (_ = 0)), _) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | Object.defineProperty(exports, "__esModule", { value: true }); 39 | var discord_js_1 = require("discord.js"); 40 | var assertActivityType_js_1 = require("./util/assertActivityType.js"); 41 | var MessageReader_js_1 = require("./message/MessageReader.js"); 42 | var readJson_js_1 = require("./util/readJson.js"); 43 | var MessageMatcher_js_1 = require("./message/MessageMatcher.js"); 44 | /** --- Declare constants --- */ 45 | var path = require('path'); 46 | // Create a new client instance 47 | var client = new discord_js_1.Client({ intents: [discord_js_1.GatewayIntentBits.Guilds, discord_js_1.GatewayIntentBits.GuildMessages, discord_js_1.GatewayIntentBits.MessageContent] }); 48 | // Import config using fs 49 | var settings = (0, readJson_js_1.readJson)(path.join(__dirname, '/../config.json')); 50 | // Import responses using fs 51 | var responses = (0, readJson_js_1.readJson)(path.join(__dirname, '/../responses.json')); 52 | // Create a new message reader instance 53 | var messageReader = new MessageReader_js_1.MessageReader({ 54 | urls: settings.urls, 55 | images: settings.images, 56 | debug: settings.debug 57 | }); 58 | // Create a new message matcher instance 59 | var messageMatcher = new MessageMatcher_js_1.MessageMatcher(responses); 60 | /** --- Bot events --- */ 61 | // When the client is ready, run this code (only once) 62 | client.once('ready', function () { return __awaiter(void 0, void 0, void 0, function () { 63 | var _a, _b; 64 | return __generator(this, function (_c) { 65 | switch (_c.label) { 66 | case 0: 67 | // @ts-ignore 68 | return [4 /*yield*/, ((_a = client.user) === null || _a === void 0 ? void 0 : _a.setActivity(settings.bot.activity_message, { type: (0, assertActivityType_js_1.assertActivityType)(settings.bot.activity) }))]; 69 | case 1: 70 | // @ts-ignore 71 | _c.sent(); 72 | return [4 /*yield*/, ((_b = client.user) === null || _b === void 0 ? void 0 : _b.setStatus(settings.bot.activity_status))]; 73 | case 2: 74 | _c.sent(); 75 | console.log('Smart-Support-bot is ready!'); 76 | console.log("".concat(responses.length, " responses loaded!")); 77 | return [2 /*return*/]; 78 | } 79 | }); 80 | }); }); 81 | // Listen for messages 82 | client.on('messageCreate', function (message) { return __awaiter(void 0, void 0, void 0, function () { 83 | var content, response, e_1; 84 | return __generator(this, function (_a) { 85 | switch (_a.label) { 86 | case 0: 87 | // Ignore messages that should not be responded to 88 | if (!botShouldRespond(message)) 89 | return [2 /*return*/]; 90 | _a.label = 1; 91 | case 1: 92 | _a.trys.push([1, 4, , 5]); 93 | return [4 /*yield*/, messageReader.read(message)]; 94 | case 2: 95 | content = _a.sent(); 96 | console.log('[BOT] received message: ' + content.replace(/\n/g, ' ').slice(0, 50) + (content.length > 50 ? '...' : '')); 97 | response = messageMatcher.match(content); 98 | if (!response) 99 | return [2 /*return*/]; 100 | // Send the response 101 | return [4 /*yield*/, message.reply(response)]; 102 | case 3: 103 | // Send the response 104 | _a.sent(); 105 | return [3 /*break*/, 5]; 106 | case 4: 107 | e_1 = _a.sent(); 108 | if (settings.debug) 109 | console.error(e_1); 110 | return [3 /*break*/, 5]; 111 | case 5: return [2 /*return*/]; 112 | } 113 | }); 114 | }); }); 115 | // Login to Discord with your client's token 116 | client.login(settings.token); 117 | /** --- Helper functions --- */ 118 | var botShouldRespond = function (message) { 119 | var _a; 120 | // Ignore messages from bots 121 | if (message.author.bot) 122 | return false; 123 | // Ignore messages that are not in the support channels 124 | if (!settings.support_channels.includes(message.channelId)) 125 | return false; 126 | // Ignore messages that are from users with excluded roles 127 | if ((_a = message.member) === null || _a === void 0 ? void 0 : _a.roles.cache.some(function (role) { return settings.excluded_roles.includes(role.id); })) 128 | return false; 129 | return true; 130 | }; 131 | -------------------------------------------------------------------------------- /dist/interface/ResponseInterface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /dist/interface/SettingsInterface.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.ActivityType = void 0; 4 | var ActivityType; 5 | (function (ActivityType) { 6 | ActivityType["Playing"] = "PLAYING"; 7 | ActivityType["Streaming"] = "STREAMING"; 8 | ActivityType["Listening"] = "LISTENING"; 9 | ActivityType["Watching"] = "WATCHING"; 10 | ActivityType["Competing"] = "COMPETING"; 11 | })(ActivityType = exports.ActivityType || (exports.ActivityType = {})); 12 | -------------------------------------------------------------------------------- /dist/message/MessageMatcher.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.MessageMatcher = void 0; 7 | var regex_parser_1 = __importDefault(require("regex-parser")); 8 | var MessageMatcher = /** @class */ (function () { 9 | function MessageMatcher(responses) { 10 | this.responses = responses.map(function (response) { 11 | return { 12 | key: (0, regex_parser_1.default)(response.key), 13 | content: response.content 14 | }; 15 | }); 16 | } 17 | /** 18 | * @description Match a message against the responses 19 | * @param message 20 | */ 21 | MessageMatcher.prototype.match = function (message) { 22 | var match = this.responses.findIndex(function (response) { return message.match(response.key); }); 23 | return match !== -1 ? this.responses[match].content : null; 24 | }; 25 | return MessageMatcher; 26 | }()); 27 | exports.MessageMatcher = MessageMatcher; 28 | -------------------------------------------------------------------------------- /dist/message/MessageReader.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (g && (g = 0, op[0] && (_ = 0)), _) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | var __importDefault = (this && this.__importDefault) || function (mod) { 39 | return (mod && mod.__esModule) ? mod : { "default": mod }; 40 | }; 41 | Object.defineProperty(exports, "__esModule", { value: true }); 42 | exports.MessageReader = void 0; 43 | var tesseract_js_1 = __importDefault(require("tesseract.js")); 44 | var axios_1 = __importDefault(require("axios")); 45 | var MessageReader = /** @class */ (function () { 46 | /** 47 | * @param {MessageReaderConfig} config 48 | */ 49 | function MessageReader(config) { 50 | this.urlExpression = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:\/?#[\]@!\$&'\(\)\*\+,;=.]+$/mg; 51 | this.config = config; 52 | } 53 | /** 54 | * @description Determine the content of the message 55 | * @param message 56 | */ 57 | MessageReader.prototype.read = function (message) { 58 | return __awaiter(this, void 0, void 0, function () { 59 | var _this = this; 60 | return __generator(this, function (_a) { 61 | return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { 62 | var attachment; 63 | return __generator(this, function (_a) { 64 | // Check if message is an URL 65 | if (this.config.urls.allowed_urls.findIndex(function (url) { return message.content.startsWith(url); }) !== -1) { 66 | // Check if URL is allowed 67 | if (message.content.match(this.urlExpression)) { 68 | // Parse URL to text 69 | return [2 /*return*/, this._parseUrl(message) 70 | .then(resolve) 71 | .catch(reject)]; 72 | } 73 | // URL is not allowed 74 | return [2 /*return*/, reject('URL not allowed: ' + message.content)]; 75 | } 76 | else { 77 | this._debug('URL not in allowed urls list'); 78 | } 79 | // Check if message has an image 80 | if (message.attachments.size > 0) { 81 | attachment = message.attachments.first(); 82 | // Check if attachment is an image and is not too large 83 | if (attachment && attachment.size < this.config.images.max_size_in_bytes && this._attachIsImage(attachment)) { 84 | // Parse image to text 85 | return [2 /*return*/, this._parseImage(message) 86 | .then(resolve) 87 | .catch(reject)]; 88 | } 89 | // Attachment is not an image or is too large 90 | return [2 /*return*/, reject("Attachment is not an image or is too large: ".concat(attachment === null || attachment === void 0 ? void 0 : attachment.url, " (").concat(attachment === null || attachment === void 0 ? void 0 : attachment.size, " bytes)"))]; 91 | } 92 | else { 93 | this._debug("No attachment found."); 94 | } 95 | // Treat message as regular text message 96 | return [2 /*return*/, resolve(message.content)]; 97 | }); 98 | }); })]; 99 | }); 100 | }); 101 | }; 102 | /** 103 | * @description Parse the content of an image to text 104 | * @param message 105 | * @protected 106 | */ 107 | MessageReader.prototype._parseImage = function (message) { 108 | var _this = this; 109 | return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { 110 | var attach, response; 111 | return __generator(this, function (_a) { 112 | switch (_a.label) { 113 | case 0: 114 | //add reaction to message to show that it is being parsed 115 | return [4 /*yield*/, message.react(this.config.images.message_reaction)]; 116 | case 1: 117 | //add reaction to message to show that it is being parsed 118 | _a.sent(); 119 | attach = message.attachments.first(); 120 | if (!(attach === null || attach === void 0 ? void 0 : attach.url)) 121 | return [2 /*return*/, reject('No attachment found')]; 122 | return [4 /*yield*/, tesseract_js_1.default.recognize(attach.url, this.config.images.parse_language)]; 123 | case 2: 124 | response = _a.sent(); 125 | //remove the reaction 126 | return [4 /*yield*/, message.reactions.removeAll()]; 127 | case 3: 128 | //remove the reaction 129 | _a.sent(); 130 | this._debug('IMAGE TEXT: ' + response.data.text); 131 | return [2 /*return*/, resolve(response.data.text)]; 132 | } 133 | }); 134 | }); }); 135 | }; 136 | /** 137 | * @description Parse the content of an url 138 | * @param message 139 | * @protected 140 | */ 141 | MessageReader.prototype._parseUrl = function (message) { 142 | var _this = this; 143 | return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { 144 | var response; 145 | return __generator(this, function (_a) { 146 | switch (_a.label) { 147 | case 0: 148 | // Check if URL content is not too large 149 | if (message.content.length > this.config.urls.max_content_size_in_bytes) { 150 | return [2 /*return*/, reject('URL content is too large')]; 151 | } 152 | return [4 /*yield*/, axios_1.default.get(message.content).catch(reject)]; 153 | case 1: 154 | response = _a.sent(); 155 | // Check if URL content is not empty 156 | if (response && response.data) { 157 | this._debug('URL TEXT: ' + response.data); 158 | return [2 /*return*/, resolve(response.data)]; 159 | } 160 | // URL content is empty 161 | return [2 /*return*/, reject('URL content is empty')]; 162 | } 163 | }); 164 | }); }); 165 | }; 166 | /** 167 | * @description Check if message attachment is an image 168 | * @param attachment 169 | * @protected 170 | */ 171 | MessageReader.prototype._attachIsImage = function (attachment) { 172 | return (attachment === null || attachment === void 0 ? void 0 : attachment.url.match(/\.(jpeg|jpg|png)$/)) != null; 173 | }; 174 | /** 175 | * @description Log a message if debug is enabled 176 | * @param message 177 | * @protected 178 | */ 179 | MessageReader.prototype._debug = function (message) { 180 | if (this.config.debug) { 181 | console.log(message); 182 | } 183 | }; 184 | return MessageReader; 185 | }()); 186 | exports.MessageReader = MessageReader; 187 | -------------------------------------------------------------------------------- /dist/util/assertActivityType.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.assertActivityType = void 0; 4 | var SettingsInterface_1 = require("../interface/SettingsInterface"); 5 | function assertActivityType(value) { 6 | if (!Object.values(SettingsInterface_1.ActivityType).includes(value)) { 7 | throw new Error("Invalid activity type: ".concat(value)); 8 | } 9 | return value; 10 | } 11 | exports.assertActivityType = assertActivityType; 12 | -------------------------------------------------------------------------------- /dist/util/readJson.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.readJson = void 0; 7 | var fs_1 = __importDefault(require("fs")); 8 | function readJson(path) { 9 | var data = fs_1.default.readFileSync(path, 'utf8'); 10 | return JSON.parse(data); 11 | } 12 | exports.readJson = readJson; 13 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smart-support-bot-v2", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "smart-support-bot-v2", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "axios": "^1.3.5", 12 | "discord.js": "^14.9.0", 13 | "regex-parser": "^2.2.11", 14 | "tesseract.js": "^4.0.3" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "^18.15.11", 18 | "concurrently": "^8.0.1", 19 | "nodemon": "^2.0.22", 20 | "ts-node": "^10.9.1", 21 | "tsc-watch": "^6.0.0", 22 | "typescript": "^4.9.5" 23 | } 24 | }, 25 | "node_modules/@babel/code-frame": { 26 | "version": "7.21.4", 27 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", 28 | "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", 29 | "dependencies": { 30 | "@babel/highlight": "^7.18.6" 31 | }, 32 | "engines": { 33 | "node": ">=6.9.0" 34 | } 35 | }, 36 | "node_modules/@babel/generator": { 37 | "version": "7.21.4", 38 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", 39 | "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", 40 | "dependencies": { 41 | "@babel/types": "^7.21.4", 42 | "@jridgewell/gen-mapping": "^0.3.2", 43 | "@jridgewell/trace-mapping": "^0.3.17", 44 | "jsesc": "^2.5.1" 45 | }, 46 | "engines": { 47 | "node": ">=6.9.0" 48 | } 49 | }, 50 | "node_modules/@babel/helper-environment-visitor": { 51 | "version": "7.18.9", 52 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 53 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/helper-function-name": { 59 | "version": "7.21.0", 60 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", 61 | "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", 62 | "dependencies": { 63 | "@babel/template": "^7.20.7", 64 | "@babel/types": "^7.21.0" 65 | }, 66 | "engines": { 67 | "node": ">=6.9.0" 68 | } 69 | }, 70 | "node_modules/@babel/helper-hoist-variables": { 71 | "version": "7.18.6", 72 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 73 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 74 | "dependencies": { 75 | "@babel/types": "^7.18.6" 76 | }, 77 | "engines": { 78 | "node": ">=6.9.0" 79 | } 80 | }, 81 | "node_modules/@babel/helper-split-export-declaration": { 82 | "version": "7.18.6", 83 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 84 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 85 | "dependencies": { 86 | "@babel/types": "^7.18.6" 87 | }, 88 | "engines": { 89 | "node": ">=6.9.0" 90 | } 91 | }, 92 | "node_modules/@babel/helper-string-parser": { 93 | "version": "7.19.4", 94 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 95 | "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 96 | "engines": { 97 | "node": ">=6.9.0" 98 | } 99 | }, 100 | "node_modules/@babel/helper-validator-identifier": { 101 | "version": "7.19.1", 102 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 103 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 104 | "engines": { 105 | "node": ">=6.9.0" 106 | } 107 | }, 108 | "node_modules/@babel/highlight": { 109 | "version": "7.18.6", 110 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 111 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 112 | "dependencies": { 113 | "@babel/helper-validator-identifier": "^7.18.6", 114 | "chalk": "^2.0.0", 115 | "js-tokens": "^4.0.0" 116 | }, 117 | "engines": { 118 | "node": ">=6.9.0" 119 | } 120 | }, 121 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 122 | "version": "3.2.1", 123 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 124 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 125 | "dependencies": { 126 | "color-convert": "^1.9.0" 127 | }, 128 | "engines": { 129 | "node": ">=4" 130 | } 131 | }, 132 | "node_modules/@babel/highlight/node_modules/chalk": { 133 | "version": "2.4.2", 134 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 135 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 136 | "dependencies": { 137 | "ansi-styles": "^3.2.1", 138 | "escape-string-regexp": "^1.0.5", 139 | "supports-color": "^5.3.0" 140 | }, 141 | "engines": { 142 | "node": ">=4" 143 | } 144 | }, 145 | "node_modules/@babel/highlight/node_modules/color-convert": { 146 | "version": "1.9.3", 147 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 148 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 149 | "dependencies": { 150 | "color-name": "1.1.3" 151 | } 152 | }, 153 | "node_modules/@babel/highlight/node_modules/color-name": { 154 | "version": "1.1.3", 155 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 156 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 157 | }, 158 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 159 | "version": "1.0.5", 160 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 161 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 162 | "engines": { 163 | "node": ">=0.8.0" 164 | } 165 | }, 166 | "node_modules/@babel/highlight/node_modules/has-flag": { 167 | "version": "3.0.0", 168 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 169 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 170 | "engines": { 171 | "node": ">=4" 172 | } 173 | }, 174 | "node_modules/@babel/highlight/node_modules/supports-color": { 175 | "version": "5.5.0", 176 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 177 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 178 | "dependencies": { 179 | "has-flag": "^3.0.0" 180 | }, 181 | "engines": { 182 | "node": ">=4" 183 | } 184 | }, 185 | "node_modules/@babel/parser": { 186 | "version": "7.21.4", 187 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", 188 | "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", 189 | "bin": { 190 | "parser": "bin/babel-parser.js" 191 | }, 192 | "engines": { 193 | "node": ">=6.0.0" 194 | } 195 | }, 196 | "node_modules/@babel/template": { 197 | "version": "7.20.7", 198 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 199 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 200 | "dependencies": { 201 | "@babel/code-frame": "^7.18.6", 202 | "@babel/parser": "^7.20.7", 203 | "@babel/types": "^7.20.7" 204 | }, 205 | "engines": { 206 | "node": ">=6.9.0" 207 | } 208 | }, 209 | "node_modules/@babel/traverse": { 210 | "version": "7.21.4", 211 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", 212 | "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", 213 | "dependencies": { 214 | "@babel/code-frame": "^7.21.4", 215 | "@babel/generator": "^7.21.4", 216 | "@babel/helper-environment-visitor": "^7.18.9", 217 | "@babel/helper-function-name": "^7.21.0", 218 | "@babel/helper-hoist-variables": "^7.18.6", 219 | "@babel/helper-split-export-declaration": "^7.18.6", 220 | "@babel/parser": "^7.21.4", 221 | "@babel/types": "^7.21.4", 222 | "debug": "^4.1.0", 223 | "globals": "^11.1.0" 224 | }, 225 | "engines": { 226 | "node": ">=6.9.0" 227 | } 228 | }, 229 | "node_modules/@babel/traverse/node_modules/debug": { 230 | "version": "4.3.4", 231 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 232 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 233 | "dependencies": { 234 | "ms": "2.1.2" 235 | }, 236 | "engines": { 237 | "node": ">=6.0" 238 | }, 239 | "peerDependenciesMeta": { 240 | "supports-color": { 241 | "optional": true 242 | } 243 | } 244 | }, 245 | "node_modules/@babel/traverse/node_modules/ms": { 246 | "version": "2.1.2", 247 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 248 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 249 | }, 250 | "node_modules/@babel/types": { 251 | "version": "7.21.4", 252 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", 253 | "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", 254 | "dependencies": { 255 | "@babel/helper-string-parser": "^7.19.4", 256 | "@babel/helper-validator-identifier": "^7.19.1", 257 | "to-fast-properties": "^2.0.0" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@cspotcode/source-map-support": { 264 | "version": "0.8.1", 265 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 266 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 267 | "dev": true, 268 | "dependencies": { 269 | "@jridgewell/trace-mapping": "0.3.9" 270 | }, 271 | "engines": { 272 | "node": ">=12" 273 | } 274 | }, 275 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { 276 | "version": "0.3.9", 277 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 278 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 279 | "dev": true, 280 | "dependencies": { 281 | "@jridgewell/resolve-uri": "^3.0.3", 282 | "@jridgewell/sourcemap-codec": "^1.4.10" 283 | } 284 | }, 285 | "node_modules/@discordjs/builders": { 286 | "version": "1.6.1", 287 | "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.1.tgz", 288 | "integrity": "sha512-CCcLwn/8ANhlAbhlE18fcaN0hfXTen53/JiwZs1t9oE/Cqa9maA8ZRarkCIsXF4J7J/MYnd0J6IsxeKsq+f6mw==", 289 | "dependencies": { 290 | "@discordjs/formatters": "^0.3.0", 291 | "@discordjs/util": "^0.2.0", 292 | "@sapphire/shapeshift": "^3.8.1", 293 | "discord-api-types": "^0.37.37", 294 | "fast-deep-equal": "^3.1.3", 295 | "ts-mixer": "^6.0.3", 296 | "tslib": "^2.5.0" 297 | }, 298 | "engines": { 299 | "node": ">=16.9.0" 300 | } 301 | }, 302 | "node_modules/@discordjs/collection": { 303 | "version": "1.5.0", 304 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.0.tgz", 305 | "integrity": "sha512-suyVndkEAAWrGxyw/CPGdtXoRRU6AUNkibtnbJevQzpelkJh3Q1gQqWDpqf5i39CnAn5+LrN0YS+cULeEjq2Yw==", 306 | "engines": { 307 | "node": ">=16.9.0" 308 | } 309 | }, 310 | "node_modules/@discordjs/formatters": { 311 | "version": "0.3.0", 312 | "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.0.tgz", 313 | "integrity": "sha512-Fc4MomalbP8HMKEMor3qUiboAKDtR7PSBoPjwm7WYghVRwgJlj5WYvUsriLsxeKk8+Qq2oy+HJlGTUkGvX0YnA==", 314 | "dependencies": { 315 | "discord-api-types": "^0.37.37" 316 | }, 317 | "engines": { 318 | "node": ">=16.9.0" 319 | } 320 | }, 321 | "node_modules/@discordjs/rest": { 322 | "version": "1.7.0", 323 | "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.0.tgz", 324 | "integrity": "sha512-r2HzmznRIo8IDGYBWqQfkEaGN1LrFfWQd3dSyC4tOpMU8nuVvFUEw6V/lwnG44jyOq+vgyDny2fxeUDMt9I4aQ==", 325 | "dependencies": { 326 | "@discordjs/collection": "^1.5.0", 327 | "@discordjs/util": "^0.2.0", 328 | "@sapphire/async-queue": "^1.5.0", 329 | "@sapphire/snowflake": "^3.4.0", 330 | "discord-api-types": "^0.37.37", 331 | "file-type": "^18.2.1", 332 | "tslib": "^2.5.0", 333 | "undici": "^5.21.0" 334 | }, 335 | "engines": { 336 | "node": ">=16.9.0" 337 | } 338 | }, 339 | "node_modules/@discordjs/util": { 340 | "version": "0.2.0", 341 | "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz", 342 | "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==", 343 | "engines": { 344 | "node": ">=16.9.0" 345 | } 346 | }, 347 | "node_modules/@eslint-community/eslint-utils": { 348 | "version": "4.4.0", 349 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 350 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 351 | "peer": true, 352 | "dependencies": { 353 | "eslint-visitor-keys": "^3.3.0" 354 | }, 355 | "engines": { 356 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 357 | }, 358 | "peerDependencies": { 359 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 360 | } 361 | }, 362 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 363 | "version": "3.4.0", 364 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", 365 | "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", 366 | "peer": true, 367 | "engines": { 368 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 369 | }, 370 | "funding": { 371 | "url": "https://opencollective.com/eslint" 372 | } 373 | }, 374 | "node_modules/@eslint-community/regexpp": { 375 | "version": "4.5.0", 376 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", 377 | "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", 378 | "peer": true, 379 | "engines": { 380 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 381 | } 382 | }, 383 | "node_modules/@eslint/eslintrc": { 384 | "version": "2.0.2", 385 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", 386 | "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", 387 | "peer": true, 388 | "dependencies": { 389 | "ajv": "^6.12.4", 390 | "debug": "^4.3.2", 391 | "espree": "^9.5.1", 392 | "globals": "^13.19.0", 393 | "ignore": "^5.2.0", 394 | "import-fresh": "^3.2.1", 395 | "js-yaml": "^4.1.0", 396 | "minimatch": "^3.1.2", 397 | "strip-json-comments": "^3.1.1" 398 | }, 399 | "engines": { 400 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 401 | }, 402 | "funding": { 403 | "url": "https://opencollective.com/eslint" 404 | } 405 | }, 406 | "node_modules/@eslint/eslintrc/node_modules/debug": { 407 | "version": "4.3.4", 408 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 409 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 410 | "peer": true, 411 | "dependencies": { 412 | "ms": "2.1.2" 413 | }, 414 | "engines": { 415 | "node": ">=6.0" 416 | }, 417 | "peerDependenciesMeta": { 418 | "supports-color": { 419 | "optional": true 420 | } 421 | } 422 | }, 423 | "node_modules/@eslint/eslintrc/node_modules/globals": { 424 | "version": "13.20.0", 425 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 426 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 427 | "peer": true, 428 | "dependencies": { 429 | "type-fest": "^0.20.2" 430 | }, 431 | "engines": { 432 | "node": ">=8" 433 | }, 434 | "funding": { 435 | "url": "https://github.com/sponsors/sindresorhus" 436 | } 437 | }, 438 | "node_modules/@eslint/eslintrc/node_modules/ms": { 439 | "version": "2.1.2", 440 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 441 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 442 | "peer": true 443 | }, 444 | "node_modules/@eslint/js": { 445 | "version": "8.37.0", 446 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", 447 | "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", 448 | "peer": true, 449 | "engines": { 450 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 451 | } 452 | }, 453 | "node_modules/@humanwhocodes/config-array": { 454 | "version": "0.11.8", 455 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 456 | "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 457 | "peer": true, 458 | "dependencies": { 459 | "@humanwhocodes/object-schema": "^1.2.1", 460 | "debug": "^4.1.1", 461 | "minimatch": "^3.0.5" 462 | }, 463 | "engines": { 464 | "node": ">=10.10.0" 465 | } 466 | }, 467 | "node_modules/@humanwhocodes/config-array/node_modules/debug": { 468 | "version": "4.3.4", 469 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 470 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 471 | "peer": true, 472 | "dependencies": { 473 | "ms": "2.1.2" 474 | }, 475 | "engines": { 476 | "node": ">=6.0" 477 | }, 478 | "peerDependenciesMeta": { 479 | "supports-color": { 480 | "optional": true 481 | } 482 | } 483 | }, 484 | "node_modules/@humanwhocodes/config-array/node_modules/ms": { 485 | "version": "2.1.2", 486 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 487 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 488 | "peer": true 489 | }, 490 | "node_modules/@humanwhocodes/module-importer": { 491 | "version": "1.0.1", 492 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 493 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 494 | "peer": true, 495 | "engines": { 496 | "node": ">=12.22" 497 | }, 498 | "funding": { 499 | "type": "github", 500 | "url": "https://github.com/sponsors/nzakas" 501 | } 502 | }, 503 | "node_modules/@humanwhocodes/object-schema": { 504 | "version": "1.2.1", 505 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 506 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 507 | "peer": true 508 | }, 509 | "node_modules/@jridgewell/gen-mapping": { 510 | "version": "0.3.2", 511 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 512 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 513 | "dependencies": { 514 | "@jridgewell/set-array": "^1.0.1", 515 | "@jridgewell/sourcemap-codec": "^1.4.10", 516 | "@jridgewell/trace-mapping": "^0.3.9" 517 | }, 518 | "engines": { 519 | "node": ">=6.0.0" 520 | } 521 | }, 522 | "node_modules/@jridgewell/resolve-uri": { 523 | "version": "3.1.0", 524 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 525 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 526 | "engines": { 527 | "node": ">=6.0.0" 528 | } 529 | }, 530 | "node_modules/@jridgewell/set-array": { 531 | "version": "1.1.2", 532 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 533 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 534 | "engines": { 535 | "node": ">=6.0.0" 536 | } 537 | }, 538 | "node_modules/@jridgewell/sourcemap-codec": { 539 | "version": "1.4.14", 540 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 541 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" 542 | }, 543 | "node_modules/@jridgewell/trace-mapping": { 544 | "version": "0.3.17", 545 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 546 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 547 | "dependencies": { 548 | "@jridgewell/resolve-uri": "3.1.0", 549 | "@jridgewell/sourcemap-codec": "1.4.14" 550 | } 551 | }, 552 | "node_modules/@nodelib/fs.scandir": { 553 | "version": "2.1.5", 554 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 555 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 556 | "peer": true, 557 | "dependencies": { 558 | "@nodelib/fs.stat": "2.0.5", 559 | "run-parallel": "^1.1.9" 560 | }, 561 | "engines": { 562 | "node": ">= 8" 563 | } 564 | }, 565 | "node_modules/@nodelib/fs.stat": { 566 | "version": "2.0.5", 567 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 568 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 569 | "peer": true, 570 | "engines": { 571 | "node": ">= 8" 572 | } 573 | }, 574 | "node_modules/@nodelib/fs.walk": { 575 | "version": "1.2.8", 576 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 577 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 578 | "peer": true, 579 | "dependencies": { 580 | "@nodelib/fs.scandir": "2.1.5", 581 | "fastq": "^1.6.0" 582 | }, 583 | "engines": { 584 | "node": ">= 8" 585 | } 586 | }, 587 | "node_modules/@sapphire/async-queue": { 588 | "version": "1.5.0", 589 | "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", 590 | "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", 591 | "engines": { 592 | "node": ">=v14.0.0", 593 | "npm": ">=7.0.0" 594 | } 595 | }, 596 | "node_modules/@sapphire/shapeshift": { 597 | "version": "3.8.2", 598 | "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz", 599 | "integrity": "sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA==", 600 | "dependencies": { 601 | "fast-deep-equal": "^3.1.3", 602 | "lodash": "^4.17.21" 603 | }, 604 | "engines": { 605 | "node": ">=v14.0.0", 606 | "npm": ">=7.0.0" 607 | } 608 | }, 609 | "node_modules/@sapphire/snowflake": { 610 | "version": "3.4.0", 611 | "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", 612 | "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==", 613 | "engines": { 614 | "node": ">=v14.0.0", 615 | "npm": ">=7.0.0" 616 | } 617 | }, 618 | "node_modules/@tokenizer/token": { 619 | "version": "0.3.0", 620 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 621 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 622 | }, 623 | "node_modules/@tsconfig/node10": { 624 | "version": "1.0.9", 625 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 626 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 627 | "dev": true 628 | }, 629 | "node_modules/@tsconfig/node12": { 630 | "version": "1.0.11", 631 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 632 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 633 | "dev": true 634 | }, 635 | "node_modules/@tsconfig/node14": { 636 | "version": "1.0.3", 637 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 638 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 639 | "dev": true 640 | }, 641 | "node_modules/@tsconfig/node16": { 642 | "version": "1.0.3", 643 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 644 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 645 | "dev": true 646 | }, 647 | "node_modules/@types/node": { 648 | "version": "18.15.11", 649 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", 650 | "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" 651 | }, 652 | "node_modules/@types/ws": { 653 | "version": "8.5.4", 654 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", 655 | "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", 656 | "dependencies": { 657 | "@types/node": "*" 658 | } 659 | }, 660 | "node_modules/abbrev": { 661 | "version": "1.1.1", 662 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 663 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 664 | "dev": true 665 | }, 666 | "node_modules/acorn": { 667 | "version": "8.8.2", 668 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 669 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 670 | "bin": { 671 | "acorn": "bin/acorn" 672 | }, 673 | "engines": { 674 | "node": ">=0.4.0" 675 | } 676 | }, 677 | "node_modules/acorn-jsx": { 678 | "version": "5.3.2", 679 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 680 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 681 | "peer": true, 682 | "peerDependencies": { 683 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 684 | } 685 | }, 686 | "node_modules/acorn-walk": { 687 | "version": "8.2.0", 688 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 689 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 690 | "dev": true, 691 | "engines": { 692 | "node": ">=0.4.0" 693 | } 694 | }, 695 | "node_modules/ajv": { 696 | "version": "6.12.6", 697 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 698 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 699 | "peer": true, 700 | "dependencies": { 701 | "fast-deep-equal": "^3.1.1", 702 | "fast-json-stable-stringify": "^2.0.0", 703 | "json-schema-traverse": "^0.4.1", 704 | "uri-js": "^4.2.2" 705 | }, 706 | "funding": { 707 | "type": "github", 708 | "url": "https://github.com/sponsors/epoberezkin" 709 | } 710 | }, 711 | "node_modules/ansi-regex": { 712 | "version": "5.0.1", 713 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 714 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 715 | "engines": { 716 | "node": ">=8" 717 | } 718 | }, 719 | "node_modules/ansi-styles": { 720 | "version": "4.3.0", 721 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 722 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 723 | "dependencies": { 724 | "color-convert": "^2.0.1" 725 | }, 726 | "engines": { 727 | "node": ">=8" 728 | }, 729 | "funding": { 730 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 731 | } 732 | }, 733 | "node_modules/anymatch": { 734 | "version": "3.1.3", 735 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 736 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 737 | "dev": true, 738 | "dependencies": { 739 | "normalize-path": "^3.0.0", 740 | "picomatch": "^2.0.4" 741 | }, 742 | "engines": { 743 | "node": ">= 8" 744 | } 745 | }, 746 | "node_modules/arg": { 747 | "version": "4.1.3", 748 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 749 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 750 | "dev": true 751 | }, 752 | "node_modules/argparse": { 753 | "version": "2.0.1", 754 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 755 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 756 | "peer": true 757 | }, 758 | "node_modules/asynckit": { 759 | "version": "0.4.0", 760 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 761 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 762 | }, 763 | "node_modules/axios": { 764 | "version": "1.3.5", 765 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz", 766 | "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==", 767 | "dependencies": { 768 | "follow-redirects": "^1.15.0", 769 | "form-data": "^4.0.0", 770 | "proxy-from-env": "^1.1.0" 771 | } 772 | }, 773 | "node_modules/babel-eslint": { 774 | "version": "10.1.0", 775 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", 776 | "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", 777 | "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", 778 | "dependencies": { 779 | "@babel/code-frame": "^7.0.0", 780 | "@babel/parser": "^7.7.0", 781 | "@babel/traverse": "^7.7.0", 782 | "@babel/types": "^7.7.0", 783 | "eslint-visitor-keys": "^1.0.0", 784 | "resolve": "^1.12.0" 785 | }, 786 | "engines": { 787 | "node": ">=6" 788 | }, 789 | "peerDependencies": { 790 | "eslint": ">= 4.12.1" 791 | } 792 | }, 793 | "node_modules/balanced-match": { 794 | "version": "1.0.2", 795 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 796 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 797 | }, 798 | "node_modules/binary-extensions": { 799 | "version": "2.2.0", 800 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 801 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 802 | "dev": true, 803 | "engines": { 804 | "node": ">=8" 805 | } 806 | }, 807 | "node_modules/bmp-js": { 808 | "version": "0.1.0", 809 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", 810 | "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" 811 | }, 812 | "node_modules/brace-expansion": { 813 | "version": "1.1.11", 814 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 815 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 816 | "dependencies": { 817 | "balanced-match": "^1.0.0", 818 | "concat-map": "0.0.1" 819 | } 820 | }, 821 | "node_modules/braces": { 822 | "version": "3.0.2", 823 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 824 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 825 | "dev": true, 826 | "dependencies": { 827 | "fill-range": "^7.0.1" 828 | }, 829 | "engines": { 830 | "node": ">=8" 831 | } 832 | }, 833 | "node_modules/busboy": { 834 | "version": "1.6.0", 835 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 836 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 837 | "dependencies": { 838 | "streamsearch": "^1.1.0" 839 | }, 840 | "engines": { 841 | "node": ">=10.16.0" 842 | } 843 | }, 844 | "node_modules/callsites": { 845 | "version": "3.1.0", 846 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 847 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 848 | "peer": true, 849 | "engines": { 850 | "node": ">=6" 851 | } 852 | }, 853 | "node_modules/chalk": { 854 | "version": "4.1.2", 855 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 856 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 857 | "dependencies": { 858 | "ansi-styles": "^4.1.0", 859 | "supports-color": "^7.1.0" 860 | }, 861 | "engines": { 862 | "node": ">=10" 863 | }, 864 | "funding": { 865 | "url": "https://github.com/chalk/chalk?sponsor=1" 866 | } 867 | }, 868 | "node_modules/chalk/node_modules/supports-color": { 869 | "version": "7.2.0", 870 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 871 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 872 | "dependencies": { 873 | "has-flag": "^4.0.0" 874 | }, 875 | "engines": { 876 | "node": ">=8" 877 | } 878 | }, 879 | "node_modules/chokidar": { 880 | "version": "3.5.3", 881 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 882 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 883 | "dev": true, 884 | "funding": [ 885 | { 886 | "type": "individual", 887 | "url": "https://paulmillr.com/funding/" 888 | } 889 | ], 890 | "dependencies": { 891 | "anymatch": "~3.1.2", 892 | "braces": "~3.0.2", 893 | "glob-parent": "~5.1.2", 894 | "is-binary-path": "~2.1.0", 895 | "is-glob": "~4.0.1", 896 | "normalize-path": "~3.0.0", 897 | "readdirp": "~3.6.0" 898 | }, 899 | "engines": { 900 | "node": ">= 8.10.0" 901 | }, 902 | "optionalDependencies": { 903 | "fsevents": "~2.3.2" 904 | } 905 | }, 906 | "node_modules/cliui": { 907 | "version": "8.0.1", 908 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 909 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 910 | "dev": true, 911 | "dependencies": { 912 | "string-width": "^4.2.0", 913 | "strip-ansi": "^6.0.1", 914 | "wrap-ansi": "^7.0.0" 915 | }, 916 | "engines": { 917 | "node": ">=12" 918 | } 919 | }, 920 | "node_modules/color-convert": { 921 | "version": "2.0.1", 922 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 923 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 924 | "dependencies": { 925 | "color-name": "~1.1.4" 926 | }, 927 | "engines": { 928 | "node": ">=7.0.0" 929 | } 930 | }, 931 | "node_modules/color-name": { 932 | "version": "1.1.4", 933 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 934 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 935 | }, 936 | "node_modules/combined-stream": { 937 | "version": "1.0.8", 938 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 939 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 940 | "dependencies": { 941 | "delayed-stream": "~1.0.0" 942 | }, 943 | "engines": { 944 | "node": ">= 0.8" 945 | } 946 | }, 947 | "node_modules/concat-map": { 948 | "version": "0.0.1", 949 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 950 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 951 | }, 952 | "node_modules/concurrently": { 953 | "version": "8.0.1", 954 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", 955 | "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", 956 | "dev": true, 957 | "dependencies": { 958 | "chalk": "^4.1.2", 959 | "date-fns": "^2.29.3", 960 | "lodash": "^4.17.21", 961 | "rxjs": "^7.8.0", 962 | "shell-quote": "^1.8.0", 963 | "spawn-command": "0.0.2-1", 964 | "supports-color": "^8.1.1", 965 | "tree-kill": "^1.2.2", 966 | "yargs": "^17.7.1" 967 | }, 968 | "bin": { 969 | "conc": "dist/bin/concurrently.js", 970 | "concurrently": "dist/bin/concurrently.js" 971 | }, 972 | "engines": { 973 | "node": "^14.13.0 || >=16.0.0" 974 | }, 975 | "funding": { 976 | "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" 977 | } 978 | }, 979 | "node_modules/create-require": { 980 | "version": "1.1.1", 981 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 982 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 983 | "dev": true 984 | }, 985 | "node_modules/cross-spawn": { 986 | "version": "7.0.3", 987 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 988 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 989 | "dependencies": { 990 | "path-key": "^3.1.0", 991 | "shebang-command": "^2.0.0", 992 | "which": "^2.0.1" 993 | }, 994 | "engines": { 995 | "node": ">= 8" 996 | } 997 | }, 998 | "node_modules/date-fns": { 999 | "version": "2.29.3", 1000 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", 1001 | "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", 1002 | "dev": true, 1003 | "engines": { 1004 | "node": ">=0.11" 1005 | }, 1006 | "funding": { 1007 | "type": "opencollective", 1008 | "url": "https://opencollective.com/date-fns" 1009 | } 1010 | }, 1011 | "node_modules/debug": { 1012 | "version": "3.2.7", 1013 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1014 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "ms": "^2.1.1" 1018 | } 1019 | }, 1020 | "node_modules/deep-is": { 1021 | "version": "0.1.4", 1022 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1023 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1024 | "peer": true 1025 | }, 1026 | "node_modules/delayed-stream": { 1027 | "version": "1.0.0", 1028 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1029 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1030 | "engines": { 1031 | "node": ">=0.4.0" 1032 | } 1033 | }, 1034 | "node_modules/diff": { 1035 | "version": "4.0.2", 1036 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1037 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1038 | "dev": true, 1039 | "engines": { 1040 | "node": ">=0.3.1" 1041 | } 1042 | }, 1043 | "node_modules/discord-api-types": { 1044 | "version": "0.37.37", 1045 | "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz", 1046 | "integrity": "sha512-LDMBKzl/zbvHO/yCzno5hevuA6lFIXJwdKSJZQrB+1ToDpFfN9thK+xxgZNR4aVkI7GHRDja0p4Sl2oYVPnHYg==" 1047 | }, 1048 | "node_modules/discord.js": { 1049 | "version": "14.9.0", 1050 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.9.0.tgz", 1051 | "integrity": "sha512-ygGms5xP4hG+QrrY9k7d/OYCzMltSMtdl/2Snzq/nLCiZo+Sna91Ulv9l0+B5Jd/Czcq37B7wJAnmja7GOa+bg==", 1052 | "dependencies": { 1053 | "@discordjs/builders": "^1.6.0", 1054 | "@discordjs/collection": "^1.5.0", 1055 | "@discordjs/formatters": "^0.3.0", 1056 | "@discordjs/rest": "^1.7.0", 1057 | "@discordjs/util": "^0.2.0", 1058 | "@sapphire/snowflake": "^3.4.0", 1059 | "@types/ws": "^8.5.4", 1060 | "discord-api-types": "^0.37.37", 1061 | "fast-deep-equal": "^3.1.3", 1062 | "lodash.snakecase": "^4.1.1", 1063 | "tslib": "^2.5.0", 1064 | "undici": "^5.21.0", 1065 | "ws": "^8.13.0" 1066 | }, 1067 | "engines": { 1068 | "node": ">=16.9.0" 1069 | } 1070 | }, 1071 | "node_modules/doctrine": { 1072 | "version": "3.0.0", 1073 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1074 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1075 | "peer": true, 1076 | "dependencies": { 1077 | "esutils": "^2.0.2" 1078 | }, 1079 | "engines": { 1080 | "node": ">=6.0.0" 1081 | } 1082 | }, 1083 | "node_modules/duplexer": { 1084 | "version": "0.1.2", 1085 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", 1086 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", 1087 | "dev": true 1088 | }, 1089 | "node_modules/emoji-regex": { 1090 | "version": "8.0.0", 1091 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1092 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1093 | "dev": true 1094 | }, 1095 | "node_modules/escalade": { 1096 | "version": "3.1.1", 1097 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1098 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1099 | "dev": true, 1100 | "engines": { 1101 | "node": ">=6" 1102 | } 1103 | }, 1104 | "node_modules/escape-string-regexp": { 1105 | "version": "4.0.0", 1106 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1107 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1108 | "peer": true, 1109 | "engines": { 1110 | "node": ">=10" 1111 | }, 1112 | "funding": { 1113 | "url": "https://github.com/sponsors/sindresorhus" 1114 | } 1115 | }, 1116 | "node_modules/eslint": { 1117 | "version": "8.37.0", 1118 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", 1119 | "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", 1120 | "peer": true, 1121 | "dependencies": { 1122 | "@eslint-community/eslint-utils": "^4.2.0", 1123 | "@eslint-community/regexpp": "^4.4.0", 1124 | "@eslint/eslintrc": "^2.0.2", 1125 | "@eslint/js": "8.37.0", 1126 | "@humanwhocodes/config-array": "^0.11.8", 1127 | "@humanwhocodes/module-importer": "^1.0.1", 1128 | "@nodelib/fs.walk": "^1.2.8", 1129 | "ajv": "^6.10.0", 1130 | "chalk": "^4.0.0", 1131 | "cross-spawn": "^7.0.2", 1132 | "debug": "^4.3.2", 1133 | "doctrine": "^3.0.0", 1134 | "escape-string-regexp": "^4.0.0", 1135 | "eslint-scope": "^7.1.1", 1136 | "eslint-visitor-keys": "^3.4.0", 1137 | "espree": "^9.5.1", 1138 | "esquery": "^1.4.2", 1139 | "esutils": "^2.0.2", 1140 | "fast-deep-equal": "^3.1.3", 1141 | "file-entry-cache": "^6.0.1", 1142 | "find-up": "^5.0.0", 1143 | "glob-parent": "^6.0.2", 1144 | "globals": "^13.19.0", 1145 | "grapheme-splitter": "^1.0.4", 1146 | "ignore": "^5.2.0", 1147 | "import-fresh": "^3.0.0", 1148 | "imurmurhash": "^0.1.4", 1149 | "is-glob": "^4.0.0", 1150 | "is-path-inside": "^3.0.3", 1151 | "js-sdsl": "^4.1.4", 1152 | "js-yaml": "^4.1.0", 1153 | "json-stable-stringify-without-jsonify": "^1.0.1", 1154 | "levn": "^0.4.1", 1155 | "lodash.merge": "^4.6.2", 1156 | "minimatch": "^3.1.2", 1157 | "natural-compare": "^1.4.0", 1158 | "optionator": "^0.9.1", 1159 | "strip-ansi": "^6.0.1", 1160 | "strip-json-comments": "^3.1.0", 1161 | "text-table": "^0.2.0" 1162 | }, 1163 | "bin": { 1164 | "eslint": "bin/eslint.js" 1165 | }, 1166 | "engines": { 1167 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1168 | }, 1169 | "funding": { 1170 | "url": "https://opencollective.com/eslint" 1171 | } 1172 | }, 1173 | "node_modules/eslint-scope": { 1174 | "version": "7.1.1", 1175 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1176 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1177 | "peer": true, 1178 | "dependencies": { 1179 | "esrecurse": "^4.3.0", 1180 | "estraverse": "^5.2.0" 1181 | }, 1182 | "engines": { 1183 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1184 | } 1185 | }, 1186 | "node_modules/eslint-visitor-keys": { 1187 | "version": "1.3.0", 1188 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1189 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1190 | "engines": { 1191 | "node": ">=4" 1192 | } 1193 | }, 1194 | "node_modules/eslint/node_modules/debug": { 1195 | "version": "4.3.4", 1196 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1197 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1198 | "peer": true, 1199 | "dependencies": { 1200 | "ms": "2.1.2" 1201 | }, 1202 | "engines": { 1203 | "node": ">=6.0" 1204 | }, 1205 | "peerDependenciesMeta": { 1206 | "supports-color": { 1207 | "optional": true 1208 | } 1209 | } 1210 | }, 1211 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 1212 | "version": "3.4.0", 1213 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", 1214 | "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", 1215 | "peer": true, 1216 | "engines": { 1217 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1218 | }, 1219 | "funding": { 1220 | "url": "https://opencollective.com/eslint" 1221 | } 1222 | }, 1223 | "node_modules/eslint/node_modules/glob-parent": { 1224 | "version": "6.0.2", 1225 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1226 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1227 | "peer": true, 1228 | "dependencies": { 1229 | "is-glob": "^4.0.3" 1230 | }, 1231 | "engines": { 1232 | "node": ">=10.13.0" 1233 | } 1234 | }, 1235 | "node_modules/eslint/node_modules/globals": { 1236 | "version": "13.20.0", 1237 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 1238 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 1239 | "peer": true, 1240 | "dependencies": { 1241 | "type-fest": "^0.20.2" 1242 | }, 1243 | "engines": { 1244 | "node": ">=8" 1245 | }, 1246 | "funding": { 1247 | "url": "https://github.com/sponsors/sindresorhus" 1248 | } 1249 | }, 1250 | "node_modules/eslint/node_modules/ms": { 1251 | "version": "2.1.2", 1252 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1253 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1254 | "peer": true 1255 | }, 1256 | "node_modules/espree": { 1257 | "version": "9.5.1", 1258 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", 1259 | "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", 1260 | "peer": true, 1261 | "dependencies": { 1262 | "acorn": "^8.8.0", 1263 | "acorn-jsx": "^5.3.2", 1264 | "eslint-visitor-keys": "^3.4.0" 1265 | }, 1266 | "engines": { 1267 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1268 | }, 1269 | "funding": { 1270 | "url": "https://opencollective.com/eslint" 1271 | } 1272 | }, 1273 | "node_modules/espree/node_modules/eslint-visitor-keys": { 1274 | "version": "3.4.0", 1275 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", 1276 | "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", 1277 | "peer": true, 1278 | "engines": { 1279 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1280 | }, 1281 | "funding": { 1282 | "url": "https://opencollective.com/eslint" 1283 | } 1284 | }, 1285 | "node_modules/esquery": { 1286 | "version": "1.5.0", 1287 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1288 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1289 | "peer": true, 1290 | "dependencies": { 1291 | "estraverse": "^5.1.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">=0.10" 1295 | } 1296 | }, 1297 | "node_modules/esrecurse": { 1298 | "version": "4.3.0", 1299 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1300 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1301 | "peer": true, 1302 | "dependencies": { 1303 | "estraverse": "^5.2.0" 1304 | }, 1305 | "engines": { 1306 | "node": ">=4.0" 1307 | } 1308 | }, 1309 | "node_modules/estraverse": { 1310 | "version": "5.3.0", 1311 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1312 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1313 | "peer": true, 1314 | "engines": { 1315 | "node": ">=4.0" 1316 | } 1317 | }, 1318 | "node_modules/esutils": { 1319 | "version": "2.0.3", 1320 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1321 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1322 | "peer": true, 1323 | "engines": { 1324 | "node": ">=0.10.0" 1325 | } 1326 | }, 1327 | "node_modules/event-stream": { 1328 | "version": "3.3.4", 1329 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 1330 | "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", 1331 | "dev": true, 1332 | "dependencies": { 1333 | "duplexer": "~0.1.1", 1334 | "from": "~0", 1335 | "map-stream": "~0.1.0", 1336 | "pause-stream": "0.0.11", 1337 | "split": "0.3", 1338 | "stream-combiner": "~0.0.4", 1339 | "through": "~2.3.1" 1340 | } 1341 | }, 1342 | "node_modules/fast-deep-equal": { 1343 | "version": "3.1.3", 1344 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1345 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1346 | }, 1347 | "node_modules/fast-json-stable-stringify": { 1348 | "version": "2.1.0", 1349 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1350 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1351 | "peer": true 1352 | }, 1353 | "node_modules/fast-levenshtein": { 1354 | "version": "2.0.6", 1355 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1356 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1357 | "peer": true 1358 | }, 1359 | "node_modules/fastq": { 1360 | "version": "1.15.0", 1361 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1362 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1363 | "peer": true, 1364 | "dependencies": { 1365 | "reusify": "^1.0.4" 1366 | } 1367 | }, 1368 | "node_modules/file-entry-cache": { 1369 | "version": "6.0.1", 1370 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1371 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1372 | "peer": true, 1373 | "dependencies": { 1374 | "flat-cache": "^3.0.4" 1375 | }, 1376 | "engines": { 1377 | "node": "^10.12.0 || >=12.0.0" 1378 | } 1379 | }, 1380 | "node_modules/file-type": { 1381 | "version": "18.2.1", 1382 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", 1383 | "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", 1384 | "dependencies": { 1385 | "readable-web-to-node-stream": "^3.0.2", 1386 | "strtok3": "^7.0.0", 1387 | "token-types": "^5.0.1" 1388 | }, 1389 | "engines": { 1390 | "node": ">=14.16" 1391 | }, 1392 | "funding": { 1393 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1394 | } 1395 | }, 1396 | "node_modules/fill-range": { 1397 | "version": "7.0.1", 1398 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1399 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1400 | "dev": true, 1401 | "dependencies": { 1402 | "to-regex-range": "^5.0.1" 1403 | }, 1404 | "engines": { 1405 | "node": ">=8" 1406 | } 1407 | }, 1408 | "node_modules/find-up": { 1409 | "version": "5.0.0", 1410 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1411 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1412 | "peer": true, 1413 | "dependencies": { 1414 | "locate-path": "^6.0.0", 1415 | "path-exists": "^4.0.0" 1416 | }, 1417 | "engines": { 1418 | "node": ">=10" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/sindresorhus" 1422 | } 1423 | }, 1424 | "node_modules/flat-cache": { 1425 | "version": "3.0.4", 1426 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1427 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1428 | "peer": true, 1429 | "dependencies": { 1430 | "flatted": "^3.1.0", 1431 | "rimraf": "^3.0.2" 1432 | }, 1433 | "engines": { 1434 | "node": "^10.12.0 || >=12.0.0" 1435 | } 1436 | }, 1437 | "node_modules/flatted": { 1438 | "version": "3.2.7", 1439 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1440 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1441 | "peer": true 1442 | }, 1443 | "node_modules/follow-redirects": { 1444 | "version": "1.15.2", 1445 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1446 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 1447 | "funding": [ 1448 | { 1449 | "type": "individual", 1450 | "url": "https://github.com/sponsors/RubenVerborgh" 1451 | } 1452 | ], 1453 | "engines": { 1454 | "node": ">=4.0" 1455 | }, 1456 | "peerDependenciesMeta": { 1457 | "debug": { 1458 | "optional": true 1459 | } 1460 | } 1461 | }, 1462 | "node_modules/form-data": { 1463 | "version": "4.0.0", 1464 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1465 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1466 | "dependencies": { 1467 | "asynckit": "^0.4.0", 1468 | "combined-stream": "^1.0.8", 1469 | "mime-types": "^2.1.12" 1470 | }, 1471 | "engines": { 1472 | "node": ">= 6" 1473 | } 1474 | }, 1475 | "node_modules/from": { 1476 | "version": "0.1.7", 1477 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 1478 | "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", 1479 | "dev": true 1480 | }, 1481 | "node_modules/fs.realpath": { 1482 | "version": "1.0.0", 1483 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1484 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1485 | "peer": true 1486 | }, 1487 | "node_modules/fsevents": { 1488 | "version": "2.3.2", 1489 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1490 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1491 | "dev": true, 1492 | "hasInstallScript": true, 1493 | "optional": true, 1494 | "os": [ 1495 | "darwin" 1496 | ], 1497 | "engines": { 1498 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1499 | } 1500 | }, 1501 | "node_modules/function-bind": { 1502 | "version": "1.1.1", 1503 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1504 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1505 | }, 1506 | "node_modules/get-caller-file": { 1507 | "version": "2.0.5", 1508 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1509 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1510 | "dev": true, 1511 | "engines": { 1512 | "node": "6.* || 8.* || >= 10.*" 1513 | } 1514 | }, 1515 | "node_modules/glob": { 1516 | "version": "7.2.3", 1517 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1518 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1519 | "peer": true, 1520 | "dependencies": { 1521 | "fs.realpath": "^1.0.0", 1522 | "inflight": "^1.0.4", 1523 | "inherits": "2", 1524 | "minimatch": "^3.1.1", 1525 | "once": "^1.3.0", 1526 | "path-is-absolute": "^1.0.0" 1527 | }, 1528 | "engines": { 1529 | "node": "*" 1530 | }, 1531 | "funding": { 1532 | "url": "https://github.com/sponsors/isaacs" 1533 | } 1534 | }, 1535 | "node_modules/glob-parent": { 1536 | "version": "5.1.2", 1537 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1538 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1539 | "dev": true, 1540 | "dependencies": { 1541 | "is-glob": "^4.0.1" 1542 | }, 1543 | "engines": { 1544 | "node": ">= 6" 1545 | } 1546 | }, 1547 | "node_modules/globals": { 1548 | "version": "11.12.0", 1549 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1550 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1551 | "engines": { 1552 | "node": ">=4" 1553 | } 1554 | }, 1555 | "node_modules/grapheme-splitter": { 1556 | "version": "1.0.4", 1557 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 1558 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 1559 | "peer": true 1560 | }, 1561 | "node_modules/has": { 1562 | "version": "1.0.3", 1563 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1564 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1565 | "dependencies": { 1566 | "function-bind": "^1.1.1" 1567 | }, 1568 | "engines": { 1569 | "node": ">= 0.4.0" 1570 | } 1571 | }, 1572 | "node_modules/has-flag": { 1573 | "version": "4.0.0", 1574 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1575 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1576 | "engines": { 1577 | "node": ">=8" 1578 | } 1579 | }, 1580 | "node_modules/idb-keyval": { 1581 | "version": "3.2.0", 1582 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-3.2.0.tgz", 1583 | "integrity": "sha512-slx8Q6oywCCSfKgPgL0sEsXtPVnSbTLWpyiDcu6msHOyKOLari1TD1qocXVCft80umnkk3/Qqh3lwoFt8T/BPQ==" 1584 | }, 1585 | "node_modules/ieee754": { 1586 | "version": "1.2.1", 1587 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1588 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1589 | "funding": [ 1590 | { 1591 | "type": "github", 1592 | "url": "https://github.com/sponsors/feross" 1593 | }, 1594 | { 1595 | "type": "patreon", 1596 | "url": "https://www.patreon.com/feross" 1597 | }, 1598 | { 1599 | "type": "consulting", 1600 | "url": "https://feross.org/support" 1601 | } 1602 | ] 1603 | }, 1604 | "node_modules/ignore": { 1605 | "version": "5.2.4", 1606 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1607 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1608 | "peer": true, 1609 | "engines": { 1610 | "node": ">= 4" 1611 | } 1612 | }, 1613 | "node_modules/ignore-by-default": { 1614 | "version": "1.0.1", 1615 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1616 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 1617 | "dev": true 1618 | }, 1619 | "node_modules/import-fresh": { 1620 | "version": "3.3.0", 1621 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1622 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1623 | "peer": true, 1624 | "dependencies": { 1625 | "parent-module": "^1.0.0", 1626 | "resolve-from": "^4.0.0" 1627 | }, 1628 | "engines": { 1629 | "node": ">=6" 1630 | }, 1631 | "funding": { 1632 | "url": "https://github.com/sponsors/sindresorhus" 1633 | } 1634 | }, 1635 | "node_modules/imurmurhash": { 1636 | "version": "0.1.4", 1637 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1638 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1639 | "peer": true, 1640 | "engines": { 1641 | "node": ">=0.8.19" 1642 | } 1643 | }, 1644 | "node_modules/inflight": { 1645 | "version": "1.0.6", 1646 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1647 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1648 | "peer": true, 1649 | "dependencies": { 1650 | "once": "^1.3.0", 1651 | "wrappy": "1" 1652 | } 1653 | }, 1654 | "node_modules/inherits": { 1655 | "version": "2.0.4", 1656 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1657 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1658 | }, 1659 | "node_modules/is-binary-path": { 1660 | "version": "2.1.0", 1661 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1662 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1663 | "dev": true, 1664 | "dependencies": { 1665 | "binary-extensions": "^2.0.0" 1666 | }, 1667 | "engines": { 1668 | "node": ">=8" 1669 | } 1670 | }, 1671 | "node_modules/is-core-module": { 1672 | "version": "2.11.0", 1673 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1674 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1675 | "dependencies": { 1676 | "has": "^1.0.3" 1677 | }, 1678 | "funding": { 1679 | "url": "https://github.com/sponsors/ljharb" 1680 | } 1681 | }, 1682 | "node_modules/is-electron": { 1683 | "version": "2.2.2", 1684 | "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", 1685 | "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" 1686 | }, 1687 | "node_modules/is-extglob": { 1688 | "version": "2.1.1", 1689 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1690 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1691 | "engines": { 1692 | "node": ">=0.10.0" 1693 | } 1694 | }, 1695 | "node_modules/is-fullwidth-code-point": { 1696 | "version": "3.0.0", 1697 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1698 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1699 | "dev": true, 1700 | "engines": { 1701 | "node": ">=8" 1702 | } 1703 | }, 1704 | "node_modules/is-glob": { 1705 | "version": "4.0.3", 1706 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1707 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1708 | "dependencies": { 1709 | "is-extglob": "^2.1.1" 1710 | }, 1711 | "engines": { 1712 | "node": ">=0.10.0" 1713 | } 1714 | }, 1715 | "node_modules/is-number": { 1716 | "version": "7.0.0", 1717 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1718 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1719 | "dev": true, 1720 | "engines": { 1721 | "node": ">=0.12.0" 1722 | } 1723 | }, 1724 | "node_modules/is-path-inside": { 1725 | "version": "3.0.3", 1726 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1727 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1728 | "peer": true, 1729 | "engines": { 1730 | "node": ">=8" 1731 | } 1732 | }, 1733 | "node_modules/is-url": { 1734 | "version": "1.2.4", 1735 | "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", 1736 | "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" 1737 | }, 1738 | "node_modules/isexe": { 1739 | "version": "2.0.0", 1740 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1741 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1742 | }, 1743 | "node_modules/js-sdsl": { 1744 | "version": "4.4.0", 1745 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", 1746 | "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", 1747 | "peer": true, 1748 | "funding": { 1749 | "type": "opencollective", 1750 | "url": "https://opencollective.com/js-sdsl" 1751 | } 1752 | }, 1753 | "node_modules/js-tokens": { 1754 | "version": "4.0.0", 1755 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1756 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1757 | }, 1758 | "node_modules/js-yaml": { 1759 | "version": "4.1.0", 1760 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1761 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1762 | "peer": true, 1763 | "dependencies": { 1764 | "argparse": "^2.0.1" 1765 | }, 1766 | "bin": { 1767 | "js-yaml": "bin/js-yaml.js" 1768 | } 1769 | }, 1770 | "node_modules/jsesc": { 1771 | "version": "2.5.2", 1772 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1773 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1774 | "bin": { 1775 | "jsesc": "bin/jsesc" 1776 | }, 1777 | "engines": { 1778 | "node": ">=4" 1779 | } 1780 | }, 1781 | "node_modules/json-schema-traverse": { 1782 | "version": "0.4.1", 1783 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1784 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1785 | "peer": true 1786 | }, 1787 | "node_modules/json-stable-stringify-without-jsonify": { 1788 | "version": "1.0.1", 1789 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1790 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1791 | "peer": true 1792 | }, 1793 | "node_modules/levn": { 1794 | "version": "0.4.1", 1795 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1796 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1797 | "peer": true, 1798 | "dependencies": { 1799 | "prelude-ls": "^1.2.1", 1800 | "type-check": "~0.4.0" 1801 | }, 1802 | "engines": { 1803 | "node": ">= 0.8.0" 1804 | } 1805 | }, 1806 | "node_modules/locate-path": { 1807 | "version": "6.0.0", 1808 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1809 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1810 | "peer": true, 1811 | "dependencies": { 1812 | "p-locate": "^5.0.0" 1813 | }, 1814 | "engines": { 1815 | "node": ">=10" 1816 | }, 1817 | "funding": { 1818 | "url": "https://github.com/sponsors/sindresorhus" 1819 | } 1820 | }, 1821 | "node_modules/lodash": { 1822 | "version": "4.17.21", 1823 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1824 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1825 | }, 1826 | "node_modules/lodash.merge": { 1827 | "version": "4.6.2", 1828 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1829 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1830 | "peer": true 1831 | }, 1832 | "node_modules/lodash.snakecase": { 1833 | "version": "4.1.1", 1834 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 1835 | "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" 1836 | }, 1837 | "node_modules/make-error": { 1838 | "version": "1.3.6", 1839 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1840 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1841 | "dev": true 1842 | }, 1843 | "node_modules/map-stream": { 1844 | "version": "0.1.0", 1845 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1846 | "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", 1847 | "dev": true 1848 | }, 1849 | "node_modules/mime-db": { 1850 | "version": "1.52.0", 1851 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1852 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1853 | "engines": { 1854 | "node": ">= 0.6" 1855 | } 1856 | }, 1857 | "node_modules/mime-types": { 1858 | "version": "2.1.35", 1859 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1860 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1861 | "dependencies": { 1862 | "mime-db": "1.52.0" 1863 | }, 1864 | "engines": { 1865 | "node": ">= 0.6" 1866 | } 1867 | }, 1868 | "node_modules/minimatch": { 1869 | "version": "3.1.2", 1870 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1871 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1872 | "dependencies": { 1873 | "brace-expansion": "^1.1.7" 1874 | }, 1875 | "engines": { 1876 | "node": "*" 1877 | } 1878 | }, 1879 | "node_modules/ms": { 1880 | "version": "2.1.3", 1881 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1882 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1883 | "dev": true 1884 | }, 1885 | "node_modules/natural-compare": { 1886 | "version": "1.4.0", 1887 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1888 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1889 | "peer": true 1890 | }, 1891 | "node_modules/node-cleanup": { 1892 | "version": "2.1.2", 1893 | "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", 1894 | "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", 1895 | "dev": true 1896 | }, 1897 | "node_modules/node-fetch": { 1898 | "version": "2.6.9", 1899 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", 1900 | "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", 1901 | "dependencies": { 1902 | "whatwg-url": "^5.0.0" 1903 | }, 1904 | "engines": { 1905 | "node": "4.x || >=6.0.0" 1906 | }, 1907 | "peerDependencies": { 1908 | "encoding": "^0.1.0" 1909 | }, 1910 | "peerDependenciesMeta": { 1911 | "encoding": { 1912 | "optional": true 1913 | } 1914 | } 1915 | }, 1916 | "node_modules/nodemon": { 1917 | "version": "2.0.22", 1918 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", 1919 | "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", 1920 | "dev": true, 1921 | "dependencies": { 1922 | "chokidar": "^3.5.2", 1923 | "debug": "^3.2.7", 1924 | "ignore-by-default": "^1.0.1", 1925 | "minimatch": "^3.1.2", 1926 | "pstree.remy": "^1.1.8", 1927 | "semver": "^5.7.1", 1928 | "simple-update-notifier": "^1.0.7", 1929 | "supports-color": "^5.5.0", 1930 | "touch": "^3.1.0", 1931 | "undefsafe": "^2.0.5" 1932 | }, 1933 | "bin": { 1934 | "nodemon": "bin/nodemon.js" 1935 | }, 1936 | "engines": { 1937 | "node": ">=8.10.0" 1938 | }, 1939 | "funding": { 1940 | "type": "opencollective", 1941 | "url": "https://opencollective.com/nodemon" 1942 | } 1943 | }, 1944 | "node_modules/nodemon/node_modules/has-flag": { 1945 | "version": "3.0.0", 1946 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1947 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1948 | "dev": true, 1949 | "engines": { 1950 | "node": ">=4" 1951 | } 1952 | }, 1953 | "node_modules/nodemon/node_modules/supports-color": { 1954 | "version": "5.5.0", 1955 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1956 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1957 | "dev": true, 1958 | "dependencies": { 1959 | "has-flag": "^3.0.0" 1960 | }, 1961 | "engines": { 1962 | "node": ">=4" 1963 | } 1964 | }, 1965 | "node_modules/nopt": { 1966 | "version": "1.0.10", 1967 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1968 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1969 | "dev": true, 1970 | "dependencies": { 1971 | "abbrev": "1" 1972 | }, 1973 | "bin": { 1974 | "nopt": "bin/nopt.js" 1975 | }, 1976 | "engines": { 1977 | "node": "*" 1978 | } 1979 | }, 1980 | "node_modules/normalize-path": { 1981 | "version": "3.0.0", 1982 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1983 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1984 | "dev": true, 1985 | "engines": { 1986 | "node": ">=0.10.0" 1987 | } 1988 | }, 1989 | "node_modules/once": { 1990 | "version": "1.4.0", 1991 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1992 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1993 | "peer": true, 1994 | "dependencies": { 1995 | "wrappy": "1" 1996 | } 1997 | }, 1998 | "node_modules/opencollective-postinstall": { 1999 | "version": "2.0.3", 2000 | "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", 2001 | "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", 2002 | "bin": { 2003 | "opencollective-postinstall": "index.js" 2004 | } 2005 | }, 2006 | "node_modules/optionator": { 2007 | "version": "0.9.1", 2008 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2009 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2010 | "peer": true, 2011 | "dependencies": { 2012 | "deep-is": "^0.1.3", 2013 | "fast-levenshtein": "^2.0.6", 2014 | "levn": "^0.4.1", 2015 | "prelude-ls": "^1.2.1", 2016 | "type-check": "^0.4.0", 2017 | "word-wrap": "^1.2.3" 2018 | }, 2019 | "engines": { 2020 | "node": ">= 0.8.0" 2021 | } 2022 | }, 2023 | "node_modules/p-limit": { 2024 | "version": "3.1.0", 2025 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2026 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2027 | "peer": true, 2028 | "dependencies": { 2029 | "yocto-queue": "^0.1.0" 2030 | }, 2031 | "engines": { 2032 | "node": ">=10" 2033 | }, 2034 | "funding": { 2035 | "url": "https://github.com/sponsors/sindresorhus" 2036 | } 2037 | }, 2038 | "node_modules/p-locate": { 2039 | "version": "5.0.0", 2040 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2041 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2042 | "peer": true, 2043 | "dependencies": { 2044 | "p-limit": "^3.0.2" 2045 | }, 2046 | "engines": { 2047 | "node": ">=10" 2048 | }, 2049 | "funding": { 2050 | "url": "https://github.com/sponsors/sindresorhus" 2051 | } 2052 | }, 2053 | "node_modules/parent-module": { 2054 | "version": "1.0.1", 2055 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2056 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2057 | "peer": true, 2058 | "dependencies": { 2059 | "callsites": "^3.0.0" 2060 | }, 2061 | "engines": { 2062 | "node": ">=6" 2063 | } 2064 | }, 2065 | "node_modules/path-exists": { 2066 | "version": "4.0.0", 2067 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2068 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2069 | "peer": true, 2070 | "engines": { 2071 | "node": ">=8" 2072 | } 2073 | }, 2074 | "node_modules/path-is-absolute": { 2075 | "version": "1.0.1", 2076 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2077 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2078 | "peer": true, 2079 | "engines": { 2080 | "node": ">=0.10.0" 2081 | } 2082 | }, 2083 | "node_modules/path-key": { 2084 | "version": "3.1.1", 2085 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2086 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2087 | "engines": { 2088 | "node": ">=8" 2089 | } 2090 | }, 2091 | "node_modules/path-parse": { 2092 | "version": "1.0.7", 2093 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2094 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2095 | }, 2096 | "node_modules/pause-stream": { 2097 | "version": "0.0.11", 2098 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 2099 | "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", 2100 | "dev": true, 2101 | "dependencies": { 2102 | "through": "~2.3" 2103 | } 2104 | }, 2105 | "node_modules/peek-readable": { 2106 | "version": "5.0.0", 2107 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", 2108 | "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", 2109 | "engines": { 2110 | "node": ">=14.16" 2111 | }, 2112 | "funding": { 2113 | "type": "github", 2114 | "url": "https://github.com/sponsors/Borewit" 2115 | } 2116 | }, 2117 | "node_modules/picomatch": { 2118 | "version": "2.3.1", 2119 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2120 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2121 | "dev": true, 2122 | "engines": { 2123 | "node": ">=8.6" 2124 | }, 2125 | "funding": { 2126 | "url": "https://github.com/sponsors/jonschlinkert" 2127 | } 2128 | }, 2129 | "node_modules/prelude-ls": { 2130 | "version": "1.2.1", 2131 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2132 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2133 | "peer": true, 2134 | "engines": { 2135 | "node": ">= 0.8.0" 2136 | } 2137 | }, 2138 | "node_modules/proxy-from-env": { 2139 | "version": "1.1.0", 2140 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 2141 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 2142 | }, 2143 | "node_modules/ps-tree": { 2144 | "version": "1.2.0", 2145 | "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", 2146 | "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", 2147 | "dev": true, 2148 | "dependencies": { 2149 | "event-stream": "=3.3.4" 2150 | }, 2151 | "bin": { 2152 | "ps-tree": "bin/ps-tree.js" 2153 | }, 2154 | "engines": { 2155 | "node": ">= 0.10" 2156 | } 2157 | }, 2158 | "node_modules/pstree.remy": { 2159 | "version": "1.1.8", 2160 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 2161 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 2162 | "dev": true 2163 | }, 2164 | "node_modules/punycode": { 2165 | "version": "2.3.0", 2166 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2167 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2168 | "peer": true, 2169 | "engines": { 2170 | "node": ">=6" 2171 | } 2172 | }, 2173 | "node_modules/queue-microtask": { 2174 | "version": "1.2.3", 2175 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2176 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2177 | "funding": [ 2178 | { 2179 | "type": "github", 2180 | "url": "https://github.com/sponsors/feross" 2181 | }, 2182 | { 2183 | "type": "patreon", 2184 | "url": "https://www.patreon.com/feross" 2185 | }, 2186 | { 2187 | "type": "consulting", 2188 | "url": "https://feross.org/support" 2189 | } 2190 | ], 2191 | "peer": true 2192 | }, 2193 | "node_modules/readable-stream": { 2194 | "version": "3.6.2", 2195 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2196 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2197 | "dependencies": { 2198 | "inherits": "^2.0.3", 2199 | "string_decoder": "^1.1.1", 2200 | "util-deprecate": "^1.0.1" 2201 | }, 2202 | "engines": { 2203 | "node": ">= 6" 2204 | } 2205 | }, 2206 | "node_modules/readable-web-to-node-stream": { 2207 | "version": "3.0.2", 2208 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 2209 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 2210 | "dependencies": { 2211 | "readable-stream": "^3.6.0" 2212 | }, 2213 | "engines": { 2214 | "node": ">=8" 2215 | }, 2216 | "funding": { 2217 | "type": "github", 2218 | "url": "https://github.com/sponsors/Borewit" 2219 | } 2220 | }, 2221 | "node_modules/readdirp": { 2222 | "version": "3.6.0", 2223 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2224 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2225 | "dev": true, 2226 | "dependencies": { 2227 | "picomatch": "^2.2.1" 2228 | }, 2229 | "engines": { 2230 | "node": ">=8.10.0" 2231 | } 2232 | }, 2233 | "node_modules/regenerator-runtime": { 2234 | "version": "0.13.11", 2235 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 2236 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 2237 | }, 2238 | "node_modules/regex-parser": { 2239 | "version": "2.2.11", 2240 | "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", 2241 | "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" 2242 | }, 2243 | "node_modules/require-directory": { 2244 | "version": "2.1.1", 2245 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2246 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2247 | "dev": true, 2248 | "engines": { 2249 | "node": ">=0.10.0" 2250 | } 2251 | }, 2252 | "node_modules/resolve": { 2253 | "version": "1.22.2", 2254 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", 2255 | "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", 2256 | "dependencies": { 2257 | "is-core-module": "^2.11.0", 2258 | "path-parse": "^1.0.7", 2259 | "supports-preserve-symlinks-flag": "^1.0.0" 2260 | }, 2261 | "bin": { 2262 | "resolve": "bin/resolve" 2263 | }, 2264 | "funding": { 2265 | "url": "https://github.com/sponsors/ljharb" 2266 | } 2267 | }, 2268 | "node_modules/resolve-from": { 2269 | "version": "4.0.0", 2270 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2271 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2272 | "peer": true, 2273 | "engines": { 2274 | "node": ">=4" 2275 | } 2276 | }, 2277 | "node_modules/resolve-url": { 2278 | "version": "0.2.1", 2279 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2280 | "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", 2281 | "deprecated": "https://github.com/lydell/resolve-url#deprecated" 2282 | }, 2283 | "node_modules/reusify": { 2284 | "version": "1.0.4", 2285 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2286 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2287 | "peer": true, 2288 | "engines": { 2289 | "iojs": ">=1.0.0", 2290 | "node": ">=0.10.0" 2291 | } 2292 | }, 2293 | "node_modules/rimraf": { 2294 | "version": "3.0.2", 2295 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2296 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2297 | "peer": true, 2298 | "dependencies": { 2299 | "glob": "^7.1.3" 2300 | }, 2301 | "bin": { 2302 | "rimraf": "bin.js" 2303 | }, 2304 | "funding": { 2305 | "url": "https://github.com/sponsors/isaacs" 2306 | } 2307 | }, 2308 | "node_modules/run-parallel": { 2309 | "version": "1.2.0", 2310 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2311 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2312 | "funding": [ 2313 | { 2314 | "type": "github", 2315 | "url": "https://github.com/sponsors/feross" 2316 | }, 2317 | { 2318 | "type": "patreon", 2319 | "url": "https://www.patreon.com/feross" 2320 | }, 2321 | { 2322 | "type": "consulting", 2323 | "url": "https://feross.org/support" 2324 | } 2325 | ], 2326 | "peer": true, 2327 | "dependencies": { 2328 | "queue-microtask": "^1.2.2" 2329 | } 2330 | }, 2331 | "node_modules/rxjs": { 2332 | "version": "7.8.0", 2333 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", 2334 | "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", 2335 | "dev": true, 2336 | "dependencies": { 2337 | "tslib": "^2.1.0" 2338 | } 2339 | }, 2340 | "node_modules/safe-buffer": { 2341 | "version": "5.2.1", 2342 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2343 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2344 | "funding": [ 2345 | { 2346 | "type": "github", 2347 | "url": "https://github.com/sponsors/feross" 2348 | }, 2349 | { 2350 | "type": "patreon", 2351 | "url": "https://www.patreon.com/feross" 2352 | }, 2353 | { 2354 | "type": "consulting", 2355 | "url": "https://feross.org/support" 2356 | } 2357 | ] 2358 | }, 2359 | "node_modules/semver": { 2360 | "version": "5.7.1", 2361 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2362 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2363 | "dev": true, 2364 | "bin": { 2365 | "semver": "bin/semver" 2366 | } 2367 | }, 2368 | "node_modules/shebang-command": { 2369 | "version": "2.0.0", 2370 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2371 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2372 | "dependencies": { 2373 | "shebang-regex": "^3.0.0" 2374 | }, 2375 | "engines": { 2376 | "node": ">=8" 2377 | } 2378 | }, 2379 | "node_modules/shebang-regex": { 2380 | "version": "3.0.0", 2381 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2382 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2383 | "engines": { 2384 | "node": ">=8" 2385 | } 2386 | }, 2387 | "node_modules/shell-quote": { 2388 | "version": "1.8.0", 2389 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", 2390 | "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", 2391 | "dev": true, 2392 | "funding": { 2393 | "url": "https://github.com/sponsors/ljharb" 2394 | } 2395 | }, 2396 | "node_modules/simple-update-notifier": { 2397 | "version": "1.1.0", 2398 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 2399 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 2400 | "dev": true, 2401 | "dependencies": { 2402 | "semver": "~7.0.0" 2403 | }, 2404 | "engines": { 2405 | "node": ">=8.10.0" 2406 | } 2407 | }, 2408 | "node_modules/simple-update-notifier/node_modules/semver": { 2409 | "version": "7.0.0", 2410 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 2411 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 2412 | "dev": true, 2413 | "bin": { 2414 | "semver": "bin/semver.js" 2415 | } 2416 | }, 2417 | "node_modules/spawn-command": { 2418 | "version": "0.0.2-1", 2419 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 2420 | "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", 2421 | "dev": true 2422 | }, 2423 | "node_modules/split": { 2424 | "version": "0.3.3", 2425 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 2426 | "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", 2427 | "dev": true, 2428 | "dependencies": { 2429 | "through": "2" 2430 | }, 2431 | "engines": { 2432 | "node": "*" 2433 | } 2434 | }, 2435 | "node_modules/stream-combiner": { 2436 | "version": "0.0.4", 2437 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 2438 | "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", 2439 | "dev": true, 2440 | "dependencies": { 2441 | "duplexer": "~0.1.1" 2442 | } 2443 | }, 2444 | "node_modules/streamsearch": { 2445 | "version": "1.1.0", 2446 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2447 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2448 | "engines": { 2449 | "node": ">=10.0.0" 2450 | } 2451 | }, 2452 | "node_modules/string_decoder": { 2453 | "version": "1.3.0", 2454 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2455 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2456 | "dependencies": { 2457 | "safe-buffer": "~5.2.0" 2458 | } 2459 | }, 2460 | "node_modules/string-argv": { 2461 | "version": "0.3.1", 2462 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", 2463 | "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", 2464 | "dev": true, 2465 | "engines": { 2466 | "node": ">=0.6.19" 2467 | } 2468 | }, 2469 | "node_modules/string-width": { 2470 | "version": "4.2.3", 2471 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2472 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2473 | "dev": true, 2474 | "dependencies": { 2475 | "emoji-regex": "^8.0.0", 2476 | "is-fullwidth-code-point": "^3.0.0", 2477 | "strip-ansi": "^6.0.1" 2478 | }, 2479 | "engines": { 2480 | "node": ">=8" 2481 | } 2482 | }, 2483 | "node_modules/strip-ansi": { 2484 | "version": "6.0.1", 2485 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2486 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2487 | "dependencies": { 2488 | "ansi-regex": "^5.0.1" 2489 | }, 2490 | "engines": { 2491 | "node": ">=8" 2492 | } 2493 | }, 2494 | "node_modules/strip-json-comments": { 2495 | "version": "3.1.1", 2496 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2497 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2498 | "peer": true, 2499 | "engines": { 2500 | "node": ">=8" 2501 | }, 2502 | "funding": { 2503 | "url": "https://github.com/sponsors/sindresorhus" 2504 | } 2505 | }, 2506 | "node_modules/strtok3": { 2507 | "version": "7.0.0", 2508 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", 2509 | "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", 2510 | "dependencies": { 2511 | "@tokenizer/token": "^0.3.0", 2512 | "peek-readable": "^5.0.0" 2513 | }, 2514 | "engines": { 2515 | "node": ">=14.16" 2516 | }, 2517 | "funding": { 2518 | "type": "github", 2519 | "url": "https://github.com/sponsors/Borewit" 2520 | } 2521 | }, 2522 | "node_modules/supports-color": { 2523 | "version": "8.1.1", 2524 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2525 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2526 | "dev": true, 2527 | "dependencies": { 2528 | "has-flag": "^4.0.0" 2529 | }, 2530 | "engines": { 2531 | "node": ">=10" 2532 | }, 2533 | "funding": { 2534 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2535 | } 2536 | }, 2537 | "node_modules/supports-preserve-symlinks-flag": { 2538 | "version": "1.0.0", 2539 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2540 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2541 | "engines": { 2542 | "node": ">= 0.4" 2543 | }, 2544 | "funding": { 2545 | "url": "https://github.com/sponsors/ljharb" 2546 | } 2547 | }, 2548 | "node_modules/tesseract.js": { 2549 | "version": "4.0.3", 2550 | "resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-4.0.3.tgz", 2551 | "integrity": "sha512-hgFhIx1pqtZD95/xG6mhETpy5lbIzgBoBGPUntb2uIXVk7KcfHo3+ObgPxNZtLOI7LfXXfBvgfraQVmQSo7m9g==", 2552 | "hasInstallScript": true, 2553 | "dependencies": { 2554 | "babel-eslint": "^10.1.0", 2555 | "bmp-js": "^0.1.0", 2556 | "file-type": "^12.4.1", 2557 | "idb-keyval": "^3.2.0", 2558 | "is-electron": "^2.2.0", 2559 | "is-url": "^1.2.4", 2560 | "node-fetch": "^2.6.0", 2561 | "opencollective-postinstall": "^2.0.2", 2562 | "regenerator-runtime": "^0.13.3", 2563 | "resolve-url": "^0.2.1", 2564 | "tesseract.js-core": "^4.0.3", 2565 | "wasm-feature-detect": "^1.2.11", 2566 | "zlibjs": "^0.3.1" 2567 | } 2568 | }, 2569 | "node_modules/tesseract.js-core": { 2570 | "version": "4.0.3", 2571 | "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-4.0.3.tgz", 2572 | "integrity": "sha512-NqSqnq0dNhlQYw9JYWUh0rymN0gG/GaLmP2gdRnxUIivzYkPa0aYQW4WSRO6lGKIabyqxa2j2sELBujyOFYVgQ==" 2573 | }, 2574 | "node_modules/tesseract.js/node_modules/file-type": { 2575 | "version": "12.4.2", 2576 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", 2577 | "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", 2578 | "engines": { 2579 | "node": ">=8" 2580 | } 2581 | }, 2582 | "node_modules/text-table": { 2583 | "version": "0.2.0", 2584 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2585 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2586 | "peer": true 2587 | }, 2588 | "node_modules/through": { 2589 | "version": "2.3.8", 2590 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2591 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2592 | "dev": true 2593 | }, 2594 | "node_modules/to-fast-properties": { 2595 | "version": "2.0.0", 2596 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2597 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2598 | "engines": { 2599 | "node": ">=4" 2600 | } 2601 | }, 2602 | "node_modules/to-regex-range": { 2603 | "version": "5.0.1", 2604 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2605 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2606 | "dev": true, 2607 | "dependencies": { 2608 | "is-number": "^7.0.0" 2609 | }, 2610 | "engines": { 2611 | "node": ">=8.0" 2612 | } 2613 | }, 2614 | "node_modules/token-types": { 2615 | "version": "5.0.1", 2616 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", 2617 | "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", 2618 | "dependencies": { 2619 | "@tokenizer/token": "^0.3.0", 2620 | "ieee754": "^1.2.1" 2621 | }, 2622 | "engines": { 2623 | "node": ">=14.16" 2624 | }, 2625 | "funding": { 2626 | "type": "github", 2627 | "url": "https://github.com/sponsors/Borewit" 2628 | } 2629 | }, 2630 | "node_modules/touch": { 2631 | "version": "3.1.0", 2632 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2633 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2634 | "dev": true, 2635 | "dependencies": { 2636 | "nopt": "~1.0.10" 2637 | }, 2638 | "bin": { 2639 | "nodetouch": "bin/nodetouch.js" 2640 | } 2641 | }, 2642 | "node_modules/tr46": { 2643 | "version": "0.0.3", 2644 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2645 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2646 | }, 2647 | "node_modules/tree-kill": { 2648 | "version": "1.2.2", 2649 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2650 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2651 | "dev": true, 2652 | "bin": { 2653 | "tree-kill": "cli.js" 2654 | } 2655 | }, 2656 | "node_modules/ts-mixer": { 2657 | "version": "6.0.3", 2658 | "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", 2659 | "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" 2660 | }, 2661 | "node_modules/ts-node": { 2662 | "version": "10.9.1", 2663 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2664 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2665 | "dev": true, 2666 | "dependencies": { 2667 | "@cspotcode/source-map-support": "^0.8.0", 2668 | "@tsconfig/node10": "^1.0.7", 2669 | "@tsconfig/node12": "^1.0.7", 2670 | "@tsconfig/node14": "^1.0.0", 2671 | "@tsconfig/node16": "^1.0.2", 2672 | "acorn": "^8.4.1", 2673 | "acorn-walk": "^8.1.1", 2674 | "arg": "^4.1.0", 2675 | "create-require": "^1.1.0", 2676 | "diff": "^4.0.1", 2677 | "make-error": "^1.1.1", 2678 | "v8-compile-cache-lib": "^3.0.1", 2679 | "yn": "3.1.1" 2680 | }, 2681 | "bin": { 2682 | "ts-node": "dist/bin.js", 2683 | "ts-node-cwd": "dist/bin-cwd.js", 2684 | "ts-node-esm": "dist/bin-esm.js", 2685 | "ts-node-script": "dist/bin-script.js", 2686 | "ts-node-transpile-only": "dist/bin-transpile.js", 2687 | "ts-script": "dist/bin-script-deprecated.js" 2688 | }, 2689 | "peerDependencies": { 2690 | "@swc/core": ">=1.2.50", 2691 | "@swc/wasm": ">=1.2.50", 2692 | "@types/node": "*", 2693 | "typescript": ">=2.7" 2694 | }, 2695 | "peerDependenciesMeta": { 2696 | "@swc/core": { 2697 | "optional": true 2698 | }, 2699 | "@swc/wasm": { 2700 | "optional": true 2701 | } 2702 | } 2703 | }, 2704 | "node_modules/tsc-watch": { 2705 | "version": "6.0.0", 2706 | "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.0.0.tgz", 2707 | "integrity": "sha512-zgpju+/z5z29/kK5V28Nz16CMkX2voFOUxkTlCim/R25hxzbyUqu2NfTnmJBQfESBSPbEQUGqDdB9A8opAcB4A==", 2708 | "dev": true, 2709 | "dependencies": { 2710 | "cross-spawn": "^7.0.3", 2711 | "node-cleanup": "^2.1.2", 2712 | "ps-tree": "^1.2.0", 2713 | "string-argv": "^0.3.1" 2714 | }, 2715 | "bin": { 2716 | "tsc-watch": "dist/lib/tsc-watch.js" 2717 | }, 2718 | "engines": { 2719 | "node": ">=12.12.0" 2720 | }, 2721 | "peerDependencies": { 2722 | "typescript": "*" 2723 | } 2724 | }, 2725 | "node_modules/tslib": { 2726 | "version": "2.5.0", 2727 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 2728 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" 2729 | }, 2730 | "node_modules/type-check": { 2731 | "version": "0.4.0", 2732 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2733 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2734 | "peer": true, 2735 | "dependencies": { 2736 | "prelude-ls": "^1.2.1" 2737 | }, 2738 | "engines": { 2739 | "node": ">= 0.8.0" 2740 | } 2741 | }, 2742 | "node_modules/type-fest": { 2743 | "version": "0.20.2", 2744 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2745 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2746 | "peer": true, 2747 | "engines": { 2748 | "node": ">=10" 2749 | }, 2750 | "funding": { 2751 | "url": "https://github.com/sponsors/sindresorhus" 2752 | } 2753 | }, 2754 | "node_modules/typescript": { 2755 | "version": "4.9.5", 2756 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2757 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2758 | "dev": true, 2759 | "bin": { 2760 | "tsc": "bin/tsc", 2761 | "tsserver": "bin/tsserver" 2762 | }, 2763 | "engines": { 2764 | "node": ">=4.2.0" 2765 | } 2766 | }, 2767 | "node_modules/undefsafe": { 2768 | "version": "2.0.5", 2769 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 2770 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 2771 | "dev": true 2772 | }, 2773 | "node_modules/undici": { 2774 | "version": "5.21.0", 2775 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", 2776 | "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", 2777 | "dependencies": { 2778 | "busboy": "^1.6.0" 2779 | }, 2780 | "engines": { 2781 | "node": ">=12.18" 2782 | } 2783 | }, 2784 | "node_modules/uri-js": { 2785 | "version": "4.4.1", 2786 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2787 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2788 | "peer": true, 2789 | "dependencies": { 2790 | "punycode": "^2.1.0" 2791 | } 2792 | }, 2793 | "node_modules/util-deprecate": { 2794 | "version": "1.0.2", 2795 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2796 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2797 | }, 2798 | "node_modules/v8-compile-cache-lib": { 2799 | "version": "3.0.1", 2800 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2801 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2802 | "dev": true 2803 | }, 2804 | "node_modules/wasm-feature-detect": { 2805 | "version": "1.5.1", 2806 | "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.5.1.tgz", 2807 | "integrity": "sha512-GHr23qmuehNXHY4902/hJ6EV5sUANIJC3R/yMfQ7hWDg3nfhlcJfnIL96R2ohpIwa62araN6aN4bLzzzq5GXkg==" 2808 | }, 2809 | "node_modules/webidl-conversions": { 2810 | "version": "3.0.1", 2811 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2812 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2813 | }, 2814 | "node_modules/whatwg-url": { 2815 | "version": "5.0.0", 2816 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2817 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2818 | "dependencies": { 2819 | "tr46": "~0.0.3", 2820 | "webidl-conversions": "^3.0.0" 2821 | } 2822 | }, 2823 | "node_modules/which": { 2824 | "version": "2.0.2", 2825 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2826 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2827 | "dependencies": { 2828 | "isexe": "^2.0.0" 2829 | }, 2830 | "bin": { 2831 | "node-which": "bin/node-which" 2832 | }, 2833 | "engines": { 2834 | "node": ">= 8" 2835 | } 2836 | }, 2837 | "node_modules/word-wrap": { 2838 | "version": "1.2.3", 2839 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2840 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2841 | "peer": true, 2842 | "engines": { 2843 | "node": ">=0.10.0" 2844 | } 2845 | }, 2846 | "node_modules/wrap-ansi": { 2847 | "version": "7.0.0", 2848 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2849 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2850 | "dev": true, 2851 | "dependencies": { 2852 | "ansi-styles": "^4.0.0", 2853 | "string-width": "^4.1.0", 2854 | "strip-ansi": "^6.0.0" 2855 | }, 2856 | "engines": { 2857 | "node": ">=10" 2858 | }, 2859 | "funding": { 2860 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2861 | } 2862 | }, 2863 | "node_modules/wrappy": { 2864 | "version": "1.0.2", 2865 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2866 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2867 | "peer": true 2868 | }, 2869 | "node_modules/ws": { 2870 | "version": "8.13.0", 2871 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", 2872 | "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", 2873 | "engines": { 2874 | "node": ">=10.0.0" 2875 | }, 2876 | "peerDependencies": { 2877 | "bufferutil": "^4.0.1", 2878 | "utf-8-validate": ">=5.0.2" 2879 | }, 2880 | "peerDependenciesMeta": { 2881 | "bufferutil": { 2882 | "optional": true 2883 | }, 2884 | "utf-8-validate": { 2885 | "optional": true 2886 | } 2887 | } 2888 | }, 2889 | "node_modules/y18n": { 2890 | "version": "5.0.8", 2891 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2892 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2893 | "dev": true, 2894 | "engines": { 2895 | "node": ">=10" 2896 | } 2897 | }, 2898 | "node_modules/yargs": { 2899 | "version": "17.7.1", 2900 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", 2901 | "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", 2902 | "dev": true, 2903 | "dependencies": { 2904 | "cliui": "^8.0.1", 2905 | "escalade": "^3.1.1", 2906 | "get-caller-file": "^2.0.5", 2907 | "require-directory": "^2.1.1", 2908 | "string-width": "^4.2.3", 2909 | "y18n": "^5.0.5", 2910 | "yargs-parser": "^21.1.1" 2911 | }, 2912 | "engines": { 2913 | "node": ">=12" 2914 | } 2915 | }, 2916 | "node_modules/yargs-parser": { 2917 | "version": "21.1.1", 2918 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2919 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2920 | "dev": true, 2921 | "engines": { 2922 | "node": ">=12" 2923 | } 2924 | }, 2925 | "node_modules/yn": { 2926 | "version": "3.1.1", 2927 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2928 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2929 | "dev": true, 2930 | "engines": { 2931 | "node": ">=6" 2932 | } 2933 | }, 2934 | "node_modules/yocto-queue": { 2935 | "version": "0.1.0", 2936 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2937 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2938 | "peer": true, 2939 | "engines": { 2940 | "node": ">=10" 2941 | }, 2942 | "funding": { 2943 | "url": "https://github.com/sponsors/sindresorhus" 2944 | } 2945 | }, 2946 | "node_modules/zlibjs": { 2947 | "version": "0.3.1", 2948 | "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz", 2949 | "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==", 2950 | "engines": { 2951 | "node": "*" 2952 | } 2953 | } 2954 | } 2955 | } 2956 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smart-support-bot", 3 | "private": true, 4 | "version": "1.2.1", 5 | "scripts": { 6 | "build": "tsc", 7 | "start": "node dist/index.js", 8 | "watch:build": "tsc -w", 9 | "watch:serve": "nodemon dist/index.js", 10 | "dev": "concurrently \"npm:watch:build\" \"npm:watch:serve\"", 11 | "prod": "node dist/index.js" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^18.15.11", 15 | "concurrently": "^8.0.1", 16 | "nodemon": "^2.0.22", 17 | "ts-node": "^10.9.1", 18 | "tsc-watch": "^6.0.0", 19 | "typescript": "^4.9.5" 20 | }, 21 | "dependencies": { 22 | "axios": "^1.3.5", 23 | "discord.js": "^14.9.0", 24 | "regex-parser": "^2.2.11", 25 | "tesseract.js": "^4.0.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | An easy-to-use Discord chatbot that automatically responds to messages, including text inside images and URLs. This bot 2 | is designed to assist with FAQs and can be configured to suit your specific needs. It's built using discord.js. 3 | 4 | The bot can read text from: 5 | 6 | - Text messages 7 | - URLs 8 | - Images 9 | 10 | ## **Requirements** 11 | 12 | - **[Node](https://nodejs.org/en/)** version **`^16`** 13 | - npm 14 | 15 | ## **Usage** 16 | 17 | 1. Configure the options according to your needs and add as many responses as desired. 18 | 2. Install packages: **`npm install`** 19 | 3. Start the bot: **`npm start`** 20 | 21 | ## **Example Response Configurations** 22 | 23 | The bot uses regex to find matches in messages and responds with the specified content. Here are some simple examples to 24 | help you get started: 25 | 26 | ### Example using image 27 | 28 | ![https://user-images.githubusercontent.com/45005889/138361646-7544ec8f-aec7-4d69-a0ad-71d63c0ac218.png](https://user-images.githubusercontent.com/45005889/138361646-7544ec8f-aec7-4d69-a0ad-71d63c0ac218.png) 29 | 30 | ### Example using url 31 | 32 | ![https://user-images.githubusercontent.com/45005889/138349727-23e437e7-d8a9-40dc-928d-1bdaec95f051.png](https://user-images.githubusercontent.com/45005889/138349727-23e437e7-d8a9-40dc-928d-1bdaec95f051.png) 33 | 34 | ### **Example 1: Simple Keyword Match** 35 | 36 | ```jsx 37 | responses: [ 38 | { 39 | key: /help/i, // Match any string containing the word "help" (case insensitive) 40 | content: "Need assistance? Visit our support page at https://www.example.com/support" 41 | } 42 | ] 43 | ``` 44 | 45 | ### **Example 2: Multiple Keywords Match** 46 | 47 | ```jsx 48 | responses: [ 49 | { 50 | key: /\b(hello|hi|hey)\b/i, // Match any string containing the words "hello", "hi", or "hey" (case insensitive) 51 | content: "Hello there! How can I help you today?" 52 | } 53 | ] 54 | ``` 55 | 56 | ### **Example 3: Match and Respond with a Captured Group** 57 | 58 | ```jsx 59 | responses: [ 60 | { 61 | key: /my name is (\w+)/i, // Match any string containing "my name is" followed by a single word (case insensitive) 62 | content: "Nice to meet you! How can I help you today?" 63 | } 64 | ] 65 | ``` 66 | 67 | ### **Example 4: Advanced Match with Multiple Keywords** 68 | 69 | ```jsx 70 | responses: [ 71 | { 72 | key: /^(?=.*hello)(?=.*world).*$/mgi, // Match any string that includes both the words "hello" and "world" 73 | content: "Hello World!" // Respond with "Hello World!" 74 | } 75 | ] 76 | ``` 77 | 78 | ## **Configuring the Bot** 79 | 80 | To configure the bot, you need to modify the **`config.json`** file. Here's an example of the **`config.json`** file and 81 | an explanation of its contents: 82 | 83 | ```json 84 | { 85 | "token": "BOT TOKEN HERE", 86 | "bot": { 87 | "activity": "PLAYING", 88 | "activity_message": "Smart Support", 89 | "activity_status": "online" 90 | }, 91 | "support_channels": [ 92 | "CHANNEL IDS HERE" 93 | ], 94 | "excluded_roles": [ 95 | "ROLE IDS HERE" 96 | ], 97 | "urls": { 98 | "allowed_urls": [ 99 | "https://pastebin.com", 100 | "https://termbin.com" 101 | ], 102 | "max_content_size_in_bytes": 314572 103 | }, 104 | "images": { 105 | "max_size_in_bytes": 524288, 106 | "parse_language": "eng", 107 | "message_reaction": "\uD83D\uDC40" 108 | }, 109 | "debug": false 110 | } 111 | ``` 112 | 113 | - **`"token"`**: Replace **`"BOT TOKEN HERE"`** with your bot's token. 114 | - **`"bot"`**: Configure the bot's activity type, message, and status. 115 | - **`"activity"`**: Set the activity type (e.g., **`"PLAYING"`**, **`"STREAMING"`**, **`"LISTENING"`**, * 116 | ***`"WATCHING"`***, or **`"COMPETING"`**). 117 | - **`"activity_message"`**: Set a custom message for the bot's status. 118 | - **`"activity_status"`**: Set the bot's online status (e.g., **`"online"`**, **`"idle"`**, **`"dnd"`** or * 119 | ***`"invisible"`***). 120 | - **`"support_channels"`**: Replace **`"CHANNEL IDS HERE"`** with an array of channel IDs where the bot should operate. 121 | - **`"excluded_roles"`**: Replace **`"ROLE IDS HERE"`** with an array of role IDs that should be excluded from bot reactions. 122 | - **`"urls"`**: Configure URL handling options. 123 | - **`"allowed_urls"`**: Add an array of allowed URLs to parse. 124 | - **`"max_content_size_in_bytes"`**: Set the maximum content size for URLs. 125 | - **`"images"`**: Configure image handling options. 126 | - **`"max_size_in_bytes"`**: Set the maximum image size for parsing. 127 | - **`"parse_language"`**: Set the language used for parsing images. 128 | - **`"message_reaction"`**: Set the reaction to add to messages with images. 129 | - **`"debug"`**: Set to **`true`** to enable extra debug messages. 130 | 131 | ## **Configuring Responses** 132 | 133 | To configure responses, modify the **`responses.json`**. The responses are stored as an array of objects, each 134 | containing a regex **`key`** and a **`content`** value. 135 | 136 | Here's an example of a **`responses.json`** file: 137 | 138 | ```json 139 | [ 140 | { 141 | "key": "how\\s*(?:can|do)\\s*i\\s*reset\\s*my\\s*password", 142 | "content": "To reset your password, follow this link: https://example.com/reset-password" 143 | }, 144 | { 145 | "key": "what\\s*are\\s*the\\s*server\\s*rules", 146 | "content": "Our server rules are: 1) Be respectful, 2) No spamming, 3) Keep content in appropriate channels." 147 | } 148 | ] 149 | ``` 150 | 151 | In this example, the bot will respond with the provided **`content`** when a user's message matches the regex pattern in 152 | the **`key`**. 153 | 154 | ## **Privileged Gateway Intents** 155 | 156 | Some Gateway Intents require approval if your bot is verified. If your bot is not verified, you can toggle those intents to access them. This bot requires the following intents: 157 | 158 | ### **Server Members Intent** 159 | 160 | This intent is required for your bot to receive events listed under **`GUILD_MEMBERS`**. To enable the Server Members Intent: 161 | 162 | 1. Go to the **[Discord Developer Portal](https://discord.com/developers/applications)**. 163 | 2. Select your bot's application. 164 | 3. Navigate to the "Bot" tab on the left-hand side. 165 | 4. Under the "Privileged Gateway Intents" section, enable the "Server Members Intent" toggle. 166 | 167 | **Note**: Once your bot reaches 100 or more servers, this will require verification and approval. **[Read more about Discord bot verification and approval here](https://support.discord.com/hc/en-us/articles/360040720412-Bot-Verification-and-Data-Whitelisting)**. 168 | 169 | ### **Message Content Intent** 170 | 171 | This intent is required for your bot to receive message content in most messages. To enable the Message Content Intent: 172 | 173 | 1. Follow steps 1-3 from the "Server Members Intent" section above. 174 | 2. Under the "Privileged Gateway Intents" section, enable the "Message Content Intent" toggle. 175 | 176 | **Note**: Once your bot reaches 100 or more servers, this will require verification and approval. **[Read more about Discord bot verification and approval here](https://support.discord.com/hc/en-us/articles/360040720412-Bot-Verification-and-Data-Whitelisting)**. 177 | 178 | ## **Bot Permissions** 179 | 180 | This bot also needs to be able to read, write, and reply to messages. Ensure that the bot has access and the necessary permissions to the configured channels. To do this: 181 | 182 | 1. Go to your Discord server and navigate to the desired channel. 183 | 2. Right-click on the channel and select "Edit Channel." 184 | 3. Navigate to the "Permissions" tab. 185 | 4. Click on the "+" button to add a new role or member. 186 | 5. Search for your bot's name and select it. 187 | 6. Grant the required permissions, such as "Read Messages", "Send Messages", and "Add Reactions." 188 | 189 | By following these steps, you'll ensure that the bot has the necessary permissions to function properly in the configured channels. 190 | 191 | ## **Donating** 192 | 193 | Are you enjoying the smart-support-bot? Feeling generous? Help me purchase pizza to continue working on the bot without 194 | an empty stomach! 195 | 196 | Your donations go a long way in helping me develop this bot, but please don't feel obligated to. 197 | 198 | Ko-fi link: **[https://ko-fi.com/avmg20](https://ko-fi.com/avmg20)** Please notify me when you've donated so I can 199 | respond quicker :) AVMG#1234 -------------------------------------------------------------------------------- /responses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "key": "/^(?=.*hello)(?=.*world).*$/mgi", 4 | "content": "Hello World!" 5 | } 6 | ] -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import {Client, GatewayIntentBits, Message, PresenceStatusData} from 'discord.js'; 2 | import {assertActivityType} from "./util/assertActivityType.js"; 3 | import {MessageReader, MessageReaderConfig} from "./message/MessageReader.js"; 4 | import {SettingsInterface} from "./interface/SettingsInterface"; 5 | import {readJson} from "./util/readJson.js"; 6 | import {MessageMatcher} from "./message/MessageMatcher.js"; 7 | import {ResponseInterface} from "./interface/ResponseInterface"; 8 | 9 | /** --- Declare constants --- */ 10 | 11 | const path = require('path'); 12 | // Create a new client instance 13 | const client = new Client({intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent]}); 14 | 15 | // Import config using fs 16 | const settings = readJson(path.join(__dirname, '/../config.json')) as SettingsInterface; 17 | // Import responses using fs 18 | let responses = readJson(path.join(__dirname, '/../responses.json')) as ResponseInterface[]; 19 | 20 | // Create a new message reader instance 21 | const messageReader = new MessageReader({ 22 | urls: settings.urls, 23 | images: settings.images, 24 | debug: settings.debug 25 | } as MessageReaderConfig); 26 | 27 | // Create a new message matcher instance 28 | const messageMatcher = new MessageMatcher(responses); 29 | 30 | /** --- Bot events --- */ 31 | 32 | // When the client is ready, run this code (only once) 33 | client.once('ready', async () => { 34 | // @ts-ignore 35 | await client.user?.setActivity(settings.bot.activity_message, {type: assertActivityType(settings.bot.activity)}); 36 | await client.user?.setStatus(settings.bot.activity_status); 37 | 38 | console.log('Smart-Support-bot is ready!'); 39 | console.log(`${responses.length} responses loaded!`); 40 | }); 41 | 42 | // Listen for messages 43 | client.on('messageCreate', async (message) => { 44 | 45 | // Ignore messages that should not be responded to 46 | if (!botShouldRespond(message)) return; 47 | 48 | try { 49 | // Read the message 50 | let content = await messageReader.read(message) 51 | console.log('[BOT] received message: ' + content.replace(/\n/g, ' ').slice(0, 50) + (content.length > 50 ? '...' : '')); 52 | 53 | // Match the message against the responses 54 | let response = messageMatcher.match(content); 55 | if (!response) return; 56 | 57 | // Send the response 58 | await message.reply(response); 59 | } catch (e) { 60 | if (settings.debug) console.error(e); 61 | } 62 | }); 63 | 64 | // Login to Discord with your client's token 65 | client.login(settings.token); 66 | 67 | /** --- Helper functions --- */ 68 | 69 | const botShouldRespond = (message: Message): boolean => { 70 | // Ignore messages from bots 71 | if (message.author.bot) return false; 72 | 73 | // Ignore messages that are not in the support channels 74 | if (!settings.support_channels.includes(message.channelId)) return false; 75 | 76 | // Ignore messages that are from users with excluded roles 77 | if (message.member?.roles.cache.some(role => settings.excluded_roles.includes(role.id))) return false; 78 | 79 | return true; 80 | } 81 | 82 | -------------------------------------------------------------------------------- /src/interface/ResponseInterface.ts: -------------------------------------------------------------------------------- 1 | export interface ResponseInterface { 2 | key: string | RegExp; // regex string to match against 3 | content: string; // response to send when key is matched 4 | } 5 | 6 | -------------------------------------------------------------------------------- /src/interface/SettingsInterface.ts: -------------------------------------------------------------------------------- 1 | export interface SettingsInterface { 2 | token: string; 3 | bot: BotConfig; 4 | support_channels: string[]; 5 | excluded_roles: string[]; 6 | urls: UrlsConfig; 7 | images: ImagesConfig; 8 | debug: boolean; 9 | } 10 | 11 | export interface BotConfig { 12 | activity: ActivityType; 13 | activity_message: string; 14 | activity_status: string; 15 | } 16 | 17 | export interface UrlsConfig { 18 | allowed_urls: string[]; 19 | max_content_size_in_bytes: number; 20 | } 21 | 22 | export interface ImagesConfig { 23 | max_size_in_bytes: number; 24 | parse_language: string; 25 | message_reaction: string; 26 | } 27 | 28 | export enum ActivityType { 29 | Playing = "PLAYING", 30 | Streaming = "STREAMING", 31 | Listening = "LISTENING", 32 | Watching = "WATCHING", 33 | Competing = "COMPETING", 34 | } -------------------------------------------------------------------------------- /src/message/MessageMatcher.ts: -------------------------------------------------------------------------------- 1 | import {ResponseInterface} from "../interface/ResponseInterface"; 2 | import RegexParser from 'regex-parser'; 3 | 4 | export class MessageMatcher { 5 | protected responses: ResponseInterface[]; 6 | 7 | constructor(responses: ResponseInterface[]) { 8 | this.responses = responses.map(response => { 9 | return { 10 | key: RegexParser(response.key), 11 | content: response.content 12 | } 13 | }) 14 | } 15 | 16 | /** 17 | * @description Match a message against the responses 18 | * @param message 19 | */ 20 | public match(message: string): string | null { 21 | let match = this.responses.findIndex(response => message.match(response.key)) 22 | return match !== -1 ? this.responses[match].content : null; 23 | } 24 | } -------------------------------------------------------------------------------- /src/message/MessageReader.ts: -------------------------------------------------------------------------------- 1 | import {Attachment, Message} from "discord.js"; 2 | import Tesseract from 'tesseract.js'; 3 | import axios from 'axios'; 4 | 5 | export interface MessageReaderConfig { 6 | urls: { 7 | allowed_urls: string[]; // This is a list of allowed urls that can be read from 8 | max_content_size_in_bytes: number; // This is the max size of the content that can be read from a url 9 | }; 10 | 11 | images: { 12 | max_size_in_bytes: number; // This is the max size of the image that can be read from 13 | parse_language: string; // This is the language that the image will be parsed in 14 | message_reaction: string; // This is the reaction that will be added to the message while it is being parsed 15 | } 16 | 17 | debug: boolean; // This is a boolean that determines if debug messages should be shown 18 | } 19 | 20 | export class MessageReader { 21 | protected config: MessageReaderConfig; 22 | protected urlExpression: RegExp = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:\/?#[\]@!\$&'\(\)\*\+,;=.]+$/mg; 23 | 24 | /** 25 | * @param {MessageReaderConfig} config 26 | */ 27 | constructor(config: MessageReaderConfig) { 28 | this.config = config; 29 | } 30 | 31 | /** 32 | * @description Determine the content of the message 33 | * @param message 34 | */ 35 | public async read(message: Message): Promise { 36 | return new Promise(async (resolve, reject) => { 37 | 38 | // Check if message is an URL 39 | if (this.config.urls.allowed_urls.findIndex(url => message.content.startsWith(url)) !== -1) { 40 | 41 | // Check if URL is allowed 42 | if (message.content.match(this.urlExpression)) { 43 | 44 | // Parse URL to text 45 | return this._parseUrl(message) 46 | .then(resolve) 47 | .catch(reject); 48 | } 49 | 50 | // URL is not allowed 51 | return reject('URL not allowed: ' + message.content); 52 | } else { 53 | this._debug('URL not in allowed urls list'); 54 | } 55 | 56 | 57 | // Check if message has an image 58 | if (message.attachments.size > 0) { 59 | 60 | // Check if attachment is an image 61 | let attachment = message.attachments.first(); 62 | 63 | // Check if attachment is an image and is not too large 64 | if (attachment && attachment.size < this.config.images.max_size_in_bytes && this._attachIsImage(attachment)) { 65 | 66 | // Parse image to text 67 | return this._parseImage(message) 68 | .then(resolve) 69 | .catch(reject); 70 | } 71 | 72 | // Attachment is not an image or is too large 73 | return reject(`Attachment is not an image or is too large: ${attachment?.url} (${attachment?.size} bytes)`); 74 | } else { 75 | this._debug(`No attachment found.`); 76 | } 77 | 78 | // Treat message as regular text message 79 | return resolve(message.content); 80 | }); 81 | } 82 | 83 | /** 84 | * @description Parse the content of an image to text 85 | * @param message 86 | * @protected 87 | */ 88 | protected _parseImage(message: Message): Promise { 89 | return new Promise(async (resolve, reject) => { 90 | //add reaction to message to show that it is being parsed 91 | await message.react(this.config.images.message_reaction); 92 | 93 | //check if there is an attachment 94 | let attach = message.attachments.first(); 95 | if (!attach?.url) return reject('No attachment found'); 96 | 97 | //read the image 98 | let response = await Tesseract.recognize(attach.url, this.config.images.parse_language); 99 | 100 | //remove the reaction 101 | await message.reactions.removeAll(); 102 | 103 | this._debug('IMAGE TEXT: ' + response.data.text) 104 | 105 | return resolve(response.data.text); 106 | }); 107 | } 108 | 109 | /** 110 | * @description Parse the content of an url 111 | * @param message 112 | * @protected 113 | */ 114 | protected _parseUrl(message: Message): Promise { 115 | return new Promise(async (resolve, reject) => { 116 | // Check if URL content is not too large 117 | if (message.content.length > this.config.urls.max_content_size_in_bytes) { 118 | return reject('URL content is too large'); 119 | } 120 | 121 | // Read URL content 122 | let response = await axios.get(message.content).catch(reject); 123 | 124 | // Check if URL content is not empty 125 | if (response && response.data) { 126 | this._debug('URL TEXT: ' + response.data); 127 | return resolve(response.data); 128 | } 129 | 130 | // URL content is empty 131 | return reject('URL content is empty'); 132 | }); 133 | } 134 | 135 | /** 136 | * @description Check if message attachment is an image 137 | * @param attachment 138 | * @protected 139 | */ 140 | protected _attachIsImage(attachment: Attachment): boolean { 141 | return attachment?.url.match(/\.(jpeg|jpg|png)$/) != null; 142 | } 143 | 144 | /** 145 | * @description Log a message if debug is enabled 146 | * @param message 147 | * @protected 148 | */ 149 | protected _debug(message: string) { 150 | if (this.config.debug) { 151 | console.log(message); 152 | } 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/util/assertActivityType.ts: -------------------------------------------------------------------------------- 1 | import {ActivityType} from '../interface/SettingsInterface'; 2 | 3 | export function assertActivityType(value: string): ActivityType { 4 | if (!Object.values(ActivityType).includes(value as ActivityType)) { 5 | throw new Error(`Invalid activity type: ${value}`); 6 | } 7 | return value as ActivityType; 8 | } 9 | 10 | -------------------------------------------------------------------------------- /src/util/readJson.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | 3 | export function readJson(path: string,) { 4 | let data = fs.readFileSync(path, 'utf8'); 5 | return JSON.parse(data); 6 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "outDir": "./dist", 6 | "lib": ["es6"], 7 | "allowJs": true, 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "resolveJsonModule": true 13 | }, 14 | "include": ["./src/**/*.ts"], 15 | "exclude": ["node_modules"] 16 | } --------------------------------------------------------------------------------