fix(slack): guard against undefined text in includes calls during mention handling

This commit is contained in:
stone-jin
2026-03-03 00:02:48 +08:00
committed by Peter Steinberger
parent ce4faedad6
commit 2a98fd3d0b
4 changed files with 33 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
import { describe, expect, it } from "vitest";
import { stripStructuralPrefixes } from "./mentions.js";
describe("stripStructuralPrefixes", () => {
it("returns empty string for undefined input at runtime", () => {
expect(stripStructuralPrefixes(undefined as unknown as string)).toBe("");
});
it("returns empty string for empty input", () => {
expect(stripStructuralPrefixes("")).toBe("");
});
it("strips sender prefix labels", () => {
expect(stripStructuralPrefixes("John: hello")).toBe("hello");
});
it("passes through plain text", () => {
expect(stripStructuralPrefixes("just a message")).toBe("just a message");
});
});

View File

@@ -111,6 +111,9 @@ export function matchesMentionWithExplicit(params: {
}
export function stripStructuralPrefixes(text: string): string {
if (!text) {
return "";
}
// Ignore wrapper labels, timestamps, and sender prefixes so directive-only
// detection still works in group batches that include history/context.
const afterMarker = text.includes(CURRENT_MESSAGE_MARKER)

View File

@@ -57,6 +57,10 @@ describe("markdownToSlackMrkdwn", () => {
"*Important:* Check the _docs_ at <https://example.com|link>\n\n• first\n• second",
);
});
it("does not throw when input is undefined at runtime", () => {
expect(markdownToSlackMrkdwn(undefined as unknown as string)).toBe("");
});
});
describe("escapeSlackMrkdwn", () => {

View File

@@ -28,6 +28,9 @@ function isAllowedSlackAngleToken(token: string): boolean {
}
function escapeSlackMrkdwnContent(text: string): string {
if (!text) {
return "";
}
if (!text.includes("&") && !text.includes("<") && !text.includes(">")) {
return text;
}
@@ -53,6 +56,9 @@ function escapeSlackMrkdwnContent(text: string): string {
}
function escapeSlackMrkdwnText(text: string): string {
if (!text) {
return "";
}
if (!text.includes("&") && !text.includes("<") && !text.includes(">")) {
return text;
}