From 84bf1d73ea29f7616eec13a41af9683cba25da6b Mon Sep 17 00:00:00 2001 From: KimGLee <05_bolster_inkling@icloud.com> Date: Sat, 21 Mar 2026 13:14:05 +0800 Subject: [PATCH] fix(telegram): guard file-ref extension set access for mocked runtimes --- extensions/telegram/src/format.ts | 34 ++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/extensions/telegram/src/format.ts b/extensions/telegram/src/format.ts index 4d14f179b2f..9134ed420e6 100644 --- a/extensions/telegram/src/format.ts +++ b/extensions/telegram/src/format.ts @@ -103,16 +103,23 @@ function escapeRegex(str: string): string { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } -const FILE_EXTENSIONS_PATTERN = Array.from(FILE_REF_EXTENSIONS_WITH_TLD).map(escapeRegex).join("|"); +const FILE_EXTENSIONS_PATTERN = + FILE_REF_EXTENSIONS_WITH_TLD && Symbol.iterator in FILE_REF_EXTENSIONS_WITH_TLD + ? Array.from(FILE_REF_EXTENSIONS_WITH_TLD).map(escapeRegex).join("|") + : ""; const AUTO_LINKED_ANCHOR_PATTERN = /]*>\1<\/a>/gi; -const FILE_REFERENCE_PATTERN = new RegExp( - `(^|[^a-zA-Z0-9_\\-/])([a-zA-Z0-9_.\\-./]+\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=$|[^a-zA-Z0-9_\\-/])`, - "gi", -); -const ORPHANED_TLD_PATTERN = new RegExp( - `([^a-zA-Z0-9]|^)([A-Za-z]\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=[^a-zA-Z0-9/]|$)`, - "g", -); +const FILE_REFERENCE_PATTERN = FILE_EXTENSIONS_PATTERN + ? new RegExp( + `(^|[^a-zA-Z0-9_\\-/])([a-zA-Z0-9_.\\-./]+\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=$|[^a-zA-Z0-9_\\-/])`, + "gi", + ) + : null; +const ORPHANED_TLD_PATTERN = FILE_EXTENSIONS_PATTERN + ? new RegExp( + `([^a-zA-Z0-9]|^)([A-Za-z]\\.(?:${FILE_EXTENSIONS_PATTERN}))(?=[^a-zA-Z0-9/]|$)`, + "g", + ) + : null; const HTML_TAG_PATTERN = /(<\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*?>/gi; function wrapStandaloneFileRef(match: string, prefix: string, filename: string): string { @@ -131,7 +138,14 @@ function wrapSegmentFileRefs( preDepth: number, anchorDepth: number, ): string { - if (!text || codeDepth > 0 || preDepth > 0 || anchorDepth > 0) { + if ( + !text || + !FILE_REFERENCE_PATTERN || + !ORPHANED_TLD_PATTERN || + codeDepth > 0 || + preDepth > 0 || + anchorDepth > 0 + ) { return text; } const wrappedStandalone = text.replace(FILE_REFERENCE_PATTERN, wrapStandaloneFileRef);