├── .gitignore ├── .replit ├── config.js ├── nodemon.json ├── readme.md ├── assets └── exemple │ ├── mika-exemple-1.png │ ├── mika-exemple-2.png │ └── mika-exemple-3.png ├── .prettierrc ├── events ├── ready.js └── message.js ├── util └── Util.js ├── commands ├── util │ ├── ping.js │ └── help.js └── music │ ├── pause.js │ ├── resume.js │ ├── volume.js │ ├── seek.js │ ├── remove.js │ ├── nowplaying.js │ ├── leave.js │ ├── skip.js │ ├── skipto.js │ ├── loop.js │ ├── queue.js │ └── play.js ├── tsconfig.json ├── .github ├── dependabot.yml └── FUNDING.yml ├── LICENSE ├── server └── app.js ├── index.js ├── package.json ├── core └── player.js └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | language = "nodejs" 2 | run = "npm start" -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = { 4 | prefix: "p:", 5 | port: 8080, 6 | }; 7 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["./src/"], 3 | "exec": "ts-node ./src/app.ts", 4 | "ext": "ts" 5 | } 6 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## LICENSE 2 | 3 | This code has **MIT** license. See the `LICENSE` file for getting more information. 4 | -------------------------------------------------------------------------------- /assets/exemple/mika-exemple-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LWJerri/JeelangaMusic/HEAD/assets/exemple/mika-exemple-1.png -------------------------------------------------------------------------------- /assets/exemple/mika-exemple-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LWJerri/JeelangaMusic/HEAD/assets/exemple/mika-exemple-2.png -------------------------------------------------------------------------------- /assets/exemple/mika-exemple-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LWJerri/JeelangaMusic/HEAD/assets/exemple/mika-exemple-3.png -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "semi": true, 4 | "singleQuote": false, 5 | "trailingComma": "all", 6 | "tabWidth": 2, 7 | "arrowParens": "always", 8 | "printWidth": 120 9 | } 10 | -------------------------------------------------------------------------------- /events/ready.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = { 4 | name: "ready", 5 | execute: async function (client) { 6 | console.log(`${client.user.username} is ready !`); 7 | client.infoApp = await client.fetchApplication(); 8 | setInterval(async () => { 9 | client.infoApp = await client.fetchApplication(); 10 | }, 3600000); 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /util/Util.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | class Util { 4 | constructor() { 5 | throw Error("Don't make instace"); 6 | } 7 | 8 | /** 9 | * 10 | * @param {string} message 11 | * @param {number} length 12 | */ 13 | static split(message, length = 2040) { 14 | return message.length > length ? message.substr(0, length - 3) + "..." : message; 15 | } 16 | } 17 | 18 | module.exports = Util; 19 | -------------------------------------------------------------------------------- /commands/util/ping.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = { 4 | name: "ping", 5 | description: "Ping the bot", 6 | usage: "ping", 7 | category: "util", 8 | aliases: [], 9 | botPerm: [], 10 | userPerm: [], 11 | admin: false, 12 | nsfw: false, 13 | guildOnly: false, 14 | enabled: true, 15 | execute: function (client, message, args) { 16 | return message.channel.send(`Pong ! ${client.ws.ping} ms`); 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "target": "ESNext", 5 | "module": "commonjs", 6 | "inlineSourceMap": true, 7 | "moduleResolution": "node", 8 | "esModuleInterop": true, 9 | "experimentalDecorators": true, 10 | "emitDecoratorMetadata": true, 11 | "skipLibCheck": true, 12 | "resolveJsonModule": true, 13 | "declaration": true, 14 | "typeRoots": ["node_modules/@types"] 15 | }, 16 | 17 | "include": ["./src"], 18 | "exclude": ["node_modules"] 19 | } 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [LWJerri] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: ['https://send.monobank.ua/8webyivBtV'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jeelanga 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and to permit 9 | persons to whom the Software is furnished subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 17 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 18 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19 | DEALINGSIN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const express = require("express"); 3 | const app = express(); 4 | const corePlayer = require("./../core/player"); 5 | 6 | module.exports = (client) => { 7 | /** Setup control origin */ 8 | app.use(function (req, res, next) { 9 | res.setHeader("Access-Control-Allow-Origin", "*"); 10 | res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 11 | res.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization"); 12 | if ("OPTIONS" == req.method) { 13 | res.sendStatus(204); 14 | } else { 15 | next(); 16 | } 17 | }); 18 | 19 | app.use(express.json()); 20 | app.use(express.urlencoded({ extended: true })); 21 | 22 | app.get("/api/:id/playlists", (req, res) => { 23 | const player = corePlayer.initPlayer(client, req.params.id); 24 | return res.status(202).json({ 25 | queue: player.queue, 26 | index: player.index, 27 | isPlaying: player.isPlaying, 28 | volume: player.volume, 29 | type: player.type, 30 | }); 31 | }); 32 | 33 | app.listen(client.config.port, "0.0.0.0", () => 34 | console.log(`server listening on http://localhost:${client.config.port}`), 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /commands/util/help.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { MessageEmbed } = require("discord.js"); 3 | 4 | module.exports = { 5 | name: "help", 6 | description: "display commands", 7 | usage: "help", 8 | category: "util", 9 | aliases: ["h"], 10 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS"], 11 | userPerm: [], 12 | admin: false, 13 | nsfw: false, 14 | guildOnly: true, 15 | enabled: true, 16 | execute: async function (client, message, args) { 17 | const commands = client.commands; 18 | const cmd = {}; 19 | for (const key of commands.filter((command) => command.enabled)) { 20 | if (!cmd[key[1].category]) { 21 | cmd[key[1].category] = []; 22 | } 23 | cmd[key[1].category].push(key[1]); 24 | } 25 | const helpEmbed = new MessageEmbed() 26 | .setTitle("Command help") 27 | .setAuthor(message.author.username, message.author.displayAvatarURL()) 28 | .setTimestamp(Date.now()) 29 | .setFooter(client.user.username, client.user.displayAvatarURL()); 30 | 31 | for (const key in cmd) { 32 | helpEmbed.addField(`**${cmd[key].length} · ${key}**`, cmd[key].map((v) => `\`${v.name}\``).join(", "), true); 33 | } 34 | 35 | message.channel.send({ embed: helpEmbed }); 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /commands/music/pause.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "pause", 7 | description: "Set stream to pause", 8 | usage: "pause", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!corePlayer.hasPermission(client, message)) { 22 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 23 | required: `Require {{mustVote}} votes for set pause the stream`, 24 | complete: `Vote completed, you set pause the stream`, 25 | content: `Vote {{haveVoted}}/{{mustVote}}`, 26 | }); 27 | if (call) { 28 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 29 | player.dispatcher.pause(); 30 | } else { 31 | return message.channel.send(`You don't set stream to pause`); 32 | } 33 | } else { 34 | player.dispatcher.pause(); 35 | } 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /commands/music/resume.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "resume", 7 | description: "Set stream to resume", 8 | usage: "resume", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!corePlayer.hasPermission(client, message)) { 22 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 23 | required: `Require {{mustVote}} votes for set resume the stream`, 24 | complete: `Vote completed, you set resume the stream`, 25 | content: `Vote {{haveVoted}}/{{mustVote}}`, 26 | }); 27 | if (call) { 28 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 29 | player.dispatcher.resume(); 30 | } else { 31 | return message.channel.send(`You don't set stream to resume`); 32 | } 33 | } else { 34 | player.dispatcher.resume(); 35 | } 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /events/message.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { Message } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "message", 7 | /** 8 | * Execute event 9 | * @param {Client} client 10 | * @param {Message} message 11 | * @return {Promise|null} 12 | */ 13 | execute: function (client, message) { 14 | if (message.author.bot || message.system) return null; 15 | if (!message.content.startsWith(client.config.prefix)) return null; 16 | const args = message.content.slice(client.config.prefix.length).trim().split(/ +/g); 17 | const command = args.shift().toLowerCase(); 18 | const cmd = client.commands.get(command) || client.commands.get(client.aliases.get(command)); 19 | if (!cmd) return null; 20 | if (!message.guild && cmd.guildOnly) { 21 | return message.channel.send(`This command is only available in a guild`); 22 | } 23 | if (message.guild && !message.channel.permissionsFor(message.guild.me).has(cmd.botPerm, { checkAdmin: true })) { 24 | return message.reply(`I need \`${cmd.botPerm.join("`, `")}\` permissions for work correctly`); 25 | } 26 | if ( 27 | message.guild && 28 | message.guild.ownerID !== message.member.id && 29 | !message.channel.permissionsFor(message.member).has(cmd.userPerm, { checkAdmin: true }) 30 | ) { 31 | return message.reply(`You need \`${cmd.userPerm.join("`, `")}\` for this command`); 32 | } 33 | if (!cmd.enabled) { 34 | return message.channel.send("This command is disabled"); 35 | } 36 | cmd.execute(client, message, args); 37 | }, 38 | }; 39 | -------------------------------------------------------------------------------- /commands/music/volume.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "volume", 7 | description: "set volume", 8 | usage: "volume [number]", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!args.join("") || isNaN(args.join(""))) { 22 | return message.channel.send(`You must enter a number value !`); 23 | } 24 | if (!corePlayer.hasPermission(client, message)) { 25 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 26 | required: `Require {{mustVote}} votes for set volume`, 27 | complete: `Vote completed, you set volume`, 28 | content: `Vote {{haveVoted}}/{{mustVote}}`, 29 | }); 30 | if (call) { 31 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 32 | player.dispatcher.setVolume(args.join("") / 100); 33 | } else { 34 | return message.channel.send(`You don't skip music`); 35 | } 36 | } else { 37 | player.dispatcher.setVolume(args.join("") / 100); 38 | } 39 | }, 40 | }; 41 | -------------------------------------------------------------------------------- /commands/music/seek.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "seek", 7 | description: "Set seek", 8 | usage: "seek [number]", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!args.join("") || isNaN(args.join(""))) { 22 | return message.channel.send(`You must enter a number value in seconds!`); 23 | } 24 | if (!corePlayer.hasPermission(client, message)) { 25 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 26 | required: `Require {{mustVote}} votes for seek the stream`, 27 | complete: `Vote completed, you seek the stream`, 28 | content: `Vote {{haveVoted}}/{{mustVote}}`, 29 | }); 30 | if (call) { 31 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 32 | corePlayer.play(client, message, args.join("")); 33 | } else { 34 | return message.channel.send(`You don't set stream to resume`); 35 | } 36 | } else { 37 | corePlayer.play(client, message, args.join("")); 38 | } 39 | }, 40 | }; 41 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { Client, Collection } = require("discord.js"); 3 | const klaw = require("klaw"); 4 | const { sep, resolve, parse } = require("path"); 5 | const credentials = require("./credentials"); 6 | const client = new Client(); 7 | 8 | client.commands = new Collection(); 9 | client.aliases = new Collection(); 10 | client.music = {}; 11 | client.config = require("./config"); 12 | 13 | require("./server/app")(client); 14 | 15 | function loadCommand(commandPath) { 16 | try { 17 | const command = require(commandPath); 18 | client.commands.set(command.name.trim().toLowerCase(), command); 19 | command.aliases.forEach((alias) => { 20 | client.aliases.set(alias, command.name); 21 | }); 22 | console.log(`Command ${command.name} loaded !`); 23 | } catch (error) { 24 | console.error(error); 25 | } 26 | } 27 | 28 | function loadEvent(eventPath) { 29 | try { 30 | const event = require(eventPath); 31 | client.on(event.name.trim(), (...args) => event.execute(client, ...args)); 32 | console.log(`Command ${event.name} loaded !`); 33 | } catch (error) { 34 | console.error(error); 35 | } 36 | } 37 | 38 | klaw(resolve(__dirname, "commands")).on("data", (item) => { 39 | const cmdFile = parse(item.path); 40 | if (!cmdFile.ext || cmdFile.ext !== ".js") return; 41 | loadCommand(`${cmdFile.dir}${sep}${cmdFile.name}${cmdFile.ext}`); 42 | }); 43 | 44 | klaw(resolve(__dirname, "events")).on("data", (item) => { 45 | const cmdFile = parse(item.path); 46 | if (!cmdFile.ext || cmdFile.ext !== ".js") return; 47 | loadEvent(`${cmdFile.dir}${sep}${cmdFile.name}${cmdFile.ext}`); 48 | }); 49 | 50 | client.login(credentials.DISCORD_TOKEN); // token is in process.env.DISCORD_TOKEN 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mika", 3 | "version": "0.1.0", 4 | "description": "[![GitHub license](https://img.shields.io/github/license/LWJerri/mika.svg)](https://github.com/LWJerri/mika/blob/master/LICENSE) [![Github all releases](https://img.shields.io/github/downloads/LWJerri/mika/total.svg)](https://GitHub.com/LWJerri/mika/releases/) [![GitHub stars](https://img.shields.io/github/stars/LWJerri/mika.svg)](https://GitHub.com/LWJerri/mika/stargazers/) [![GitHub watchers](https://img.shields.io/github/watchers/LWJerri/mika.svg)](https://GitHub.com/LWJerri/mika/watchers/) [![GitHub issues](https://img.shields.io/github/issues/LWJerri/mika.svg)](https://GitHub.com/LWJerri/mika/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/LWJerri/mika.svg)](https://GitHub.com/LWJerri/node-anemy/issues?q=is%3Aissue+is%3Aclosed)", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon" 9 | }, 10 | "engines": { 11 | "node": ">= 12" 12 | }, 13 | "repository": "https://github.com/Jeelanga/JeelangaMusic", 14 | "author": "LWJerri (lwjerri.js.org)", 15 | "license": "MIT", 16 | "dependencies": { 17 | "@discordjs/opus": "^0.9.0", 18 | "axios": "^1.1.3", 19 | "discord.js": "^14.6.0", 20 | "express": "^4.18.1", 21 | "ffmpeg": "^0.0.4", 22 | "ffmpeg-static": "^5.0.0", 23 | "html-entities-decoder": "^1.0.2", 24 | "klaw": "^4.0.1", 25 | "moment": "^2.29.3", 26 | "source-map-support": "^0.5.21", 27 | "ytdl-core": "^4.11.0" 28 | }, 29 | "devDependencies": { 30 | "@types/node": "^18.0.0", 31 | "@types/source-map-support": "^0.5.4", 32 | "nodemon": "^2.0.18", 33 | "prettier": "^2.7.1", 34 | "rimraf": "^3.0.2", 35 | "ts-node": "^10.8.1", 36 | "typescript": "^4.7.4" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /commands/music/remove.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "remove", 7 | description: "Remove a song to playlist", 8 | usage: "remove [number]", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | const index = parseInt(args.join("")) - 1; 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (isNaN(index)) { 22 | return message.channel.send(`You must enter a number value !`); 23 | } 24 | if (index > player.queue.length - 1) return message.channel.send("Please enter a valide number "); 25 | if (!corePlayer.hasPermission(client, message)) { 26 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 27 | required: `Require {{mustVote}} votes for remove ${player.queue[index].snippet.title}`, 28 | complete: `Vote completed, you remove ${player.queue[index].snippet.title} from the playlist`, 29 | content: `Vote {{haveVoted}}/{{mustVote}}`, 30 | }); 31 | if (call) { 32 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 33 | if (player.index > index) player.index--; 34 | player.queue.splice(index, 1); 35 | message.channel.send(`Song removed to playlist`); 36 | } else { 37 | return message.channel.send(`You don't set stream to resume`); 38 | } 39 | } else { 40 | if (player.index > index) player.index--; 41 | player.queue.splice(index, 1); 42 | message.channel.send(`Song removed to playlist`); 43 | } 44 | }, 45 | }; 46 | -------------------------------------------------------------------------------- /commands/music/nowplaying.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | const moment = require("moment"); 5 | const { split } = require("./../../util/Util"); 6 | 7 | module.exports = { 8 | name: "nowplaying", 9 | description: "Destroy and reset the stream", 10 | usage: "destroy", 11 | aliases: ["nowplay", "np"], 12 | category: "music", 13 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS"], 14 | userPerm: [], 15 | admin: false, 16 | nsfw: false, 17 | guildOnly: true, 18 | enabled: true, 19 | execute: async function (client, message, args) { 20 | const player = corePlayer.initPlayer(client, message.guild.id); 21 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 22 | const duration = moment.duration({ 23 | ms: player.queue[player.index].time, 24 | }); 25 | const progress = moment.duration({ ms: player.dispatcher.streamTime }); 26 | const progressBar = ["▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬", "▬"]; 27 | const calcul = Math.round(progressBar.length * (player.dispatcher.streamTime / player.queue[player.index].time)); 28 | progressBar[calcul] = "🔘"; 29 | const npEmbed = new MessageEmbed() 30 | .setTitle("Now playing") 31 | .setDescription( 32 | `${split(player.queue[player.index].snippet.description, 1000)}\n[${ 33 | player.queue[player.index].snippet.title 34 | }](https://www.youtube.com/watch?v=${player.queue[player.index].id.videoId})`, 35 | ) 36 | .setThumbnail(player.queue[player.index].snippet.thumbnails.high.url) 37 | .addField( 38 | "Duration", 39 | "[`" + 40 | progress.minutes() + 41 | ":" + 42 | progress.seconds() + 43 | "`] " + 44 | progressBar.join("") + 45 | " [`" + 46 | duration.minutes() + 47 | ":" + 48 | duration.seconds() + 49 | "`]", 50 | ); 51 | message.channel.send({ embed: npEmbed }); 52 | }, 53 | }; 54 | -------------------------------------------------------------------------------- /commands/music/leave.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "leave", 7 | description: "Leave channel", 8 | usage: "leave", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!corePlayer.hasPermission(client, message)) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!corePlayer.hasPermission(client, message)) { 21 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 22 | required: `Require {{mustVote}} votes for destroy the stream`, 23 | complete: `Vote completed, you destroy the stream`, 24 | content: `Vote {{haveVoted}}/{{mustVote}}`, 25 | }); 26 | if (call) { 27 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 28 | /** 29 | * node V14 30 | * player?.dispatcher?.destroy() 31 | */ 32 | try { 33 | player.dispatcher.destroy(); 34 | } catch (error) { 35 | /*No player init*/ 36 | } 37 | try { 38 | message.member.voice.channel.leave(); 39 | } catch (error) { 40 | /*...*/ 41 | } 42 | 43 | // grabage collector 44 | delete client.music[message.guild.id]; 45 | } else { 46 | return message.channel.send(`You don't destroy the stream`); 47 | } 48 | } else { 49 | /** 50 | * node V14 51 | * player?.dispatcher?.destroy() 52 | */ 53 | try { 54 | player.dispatcher.destroy(); 55 | } catch (error) { 56 | /*No player init*/ 57 | } 58 | try { 59 | message.member.voice.channel.leave(); 60 | } catch (error) { 61 | /*...*/ 62 | } 63 | 64 | // grabage collector 65 | delete client.music[message.guild.id]; 66 | } 67 | }, 68 | }; 69 | -------------------------------------------------------------------------------- /commands/music/skip.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "skip", 7 | description: "Skip music", 8 | usage: "skip", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!corePlayer.hasPermission(client, message)) { 22 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 23 | required: `Require {{mustVote}} votes for skip this music`, 24 | complete: `Vote completed, you skip this music`, 25 | content: `Vote {{haveVoted}}/{{mustVote}}`, 26 | }); 27 | if (call) { 28 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 29 | switch (player.loop) { 30 | case "off": 31 | player.queue.shift(); 32 | corePlayer.play(client, message); 33 | break; 34 | default: 35 | await player.dispatcher.destroy(); 36 | if (player.index === player.queue.length - 1) { 37 | player.index = 0; 38 | } else { 39 | player.index++; 40 | } 41 | player.play(message, guildPlayer, guild); 42 | break; 43 | } 44 | } else { 45 | return message.channel.send(`You don't skip music`); 46 | } 47 | } else { 48 | switch (player.loop) { 49 | case "off": 50 | player.queue.shift(); 51 | corePlayer.play(client, message); 52 | break; 53 | default: 54 | await player.dispatcher.destroy(); 55 | if (player.index === player.queue.length - 1) { 56 | player.index = 0; 57 | } else { 58 | player.index++; 59 | } 60 | player.play(message, guildPlayer, guild); 61 | break; 62 | } 63 | } 64 | }, 65 | }; 66 | -------------------------------------------------------------------------------- /commands/music/skipto.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "skipto", 7 | description: "Skip music", 8 | usage: "skipto [number]", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!message.member.voice.channel) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 21 | if (!args.join("") || isNaN(args.join(""))) { 22 | return message.channel.send(`You must enter a number value !`); 23 | } 24 | if (!corePlayer.hasPermission(client, message)) { 25 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 26 | required: `Require {{mustVote}} votes for skip this music`, 27 | complete: `Vote completed, you skip this music`, 28 | content: `Vote {{haveVoted}}/{{mustVote}}`, 29 | }); 30 | if (call) { 31 | if (!player.dispatcher) return message.channel.send(`I don't play a music`); 32 | if (args.join("") > player.queue.length - 1) return message.react("💢"); 33 | switch (player.loop) { 34 | case "off": 35 | player.queue = player.queue.slice(args.join("") - 1); 36 | player.index = 0; 37 | corePlayer.play(client, message); 38 | break; 39 | default: 40 | await player.dispatcher.destroy(); 41 | player.index = args.join("") - 1; 42 | corePlayer.play(client, message); 43 | break; 44 | } 45 | } else { 46 | return message.channel.send(`You don't skip music`); 47 | } 48 | } else { 49 | if (args.join("") > player.queue.length - 1) return message.react("💢"); 50 | switch (player.loop) { 51 | case "off": 52 | player.queue = player.queue.slice(args.join("") - 1); 53 | player.index = 0; 54 | corePlayer.play(client, message); 55 | break; 56 | default: 57 | await player.dispatcher.destroy(); 58 | player.index = args.join("") - 1; 59 | corePlayer.play(client, message); 60 | break; 61 | } 62 | } 63 | }, 64 | }; 65 | -------------------------------------------------------------------------------- /commands/music/loop.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "loop", 7 | description: "Set loop stream", 8 | usage: "loop (on | once | off)", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | execute: async function (client, message, args) { 18 | if (!corePlayer.hasPermission(client, message)) return message.reply("💢"); 19 | const player = corePlayer.initPlayer(client, message.guild.id); 20 | if (!corePlayer.hasPermission(client, message)) { 21 | const call = await corePlayer.callRequest(message, new MessageEmbed(), { 22 | required: `Require {{mustVote}} votes for loop stream`, 23 | complete: `Vote completed, you loop stream`, 24 | content: `Vote {{haveVoted}}/{{mustVote}}`, 25 | }); 26 | if (call) { 27 | switch (args.join("")) { 28 | case "off": 29 | player.loop = "off"; 30 | message.react("➡️"); 31 | break; 32 | case "on": 33 | player.loop = "on"; 34 | message.react("🔁"); 35 | break; 36 | case "once": 37 | player.loop = "once"; 38 | message.react("🔂"); 39 | break; 40 | default: 41 | if (player.loop === "off") { 42 | player.loop = "on"; 43 | message.react("🔁"); 44 | } else if (player.loop === "on") { 45 | player.loop = "once"; 46 | message.react("🔂"); 47 | } else if (player.loop === "once") { 48 | player.loop = "off"; 49 | message.react("➡️"); 50 | } 51 | break; 52 | } 53 | } else { 54 | return message.channel.send(`You don't skip music`); 55 | } 56 | } else { 57 | switch (args.join("")) { 58 | case "off": 59 | player.loop = "off"; 60 | message.react("➡️"); 61 | break; 62 | case "on": 63 | player.loop = "on"; 64 | message.react("🔁"); 65 | break; 66 | case "once": 67 | player.loop = "once"; 68 | message.react("🔂"); 69 | break; 70 | default: 71 | if (player.loop === "off") { 72 | player.loop = "on"; 73 | message.react("🔁"); 74 | } else if (player.loop === "on") { 75 | player.loop = "once"; 76 | message.react("🔂"); 77 | } else if (player.loop === "once") { 78 | player.loop = "off"; 79 | message.react("➡️"); 80 | } 81 | break; 82 | } 83 | } 84 | }, 85 | }; 86 | -------------------------------------------------------------------------------- /commands/music/queue.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const { MessageEmbed, Client, Message } = require("discord.js"); 4 | 5 | module.exports = { 6 | name: "queue", 7 | description: "Display the queue", 8 | usage: "queue", 9 | aliases: [], 10 | category: "music", 11 | botPerm: ["MANAGE_MESSAGES", "EMBED_LINKS"], 12 | userPerm: [], 13 | admin: false, 14 | nsfw: false, 15 | guildOnly: true, 16 | enabled: true, 17 | /** 18 | * 19 | * @param {Client} client 20 | * @param {Message} message 21 | * @param {string[]} args 22 | */ 23 | execute: async function (client, message, args) { 24 | const player = corePlayer.initPlayer(client, message.guild.id); 25 | if (!player.queue || player.queue.length <= 0) return message.channel.send(`The queue is empty`); 26 | let totalTime = 0; 27 | player.queue.map((v) => (totalTime = totalTime + v.time / 1000)); 28 | 29 | const packet = []; 30 | let i = 0; 31 | 32 | let _i = 0; 33 | 34 | for (const song of player.queue) { 35 | song.i = _i; 36 | _i++; 37 | if (packet.length < 1) { 38 | packet.push([song]); 39 | } else { 40 | if ( 41 | ( 42 | packet[i].map((v, i) => `[${i + 1}] ${v.snippet.title} - request by ${v.request}`).join("\n") + 43 | `[0] ${song.snippet.title} - request by ${song.request}` 44 | ).length >= 2048 45 | ) { 46 | i++; 47 | packet.push([song]); 48 | } else { 49 | packet[i].push(song); 50 | } 51 | } 52 | } 53 | 54 | let index = 0; 55 | 56 | const des = (_index = index) => 57 | packet[_index].map((v) => `[${v.i + 1}] ${v.snippet.title} - request by ${v.request}`).join("\n"); 58 | 59 | const msg = await message.channel.send({ 60 | embed: new MessageEmbed() 61 | .setTitle(`${message.guild.name} queue`) 62 | .setDescription(des(index)) 63 | .addField("Playlist time", `${corePlayer.parseSeconde(totalTime)}`), 64 | }); 65 | 66 | if (packet.length > 1) { 67 | await msg.react("◀️"); 68 | await msg.react("▶️"); 69 | 70 | const filter = (reaction, user) => (reaction.emoji.name === "◀️" || reaction.emoji.name === "▶️") && !user.bot; 71 | 72 | const collector = msg.createReactionCollector(filter, { 73 | time: 1000 * 60 * 5, 74 | }); 75 | 76 | const collectFunc = (reaction) => { 77 | if (reaction.emoji.name === "◀️") { 78 | if (index <= 0) index = packet.length - 1; 79 | else index--; 80 | console.log(index); 81 | msg.edit({ 82 | embed: new MessageEmbed() 83 | .setTitle(`${message.guild.name} queue`) 84 | .setDescription(des(index)) 85 | .addField("Playlist time", `${corePlayer.parseSeconde(totalTime)}`), 86 | }); 87 | } else { 88 | if (index >= packet.length - 1) index = 0; 89 | else index++; 90 | console.log(index); 91 | msg.edit({ 92 | embed: new MessageEmbed() 93 | .setTitle(`${message.guild.name} queue`) 94 | .setDescription(des(index)) 95 | .addField("Playlist time", `${corePlayer.parseSeconde(totalTime)}`), 96 | }); 97 | } 98 | }; 99 | 100 | collector.on("collect", collectFunc); 101 | 102 | collector.once("end", () => { 103 | collector.removeAllListeners(); 104 | }); 105 | } 106 | }, 107 | }; 108 | -------------------------------------------------------------------------------- /core/player.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const credentials = require("./../credentials"); 3 | const axios = require("axios"); 4 | const { MessageEmbed } = require("discord.js"); 5 | const ytdl = require("ytdl-core"); 6 | 7 | /** 8 | * init the player 9 | * @param {Client} client 10 | * @param {Snowflake} guildID 11 | * @return {Object} 12 | */ 13 | module.exports.initPlayer = function (client, guildID) { 14 | if (!client.music[guildID]) { 15 | client.music[guildID] = { 16 | queue: [], 17 | index: 0, 18 | isPlaying: false, 19 | volume: 0.5, 20 | type: null, 21 | dispatcher: false, 22 | connection: false, 23 | loop: "off", 24 | broadcast: false, 25 | muteIndicator: false, 26 | backup: { 27 | index: null, 28 | seek: null, 29 | }, 30 | }; 31 | } 32 | return client.music[guildID]; 33 | }; 34 | 35 | /** 36 | * Save data in backup 37 | * @param {Client} client 38 | * @param {Message} message 39 | */ 40 | module.exports.heathBeat = function (client, message) { 41 | const player = this.initPlayer(client, message.guild.id); 42 | player.backup.index = player.index; 43 | player.dispatcher ? (player.backup.seek = player.dispatcher.streamTime) : null; 44 | }; 45 | 46 | /** 47 | * check if the user has the permissions necessery 48 | * @param {Client} client 49 | * @param {Message} message 50 | * @param {Boolean} 51 | */ 52 | module.exports.hasPermission = function (client, message) { 53 | const player = this.initPlayer(client, message.guild.id); 54 | if ( 55 | message.member.hasPermission(["ADMINISTRATOR"], { 56 | checkAdmin: true, 57 | checkOwner: true, 58 | }) 59 | ) { 60 | return true; 61 | } else { 62 | if (message.member.roles.cache.find((role) => role.name === "DJ")) { 63 | return true; 64 | } else { 65 | if (!player.dispatcher) { 66 | return true; 67 | } else { 68 | if (message.guild.me.voice.channel.members.size < 2) { 69 | return true; 70 | } else { 71 | return false; 72 | } 73 | } 74 | } 75 | } 76 | }; 77 | 78 | /** 79 | * Get songs 80 | * @param {String} query 81 | * @return {Promise} 82 | */ 83 | module.exports.getSongs = async function (query) { 84 | return await axios 85 | .get( 86 | `https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=5&key=${ 87 | credentials.YOUTUBE_TOKEN 88 | }&q=${encodeURI(query)}`, 89 | ) 90 | .then((response) => response.data) 91 | .catch((error) => error); 92 | }; 93 | 94 | module.exports.parseSeconde = function (seconds) { 95 | const format = (val) => `0${Math.floor(val)}`.slice(-2); 96 | const hours = seconds / 3600; 97 | const minutes = (seconds % 3600) / 60; 98 | 99 | return [hours, minutes, seconds % 60].map(format).join(":"); 100 | }; 101 | 102 | /** 103 | * Play a song 104 | * @param {Message} message 105 | */ 106 | module.exports.play = async function (client, message, seek = 0) { 107 | const player = this.initPlayer(client, message.guild.id); 108 | if (!player.queue || player.queue.length < 1) { 109 | return message.channel.send(`The playlist is empty`); 110 | } 111 | if (!player.queue[player.index]) { 112 | player.index = player.queue.length; 113 | if (!player.queue[player.index]) { 114 | player.index = 0; 115 | if (!player.queue[player.index]) { 116 | return message.channel.send(`Playlist is empty`); 117 | } 118 | } 119 | } 120 | const msgDl = await message.channel.send("Music downloading 📥"); 121 | player.dispatcher = player.connection.play( 122 | await ytdl(`https://www.youtube.com/watch?v=${player.queue[player.index].id.videoId}`, { 123 | filter: "audioonly", 124 | quality: "highestaudio", 125 | }), 126 | { 127 | volume: player.volume, 128 | highWaterMark: 100, 129 | fec: true, 130 | plp: 30, 131 | bitrate: 64, 132 | seek, 133 | }, 134 | ); 135 | const heatBeat = setInterval(() => { 136 | this.heathBeat(client, message); 137 | }, 5000); 138 | player.connection.voice.setSelfDeaf(true); 139 | player.connection.voice.setSelfMute(false); 140 | player.broadcast = false; 141 | if (!player.muteIndicator) { 142 | const playNowEmbed = new MessageEmbed() 143 | .setTitle(`Now playing`) 144 | .setDescription(player.queue[player.index].snippet.title) 145 | .setThumbnail(player.queue[player.index].snippet.thumbnails.default.url); 146 | message.channel.send({ embed: playNowEmbed }); 147 | } else { 148 | message.react("👌"); 149 | } 150 | player.dispatcher.on("finish", async () => { 151 | clearInterval(heatBeat); 152 | if (player.dispatcher) player.dispatcher.destroy(); 153 | player.dispatcher = null; 154 | if (player.loop === "off" && player.queue.length !== 0) { 155 | player.queue.shift(); 156 | if (player.queue.length === 0) { 157 | return this.play(client, message); 158 | } 159 | player.index = 0; 160 | this.play(client, message); 161 | } else if (player.loop === "on") { 162 | if (player.index === player.queue.length - 1) { 163 | player.index = 0; 164 | } else { 165 | player.index++; 166 | } 167 | this.play(client, message); 168 | } else if (player.loop === "once") { 169 | this.play(client, message); 170 | player.index = player.index; 171 | } 172 | }); 173 | let r = 0; 174 | player.dispatcher.on("speaking", (s) => { 175 | if (s === r) return; 176 | r = s; 177 | msgDl.delete({ timeout: 1000 }).catch((er) => { 178 | /* Message is already delete */ 179 | }); 180 | player.isPlaying = r === 1 ? true : false; 181 | }); 182 | player.dispatcher.on("error", async (err) => { 183 | clearInterval(heatBeat); 184 | console.error(err); 185 | message.channel.send(err, { code: "js" }); 186 | player.index = player.backup.index; 187 | return this.play(client, message, player.backup.seek / 100); 188 | }); 189 | }; 190 | 191 | /** 192 | * Call request 193 | * @param {Message} message 194 | * @param {MessageEmbed} embed 195 | * @param {Object} options 196 | * @param {String} options.required 197 | * @param {String} options.complete 198 | * @param {String} options.content 199 | * @return {Promise} 200 | */ 201 | module.exports.callRequest = async function (message, embed, options) { 202 | return new Promise(async (resolve) => { 203 | let m = await message.channel.send({ embed }); 204 | const members = message.member.voice.channel.members.filter((m) => !m.user.bot); 205 | if (members.size > 1) { 206 | m.react("👍"); 207 | let mustVote = Math.floor(members.size / 2 + 1); 208 | embed.setDescription(options.required.replace(/{{mustVote}}/g, mustVote)); 209 | m.edit({ embed }); 210 | 211 | let filter = (reaction, user) => { 212 | let member = message.guild.members.cache.get(user.id); 213 | let voiceChannel = member.voice.channel; 214 | if (voiceChannel) { 215 | if (voiceChannel.id === message.member.voice.channelID) { 216 | return true; 217 | } else { 218 | return false; 219 | } 220 | } 221 | }; 222 | 223 | let collector = await m.createReactionCollector(filter, { 224 | time: 25000, 225 | }); 226 | 227 | collector.on("collect", (reaction, user) => { 228 | let haveVoted = reaction.count - 1; 229 | if (haveVoted >= mustVote) { 230 | embed.setDescription(options.complete); 231 | m.edit({ embed }); 232 | collector.stop(true); 233 | resolve(true); 234 | } else { 235 | embed.setDescription(options.content.replace(/{{haveVoted}}/g, haveVoted).replace(/{{mustVote}}/g, mustVote)); 236 | m.edit({ embed }); 237 | } 238 | }); 239 | 240 | collector.on("end", (collected, isDone) => { 241 | if (!isDone) { 242 | return resolve(false); 243 | } 244 | }); 245 | } else { 246 | resolve(true); 247 | } 248 | }); 249 | }; 250 | -------------------------------------------------------------------------------- /commands/music/play.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const corePlayer = require("./../../core/player"); 3 | const htmlEntitiesDecoder = require("html-entities-decoder"); 4 | const { MessageEmbed, MessageCollector } = require("discord.js"); 5 | const ytdl = require("ytdl-core"); 6 | 7 | /** 8 | * @typedef snippetObject 9 | * 10 | * @property {string} publishedAt 11 | * @property {string} channelId 12 | * @property {string} title 13 | * @property {string} description 14 | * @property {{default: {url: string}, medium: {url: string}, high: {url: string}}} thumbnails 15 | * @property {string} channelTitle 16 | * @property {string} liveBroadcastContent 17 | * @property {string} publishTime 18 | */ 19 | 20 | /** 21 | * @typedef idObject 22 | * 23 | * @property {string} kind 24 | * @property {string} videoId 25 | */ 26 | 27 | /** 28 | * @typedef SongObject 29 | * 30 | * @property {string} kind 31 | * @property {string} etag 32 | * @property {{kind: string, videoId: string}} id 33 | * @property {snippetObject} snippet 34 | */ 35 | 36 | let requestFunc = {}; 37 | 38 | async function getBasicInfo(args, token) { 39 | if (!requestFunc[token]) requestFunc[token] = 0; 40 | if (requestFunc[token] > 5) return "ERROR"; 41 | requestFunc[token]++; 42 | return ytdl.getBasicInfo(args).catch(async (err) => { 43 | await new Promise((resolve) => setTimeout(resolve, 250)); 44 | return getBasicInfo(args, token); 45 | }); 46 | } 47 | 48 | module.exports = { 49 | name: "play", 50 | description: "Play a music", 51 | usage: "play (url | title)", 52 | aliases: ["p"], 53 | category: "music", 54 | botPerm: ["CONNECT", "SPEAK", "MANAGE_MESSAGES", "EMBED_LINKS", "ADD_REACTIONS"], 55 | userPerm: [], 56 | admin: false, 57 | nsfw: false, 58 | guildOnly: true, 59 | enabled: true, 60 | execute: async function (client, message, args) { 61 | if (!message.member.voice.channel) return message.channel.send(`You must connect on the voice channel before !`); 62 | 63 | const player = corePlayer.initPlayer(client, message.guild.id); 64 | player.connection = await message.member.voice.channel.join(); 65 | 66 | if (!args.join("") && player.queue.length >= 1 && !player.dispatcher) return corePlayer.play(client, message); 67 | else if (!args.join("")) return; 68 | 69 | if ( 70 | /http(s):\/\/(www.)?(youtube.[a-z]{0,10}\/((watch\?v=[a-zA-Z0-9]{0,50})|(embed\/[a-zA-Z0-9]{0,50})))|(youtu.be\/{0,50})/.test( 71 | args.join(""), 72 | ) 73 | ) { 74 | /** 75 | * @type {SongObject} 76 | */ 77 | const song = { 78 | kind: "youtube#searchResult", 79 | etag: undefined, 80 | id: { 81 | kind: "youtube#video", 82 | }, 83 | snippet: { 84 | thumbnails: { 85 | default: {}, 86 | medium: {}, 87 | high: {}, 88 | }, 89 | }, 90 | }; 91 | const songData = await getBasicInfo(args.join(""), message.id); 92 | delete requestFunc[message.id]; 93 | 94 | if (songData == "ERROR") return message.channel.send("I can't play this song"); 95 | 96 | song.id.videoId = songData.video_id; 97 | song.snippet.publishedAt = songData.published; 98 | song.snippet.channelId = songData.author.id; 99 | song.snippet.title = songData.title; 100 | song.snippet.description = songData.description; 101 | song.snippet.thumbnails.default.url = songData.thumbnail_url; 102 | song.snippet.thumbnails.medium.url = songData.thumbnail_url; 103 | song.snippet.thumbnails.high.url = songData.thumbnail_url; 104 | song.snippet.channelTitle = songData.author.user; 105 | song.snippet.liveBroadcastContent = undefined; 106 | song.snippet.publishTime = undefined; 107 | song.time = songData.length_seconds * 1000; 108 | song.request = message.member; 109 | 110 | player.queue.push(song); 111 | player.type = "player"; 112 | let allTime = 0; 113 | player.queue.map((v) => (allTime = allTime + v.time / 1000)); 114 | const addQueueEmbed = new MessageEmbed() 115 | .setTitle(`Add music in playlist`) 116 | .setDescription(song.snippet.title) 117 | .addFields( 118 | { 119 | name: "Song time", 120 | value: `${corePlayer.parseSeconde(song.time / 1000)}`, 121 | inline: true, 122 | }, 123 | { 124 | name: "Playlist time", 125 | value: `${corePlayer.parseSeconde(allTime)}`, 126 | inline: true, 127 | }, 128 | ) 129 | .setThumbnail(song.snippet.thumbnails.high.url); 130 | message.channel.send({ embed: addQueueEmbed }); 131 | if (player.queue.length > 1) { 132 | if (!player.dispatcher) { 133 | corePlayer.play(client, message); 134 | } 135 | } else { 136 | if (player.queue.length <= 1) { 137 | player.index = 0; 138 | } 139 | corePlayer.play(client, message); 140 | } 141 | return; 142 | } 143 | 144 | const youtube = await corePlayer.getSongs(args.join(" ")); 145 | if (youtube.error) return message.channel.send(youtube.error.message, { code: "js" }); 146 | if (youtube.isAxiosError) { 147 | /** 148 | * node v14 youtube?.response?.data?.error?.status 149 | */ 150 | return message.channel.send( 151 | youtube.response 152 | ? youtube.response.data 153 | ? youtube.response.data.error 154 | ? youtube.response.data.error.status 155 | : "undefined" 156 | : "undefined" 157 | : "undefined", 158 | { code: "js" }, 159 | ); 160 | } 161 | 162 | if (youtube.items.length < 1) { 163 | return message.channel.send("No tracks found !"); 164 | } 165 | 166 | for (const key in youtube.items) { 167 | youtube.items[key].snippet.title = htmlEntitiesDecoder(youtube.items[key].snippet.title); 168 | } 169 | 170 | const listEmbed = new MessageEmbed() 171 | .setTitle(`here is music list`) 172 | .setDescription(youtube.items.map((v, i) => `[${i + 1}] ${v.snippet.title}`).join("\n")) 173 | .setTimestamp(Date.now()) 174 | .setFooter(`Entre \`cancel\` for exit selection`); 175 | message.channel.send({ embed: listEmbed }).then((msg) => { 176 | const filter = (msg) => msg.author.id === message.author.id; 177 | const collector = new MessageCollector(message.channel, filter, { 178 | time: 20000, 179 | }); 180 | collector.on("collect", async (msgCollected) => { 181 | const choice = msgCollected.content.trim().split(/ +/g)[0]; 182 | if (choice.toLowerCase() === "cancel") { 183 | return collector.stop("STOPPED"); 184 | } 185 | if (!choice || isNaN(choice)) { 186 | return message.channel.send(`Your choice is invalid`); 187 | } 188 | if (choice > youtube.items.length || choice <= 0) { 189 | return message.reply(`Your choice is not finding in the selection`); 190 | } 191 | const song = youtube.items[choice - 1]; 192 | collector.stop("PLAY"); 193 | msg.delete().catch((err) => { 194 | /*Message already deleted*/ 195 | }); 196 | msgCollected.delete().catch((err) => { 197 | /*Message already deleted*/ 198 | }); 199 | if (song.id.kind === "youtube#channel") { 200 | return message.channel.send(`I can't play a video with a channel`); 201 | } 202 | const info = await ytdl.getBasicInfo(`https://www.youtube.com/watch?v=${song.id.videoId}`); 203 | song.time = JSON.parse(JSON.stringify(info)).length_seconds * 1000; 204 | song.request = message.member; 205 | player.queue.push(song); 206 | player.type = "player"; 207 | let allTime = 0; 208 | player.queue.map((v) => (allTime = allTime + v.time / 1000)); 209 | const addQueueEmbed = new MessageEmbed() 210 | .setTitle(`Add music in playlist`) 211 | .setDescription(song.snippet.title) 212 | .addFields( 213 | { 214 | name: "Song time", 215 | value: `${corePlayer.parseSeconde(song.time / 1000)}`, 216 | inline: true, 217 | }, 218 | { 219 | name: "Playlist time", 220 | value: `${corePlayer.parseSeconde(allTime)}`, 221 | inline: true, 222 | }, 223 | ) 224 | .setThumbnail(song.snippet.thumbnails.high.url); 225 | message.channel.send({ embed: addQueueEmbed }); 226 | if (player.queue.length > 1) { 227 | if (!player.dispatcher) { 228 | corePlayer.play(client, message); 229 | } 230 | } else { 231 | if (player.queue.length <= 1) { 232 | player.index = 0; 233 | } 234 | corePlayer.play(client, message); 235 | } 236 | }); 237 | collector.on("end", (collected, reason) => { 238 | if (reason === "STOPPED") { 239 | return message.reply("You have cancelled the selection"); 240 | } else if (reason === "PLAY") { 241 | return false; 242 | } else { 243 | return message.reply("Do you not have select a song"); 244 | } 245 | }); 246 | }); 247 | }, 248 | }; 249 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@discordjs/opus': ^0.7.0 5 | '@types/node': ^18.0.0 6 | '@types/source-map-support': ^0.5.4 7 | axios: ^0.27.2 8 | discord.js: ^13.8.1 9 | express: ^4.18.1 10 | ffmpeg: ^0.0.4 11 | ffmpeg-static: ^5.0.0 12 | html-entities-decoder: ^1.0.2 13 | klaw: ^4.0.1 14 | moment: ^2.29.3 15 | nodemon: ^2.0.18 16 | prettier: ^2.7.1 17 | rimraf: ^3.0.2 18 | source-map-support: ^0.5.21 19 | ts-node: ^10.8.1 20 | typescript: ^4.7.4 21 | ytdl-core: ^4.11.0 22 | 23 | dependencies: 24 | '@discordjs/opus': 0.7.0 25 | axios: 0.27.2 26 | discord.js: 13.8.1 27 | express: 4.18.1 28 | ffmpeg: 0.0.4 29 | ffmpeg-static: 5.0.0 30 | html-entities-decoder: 1.0.2 31 | klaw: 4.0.1 32 | moment: 2.29.3 33 | source-map-support: 0.5.21 34 | ytdl-core: 4.11.0 35 | 36 | devDependencies: 37 | '@types/node': 18.0.0 38 | '@types/source-map-support': 0.5.4 39 | nodemon: 2.0.18 40 | prettier: 2.7.1 41 | rimraf: 3.0.2 42 | ts-node: 10.8.1_qiyc72axg2v44xl4yovan2v55u 43 | typescript: 4.7.4 44 | 45 | packages: 46 | 47 | /@cspotcode/source-map-support/0.8.1: 48 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 49 | engines: {node: '>=12'} 50 | dependencies: 51 | '@jridgewell/trace-mapping': 0.3.9 52 | dev: true 53 | 54 | /@derhuerst/http-basic/8.2.2: 55 | resolution: {integrity: sha512-ek065nW95mleLHo8vZ+ob7QTQPNOwDEjCe27BX2flme/UTu9z2mD1uRRPko38u7al4tTZADMtozpll8PQHAZgg==} 56 | engines: {node: '>=6.0.0'} 57 | dependencies: 58 | caseless: 0.12.0 59 | concat-stream: 1.6.2 60 | http-response-object: 3.0.2 61 | parse-cache-control: 1.0.1 62 | dev: false 63 | 64 | /@discordjs/builders/0.14.0: 65 | resolution: {integrity: sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==} 66 | engines: {node: '>=16.9.0'} 67 | dependencies: 68 | '@sapphire/shapeshift': 3.3.1 69 | '@sindresorhus/is': 4.6.0 70 | discord-api-types: 0.33.5 71 | fast-deep-equal: 3.1.3 72 | ts-mixer: 6.0.1 73 | tslib: 2.4.0 74 | dev: false 75 | 76 | /@discordjs/collection/0.7.0: 77 | resolution: {integrity: sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==} 78 | engines: {node: '>=16.9.0'} 79 | dev: false 80 | 81 | /@discordjs/node-pre-gyp/0.4.2: 82 | resolution: {integrity: sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==} 83 | hasBin: true 84 | dependencies: 85 | detect-libc: 1.0.3 86 | https-proxy-agent: 5.0.1 87 | make-dir: 3.1.0 88 | node-fetch: 2.6.7 89 | nopt: 5.0.0 90 | npmlog: 5.0.1 91 | rimraf: 3.0.2 92 | semver: 7.3.7 93 | tar: 6.1.11 94 | transitivePeerDependencies: 95 | - encoding 96 | - supports-color 97 | dev: false 98 | 99 | /@discordjs/opus/0.7.0: 100 | resolution: {integrity: sha512-3Xxa3dh7taSDwBAR5fLALZ/KTxvbMmHCMxYLYve6NlPO7Ms1CLmKqp/R4ZoVzkRGQVUVWEhaB1s0v9jfa2tfDg==} 101 | engines: {node: '>=12.0.0'} 102 | requiresBuild: true 103 | dependencies: 104 | '@discordjs/node-pre-gyp': 0.4.2 105 | node-addon-api: 4.3.0 106 | transitivePeerDependencies: 107 | - encoding 108 | - supports-color 109 | dev: false 110 | 111 | /@jridgewell/resolve-uri/3.0.7: 112 | resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} 113 | engines: {node: '>=6.0.0'} 114 | dev: true 115 | 116 | /@jridgewell/sourcemap-codec/1.4.13: 117 | resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} 118 | dev: true 119 | 120 | /@jridgewell/trace-mapping/0.3.9: 121 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 122 | dependencies: 123 | '@jridgewell/resolve-uri': 3.0.7 124 | '@jridgewell/sourcemap-codec': 1.4.13 125 | dev: true 126 | 127 | /@sapphire/async-queue/1.3.1: 128 | resolution: {integrity: sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==} 129 | engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 130 | dev: false 131 | 132 | /@sapphire/shapeshift/3.3.1: 133 | resolution: {integrity: sha512-PB2e5JHWIMRz9HiN/sIWcNIzXjYvzc3OmeRHYICXreKhetDYf4Zufypr8A48Z/XZLzbMqIka6uoR+2dH58nksg==} 134 | engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 135 | dev: false 136 | 137 | /@sindresorhus/is/0.14.0: 138 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 139 | engines: {node: '>=6'} 140 | dev: true 141 | 142 | /@sindresorhus/is/4.6.0: 143 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} 144 | engines: {node: '>=10'} 145 | dev: false 146 | 147 | /@szmarczak/http-timer/1.1.2: 148 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 149 | engines: {node: '>=6'} 150 | dependencies: 151 | defer-to-connect: 1.1.3 152 | dev: true 153 | 154 | /@tsconfig/node10/1.0.9: 155 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 156 | dev: true 157 | 158 | /@tsconfig/node12/1.0.11: 159 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 160 | dev: true 161 | 162 | /@tsconfig/node14/1.0.3: 163 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 164 | dev: true 165 | 166 | /@tsconfig/node16/1.0.3: 167 | resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} 168 | dev: true 169 | 170 | /@types/keyv/3.1.4: 171 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 172 | dependencies: 173 | '@types/node': 18.0.0 174 | dev: true 175 | 176 | /@types/node-fetch/2.6.2: 177 | resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} 178 | dependencies: 179 | '@types/node': 18.0.0 180 | form-data: 3.0.1 181 | dev: false 182 | 183 | /@types/node/10.17.60: 184 | resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} 185 | dev: false 186 | 187 | /@types/node/18.0.0: 188 | resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} 189 | 190 | /@types/responselike/1.0.0: 191 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 192 | dependencies: 193 | '@types/node': 18.0.0 194 | dev: true 195 | 196 | /@types/source-map-support/0.5.4: 197 | resolution: {integrity: sha512-9zGujX1sOPg32XLyfgEB/0G9ZnrjthL/Iv1ZfuAjj8LEilHZEpQSQs1scpRXPhHzGYgWiLz9ldF1cI8JhL+yMw==} 198 | dependencies: 199 | source-map: 0.6.1 200 | dev: true 201 | 202 | /@types/ws/8.5.3: 203 | resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} 204 | dependencies: 205 | '@types/node': 18.0.0 206 | dev: false 207 | 208 | /abbrev/1.1.1: 209 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 210 | 211 | /accepts/1.3.8: 212 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 213 | engines: {node: '>= 0.6'} 214 | dependencies: 215 | mime-types: 2.1.35 216 | negotiator: 0.6.3 217 | dev: false 218 | 219 | /acorn-walk/8.2.0: 220 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 221 | engines: {node: '>=0.4.0'} 222 | dev: true 223 | 224 | /acorn/8.7.1: 225 | resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} 226 | engines: {node: '>=0.4.0'} 227 | hasBin: true 228 | dev: true 229 | 230 | /agent-base/6.0.2: 231 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 232 | engines: {node: '>= 6.0.0'} 233 | dependencies: 234 | debug: 4.3.4 235 | transitivePeerDependencies: 236 | - supports-color 237 | dev: false 238 | 239 | /ansi-align/3.0.1: 240 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 241 | dependencies: 242 | string-width: 4.2.3 243 | dev: true 244 | 245 | /ansi-regex/5.0.1: 246 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 247 | engines: {node: '>=8'} 248 | 249 | /ansi-styles/4.3.0: 250 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 251 | engines: {node: '>=8'} 252 | dependencies: 253 | color-convert: 2.0.1 254 | dev: true 255 | 256 | /anymatch/3.1.2: 257 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 258 | engines: {node: '>= 8'} 259 | dependencies: 260 | normalize-path: 3.0.0 261 | picomatch: 2.3.1 262 | dev: true 263 | 264 | /aproba/2.0.0: 265 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 266 | dev: false 267 | 268 | /are-we-there-yet/2.0.0: 269 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} 270 | engines: {node: '>=10'} 271 | dependencies: 272 | delegates: 1.0.0 273 | readable-stream: 3.6.0 274 | dev: false 275 | 276 | /arg/4.1.3: 277 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 278 | dev: true 279 | 280 | /array-flatten/1.1.1: 281 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 282 | dev: false 283 | 284 | /asynckit/0.4.0: 285 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 286 | dev: false 287 | 288 | /axios/0.27.2: 289 | resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} 290 | dependencies: 291 | follow-redirects: 1.15.1 292 | form-data: 4.0.0 293 | transitivePeerDependencies: 294 | - debug 295 | dev: false 296 | 297 | /balanced-match/1.0.2: 298 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 299 | 300 | /binary-extensions/2.2.0: 301 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 302 | engines: {node: '>=8'} 303 | dev: true 304 | 305 | /body-parser/1.20.0: 306 | resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} 307 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 308 | dependencies: 309 | bytes: 3.1.2 310 | content-type: 1.0.4 311 | debug: 2.6.9 312 | depd: 2.0.0 313 | destroy: 1.2.0 314 | http-errors: 2.0.0 315 | iconv-lite: 0.4.24 316 | on-finished: 2.4.1 317 | qs: 6.10.3 318 | raw-body: 2.5.1 319 | type-is: 1.6.18 320 | unpipe: 1.0.0 321 | transitivePeerDependencies: 322 | - supports-color 323 | dev: false 324 | 325 | /boxen/5.1.2: 326 | resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} 327 | engines: {node: '>=10'} 328 | dependencies: 329 | ansi-align: 3.0.1 330 | camelcase: 6.3.0 331 | chalk: 4.1.2 332 | cli-boxes: 2.2.1 333 | string-width: 4.2.3 334 | type-fest: 0.20.2 335 | widest-line: 3.1.0 336 | wrap-ansi: 7.0.0 337 | dev: true 338 | 339 | /brace-expansion/1.1.11: 340 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 341 | dependencies: 342 | balanced-match: 1.0.2 343 | concat-map: 0.0.1 344 | 345 | /braces/3.0.2: 346 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 347 | engines: {node: '>=8'} 348 | dependencies: 349 | fill-range: 7.0.1 350 | dev: true 351 | 352 | /buffer-from/1.1.2: 353 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 354 | dev: false 355 | 356 | /bytes/3.1.2: 357 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 358 | engines: {node: '>= 0.8'} 359 | dev: false 360 | 361 | /cacheable-request/6.1.0: 362 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 363 | engines: {node: '>=8'} 364 | dependencies: 365 | clone-response: 1.0.2 366 | get-stream: 5.2.0 367 | http-cache-semantics: 4.1.0 368 | keyv: 3.1.0 369 | lowercase-keys: 2.0.0 370 | normalize-url: 4.5.1 371 | responselike: 1.0.2 372 | dev: true 373 | 374 | /call-bind/1.0.2: 375 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 376 | dependencies: 377 | function-bind: 1.1.1 378 | get-intrinsic: 1.1.2 379 | dev: false 380 | 381 | /camelcase/6.3.0: 382 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 383 | engines: {node: '>=10'} 384 | dev: true 385 | 386 | /caseless/0.12.0: 387 | resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} 388 | dev: false 389 | 390 | /chalk/4.1.2: 391 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 392 | engines: {node: '>=10'} 393 | dependencies: 394 | ansi-styles: 4.3.0 395 | supports-color: 7.2.0 396 | dev: true 397 | 398 | /chokidar/3.5.3: 399 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 400 | engines: {node: '>= 8.10.0'} 401 | dependencies: 402 | anymatch: 3.1.2 403 | braces: 3.0.2 404 | glob-parent: 5.1.2 405 | is-binary-path: 2.1.0 406 | is-glob: 4.0.3 407 | normalize-path: 3.0.0 408 | readdirp: 3.6.0 409 | optionalDependencies: 410 | fsevents: 2.3.2 411 | dev: true 412 | 413 | /chownr/2.0.0: 414 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 415 | engines: {node: '>=10'} 416 | dev: false 417 | 418 | /ci-info/2.0.0: 419 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} 420 | dev: true 421 | 422 | /cli-boxes/2.2.1: 423 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} 424 | engines: {node: '>=6'} 425 | dev: true 426 | 427 | /clone-response/1.0.2: 428 | resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} 429 | dependencies: 430 | mimic-response: 1.0.1 431 | dev: true 432 | 433 | /color-convert/2.0.1: 434 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 435 | engines: {node: '>=7.0.0'} 436 | dependencies: 437 | color-name: 1.1.4 438 | dev: true 439 | 440 | /color-name/1.1.4: 441 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 442 | dev: true 443 | 444 | /color-support/1.1.3: 445 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 446 | hasBin: true 447 | dev: false 448 | 449 | /combined-stream/1.0.8: 450 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 451 | engines: {node: '>= 0.8'} 452 | dependencies: 453 | delayed-stream: 1.0.0 454 | dev: false 455 | 456 | /concat-map/0.0.1: 457 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 458 | 459 | /concat-stream/1.6.2: 460 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 461 | engines: {'0': node >= 0.8} 462 | dependencies: 463 | buffer-from: 1.1.2 464 | inherits: 2.0.4 465 | readable-stream: 2.3.7 466 | typedarray: 0.0.6 467 | dev: false 468 | 469 | /configstore/5.0.1: 470 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} 471 | engines: {node: '>=8'} 472 | dependencies: 473 | dot-prop: 5.3.0 474 | graceful-fs: 4.2.10 475 | make-dir: 3.1.0 476 | unique-string: 2.0.0 477 | write-file-atomic: 3.0.3 478 | xdg-basedir: 4.0.0 479 | dev: true 480 | 481 | /console-control-strings/1.1.0: 482 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 483 | dev: false 484 | 485 | /content-disposition/0.5.4: 486 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 487 | engines: {node: '>= 0.6'} 488 | dependencies: 489 | safe-buffer: 5.2.1 490 | dev: false 491 | 492 | /content-type/1.0.4: 493 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 494 | engines: {node: '>= 0.6'} 495 | dev: false 496 | 497 | /cookie-signature/1.0.6: 498 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 499 | dev: false 500 | 501 | /cookie/0.5.0: 502 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 503 | engines: {node: '>= 0.6'} 504 | dev: false 505 | 506 | /core-util-is/1.0.3: 507 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 508 | dev: false 509 | 510 | /create-require/1.1.1: 511 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 512 | dev: true 513 | 514 | /crypto-random-string/2.0.0: 515 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} 516 | engines: {node: '>=8'} 517 | dev: true 518 | 519 | /debug/2.6.9: 520 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 521 | peerDependencies: 522 | supports-color: '*' 523 | peerDependenciesMeta: 524 | supports-color: 525 | optional: true 526 | dependencies: 527 | ms: 2.0.0 528 | dev: false 529 | 530 | /debug/3.2.7_supports-color@5.5.0: 531 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 532 | peerDependencies: 533 | supports-color: '*' 534 | peerDependenciesMeta: 535 | supports-color: 536 | optional: true 537 | dependencies: 538 | ms: 2.1.3 539 | supports-color: 5.5.0 540 | dev: true 541 | 542 | /debug/4.3.4: 543 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 544 | engines: {node: '>=6.0'} 545 | peerDependencies: 546 | supports-color: '*' 547 | peerDependenciesMeta: 548 | supports-color: 549 | optional: true 550 | dependencies: 551 | ms: 2.1.2 552 | dev: false 553 | 554 | /decompress-response/3.3.0: 555 | resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} 556 | engines: {node: '>=4'} 557 | dependencies: 558 | mimic-response: 1.0.1 559 | dev: true 560 | 561 | /deep-extend/0.6.0: 562 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 563 | engines: {node: '>=4.0.0'} 564 | dev: true 565 | 566 | /defer-to-connect/1.1.3: 567 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 568 | dev: true 569 | 570 | /delayed-stream/1.0.0: 571 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 572 | engines: {node: '>=0.4.0'} 573 | dev: false 574 | 575 | /delegates/1.0.0: 576 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 577 | dev: false 578 | 579 | /depd/2.0.0: 580 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 581 | engines: {node: '>= 0.8'} 582 | dev: false 583 | 584 | /destroy/1.2.0: 585 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 586 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 587 | dev: false 588 | 589 | /detect-libc/1.0.3: 590 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 591 | engines: {node: '>=0.10'} 592 | hasBin: true 593 | dev: false 594 | 595 | /diff/4.0.2: 596 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 597 | engines: {node: '>=0.3.1'} 598 | dev: true 599 | 600 | /discord-api-types/0.33.5: 601 | resolution: {integrity: sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==} 602 | dev: false 603 | 604 | /discord.js/13.8.1: 605 | resolution: {integrity: sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==} 606 | engines: {node: '>=16.6.0', npm: '>=7.0.0'} 607 | dependencies: 608 | '@discordjs/builders': 0.14.0 609 | '@discordjs/collection': 0.7.0 610 | '@sapphire/async-queue': 1.3.1 611 | '@types/node-fetch': 2.6.2 612 | '@types/ws': 8.5.3 613 | discord-api-types: 0.33.5 614 | form-data: 4.0.0 615 | node-fetch: 2.6.7 616 | ws: 8.8.0 617 | transitivePeerDependencies: 618 | - bufferutil 619 | - encoding 620 | - utf-8-validate 621 | dev: false 622 | 623 | /dot-prop/5.3.0: 624 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 625 | engines: {node: '>=8'} 626 | dependencies: 627 | is-obj: 2.0.0 628 | dev: true 629 | 630 | /duplexer3/0.1.4: 631 | resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} 632 | dev: true 633 | 634 | /ee-first/1.1.1: 635 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 636 | dev: false 637 | 638 | /emoji-regex/8.0.0: 639 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 640 | 641 | /encodeurl/1.0.2: 642 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 643 | engines: {node: '>= 0.8'} 644 | dev: false 645 | 646 | /end-of-stream/1.4.4: 647 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 648 | dependencies: 649 | once: 1.4.0 650 | dev: true 651 | 652 | /env-paths/2.2.1: 653 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 654 | engines: {node: '>=6'} 655 | dev: false 656 | 657 | /escape-goat/2.1.1: 658 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} 659 | engines: {node: '>=8'} 660 | dev: true 661 | 662 | /escape-html/1.0.3: 663 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 664 | dev: false 665 | 666 | /etag/1.8.1: 667 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 668 | engines: {node: '>= 0.6'} 669 | dev: false 670 | 671 | /express/4.18.1: 672 | resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} 673 | engines: {node: '>= 0.10.0'} 674 | dependencies: 675 | accepts: 1.3.8 676 | array-flatten: 1.1.1 677 | body-parser: 1.20.0 678 | content-disposition: 0.5.4 679 | content-type: 1.0.4 680 | cookie: 0.5.0 681 | cookie-signature: 1.0.6 682 | debug: 2.6.9 683 | depd: 2.0.0 684 | encodeurl: 1.0.2 685 | escape-html: 1.0.3 686 | etag: 1.8.1 687 | finalhandler: 1.2.0 688 | fresh: 0.5.2 689 | http-errors: 2.0.0 690 | merge-descriptors: 1.0.1 691 | methods: 1.1.2 692 | on-finished: 2.4.1 693 | parseurl: 1.3.3 694 | path-to-regexp: 0.1.7 695 | proxy-addr: 2.0.7 696 | qs: 6.10.3 697 | range-parser: 1.2.1 698 | safe-buffer: 5.2.1 699 | send: 0.18.0 700 | serve-static: 1.15.0 701 | setprototypeof: 1.2.0 702 | statuses: 2.0.1 703 | type-is: 1.6.18 704 | utils-merge: 1.0.1 705 | vary: 1.1.2 706 | transitivePeerDependencies: 707 | - supports-color 708 | dev: false 709 | 710 | /fast-deep-equal/3.1.3: 711 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 712 | dev: false 713 | 714 | /ffmpeg-static/5.0.0: 715 | resolution: {integrity: sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA==} 716 | engines: {node: '>=16'} 717 | requiresBuild: true 718 | dependencies: 719 | '@derhuerst/http-basic': 8.2.2 720 | env-paths: 2.2.1 721 | https-proxy-agent: 5.0.1 722 | progress: 2.0.3 723 | transitivePeerDependencies: 724 | - supports-color 725 | dev: false 726 | 727 | /ffmpeg/0.0.4: 728 | resolution: {integrity: sha512-3TgWUJJlZGQn+crJFyhsO/oNeRRnGTy6GhgS98oUCIfZrOW5haPPV7DUfOm3xJcHr5q3TJpjk2GudPutrNisRA==} 729 | dependencies: 730 | when: 3.7.8 731 | dev: false 732 | 733 | /fill-range/7.0.1: 734 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 735 | engines: {node: '>=8'} 736 | dependencies: 737 | to-regex-range: 5.0.1 738 | dev: true 739 | 740 | /finalhandler/1.2.0: 741 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 742 | engines: {node: '>= 0.8'} 743 | dependencies: 744 | debug: 2.6.9 745 | encodeurl: 1.0.2 746 | escape-html: 1.0.3 747 | on-finished: 2.4.1 748 | parseurl: 1.3.3 749 | statuses: 2.0.1 750 | unpipe: 1.0.0 751 | transitivePeerDependencies: 752 | - supports-color 753 | dev: false 754 | 755 | /follow-redirects/1.15.1: 756 | resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} 757 | engines: {node: '>=4.0'} 758 | peerDependencies: 759 | debug: '*' 760 | peerDependenciesMeta: 761 | debug: 762 | optional: true 763 | dev: false 764 | 765 | /form-data/3.0.1: 766 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 767 | engines: {node: '>= 6'} 768 | dependencies: 769 | asynckit: 0.4.0 770 | combined-stream: 1.0.8 771 | mime-types: 2.1.35 772 | dev: false 773 | 774 | /form-data/4.0.0: 775 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 776 | engines: {node: '>= 6'} 777 | dependencies: 778 | asynckit: 0.4.0 779 | combined-stream: 1.0.8 780 | mime-types: 2.1.35 781 | dev: false 782 | 783 | /forwarded/0.2.0: 784 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 785 | engines: {node: '>= 0.6'} 786 | dev: false 787 | 788 | /fresh/0.5.2: 789 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 790 | engines: {node: '>= 0.6'} 791 | dev: false 792 | 793 | /fs-minipass/2.1.0: 794 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 795 | engines: {node: '>= 8'} 796 | dependencies: 797 | minipass: 3.3.3 798 | dev: false 799 | 800 | /fs.realpath/1.0.0: 801 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 802 | 803 | /fsevents/2.3.2: 804 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 805 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 806 | os: [darwin] 807 | requiresBuild: true 808 | dev: true 809 | optional: true 810 | 811 | /function-bind/1.1.1: 812 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 813 | dev: false 814 | 815 | /gauge/3.0.2: 816 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} 817 | engines: {node: '>=10'} 818 | dependencies: 819 | aproba: 2.0.0 820 | color-support: 1.1.3 821 | console-control-strings: 1.1.0 822 | has-unicode: 2.0.1 823 | object-assign: 4.1.1 824 | signal-exit: 3.0.7 825 | string-width: 4.2.3 826 | strip-ansi: 6.0.1 827 | wide-align: 1.1.5 828 | dev: false 829 | 830 | /get-intrinsic/1.1.2: 831 | resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} 832 | dependencies: 833 | function-bind: 1.1.1 834 | has: 1.0.3 835 | has-symbols: 1.0.3 836 | dev: false 837 | 838 | /get-stream/4.1.0: 839 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 840 | engines: {node: '>=6'} 841 | dependencies: 842 | pump: 3.0.0 843 | dev: true 844 | 845 | /get-stream/5.2.0: 846 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 847 | engines: {node: '>=8'} 848 | dependencies: 849 | pump: 3.0.0 850 | dev: true 851 | 852 | /glob-parent/5.1.2: 853 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 854 | engines: {node: '>= 6'} 855 | dependencies: 856 | is-glob: 4.0.3 857 | dev: true 858 | 859 | /glob/7.2.3: 860 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 861 | dependencies: 862 | fs.realpath: 1.0.0 863 | inflight: 1.0.6 864 | inherits: 2.0.4 865 | minimatch: 3.1.2 866 | once: 1.4.0 867 | path-is-absolute: 1.0.1 868 | 869 | /global-dirs/3.0.0: 870 | resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} 871 | engines: {node: '>=10'} 872 | dependencies: 873 | ini: 2.0.0 874 | dev: true 875 | 876 | /got/9.6.0: 877 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 878 | engines: {node: '>=8.6'} 879 | dependencies: 880 | '@sindresorhus/is': 0.14.0 881 | '@szmarczak/http-timer': 1.1.2 882 | '@types/keyv': 3.1.4 883 | '@types/responselike': 1.0.0 884 | cacheable-request: 6.1.0 885 | decompress-response: 3.3.0 886 | duplexer3: 0.1.4 887 | get-stream: 4.1.0 888 | lowercase-keys: 1.0.1 889 | mimic-response: 1.0.1 890 | p-cancelable: 1.1.0 891 | to-readable-stream: 1.0.0 892 | url-parse-lax: 3.0.0 893 | dev: true 894 | 895 | /graceful-fs/4.2.10: 896 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 897 | dev: true 898 | 899 | /has-flag/3.0.0: 900 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 901 | engines: {node: '>=4'} 902 | dev: true 903 | 904 | /has-flag/4.0.0: 905 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 906 | engines: {node: '>=8'} 907 | dev: true 908 | 909 | /has-symbols/1.0.3: 910 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 911 | engines: {node: '>= 0.4'} 912 | dev: false 913 | 914 | /has-unicode/2.0.1: 915 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 916 | dev: false 917 | 918 | /has-yarn/2.1.0: 919 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} 920 | engines: {node: '>=8'} 921 | dev: true 922 | 923 | /has/1.0.3: 924 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 925 | engines: {node: '>= 0.4.0'} 926 | dependencies: 927 | function-bind: 1.1.1 928 | dev: false 929 | 930 | /html-entities-decoder/1.0.2: 931 | resolution: {integrity: sha512-EDO3wcpMvGXF9xtJlQ/0G+71mrfFf/RBKG45sxEO69b0K3OARkWlpk7KNDx7oDYez40IoMyZMyJlfj8y1Q0tSQ==} 932 | dev: false 933 | 934 | /http-cache-semantics/4.1.0: 935 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 936 | dev: true 937 | 938 | /http-errors/2.0.0: 939 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 940 | engines: {node: '>= 0.8'} 941 | dependencies: 942 | depd: 2.0.0 943 | inherits: 2.0.4 944 | setprototypeof: 1.2.0 945 | statuses: 2.0.1 946 | toidentifier: 1.0.1 947 | dev: false 948 | 949 | /http-response-object/3.0.2: 950 | resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} 951 | dependencies: 952 | '@types/node': 10.17.60 953 | dev: false 954 | 955 | /https-proxy-agent/5.0.1: 956 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 957 | engines: {node: '>= 6'} 958 | dependencies: 959 | agent-base: 6.0.2 960 | debug: 4.3.4 961 | transitivePeerDependencies: 962 | - supports-color 963 | dev: false 964 | 965 | /iconv-lite/0.4.24: 966 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 967 | engines: {node: '>=0.10.0'} 968 | dependencies: 969 | safer-buffer: 2.1.2 970 | dev: false 971 | 972 | /ignore-by-default/1.0.1: 973 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 974 | dev: true 975 | 976 | /import-lazy/2.1.0: 977 | resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} 978 | engines: {node: '>=4'} 979 | dev: true 980 | 981 | /imurmurhash/0.1.4: 982 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 983 | engines: {node: '>=0.8.19'} 984 | dev: true 985 | 986 | /inflight/1.0.6: 987 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 988 | dependencies: 989 | once: 1.4.0 990 | wrappy: 1.0.2 991 | 992 | /inherits/2.0.4: 993 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 994 | 995 | /ini/1.3.8: 996 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 997 | dev: true 998 | 999 | /ini/2.0.0: 1000 | resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} 1001 | engines: {node: '>=10'} 1002 | dev: true 1003 | 1004 | /ipaddr.js/1.9.1: 1005 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1006 | engines: {node: '>= 0.10'} 1007 | dev: false 1008 | 1009 | /is-binary-path/2.1.0: 1010 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1011 | engines: {node: '>=8'} 1012 | dependencies: 1013 | binary-extensions: 2.2.0 1014 | dev: true 1015 | 1016 | /is-ci/2.0.0: 1017 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} 1018 | hasBin: true 1019 | dependencies: 1020 | ci-info: 2.0.0 1021 | dev: true 1022 | 1023 | /is-extglob/2.1.1: 1024 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1025 | engines: {node: '>=0.10.0'} 1026 | dev: true 1027 | 1028 | /is-fullwidth-code-point/3.0.0: 1029 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1030 | engines: {node: '>=8'} 1031 | 1032 | /is-glob/4.0.3: 1033 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1034 | engines: {node: '>=0.10.0'} 1035 | dependencies: 1036 | is-extglob: 2.1.1 1037 | dev: true 1038 | 1039 | /is-installed-globally/0.4.0: 1040 | resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} 1041 | engines: {node: '>=10'} 1042 | dependencies: 1043 | global-dirs: 3.0.0 1044 | is-path-inside: 3.0.3 1045 | dev: true 1046 | 1047 | /is-npm/5.0.0: 1048 | resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} 1049 | engines: {node: '>=10'} 1050 | dev: true 1051 | 1052 | /is-number/7.0.0: 1053 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1054 | engines: {node: '>=0.12.0'} 1055 | dev: true 1056 | 1057 | /is-obj/2.0.0: 1058 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 1059 | engines: {node: '>=8'} 1060 | dev: true 1061 | 1062 | /is-path-inside/3.0.3: 1063 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1064 | engines: {node: '>=8'} 1065 | dev: true 1066 | 1067 | /is-typedarray/1.0.0: 1068 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 1069 | dev: true 1070 | 1071 | /is-yarn-global/0.3.0: 1072 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} 1073 | dev: true 1074 | 1075 | /isarray/1.0.0: 1076 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1077 | dev: false 1078 | 1079 | /json-buffer/3.0.0: 1080 | resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} 1081 | dev: true 1082 | 1083 | /keyv/3.1.0: 1084 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 1085 | dependencies: 1086 | json-buffer: 3.0.0 1087 | dev: true 1088 | 1089 | /klaw/4.0.1: 1090 | resolution: {integrity: sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw==} 1091 | engines: {node: '>=14.14.0'} 1092 | dev: false 1093 | 1094 | /latest-version/5.1.0: 1095 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} 1096 | engines: {node: '>=8'} 1097 | dependencies: 1098 | package-json: 6.5.0 1099 | dev: true 1100 | 1101 | /lowercase-keys/1.0.1: 1102 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 1103 | engines: {node: '>=0.10.0'} 1104 | dev: true 1105 | 1106 | /lowercase-keys/2.0.0: 1107 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 1108 | engines: {node: '>=8'} 1109 | dev: true 1110 | 1111 | /lru-cache/6.0.0: 1112 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1113 | engines: {node: '>=10'} 1114 | dependencies: 1115 | yallist: 4.0.0 1116 | 1117 | /m3u8stream/0.8.6: 1118 | resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==} 1119 | engines: {node: '>=12'} 1120 | dependencies: 1121 | miniget: 4.2.2 1122 | sax: 1.2.4 1123 | dev: false 1124 | 1125 | /make-dir/3.1.0: 1126 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 1127 | engines: {node: '>=8'} 1128 | dependencies: 1129 | semver: 6.3.0 1130 | 1131 | /make-error/1.3.6: 1132 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1133 | dev: true 1134 | 1135 | /media-typer/0.3.0: 1136 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1137 | engines: {node: '>= 0.6'} 1138 | dev: false 1139 | 1140 | /merge-descriptors/1.0.1: 1141 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 1142 | dev: false 1143 | 1144 | /methods/1.1.2: 1145 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1146 | engines: {node: '>= 0.6'} 1147 | dev: false 1148 | 1149 | /mime-db/1.52.0: 1150 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1151 | engines: {node: '>= 0.6'} 1152 | dev: false 1153 | 1154 | /mime-types/2.1.35: 1155 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1156 | engines: {node: '>= 0.6'} 1157 | dependencies: 1158 | mime-db: 1.52.0 1159 | dev: false 1160 | 1161 | /mime/1.6.0: 1162 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1163 | engines: {node: '>=4'} 1164 | hasBin: true 1165 | dev: false 1166 | 1167 | /mimic-response/1.0.1: 1168 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 1169 | engines: {node: '>=4'} 1170 | dev: true 1171 | 1172 | /miniget/4.2.2: 1173 | resolution: {integrity: sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==} 1174 | engines: {node: '>=12'} 1175 | dev: false 1176 | 1177 | /minimatch/3.1.2: 1178 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1179 | dependencies: 1180 | brace-expansion: 1.1.11 1181 | 1182 | /minimist/1.2.6: 1183 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 1184 | dev: true 1185 | 1186 | /minipass/3.3.3: 1187 | resolution: {integrity: sha512-N0BOsdFAlNRfmwMhjAsLVWOk7Ljmeb39iqFlsV1At+jqRhSUP9yeof8FyJu4imaJiSUp8vQebWD/guZwGQC8iA==} 1188 | engines: {node: '>=8'} 1189 | dependencies: 1190 | yallist: 4.0.0 1191 | dev: false 1192 | 1193 | /minizlib/2.1.2: 1194 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1195 | engines: {node: '>= 8'} 1196 | dependencies: 1197 | minipass: 3.3.3 1198 | yallist: 4.0.0 1199 | dev: false 1200 | 1201 | /mkdirp/1.0.4: 1202 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1203 | engines: {node: '>=10'} 1204 | hasBin: true 1205 | dev: false 1206 | 1207 | /moment/2.29.3: 1208 | resolution: {integrity: sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==} 1209 | dev: false 1210 | 1211 | /ms/2.0.0: 1212 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1213 | dev: false 1214 | 1215 | /ms/2.1.2: 1216 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1217 | dev: false 1218 | 1219 | /ms/2.1.3: 1220 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1221 | 1222 | /negotiator/0.6.3: 1223 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1224 | engines: {node: '>= 0.6'} 1225 | dev: false 1226 | 1227 | /node-addon-api/4.3.0: 1228 | resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} 1229 | dev: false 1230 | 1231 | /node-fetch/2.6.7: 1232 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1233 | engines: {node: 4.x || >=6.0.0} 1234 | peerDependencies: 1235 | encoding: ^0.1.0 1236 | peerDependenciesMeta: 1237 | encoding: 1238 | optional: true 1239 | dependencies: 1240 | whatwg-url: 5.0.0 1241 | dev: false 1242 | 1243 | /nodemon/2.0.18: 1244 | resolution: {integrity: sha512-uAvrKipi2zAz8E7nkSz4qW4F4zd5fs2wNGsTx+xXlP8KXqd9ucE0vY9wankOsPboeDyuUGN9vsXGV1pLn80l/A==} 1245 | engines: {node: '>=8.10.0'} 1246 | hasBin: true 1247 | requiresBuild: true 1248 | dependencies: 1249 | chokidar: 3.5.3 1250 | debug: 3.2.7_supports-color@5.5.0 1251 | ignore-by-default: 1.0.1 1252 | minimatch: 3.1.2 1253 | pstree.remy: 1.1.8 1254 | semver: 5.7.1 1255 | supports-color: 5.5.0 1256 | touch: 3.1.0 1257 | undefsafe: 2.0.5 1258 | update-notifier: 5.1.0 1259 | dev: true 1260 | 1261 | /nopt/1.0.10: 1262 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 1263 | hasBin: true 1264 | dependencies: 1265 | abbrev: 1.1.1 1266 | dev: true 1267 | 1268 | /nopt/5.0.0: 1269 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} 1270 | engines: {node: '>=6'} 1271 | hasBin: true 1272 | dependencies: 1273 | abbrev: 1.1.1 1274 | dev: false 1275 | 1276 | /normalize-path/3.0.0: 1277 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1278 | engines: {node: '>=0.10.0'} 1279 | dev: true 1280 | 1281 | /normalize-url/4.5.1: 1282 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} 1283 | engines: {node: '>=8'} 1284 | dev: true 1285 | 1286 | /npmlog/5.0.1: 1287 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} 1288 | dependencies: 1289 | are-we-there-yet: 2.0.0 1290 | console-control-strings: 1.1.0 1291 | gauge: 3.0.2 1292 | set-blocking: 2.0.0 1293 | dev: false 1294 | 1295 | /object-assign/4.1.1: 1296 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1297 | engines: {node: '>=0.10.0'} 1298 | dev: false 1299 | 1300 | /object-inspect/1.12.2: 1301 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1302 | dev: false 1303 | 1304 | /on-finished/2.4.1: 1305 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1306 | engines: {node: '>= 0.8'} 1307 | dependencies: 1308 | ee-first: 1.1.1 1309 | dev: false 1310 | 1311 | /once/1.4.0: 1312 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1313 | dependencies: 1314 | wrappy: 1.0.2 1315 | 1316 | /p-cancelable/1.1.0: 1317 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 1318 | engines: {node: '>=6'} 1319 | dev: true 1320 | 1321 | /package-json/6.5.0: 1322 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} 1323 | engines: {node: '>=8'} 1324 | dependencies: 1325 | got: 9.6.0 1326 | registry-auth-token: 4.2.2 1327 | registry-url: 5.1.0 1328 | semver: 6.3.0 1329 | dev: true 1330 | 1331 | /parse-cache-control/1.0.1: 1332 | resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} 1333 | dev: false 1334 | 1335 | /parseurl/1.3.3: 1336 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1337 | engines: {node: '>= 0.8'} 1338 | dev: false 1339 | 1340 | /path-is-absolute/1.0.1: 1341 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1342 | engines: {node: '>=0.10.0'} 1343 | 1344 | /path-to-regexp/0.1.7: 1345 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 1346 | dev: false 1347 | 1348 | /picomatch/2.3.1: 1349 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1350 | engines: {node: '>=8.6'} 1351 | dev: true 1352 | 1353 | /prepend-http/2.0.0: 1354 | resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} 1355 | engines: {node: '>=4'} 1356 | dev: true 1357 | 1358 | /prettier/2.7.1: 1359 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} 1360 | engines: {node: '>=10.13.0'} 1361 | hasBin: true 1362 | dev: true 1363 | 1364 | /process-nextick-args/2.0.1: 1365 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1366 | dev: false 1367 | 1368 | /progress/2.0.3: 1369 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1370 | engines: {node: '>=0.4.0'} 1371 | dev: false 1372 | 1373 | /proxy-addr/2.0.7: 1374 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1375 | engines: {node: '>= 0.10'} 1376 | dependencies: 1377 | forwarded: 0.2.0 1378 | ipaddr.js: 1.9.1 1379 | dev: false 1380 | 1381 | /pstree.remy/1.1.8: 1382 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1383 | dev: true 1384 | 1385 | /pump/3.0.0: 1386 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1387 | dependencies: 1388 | end-of-stream: 1.4.4 1389 | once: 1.4.0 1390 | dev: true 1391 | 1392 | /pupa/2.1.1: 1393 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} 1394 | engines: {node: '>=8'} 1395 | dependencies: 1396 | escape-goat: 2.1.1 1397 | dev: true 1398 | 1399 | /qs/6.10.3: 1400 | resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} 1401 | engines: {node: '>=0.6'} 1402 | dependencies: 1403 | side-channel: 1.0.4 1404 | dev: false 1405 | 1406 | /range-parser/1.2.1: 1407 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1408 | engines: {node: '>= 0.6'} 1409 | dev: false 1410 | 1411 | /raw-body/2.5.1: 1412 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 1413 | engines: {node: '>= 0.8'} 1414 | dependencies: 1415 | bytes: 3.1.2 1416 | http-errors: 2.0.0 1417 | iconv-lite: 0.4.24 1418 | unpipe: 1.0.0 1419 | dev: false 1420 | 1421 | /rc/1.2.8: 1422 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1423 | hasBin: true 1424 | dependencies: 1425 | deep-extend: 0.6.0 1426 | ini: 1.3.8 1427 | minimist: 1.2.6 1428 | strip-json-comments: 2.0.1 1429 | dev: true 1430 | 1431 | /readable-stream/2.3.7: 1432 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1433 | dependencies: 1434 | core-util-is: 1.0.3 1435 | inherits: 2.0.4 1436 | isarray: 1.0.0 1437 | process-nextick-args: 2.0.1 1438 | safe-buffer: 5.1.2 1439 | string_decoder: 1.1.1 1440 | util-deprecate: 1.0.2 1441 | dev: false 1442 | 1443 | /readable-stream/3.6.0: 1444 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1445 | engines: {node: '>= 6'} 1446 | dependencies: 1447 | inherits: 2.0.4 1448 | string_decoder: 1.3.0 1449 | util-deprecate: 1.0.2 1450 | dev: false 1451 | 1452 | /readdirp/3.6.0: 1453 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1454 | engines: {node: '>=8.10.0'} 1455 | dependencies: 1456 | picomatch: 2.3.1 1457 | dev: true 1458 | 1459 | /registry-auth-token/4.2.2: 1460 | resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} 1461 | engines: {node: '>=6.0.0'} 1462 | dependencies: 1463 | rc: 1.2.8 1464 | dev: true 1465 | 1466 | /registry-url/5.1.0: 1467 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} 1468 | engines: {node: '>=8'} 1469 | dependencies: 1470 | rc: 1.2.8 1471 | dev: true 1472 | 1473 | /responselike/1.0.2: 1474 | resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} 1475 | dependencies: 1476 | lowercase-keys: 1.0.1 1477 | dev: true 1478 | 1479 | /rimraf/3.0.2: 1480 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1481 | hasBin: true 1482 | dependencies: 1483 | glob: 7.2.3 1484 | 1485 | /safe-buffer/5.1.2: 1486 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1487 | dev: false 1488 | 1489 | /safe-buffer/5.2.1: 1490 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1491 | dev: false 1492 | 1493 | /safer-buffer/2.1.2: 1494 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1495 | dev: false 1496 | 1497 | /sax/1.2.4: 1498 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 1499 | dev: false 1500 | 1501 | /semver-diff/3.1.1: 1502 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} 1503 | engines: {node: '>=8'} 1504 | dependencies: 1505 | semver: 6.3.0 1506 | dev: true 1507 | 1508 | /semver/5.7.1: 1509 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1510 | hasBin: true 1511 | dev: true 1512 | 1513 | /semver/6.3.0: 1514 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1515 | hasBin: true 1516 | 1517 | /semver/7.3.7: 1518 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 1519 | engines: {node: '>=10'} 1520 | hasBin: true 1521 | dependencies: 1522 | lru-cache: 6.0.0 1523 | 1524 | /send/0.18.0: 1525 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 1526 | engines: {node: '>= 0.8.0'} 1527 | dependencies: 1528 | debug: 2.6.9 1529 | depd: 2.0.0 1530 | destroy: 1.2.0 1531 | encodeurl: 1.0.2 1532 | escape-html: 1.0.3 1533 | etag: 1.8.1 1534 | fresh: 0.5.2 1535 | http-errors: 2.0.0 1536 | mime: 1.6.0 1537 | ms: 2.1.3 1538 | on-finished: 2.4.1 1539 | range-parser: 1.2.1 1540 | statuses: 2.0.1 1541 | transitivePeerDependencies: 1542 | - supports-color 1543 | dev: false 1544 | 1545 | /serve-static/1.15.0: 1546 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 1547 | engines: {node: '>= 0.8.0'} 1548 | dependencies: 1549 | encodeurl: 1.0.2 1550 | escape-html: 1.0.3 1551 | parseurl: 1.3.3 1552 | send: 0.18.0 1553 | transitivePeerDependencies: 1554 | - supports-color 1555 | dev: false 1556 | 1557 | /set-blocking/2.0.0: 1558 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 1559 | dev: false 1560 | 1561 | /setprototypeof/1.2.0: 1562 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1563 | dev: false 1564 | 1565 | /side-channel/1.0.4: 1566 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1567 | dependencies: 1568 | call-bind: 1.0.2 1569 | get-intrinsic: 1.1.2 1570 | object-inspect: 1.12.2 1571 | dev: false 1572 | 1573 | /signal-exit/3.0.7: 1574 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1575 | 1576 | /source-map-support/0.5.21: 1577 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1578 | dependencies: 1579 | buffer-from: 1.1.2 1580 | source-map: 0.6.1 1581 | dev: false 1582 | 1583 | /source-map/0.6.1: 1584 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1585 | engines: {node: '>=0.10.0'} 1586 | 1587 | /statuses/2.0.1: 1588 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1589 | engines: {node: '>= 0.8'} 1590 | dev: false 1591 | 1592 | /string-width/4.2.3: 1593 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1594 | engines: {node: '>=8'} 1595 | dependencies: 1596 | emoji-regex: 8.0.0 1597 | is-fullwidth-code-point: 3.0.0 1598 | strip-ansi: 6.0.1 1599 | 1600 | /string_decoder/1.1.1: 1601 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1602 | dependencies: 1603 | safe-buffer: 5.1.2 1604 | dev: false 1605 | 1606 | /string_decoder/1.3.0: 1607 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1608 | dependencies: 1609 | safe-buffer: 5.2.1 1610 | dev: false 1611 | 1612 | /strip-ansi/6.0.1: 1613 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1614 | engines: {node: '>=8'} 1615 | dependencies: 1616 | ansi-regex: 5.0.1 1617 | 1618 | /strip-json-comments/2.0.1: 1619 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1620 | engines: {node: '>=0.10.0'} 1621 | dev: true 1622 | 1623 | /supports-color/5.5.0: 1624 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1625 | engines: {node: '>=4'} 1626 | dependencies: 1627 | has-flag: 3.0.0 1628 | dev: true 1629 | 1630 | /supports-color/7.2.0: 1631 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1632 | engines: {node: '>=8'} 1633 | dependencies: 1634 | has-flag: 4.0.0 1635 | dev: true 1636 | 1637 | /tar/6.1.11: 1638 | resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} 1639 | engines: {node: '>= 10'} 1640 | dependencies: 1641 | chownr: 2.0.0 1642 | fs-minipass: 2.1.0 1643 | minipass: 3.3.3 1644 | minizlib: 2.1.2 1645 | mkdirp: 1.0.4 1646 | yallist: 4.0.0 1647 | dev: false 1648 | 1649 | /to-readable-stream/1.0.0: 1650 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 1651 | engines: {node: '>=6'} 1652 | dev: true 1653 | 1654 | /to-regex-range/5.0.1: 1655 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1656 | engines: {node: '>=8.0'} 1657 | dependencies: 1658 | is-number: 7.0.0 1659 | dev: true 1660 | 1661 | /toidentifier/1.0.1: 1662 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1663 | engines: {node: '>=0.6'} 1664 | dev: false 1665 | 1666 | /touch/3.1.0: 1667 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1668 | hasBin: true 1669 | dependencies: 1670 | nopt: 1.0.10 1671 | dev: true 1672 | 1673 | /tr46/0.0.3: 1674 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1675 | dev: false 1676 | 1677 | /ts-mixer/6.0.1: 1678 | resolution: {integrity: sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==} 1679 | dev: false 1680 | 1681 | /ts-node/10.8.1_qiyc72axg2v44xl4yovan2v55u: 1682 | resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==} 1683 | hasBin: true 1684 | peerDependencies: 1685 | '@swc/core': '>=1.2.50' 1686 | '@swc/wasm': '>=1.2.50' 1687 | '@types/node': '*' 1688 | typescript: '>=2.7' 1689 | peerDependenciesMeta: 1690 | '@swc/core': 1691 | optional: true 1692 | '@swc/wasm': 1693 | optional: true 1694 | dependencies: 1695 | '@cspotcode/source-map-support': 0.8.1 1696 | '@tsconfig/node10': 1.0.9 1697 | '@tsconfig/node12': 1.0.11 1698 | '@tsconfig/node14': 1.0.3 1699 | '@tsconfig/node16': 1.0.3 1700 | '@types/node': 18.0.0 1701 | acorn: 8.7.1 1702 | acorn-walk: 8.2.0 1703 | arg: 4.1.3 1704 | create-require: 1.1.1 1705 | diff: 4.0.2 1706 | make-error: 1.3.6 1707 | typescript: 4.7.4 1708 | v8-compile-cache-lib: 3.0.1 1709 | yn: 3.1.1 1710 | dev: true 1711 | 1712 | /tslib/2.4.0: 1713 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 1714 | dev: false 1715 | 1716 | /type-fest/0.20.2: 1717 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1718 | engines: {node: '>=10'} 1719 | dev: true 1720 | 1721 | /type-is/1.6.18: 1722 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1723 | engines: {node: '>= 0.6'} 1724 | dependencies: 1725 | media-typer: 0.3.0 1726 | mime-types: 2.1.35 1727 | dev: false 1728 | 1729 | /typedarray-to-buffer/3.1.5: 1730 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1731 | dependencies: 1732 | is-typedarray: 1.0.0 1733 | dev: true 1734 | 1735 | /typedarray/0.0.6: 1736 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1737 | dev: false 1738 | 1739 | /typescript/4.7.4: 1740 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 1741 | engines: {node: '>=4.2.0'} 1742 | hasBin: true 1743 | dev: true 1744 | 1745 | /undefsafe/2.0.5: 1746 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1747 | dev: true 1748 | 1749 | /unique-string/2.0.0: 1750 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} 1751 | engines: {node: '>=8'} 1752 | dependencies: 1753 | crypto-random-string: 2.0.0 1754 | dev: true 1755 | 1756 | /unpipe/1.0.0: 1757 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1758 | engines: {node: '>= 0.8'} 1759 | dev: false 1760 | 1761 | /update-notifier/5.1.0: 1762 | resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} 1763 | engines: {node: '>=10'} 1764 | dependencies: 1765 | boxen: 5.1.2 1766 | chalk: 4.1.2 1767 | configstore: 5.0.1 1768 | has-yarn: 2.1.0 1769 | import-lazy: 2.1.0 1770 | is-ci: 2.0.0 1771 | is-installed-globally: 0.4.0 1772 | is-npm: 5.0.0 1773 | is-yarn-global: 0.3.0 1774 | latest-version: 5.1.0 1775 | pupa: 2.1.1 1776 | semver: 7.3.7 1777 | semver-diff: 3.1.1 1778 | xdg-basedir: 4.0.0 1779 | dev: true 1780 | 1781 | /url-parse-lax/3.0.0: 1782 | resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} 1783 | engines: {node: '>=4'} 1784 | dependencies: 1785 | prepend-http: 2.0.0 1786 | dev: true 1787 | 1788 | /util-deprecate/1.0.2: 1789 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1790 | dev: false 1791 | 1792 | /utils-merge/1.0.1: 1793 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1794 | engines: {node: '>= 0.4.0'} 1795 | dev: false 1796 | 1797 | /v8-compile-cache-lib/3.0.1: 1798 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1799 | dev: true 1800 | 1801 | /vary/1.1.2: 1802 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1803 | engines: {node: '>= 0.8'} 1804 | dev: false 1805 | 1806 | /webidl-conversions/3.0.1: 1807 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1808 | dev: false 1809 | 1810 | /whatwg-url/5.0.0: 1811 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1812 | dependencies: 1813 | tr46: 0.0.3 1814 | webidl-conversions: 3.0.1 1815 | dev: false 1816 | 1817 | /when/3.7.8: 1818 | resolution: {integrity: sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==} 1819 | dev: false 1820 | 1821 | /wide-align/1.1.5: 1822 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 1823 | dependencies: 1824 | string-width: 4.2.3 1825 | dev: false 1826 | 1827 | /widest-line/3.1.0: 1828 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} 1829 | engines: {node: '>=8'} 1830 | dependencies: 1831 | string-width: 4.2.3 1832 | dev: true 1833 | 1834 | /wrap-ansi/7.0.0: 1835 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1836 | engines: {node: '>=10'} 1837 | dependencies: 1838 | ansi-styles: 4.3.0 1839 | string-width: 4.2.3 1840 | strip-ansi: 6.0.1 1841 | dev: true 1842 | 1843 | /wrappy/1.0.2: 1844 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1845 | 1846 | /write-file-atomic/3.0.3: 1847 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1848 | dependencies: 1849 | imurmurhash: 0.1.4 1850 | is-typedarray: 1.0.0 1851 | signal-exit: 3.0.7 1852 | typedarray-to-buffer: 3.1.5 1853 | dev: true 1854 | 1855 | /ws/8.8.0: 1856 | resolution: {integrity: sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==} 1857 | engines: {node: '>=10.0.0'} 1858 | peerDependencies: 1859 | bufferutil: ^4.0.1 1860 | utf-8-validate: ^5.0.2 1861 | peerDependenciesMeta: 1862 | bufferutil: 1863 | optional: true 1864 | utf-8-validate: 1865 | optional: true 1866 | dev: false 1867 | 1868 | /xdg-basedir/4.0.0: 1869 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} 1870 | engines: {node: '>=8'} 1871 | dev: true 1872 | 1873 | /yallist/4.0.0: 1874 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1875 | 1876 | /yn/3.1.1: 1877 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1878 | engines: {node: '>=6'} 1879 | dev: true 1880 | 1881 | /ytdl-core/4.11.0: 1882 | resolution: {integrity: sha512-Q3hCLiUA9AOGQXzPvno14GN+HgF9wsO1ZBHlj0COTcyxjIyFpWvMfii0UC4/cAbVaIjEdbWB71GdcGuc4J1Lmw==} 1883 | engines: {node: '>=12'} 1884 | dependencies: 1885 | m3u8stream: 0.8.6 1886 | miniget: 4.2.2 1887 | sax: 1.2.4 1888 | dev: false 1889 | --------------------------------------------------------------------------------