From 60ca7565a7f7bd2f4a1d603c847ed5e8d1bd045e Mon Sep 17 00:00:00 2001 From: qingminlong <0668001063@xydigit.com> Date: Mon, 13 Jul 2026 09:25:49 +0800 Subject: [PATCH] fix(discord): omit invalid component accent colors (#105387) * fix(discord): omit invalid component accent colors * test(discord): cover accent color boundaries * docs: keep release notes in PR context --------- Co-authored-by: Peter Steinberger --- extensions/discord/src/components.test.ts | 26 +++++++++++++++++++ .../discord/src/internal/components.base.ts | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/extensions/discord/src/components.test.ts b/extensions/discord/src/components.test.ts index 0a0056f6d621..91c427f86c3d 100644 --- a/extensions/discord/src/components.test.ts +++ b/extensions/discord/src/components.test.ts @@ -115,6 +115,32 @@ describe("discord components", () => { expect(result.modals[0]?.allowedUsers).toEqual(["discord:user-1"]); }); + it.each([ + { label: "minimum", accentColor: 0, expected: 0 }, + { label: "maximum", accentColor: 0xffffff, expected: 0xffffff }, + { label: "negative", accentColor: -1, expected: undefined }, + { label: "fractional", accentColor: 1.5, expected: undefined }, + { label: "above maximum", accentColor: 0x1000000, expected: undefined }, + ])("serializes $label numeric container accent colors safely", ({ accentColor, expected }) => { + const spec = readDiscordComponentSpec({ + text: "Status", + container: { accentColor }, + }); + if (!spec) { + throw new Error("Expected component spec to be parsed"); + } + + const serialized = buildDiscordComponentMessage({ spec }).components[0]?.serialize() as + | { accent_color?: unknown } + | undefined; + + if (expected === undefined) { + expect(serialized).not.toHaveProperty("accent_color"); + } else { + expect(serialized?.accent_color).toBe(expected); + } + }); + it("serializes disabled link buttons", () => { const spec = readDiscordComponentSpec({ blocks: [ diff --git a/extensions/discord/src/internal/components.base.ts b/extensions/discord/src/internal/components.base.ts index 6ec80eb9deca..d5f86bb1523e 100644 --- a/extensions/discord/src/internal/components.base.ts +++ b/extensions/discord/src/internal/components.base.ts @@ -41,7 +41,7 @@ export function clean>(value: T): T { export function colorToNumber(value: string | number | undefined): number | undefined { if (typeof value === "number") { - return value; + return Number.isInteger(value) && value >= 0 && value <= 0xffffff ? value : undefined; } if (typeof value === "string" && /^#?[0-9a-f]{6}$/i.test(value)) { return Number.parseInt(value.replace(/^#/, ""), 16);