summaryrefslogtreecommitdiff
path: root/node_modules/discord.js/src/util/Structures.js
diff options
context:
space:
mode:
author8cy <[email protected]>2020-04-30 15:46:16 -0700
committer8cy <[email protected]>2020-04-30 15:46:16 -0700
commit3a4deac89054021b56ad5bd8005b2044cc085c98 (patch)
tree3dd6af8503e497e46180b6b5231674f36bdce9f2 /node_modules/discord.js/src/util/Structures.js
downloaduppity-3a4deac89054021b56ad5bd8005b2044cc085c98.tar.xz
uppity-3a4deac89054021b56ad5bd8005b2044cc085c98.zip
Up, up, uppity.
Diffstat (limited to 'node_modules/discord.js/src/util/Structures.js')
-rw-r--r--node_modules/discord.js/src/util/Structures.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/node_modules/discord.js/src/util/Structures.js b/node_modules/discord.js/src/util/Structures.js
new file mode 100644
index 0000000..0c6ab35
--- /dev/null
+++ b/node_modules/discord.js/src/util/Structures.js
@@ -0,0 +1,112 @@
+'use strict';
+
+/**
+ * An extendable structure:
+ * * **`GuildEmoji`**
+ * * **`DMChannel`**
+ * * **`TextChannel`**
+ * * **`VoiceChannel`**
+ * * **`CategoryChannel`**
+ * * **`NewsChannel`**
+ * * **`StoreChannel`**
+ * * **`GuildMember`**
+ * * **`Guild`**
+ * * **`Message`**
+ * * **`MessageReaction`**
+ * * **`Presence`**
+ * * **`ClientPresence`**
+ * * **`VoiceState`**
+ * * **`Role`**
+ * * **`User`**
+ * @typedef {string} ExtendableStructure
+ */
+
+/**
+ * Allows for the extension of built-in Discord.js structures that are instantiated by {@link BaseManager Managers}.
+ */
+class Structures {
+ constructor() {
+ throw new Error(`The ${this.constructor.name} class may not be instantiated.`);
+ }
+
+ /**
+ * Retrieves a structure class.
+ * @param {string} structure Name of the structure to retrieve
+ * @returns {Function}
+ */
+ static get(structure) {
+ if (typeof structure === 'string') return structures[structure];
+ throw new TypeError(`"structure" argument must be a string (received ${typeof structure})`);
+ }
+
+ /**
+ * Extends a structure.
+ * <warn> Make sure to extend all structures before instantiating your client.
+ * Extending after doing so may not work as expected. </warn>
+ * @param {ExtendableStructure} structure Name of the structure class to extend
+ * @param {Function} extender Function that takes the base class to extend as its only parameter and returns the
+ * extended class/prototype
+ * @returns {Function} Extended class/prototype returned from the extender
+ * @example
+ * const { Structures } = require('discord.js');
+ *
+ * Structures.extend('Guild', Guild => {
+ * class CoolGuild extends Guild {
+ * constructor(client, data) {
+ * super(client, data);
+ * this.cool = true;
+ * }
+ * }
+ *
+ * return CoolGuild;
+ * });
+ */
+ static extend(structure, extender) {
+ if (!structures[structure]) throw new RangeError(`"${structure}" is not a valid extensible structure.`);
+ if (typeof extender !== 'function') {
+ const received = `(received ${typeof extender})`;
+ throw new TypeError(
+ `"extender" argument must be a function that returns the extended structure class/prototype ${received}.`,
+ );
+ }
+
+ const extended = extender(structures[structure]);
+ if (typeof extended !== 'function') {
+ const received = `(received ${typeof extended})`;
+ throw new TypeError(`The extender function must return the extended structure class/prototype ${received}.`);
+ }
+
+ if (!(extended.prototype instanceof structures[structure])) {
+ const prototype = Object.getPrototypeOf(extended);
+ const received = `${extended.name || 'unnamed'}${prototype.name ? ` extends ${prototype.name}` : ''}`;
+ throw new Error(
+ 'The class/prototype returned from the extender function must extend the existing structure class/prototype' +
+ ` (received function ${received}; expected extension of ${structures[structure].name}).`,
+ );
+ }
+
+ structures[structure] = extended;
+ return extended;
+ }
+}
+
+const structures = {
+ GuildEmoji: require('../structures/GuildEmoji'),
+ DMChannel: require('../structures/DMChannel'),
+ TextChannel: require('../structures/TextChannel'),
+ VoiceChannel: require('../structures/VoiceChannel'),
+ CategoryChannel: require('../structures/CategoryChannel'),
+ NewsChannel: require('../structures/NewsChannel'),
+ StoreChannel: require('../structures/StoreChannel'),
+ GuildMember: require('../structures/GuildMember'),
+ Guild: require('../structures/Guild'),
+ Message: require('../structures/Message'),
+ MessageReaction: require('../structures/MessageReaction'),
+ Presence: require('../structures/Presence').Presence,
+ ClientPresence: require('../structures/ClientPresence'),
+ VoiceState: require('../structures/VoiceState'),
+ Role: require('../structures/Role'),
+ User: require('../structures/User'),
+};
+
+module.exports = Structures;