refactor(*): return the invalid element when erroring from Array (#5314)

This commit is contained in:
ckohen
2021-05-10 03:28:36 -07:00
committed by GitHub
parent 1ecda83da7
commit eaf332f83f
5 changed files with 57 additions and 47 deletions

View File

@@ -49,15 +49,14 @@ class GuildEmojiManager extends BaseGuildEmojiManager {
const data = { image: attachment, name }; const data = { image: attachment, name };
if (roles) { if (roles) {
if (!Array.isArray(roles) && !(roles instanceof Collection)) {
throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true);
}
data.roles = []; data.roles = [];
for (let role of roles instanceof Collection ? roles.values() : roles) { for (const role of roles.values()) {
const roleID = this.guild.roles.resolveID(role); const resolvedRole = this.guild.roles.resolveID(role);
if (!roleID) { if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'options.roles', role);
return Promise.reject( data.roles.push(resolvedRole);
new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true),
);
}
data.roles.push(roleID);
} }
} }

View File

@@ -51,15 +51,18 @@ class GuildEmojiRoleManager {
* @returns {Promise<GuildEmoji>} * @returns {Promise<GuildEmoji>}
*/ */
add(roleOrRoles) { add(roleOrRoles) {
if (roleOrRoles instanceof Collection) return this.add(roleOrRoles.keyArray()); if (!Array.isArray(roleOrRoles) && !(roleOrRoles instanceof Collection)) roleOrRoles = [roleOrRoles];
if (!Array.isArray(roleOrRoles)) return this.add([roleOrRoles]);
roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r));
if (roleOrRoles.includes(null)) { const resolvedRoles = [];
return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true)); for (const role of roleOrRoles.values()) {
const resolvedRole = this.guild.roles.resolveID(role);
if (!resolvedRole) {
return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role));
}
resolvedRoles.push(resolvedRole);
} }
const newRoles = [...new Set(roleOrRoles.concat(...this._roles.values()))]; const newRoles = [...new Set(resolvedRoles.concat(...this._roles.values()))];
return this.set(newRoles); return this.set(newRoles);
} }
@@ -69,15 +72,18 @@ class GuildEmojiRoleManager {
* @returns {Promise<GuildEmoji>} * @returns {Promise<GuildEmoji>}
*/ */
remove(roleOrRoles) { remove(roleOrRoles) {
if (roleOrRoles instanceof Collection) return this.remove(roleOrRoles.keyArray()); if (!Array.isArray(roleOrRoles) && !(roleOrRoles instanceof Collection)) roleOrRoles = [roleOrRoles];
if (!Array.isArray(roleOrRoles)) return this.remove([roleOrRoles]);
roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r));
if (roleOrRoles.includes(null)) { const resolvedRoles = [];
return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true)); for (const role of roleOrRoles.values()) {
const resolvedRole = this.guild.roles.resolveID(role);
if (!resolvedRole) {
return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role));
}
resolvedRoles.push(resolvedRole);
} }
const newRoles = this._roles.keyArray().filter(role => !roleOrRoles.includes(role)); const newRoles = this._roles.keyArray().filter(role => !resolvedRoles.includes(role.id));
return this.set(newRoles); return this.set(newRoles);
} }

View File

@@ -176,7 +176,7 @@ class GuildMemberManager extends BaseManager {
* .catch(console.error); * .catch(console.error);
*/ */
prune({ days = 7, dry = false, count: compute_prune_count = true, roles = [], reason } = {}) { prune({ days = 7, dry = false, count: compute_prune_count = true, roles = [], reason } = {}) {
if (typeof days !== 'number') throw new TypeError('PRUNE_DAYS_TYPE'); if (typeof days !== 'number') return Promise.reject(new TypeError('PRUNE_DAYS_TYPE'));
const query = { days }; const query = { days };
const resolvedRoles = []; const resolvedRoles = [];
@@ -184,7 +184,7 @@ class GuildMemberManager extends BaseManager {
for (const role of roles) { for (const role of roles) {
const resolvedRole = this.guild.roles.resolveID(role); const resolvedRole = this.guild.roles.resolveID(role);
if (!resolvedRole) { if (!resolvedRole) {
return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array of Roles or Snowflakes', true)); return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array', 'options.roles', role));
} }
resolvedRoles.push(resolvedRole); resolvedRoles.push(resolvedRole);
} }

View File

@@ -100,23 +100,25 @@ class GuildMemberRoleManager {
*/ */
async add(roleOrRoles, reason) { async add(roleOrRoles, reason) {
if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) { if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) {
roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); const resolvedRoles = [];
if (roleOrRoles.includes(null)) { for (const role of roleOrRoles.values()) {
throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); const resolvedRole = this.guild.roles.resolveID(role);
if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role);
resolvedRoles.push(resolvedRole);
} }
const newRoles = [...new Set(roleOrRoles.concat(...this._roles.values()))]; const newRoles = [...new Set(resolvedRoles.concat(...this._roles.values()))];
return this.set(newRoles, reason); return this.set(newRoles, reason);
} else { } else {
const roleID = this.guild.roles.resolveID(roleOrRoles); roleOrRoles = this.guild.roles.resolveID(roleOrRoles);
if (roleID === null) { if (roleOrRoles === null) {
throw new TypeError('INVALID_TYPE', 'roles', 'Role, Snowflake or Array or Collection of Roles or Snowflakes'); throw new TypeError('INVALID_TYPE', 'roles', 'Role, Snowflake or Array or Collection of Roles or Snowflakes');
} }
await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleID].put({ reason }); await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleOrRoles].put({ reason });
const clone = this.member._clone(); const clone = this.member._clone();
clone._roles = [...this._roles.keys(), roleID]; clone._roles = [...this._roles.keys(), roleOrRoles];
return clone; return clone;
} }
} }
@@ -129,23 +131,25 @@ class GuildMemberRoleManager {
*/ */
async remove(roleOrRoles, reason) { async remove(roleOrRoles, reason) {
if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) { if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) {
roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); const resolvedRoles = [];
if (roleOrRoles.includes(null)) { for (const role of roleOrRoles.values()) {
throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); const resolvedRole = this.guild.roles.resolveID(role);
if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role);
resolvedRoles.push(resolvedRole);
} }
const newRoles = this._roles.filter(role => !roleOrRoles.includes(role.id)); const newRoles = this._roles.filter(role => !resolvedRoles.includes(role.id));
return this.set(newRoles, reason); return this.set(newRoles, reason);
} else { } else {
const roleID = this.guild.roles.resolveID(roleOrRoles); roleOrRoles = this.guild.roles.resolveID(roleOrRoles);
if (roleID === null) { if (roleOrRoles === null) {
throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); throw new TypeError('INVALID_TYPE', 'roles', 'Role, Snwoflake or Array or Collection of Roles or Snowflakes');
} }
await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleID].delete({ reason }); await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleOrRoles].delete({ reason });
const clone = this.member._clone(); const clone = this.member._clone();
const newRoles = this._roles.filter(role => role.id !== roleID); const newRoles = this._roles.filter(role => role.id !== roleOrRoles);
clone._roles = [...newRoles.keys()]; clone._roles = [...newRoles.keys()];
return clone; return clone;
} }

View File

@@ -929,15 +929,16 @@ class Guild extends Base {
if (this.members.cache.has(user)) return this.members.cache.get(user); if (this.members.cache.has(user)) return this.members.cache.get(user);
options.access_token = options.accessToken; options.access_token = options.accessToken;
if (options.roles) { if (options.roles) {
const roles = []; if (!Array.isArray(options.roles) && !(options.roles instanceof Collection)) {
for (let role of options.roles instanceof Collection ? options.roles.values() : options.roles) { throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true);
let roleID = this.roles.resolveID(role);
if (!roleID) {
throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true);
}
roles.push(roleID);
} }
options.roles = roles; const resolvedRoles = [];
for (const role of options.roles.values()) {
const resolvedRole = this.roles.resolveID(role);
if (!role) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'options.roles', role);
resolvedRoles.push(resolvedRole);
}
options.roles = resolvedRoles;
} }
const data = await this.client.api.guilds(this.id).members(user).put({ data: options }); const data = await this.client.api.guilds(this.id).members(user).put({ data: options });
// Data is an empty buffer if the member is already part of the guild. // Data is an empty buffer if the member is already part of the guild.