Socket
Socket
Sign inDemoInstall

distube

Package Overview
Dependencies
169
Maintainers
1
Versions
195
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 3.0.0-beta.37 to 3.0.0-beta.38

12

dist/constant.d.ts

@@ -108,2 +108,14 @@ import type { Filters } from ".";

*/
/**
* The repeat mode of a {@link Queue} (enum)
* * DISABLED
* * SONG
* * QUEUE
* @typedef {number} RepeatMode
*/
export declare enum RepeatMode {
DISABLED = 0,
SONG = 1,
QUEUE = 2
}
//# sourceMappingURL=constant.d.ts.map

15

dist/constant.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultOptions = exports.defaultFilters = void 0;
exports.RepeatMode = exports.defaultOptions = exports.defaultFilters = void 0;
/**

@@ -126,2 +126,15 @@ * Default DisTube audio filters.

*/
/**
* The repeat mode of a {@link Queue} (enum)
* * DISABLED
* * SONG
* * QUEUE
* @typedef {number} RepeatMode
*/
var RepeatMode;
(function (RepeatMode) {
RepeatMode[RepeatMode["DISABLED"] = 0] = "DISABLED";
RepeatMode[RepeatMode["SONG"] = 1] = "SONG";
RepeatMode[RepeatMode["QUEUE"] = 2] = "QUEUE";
})(RepeatMode = exports.RepeatMode || (exports.RepeatMode = {}));
//# sourceMappingURL=constant.js.map

7

dist/core/DisTubeBase.d.ts
import type { Client, TextChannel } from "discord.js";
import type { DisTube, DisTubeEvents, DisTubeHandler, DisTubeVoiceManager, Options, QueueManager } from "..";
/** @private */
export declare class DisTubeBase {
/**
* @private
* @abstract
*/
export declare abstract class DisTubeBase {
distube: DisTube;

@@ -6,0 +9,0 @@ constructor(distube: DisTube);

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DisTubeBase = void 0;
/** @private */
/**
* @private
* @abstract
*/
class DisTubeBase {

@@ -6,0 +9,0 @@ constructor(distube) {

@@ -28,3 +28,4 @@ import { FFmpeg } from "prism-media";

* @param {StreamOptions} options options
* @returns {*}
* @returns {DisTubeStream}
* @private
*/

@@ -36,3 +37,4 @@ static YouTube(formats: ytdl.videoFormat[] | undefined, options?: StreamOptions): DisTubeStream;

* @param {StreamOptions} options options
* @returns {Readable|string}
* @returns {DisTubeStream}
* @private
*/

@@ -47,2 +49,3 @@ static DirectLink(url: string, options?: StreamOptions): DisTubeStream;

* @param {StreamOptions} options Stream options
* @private
*/

@@ -49,0 +52,0 @@ constructor(url: string, options: StreamOptions);

@@ -26,5 +26,14 @@ "use strict";

* @param {StreamOptions} options Stream options
* @private
*/
constructor(url, options) {
/**
* Stream URL
* @type {string}
*/
this.url = url;
/**
* Stream type
* @type {DiscordVoice.StreamType.Raw}
*/
this.type = voice_1.StreamType.Raw;

@@ -57,2 +66,6 @@ const args = [

}
/**
* FFmpeg stream (Duplex)
* @type {FFmpeg}
*/
this.stream = new prism_media_1.FFmpeg({ args, shell: false });

@@ -64,3 +77,4 @@ }

* @param {StreamOptions} options options
* @returns {*}
* @returns {DisTubeStream}
* @private
*/

@@ -82,3 +96,4 @@ static YouTube(formats, options = {}) {

* @param {StreamOptions} options options
* @returns {Readable|string}
* @returns {DisTubeStream}
* @private
*/

@@ -85,0 +100,0 @@ static DirectLink(url, options = {}) {

@@ -9,3 +9,3 @@ import DisTubeBase from "../DisTubeBase";

*/
export declare class BaseManager<V> extends DisTubeBase {
export declare abstract class BaseManager<V> extends DisTubeBase {
collection: Collection<string, V>;

@@ -12,0 +12,0 @@ constructor(distube: DisTube);

@@ -19,6 +19,6 @@ import { BaseManager } from ".";

/**
* Get a Queue from a QueueManager with a GuildIDResolvable.
* Get a Queue from this QueueManager.
* @method get
* @memberof QueueManager#
* @param {GuildIDResolvable} queue The queue resolvable to resolve
* @param {GuildIDResolvable} queue Resolvable thing from a guild
* @returns {Queue?}

@@ -25,0 +25,0 @@ */

@@ -37,6 +37,6 @@ "use strict";

/**
* Get a Queue from a QueueManager with a GuildIDResolvable.
* Get a Queue from this QueueManager.
* @method get
* @memberof QueueManager#
* @param {GuildIDResolvable} queue The queue resolvable to resolve
* @param {GuildIDResolvable} queue Resolvable thing from a guild
* @returns {Queue?}

@@ -76,6 +76,6 @@ */

return;
if (queue.repeatMode === 2 && !queue.prev)
if (queue.repeatMode === __1.RepeatMode.QUEUE && !queue.prev)
queue.songs.push(queue.songs[0]);
if (queue.prev) {
if (queue.repeatMode === 2)
if (queue.repeatMode === __1.RepeatMode.QUEUE)
queue.songs.unshift(queue.songs.pop());

@@ -85,3 +85,3 @@ else

}
if (queue.songs.length <= 1 && (queue.next || !queue.repeatMode)) {
if (queue.songs.length <= 1 && (queue.next || queue.repeatMode !== __1.RepeatMode.DISABLED)) {
if (queue.autoplay) {

@@ -105,3 +105,3 @@ try {

const emitPlaySong = this._emitPlaySong(queue);
if (!queue.prev && (queue.repeatMode !== 1 || queue.next)) {
if (!queue.prev && (queue.repeatMode !== __1.RepeatMode.SONG || queue.next)) {
const prev = queue.songs.shift();

@@ -162,2 +162,4 @@ delete prev.formats;

}
if (queue.stopped)
return false;
queue.playing = true;

@@ -199,3 +201,4 @@ queue.paused = false;

var _a, _b;
return !this.options.emitNewSongOnly || (queue.repeatMode !== 1 && ((_a = queue.songs[0]) === null || _a === void 0 ? void 0 : _a.id) !== ((_b = queue.songs[1]) === null || _b === void 0 ? void 0 : _b.id));
return (!this.options.emitNewSongOnly ||
(queue.repeatMode !== __1.RepeatMode.SONG && ((_a = queue.songs[0]) === null || _a === void 0 ? void 0 : _a.id) !== ((_b = queue.songs[1]) === null || _b === void 0 ? void 0 : _b.id)));
}

@@ -202,0 +205,0 @@ }

@@ -15,2 +15,3 @@ import { TypedEmitter } from "tiny-typed-emitter";

emittedError: boolean;
isDisconnected: boolean;
private _channel;

@@ -17,0 +18,0 @@ private _volume;

@@ -21,2 +21,3 @@ "use strict";

}
this.isDisconnected = false;
this.id = channel.guild.id;

@@ -119,6 +120,8 @@ this.channel = channel;

this.stop();
if (this.connection.state.status !== voice_1.VoiceConnectionStatus.Destroyed) {
if (!this.isDisconnected) {
this.emit("disconnect", error);
this.isDisconnected = true;
}
if (this.connection.state.status !== voice_1.VoiceConnectionStatus.Destroyed)
this.connection.destroy();
}
this.voices.delete(this.id);

@@ -125,0 +128,0 @@ }

@@ -192,3 +192,5 @@ import { TypedEmitter } from "tiny-typed-emitter";

/**
* Skip the playing song
* Skip the playing song if there is a next song in the queue.
* <info>If {@link Queue#autoplay} is `true` and there is no up next song,
* DisTube will add and play a related song.</info>
* @param {GuildIDResolvable} queue The type can be resolved to give a {@link Queue}

@@ -256,8 +258,7 @@ * @returns {Promise<Song>} The new Song will be played

/**
* Set the repeat mode of the guild queue.
* Turn off if repeat mode is the same value as new mode.
* Toggle mode `(0 -> 1 -> 2 -> 0...)`: `mode` is `undefined`
* Set the repeat mode of the guild queue.\
* Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`
* @param {GuildIDResolvable} queue The type can be resolved to give a {@link Queue}
* @param {number?} [mode] The repeat modes `(0: disabled, 1: Repeat a song, 2: Repeat all the queue)`
* @returns {number} The new repeat mode
* @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)
* @returns {RepeatMode} The new repeat mode
* @example

@@ -274,2 +275,17 @@ * client.on('message', (message) => {

* });
* @example
* const { RepeatMode } = require("distube");
* let mode;
* switch(distube.setRepeatMode(message, parseInt(args[0]))) {
* case RepeatMode.DISABLED:
* mode = "Off";
* break;
* case RepeatMode.SONG:
* mode = "Repeat a song";
* break;
* case RepeatMode.QUEUE:
* mode = "Repeat all queue";
* break;
* }
* message.channel.send("Set repeat mode to `" + mode + "`");
*/

@@ -276,0 +292,0 @@ setRepeatMode(queue: GuildIDResolvable, mode?: number): number;

@@ -403,3 +403,5 @@ "use strict";

/**
* Skip the playing song
* Skip the playing song if there is a next song in the queue.
* <info>If {@link Queue#autoplay} is `true` and there is no up next song,
* DisTube will add and play a related song.</info>
* @param {GuildIDResolvable} queue The type can be resolved to give a {@link Queue}

@@ -487,8 +489,7 @@ * @returns {Promise<Song>} The new Song will be played

/**
* Set the repeat mode of the guild queue.
* Turn off if repeat mode is the same value as new mode.
* Toggle mode `(0 -> 1 -> 2 -> 0...)`: `mode` is `undefined`
* Set the repeat mode of the guild queue.\
* Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`
* @param {GuildIDResolvable} queue The type can be resolved to give a {@link Queue}
* @param {number?} [mode] The repeat modes `(0: disabled, 1: Repeat a song, 2: Repeat all the queue)`
* @returns {number} The new repeat mode
* @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)
* @returns {RepeatMode} The new repeat mode
* @example

@@ -505,2 +506,17 @@ * client.on('message', (message) => {

* });
* @example
* const { RepeatMode } = require("distube");
* let mode;
* switch(distube.setRepeatMode(message, parseInt(args[0]))) {
* case RepeatMode.DISABLED:
* mode = "Off";
* break;
* case RepeatMode.SONG:
* mode = "Repeat a song";
* break;
* case RepeatMode.QUEUE:
* mode = "Repeat all queue";
* break;
* }
* message.channel.send("Set repeat mode to `" + mode + "`");
*/

@@ -507,0 +523,0 @@ setRepeatMode(queue, mode) {

@@ -6,19 +6,22 @@ import Plugin from "./Plugin";

* @extends Plugin
* @abstract
*/
export declare class CustomPlugin extends Plugin {
/** Create a custom plugin */
constructor();
/**
* Execute if the url is validated
* @param {Discord.VoiceChannel|Discord.StageChannel} voiceChannel The voice channel will be joined
* @param {string} url Validated url
* @param {Discord.GuildMember} member Requested user
* @param {Discord.TextChannel?} textChannel Default {@link Queue#textChannel}
* @param {boolean} skip Skip the playing song (if exists) and play the added song/playlist instantly
* @param {boolean} unshift Add the song/playlist to the beginning of the queue (after the playing song if exists)
* @returns {Promise<void>}
*/
play(voiceChannel: VoiceChannel | StageChannel, url: string, member: GuildMember, textChannel: TextChannel | undefined, skip: boolean, unshift: boolean): Promise<void>;
export declare abstract class CustomPlugin extends Plugin {
type: "custom";
abstract play(voiceChannel: VoiceChannel | StageChannel, url: string, member: GuildMember, textChannel: TextChannel | undefined, skip: boolean, unshift: boolean): Promise<void>;
}
/**
* This method will be executed if the url is validated.
* @param {Discord.VoiceChannel|Discord.StageChannel} voiceChannel The voice channel will be joined
* @param {string} url Validated url
* @param {Discord.GuildMember} member Requested user
* @param {Discord.TextChannel?} textChannel Default {@link Queue#textChannel}
* @param {boolean} skip Skip the playing song (if exists) and play the added song/playlist instantly
* @param {boolean} unshift Add the song/playlist to the beginning of the queue (after the playing song if exists)
* @returns {Promise<void>}
* @method play
* @memberof CustomPlugin#
* @abstract
*/
export default CustomPlugin;
//# sourceMappingURL=CustomPlugin.d.ts.map

@@ -7,3 +7,2 @@ "use strict";

exports.CustomPlugin = void 0;
/* eslint-disable @typescript-eslint/no-unused-vars */
const Plugin_1 = __importDefault(require("./Plugin"));

@@ -13,24 +12,25 @@ /**

* @extends Plugin
* @abstract
*/
class CustomPlugin extends Plugin_1.default {
/** Create a custom plugin */
constructor() {
super("custom");
super(...arguments);
this.type = "custom";
}
/**
* Execute if the url is validated
* @param {Discord.VoiceChannel|Discord.StageChannel} voiceChannel The voice channel will be joined
* @param {string} url Validated url
* @param {Discord.GuildMember} member Requested user
* @param {Discord.TextChannel?} textChannel Default {@link Queue#textChannel}
* @param {boolean} skip Skip the playing song (if exists) and play the added song/playlist instantly
* @param {boolean} unshift Add the song/playlist to the beginning of the queue (after the playing song if exists)
* @returns {Promise<void>}
*/
async play(voiceChannel, url, member, textChannel, skip, unshift) {
// Template
}
}
exports.CustomPlugin = CustomPlugin;
/**
* This method will be executed if the url is validated.
* @param {Discord.VoiceChannel|Discord.StageChannel} voiceChannel The voice channel will be joined
* @param {string} url Validated url
* @param {Discord.GuildMember} member Requested user
* @param {Discord.TextChannel?} textChannel Default {@link Queue#textChannel}
* @param {boolean} skip Skip the playing song (if exists) and play the added song/playlist instantly
* @param {boolean} unshift Add the song/playlist to the beginning of the queue (after the playing song if exists)
* @returns {Promise<void>}
* @method play
* @memberof CustomPlugin#
* @abstract
*/
exports.default = CustomPlugin;
//# sourceMappingURL=CustomPlugin.js.map
declare const ERROR_MESSAGES: {
INVALID_TYPE: (expected: (number | string) | (number | string)[], got: any, name?: string | undefined) => string;
INVALID_TYPE: (expected: (number | string) | readonly (number | string)[], got: any, name?: string | undefined) => string;
NUMBER_COMPARE: (name: string, expected: string, value: number) => string;

@@ -4,0 +4,0 @@ EMPTY_ARRAY: (name: string) => string;

@@ -7,16 +7,23 @@ import Plugin from "./Plugin";

* @extends Plugin
* @abstract
*/
export declare class ExtractorPlugin extends Plugin {
/** Create a extractor plugin */
constructor();
export declare abstract class ExtractorPlugin extends Plugin {
type: "extractor";
/**
* Execute if the url is validated
* (Not needed to add {@link Song#related} because it will be added with {@link Plugin#getRelatedSongs})
* @param {string} url URL
* @param {Discord.GuildMember} member Requested user
* @returns {Promise<Song|Song[]|Playlist>}
* Resolve the validated url to a {@link Song} or a {@link Playlist}.\
* Not needed to add {@link Song#related} because it will be added with {@link Plugin#getRelatedSongs}.
*/
resolve(url: string, member: GuildMember): Promise<Song | Playlist>;
abstract resolve(url: string, member: GuildMember): Promise<Song | Playlist>;
}
/**
* Resolve the validated url to a {@link Song} or a {@link Playlist}.\
* Not needed to add {@link Song#related} because it will be added with {@link Plugin#getRelatedSongs}.
* @param {string} url URL
* @param {Discord.GuildMember} member Requested user
* @returns {Promise<Song|Song[]|Playlist>}
* @method resolve
* @memberof ExtractorPlugin#
* @abstract
*/
export default ExtractorPlugin;
//# sourceMappingURL=ExtractorPlugin.d.ts.map

@@ -11,22 +11,22 @@ "use strict";

* @extends Plugin
* @abstract
*/
class ExtractorPlugin extends Plugin_1.default {
/** Create a extractor plugin */
constructor() {
super("extractor");
super(...arguments);
this.type = "extractor";
}
/**
* Execute if the url is validated
* (Not needed to add {@link Song#related} because it will be added with {@link Plugin#getRelatedSongs})
* @param {string} url URL
* @param {Discord.GuildMember} member Requested user
* @returns {Promise<Song|Song[]|Playlist>}
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
async resolve(url, member) {
return undefined;
}
}
exports.ExtractorPlugin = ExtractorPlugin;
/**
* Resolve the validated url to a {@link Song} or a {@link Playlist}.\
* Not needed to add {@link Song#related} because it will be added with {@link Plugin#getRelatedSongs}.
* @param {string} url URL
* @param {Discord.GuildMember} member Requested user
* @returns {Promise<Song|Song[]|Playlist>}
* @method resolve
* @memberof ExtractorPlugin#
* @abstract
*/
exports.default = ExtractorPlugin;
//# sourceMappingURL=ExtractorPlugin.js.map
import type { Client, TextChannel } from "discord.js";
import type { DisTube, DisTubeEvents, DisTubeHandler, DisTubeVoiceManager, Options, QueueManager, Song } from "..";
/**
* All available plugin types:
* * `custom`: {@link CustomPlugin}
* * `extractor`: {@link ExtractorPlugin}
* @typedef {"custom"|"extractor"} PluginType
*/
/**
* DisTube Plugin
* @abstract
* @private
*/
export declare class Plugin {
export declare abstract class Plugin {
type: "custom" | "extractor";
distube: DisTube;
constructor(type: "custom" | "extractor");
init(distube: DisTube): void;
/**
* Type of the plugin
* @name Plugin#type
* @type {PluginType}
*/
/**
* Emit the {@link DisTube} of this base

@@ -14,0 +25,0 @@ * @param {string} eventName Event name

@@ -5,13 +5,13 @@ "use strict";

/**
* All available plugin types:
* * `custom`: {@link CustomPlugin}
* * `extractor`: {@link ExtractorPlugin}
* @typedef {"custom"|"extractor"} PluginType
*/
/**
* DisTube Plugin
* @abstract
* @private
*/
class Plugin {
constructor(type) {
/**
* Type of the plugin
* @type {"custom"|"extractor"}
*/
this.type = type;
}
init(distube) {

@@ -25,2 +25,7 @@ /**

/**
* Type of the plugin
* @name Plugin#type
* @type {PluginType}
*/
/**
* Emit the {@link DisTube} of this base

@@ -27,0 +32,0 @@ * @param {string} eventName Event name

/// <reference types="node" />
import { DisTubeBase } from "../core";
import { Song, TaskQueue } from "..";
import { RepeatMode, Song, TaskQueue } from "..";
import type { GuildMember, Snowflake, TextChannel } from "discord.js";

@@ -51,3 +51,3 @@ import type { DisTube, DisTubeVoice, DisTubeVoiceEvents, SearchResult } from "..";

*/
repeatMode: number;
repeatMode: RepeatMode;
/**

@@ -146,3 +146,5 @@ * Whether or not the autoplay mode is enabled.

/**
* Skip the playing song
* Skip the playing song if there is a next song in the queue.
* <info>If {@link Queue#autoplay} is `true` and there is no up next song,
* DisTube will add and play a related song.</info>
* @returns {Promise<Song>} The song will skip to

@@ -153,3 +155,3 @@ * @throws {Error}

/**
* Play the previous song
* Play the previous song if exists
* @returns {Song} The guild queue

@@ -174,9 +176,8 @@ * @throws {Error}

/**
* Set the repeat mode of the guild queue.
* Turn off if repeat mode is the same value as new mode.
* Toggle mode `(0 -> 1 -> 2 -> 0...)`: `mode` is `undefined`
* @param {number?} [mode] The repeat modes `(0: disabled, 1: Repeat a song, 2: Repeat all the queue)`
* @returns {number} The new repeat mode
* Set the repeat mode of the guild queue.\
* Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`
* @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)
* @returns {RepeatMode} The new repeat mode
*/
setRepeatMode(mode?: number): number;
setRepeatMode(mode?: RepeatMode): RepeatMode;
/**

@@ -183,0 +184,0 @@ * Enable or disable filter(s) of the queue.

@@ -82,5 +82,5 @@ "use strict";

* Default value: `0` (disabled)
* @type {number}
* @type {RepeatMode}
*/
this.repeatMode = 0;
this.repeatMode = __1.RepeatMode.DISABLED;
/**

@@ -235,3 +235,5 @@ * Whether or not the autoplay mode is enabled.

/**
* Skip the playing song
* Skip the playing song if there is a next song in the queue.
* <info>If {@link Queue#autoplay} is `true` and there is no up next song,
* DisTube will add and play a related song.</info>
* @returns {Promise<Song>} The song will skip to

@@ -259,3 +261,3 @@ * @throws {Error}

/**
* Play the previous song
* Play the previous song if exists
* @returns {Song} The guild queue

@@ -270,4 +272,5 @@ * @throws {Error}

throw new __1.DisTubeError("DISABLED_OPTION", "savePreviousSongs");
if (((_a = this.previousSongs) === null || _a === void 0 ? void 0 : _a.length) === 0 && this.repeatMode !== 2)
if (((_a = this.previousSongs) === null || _a === void 0 ? void 0 : _a.length) === 0 && this.repeatMode !== __1.RepeatMode.QUEUE) {
throw new __1.DisTubeError("NO_PREVIOUS");
}
const song = this.repeatMode === 2 ? this.songs[this.songs.length - 1] : this.previousSongs[this.previousSongs.length - 1];

@@ -348,11 +351,10 @@ this.prev = true;

/**
* Set the repeat mode of the guild queue.
* Turn off if repeat mode is the same value as new mode.
* Toggle mode `(0 -> 1 -> 2 -> 0...)`: `mode` is `undefined`
* @param {number?} [mode] The repeat modes `(0: disabled, 1: Repeat a song, 2: Repeat all the queue)`
* @returns {number} The new repeat mode
* Set the repeat mode of the guild queue.\
* Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`
* @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)
* @returns {RepeatMode} The new repeat mode
*/
setRepeatMode(mode) {
if (mode !== undefined && ![0, 1, 2].includes(mode)) {
throw new __1.DisTubeError("INVALID_TYPE", [0, 1, 2, "undefined"], mode, "mode");
if (mode !== undefined && !Object.values(__1.RepeatMode).includes(mode)) {
throw new __1.DisTubeError("INVALID_TYPE", ["RepeatMode", "undefined"], mode, "mode");
}

@@ -362,3 +364,3 @@ if (mode === undefined)

else if (this.repeatMode === mode)
this.repeatMode = 0;
this.repeatMode = __1.RepeatMode.DISABLED;
else

@@ -365,0 +367,0 @@ this.repeatMode = mode;

{
"name": "distube",
"version": "3.0.0-beta.37",
"version": "3.0.0-beta.38",
"description": "A Discord.js module to simplify your music commands and play songs with audio filters on Discord without any API key. Support YouTube, SoundCloud, Bandcamp, Facebook, and 700+ more sites",

@@ -15,3 +15,4 @@ "main": "dist/index.js",

"build:check": "tsc --noEmit --incremental false",
"publish:beta": "npm publish --tag beta"
"publish:beta": "npm publish --tag beta",
"ncu": "ncu -u --dep dev,prod"
},

@@ -53,6 +54,6 @@ "repository": {

"devDependencies": {
"@babel/core": "^7.15.0",
"@babel/core": "^7.15.5",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-proposal-object-rest-spread": "^7.14.7",
"@babel/preset-env": "^7.15.0",
"@babel/preset-env": "^7.15.4",
"@babel/preset-typescript": "^7.15.0",

@@ -66,5 +67,5 @@ "@commitlint/cli": "^13.1.0",

"babel-jest": "^27.1.0",
"discord.js": "^13.0.1",
"discord.js": "^13.1.0",
"eslint": "^7.32.0",
"eslint-config-distube": "^1.3.0",
"eslint-config-distube": "^1.4.0",
"husky": "^7.0.2",

@@ -74,2 +75,3 @@ "jest": "^27.1.0",

"lint-staged": "^11.1.2",
"npm-check-updates": "^11.8.5",
"prettier": "^2.3.2",

@@ -76,0 +78,0 @@ "typescript": "^4.4.2"

@@ -42,3 +42,3 @@ <div align="center">

- Node v12 or higher
- [git](https://git-scm.com/downloads) (for install forked dependencies)
- [git](https://git-scm.com/downloads) _(For installing forked dependencies)_
- [discord.js](https://discord.js.org) v12 or **v13 _(Recommended)_**

@@ -66,2 +66,2 @@ - [@discordjs/voice](https://github.com/discordjs/voice)

- [node-ytpl](https://github.com/TimeForANinja/node-ytpl): YouTube playlist resolver ([DisTube Fork](https://github.com/distubejs/ytpl))
- [youtube-dl-exec](https://github.com/microlinkhq/youtube-dl-exec): [`youtube-dl`](https://youtube-dl.org/) wrapper
- [youtube-dl-exec](https://github.com/microlinkhq/youtube-dl-exec): [`youtube-dl`](https://youtube-dl.org/) wrapper

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc