From 847f9d3eccf2d830823b880adc5e53eb3cc99a03 Mon Sep 17 00:00:00 2001 From: WhatCats Date: Thu, 20 Nov 2025 23:43:34 +0100 Subject: [PATCH] fix: typing mismatch for empty strings being treated as undefined --- .../src/managers/ApplicationCommandManager.js | 4 +++- .../discord.js/src/managers/ApplicationEmojiManager.js | 2 +- .../src/managers/AutoModerationRuleManager.js | 5 ++++- packages/discord.js/src/managers/EntitlementManager.js | 8 +++++--- packages/discord.js/src/managers/GuildBanManager.js | 9 +++++++-- .../discord.js/src/managers/GuildChannelManager.js | 4 ++-- packages/discord.js/src/managers/GuildEmojiManager.js | 2 +- packages/discord.js/src/managers/GuildInviteManager.js | 5 ++++- packages/discord.js/src/managers/GuildMemberManager.js | 10 ++++++++-- .../src/managers/GuildSoundboardSoundManager.js | 10 ++++++++-- .../discord.js/src/managers/GuildStickerManager.js | 2 +- packages/discord.js/src/managers/MessageManager.js | 10 ++++++++-- packages/discord.js/src/managers/RoleManager.js | 2 +- .../discord.js/src/managers/ThreadMemberManager.js | 10 ++++++++-- 14 files changed, 61 insertions(+), 22 deletions(-) diff --git a/packages/discord.js/src/managers/ApplicationCommandManager.js b/packages/discord.js/src/managers/ApplicationCommandManager.js index cbf7672ef013..869ed07aecb0 100644 --- a/packages/discord.js/src/managers/ApplicationCommandManager.js +++ b/packages/discord.js/src/managers/ApplicationCommandManager.js @@ -123,7 +123,9 @@ class ApplicationCommandManager extends CachedManager { * .catch(console.error) */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } if (typeof options === 'string') return this._fetchSingle({ id: options }); diff --git a/packages/discord.js/src/managers/ApplicationEmojiManager.js b/packages/discord.js/src/managers/ApplicationEmojiManager.js index 97f058da7424..453e23adb922 100644 --- a/packages/discord.js/src/managers/ApplicationEmojiManager.js +++ b/packages/discord.js/src/managers/ApplicationEmojiManager.js @@ -80,7 +80,7 @@ class ApplicationEmojiManager extends CachedManager { * .catch(console.error); */ async fetch(id, { cache = true, force = false } = {}) { - if (id) { + if (id !== undefined) { if (!force) { const existing = this.cache.get(id); if (existing) return existing; diff --git a/packages/discord.js/src/managers/AutoModerationRuleManager.js b/packages/discord.js/src/managers/AutoModerationRuleManager.js index c19414e4dfcf..5d3e9e5fe7b8 100644 --- a/packages/discord.js/src/managers/AutoModerationRuleManager.js +++ b/packages/discord.js/src/managers/AutoModerationRuleManager.js @@ -265,7 +265,10 @@ class AutoModerationRuleManager extends CachedManager { * .catch(console.error) */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { autoModerationRule, cache, force } = options; const resolvedAutoModerationRule = this.resolveId(autoModerationRule ?? options); if (resolvedAutoModerationRule) { diff --git a/packages/discord.js/src/managers/EntitlementManager.js b/packages/discord.js/src/managers/EntitlementManager.js index 70cd518f94cb..e09ffbb05e3b 100644 --- a/packages/discord.js/src/managers/EntitlementManager.js +++ b/packages/discord.js/src/managers/EntitlementManager.js @@ -72,11 +72,13 @@ class EntitlementManager extends CachedManager { * @returns {Promise>} */ async fetch(options) { - if (!options) return this._fetchMany(options); + if (options === undefined) { + return this._fetchMany(options); + } + const { entitlement, cache, force } = options; const resolvedEntitlement = this.resolveId(entitlement ?? options); - - if (resolvedEntitlement) { + if (resolvedEntitlement !== null) { return this._fetchSingle({ entitlement: resolvedEntitlement, cache, force }); } diff --git a/packages/discord.js/src/managers/GuildBanManager.js b/packages/discord.js/src/managers/GuildBanManager.js index 3df311719ae5..ea53f4b76fd1 100644 --- a/packages/discord.js/src/managers/GuildBanManager.js +++ b/packages/discord.js/src/managers/GuildBanManager.js @@ -102,10 +102,15 @@ class GuildBanManager extends CachedManager { * .catch(console.error); */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { user, cache, force, limit, before, after } = options; const resolvedUser = this.client.users.resolveId(user ?? options); - if (resolvedUser) return this._fetchSingle({ user: resolvedUser, cache, force }); + if (resolvedUser !== null) { + return this._fetchSingle({ user: resolvedUser, cache, force }); + } if (!before && !after && !limit && cache === undefined) { throw new DiscordjsError(ErrorCodes.FetchBanResolveId); diff --git a/packages/discord.js/src/managers/GuildChannelManager.js b/packages/discord.js/src/managers/GuildChannelManager.js index 628f0603b7ad..2bda19139eb8 100644 --- a/packages/discord.js/src/managers/GuildChannelManager.js +++ b/packages/discord.js/src/managers/GuildChannelManager.js @@ -418,12 +418,12 @@ class GuildChannelManager extends CachedManager { * .catch(console.error); */ async fetch(id, { cache = true, force = false } = {}) { - if (id && !force) { + if (id !== undefined && !force) { const existing = this.cache.get(id); if (existing) return existing; } - if (id) { + if (id !== undefined) { const innerData = await this.client.rest.get(Routes.channel(id)); // Since this is the guild manager, throw if on a different guild if (this.guild.id !== innerData.guild_id) throw new DiscordjsError(ErrorCodes.GuildChannelUnowned); diff --git a/packages/discord.js/src/managers/GuildEmojiManager.js b/packages/discord.js/src/managers/GuildEmojiManager.js index 83ef0e490916..f64b3541dec1 100644 --- a/packages/discord.js/src/managers/GuildEmojiManager.js +++ b/packages/discord.js/src/managers/GuildEmojiManager.js @@ -179,7 +179,7 @@ class GuildEmojiManager extends CachedManager { * .catch(console.error); */ async fetch(id, { cache = true, force = false } = {}) { - if (id) { + if (id !== undefined) { if (!force) { const existing = this.cache.get(id); if (existing) return existing; diff --git a/packages/discord.js/src/managers/GuildInviteManager.js b/packages/discord.js/src/managers/GuildInviteManager.js index 960dbf364411..d07022ea22f9 100644 --- a/packages/discord.js/src/managers/GuildInviteManager.js +++ b/packages/discord.js/src/managers/GuildInviteManager.js @@ -142,7 +142,10 @@ class GuildInviteManager extends CachedManager { * .catch(console.error); */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + if (typeof options === 'string') { const code = resolveInviteCode(options); if (!code) throw new DiscordjsError(ErrorCodes.InviteResolveCode); diff --git a/packages/discord.js/src/managers/GuildMemberManager.js b/packages/discord.js/src/managers/GuildMemberManager.js index e75c9a3384e5..74c9bed015e2 100644 --- a/packages/discord.js/src/managers/GuildMemberManager.js +++ b/packages/discord.js/src/managers/GuildMemberManager.js @@ -217,10 +217,16 @@ class GuildMemberManager extends CachedManager { * .catch(console.error); */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { user: users, limit, withPresences, cache, force } = options; const resolvedUser = this.client.users.resolveId(users ?? options); - if (resolvedUser && !limit && !withPresences) return this._fetchSingle({ user: resolvedUser, cache, force }); + if (resolvedUser !== null && !limit && !withPresences) { + return this._fetchSingle({ user: resolvedUser, cache, force }); + } + const resolvedUsers = users?.map?.(user => this.client.users.resolveId(user)) ?? resolvedUser ?? undefined; return this._fetchMany({ ...options, users: resolvedUsers }); } diff --git a/packages/discord.js/src/managers/GuildSoundboardSoundManager.js b/packages/discord.js/src/managers/GuildSoundboardSoundManager.js index c5027c0fbb15..2b2fb487496f 100644 --- a/packages/discord.js/src/managers/GuildSoundboardSoundManager.js +++ b/packages/discord.js/src/managers/GuildSoundboardSoundManager.js @@ -199,10 +199,16 @@ class GuildSoundboardSoundManager extends CachedManager { * .catch(console.error); */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { cache, force, soundboardSound } = options; const resolvedSoundboardSound = this.resolveId(soundboardSound ?? options); - if (resolvedSoundboardSound) return this._fetchSingle({ cache, force, soundboardSound: resolvedSoundboardSound }); + if (resolvedSoundboardSound !== null) { + return this._fetchSingle({ cache, force, soundboardSound: resolvedSoundboardSound }); + } + return this._fetchMany({ cache }); } diff --git a/packages/discord.js/src/managers/GuildStickerManager.js b/packages/discord.js/src/managers/GuildStickerManager.js index e8bd50f76db4..e5d7cafb90db 100644 --- a/packages/discord.js/src/managers/GuildStickerManager.js +++ b/packages/discord.js/src/managers/GuildStickerManager.js @@ -163,7 +163,7 @@ class GuildStickerManager extends CachedManager { * .catch(console.error); */ async fetch(id, { cache = true, force = false } = {}) { - if (id) { + if (id !== undefined) { if (!force) { const existing = this.cache.get(id); if (existing) return existing; diff --git a/packages/discord.js/src/managers/MessageManager.js b/packages/discord.js/src/managers/MessageManager.js index d0a4402b4490..8329fc9f9eb2 100644 --- a/packages/discord.js/src/managers/MessageManager.js +++ b/packages/discord.js/src/managers/MessageManager.js @@ -98,10 +98,16 @@ class MessageManager extends CachedManager { * .catch(console.error); */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { message, cache, force } = options; const resolvedMessage = this.resolveId(message ?? options); - if (resolvedMessage) return this._fetchSingle({ message: resolvedMessage, cache, force }); + if (resolvedMessage !== null) { + return this._fetchSingle({ message: resolvedMessage, cache, force }); + } + return this._fetchMany(options); } diff --git a/packages/discord.js/src/managers/RoleManager.js b/packages/discord.js/src/managers/RoleManager.js index e17f4f46d04d..a5f5a7cdd9a9 100644 --- a/packages/discord.js/src/managers/RoleManager.js +++ b/packages/discord.js/src/managers/RoleManager.js @@ -65,7 +65,7 @@ class RoleManager extends CachedManager { * .catch(console.error); */ async fetch(id, { cache = true, force = false } = {}) { - if (!id) { + if (id === undefined) { const innerData = await this.client.rest.get(Routes.guildRoles(this.guild.id)); const roles = new Collection(); for (const role of innerData) roles.set(role.id, this._add(role, cache)); diff --git a/packages/discord.js/src/managers/ThreadMemberManager.js b/packages/discord.js/src/managers/ThreadMemberManager.js index e96a4a2899e8..539181ff6284 100644 --- a/packages/discord.js/src/managers/ThreadMemberManager.js +++ b/packages/discord.js/src/managers/ThreadMemberManager.js @@ -165,10 +165,16 @@ class ThreadMemberManager extends CachedManager { * @returns {Promise>} */ async fetch(options) { - if (!options) return this._fetchMany(); + if (options === undefined) { + return this._fetchMany(); + } + const { member, withMember, cache, force } = options; const resolvedMember = this.resolveId(member ?? options); - if (resolvedMember) return this._fetchSingle({ member: resolvedMember, withMember, cache, force }); + if (resolvedMember !== null) { + return this._fetchSingle({ member: resolvedMember, withMember, cache, force }); + } + return this._fetchMany(options); }