Skip to content

Commit

Permalink
fix: unsafe embed builder field normalization (#7418)
Browse files Browse the repository at this point in the history
  • Loading branch information
suneettipirneni committed Feb 7, 2022
1 parent a921ec7 commit b936103
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 9 deletions.
7 changes: 2 additions & 5 deletions packages/builders/src/components/Component.ts
@@ -1,15 +1,12 @@
import type { APIMessageComponent, ComponentType } from 'discord-api-types/v9';
import type { JSONEncodable } from '../util/jsonEncodable';

/**
* Represents a discord component
*/
export interface Component {
export interface Component extends JSONEncodable<APIMessageComponent> {
/**
* The type of this component
*/
readonly type: ComponentType;
/**
* Converts this component to an API-compatible JSON object
*/
toJSON: () => APIMessageComponent;
}
2 changes: 2 additions & 0 deletions packages/builders/src/index.ts
Expand Up @@ -28,3 +28,5 @@ export * from './interactions/slashCommands/options/user';

export * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions';
export * from './interactions/contextMenuCommands/ContextMenuCommandBuilder';

export * from './util/jsonEncodable';
8 changes: 4 additions & 4 deletions packages/builders/src/messages/embed/UnsafeEmbed.ts
Expand Up @@ -8,7 +8,7 @@ import type {
APIEmbedThumbnail,
APIEmbedVideo,
} from 'discord-api-types/v9';
import { Embed } from './Embed';
import type { JSONEncodable } from '../../util/jsonEncodable';

export interface AuthorOptions {
name: string;
Expand All @@ -21,7 +21,7 @@ export interface FooterOptions {
iconURL?: string;
}

export class UnsafeEmbed implements APIEmbed {
export class UnsafeEmbed implements APIEmbed, JSONEncodable<APIEmbed> {
/**
* An array of fields of this embed
*/
Expand Down Expand Up @@ -126,7 +126,7 @@ export class UnsafeEmbed implements APIEmbed {
* @param fields The fields to add
*/
public addFields(...fields: APIEmbedField[]): this {
this.fields.push(...Embed.normalizeFields(...fields));
this.fields.push(...UnsafeEmbed.normalizeFields(...fields));
return this;
}

Expand All @@ -138,7 +138,7 @@ export class UnsafeEmbed implements APIEmbed {
* @param fields The replacing field objects
*/
public spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {
this.fields.splice(index, deleteCount, ...Embed.normalizeFields(...fields));
this.fields.splice(index, deleteCount, ...UnsafeEmbed.normalizeFields(...fields));
return this;
}

Expand Down
14 changes: 14 additions & 0 deletions packages/builders/src/util/jsonEncodable.ts
@@ -0,0 +1,14 @@
export interface JSONEncodable<T> {
/**
* Transforms this object to its JSON format
*/
toJSON: () => T;
}

/**
* Indicates if an object is encodable or not.
* @param maybeEncodable The object to check against
*/
export function isJSONEncodable(maybeEncodable: unknown): maybeEncodable is JSONEncodable<unknown> {
return maybeEncodable !== null && typeof maybeEncodable === 'object' && 'toJSON' in maybeEncodable;
}

0 comments on commit b936103

Please sign in to comment.