From 8f5920b4d335886c9731a90b1af0dee01bb6b495 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 09:49:31 -0300 Subject: [PATCH 1/7] feat(gazzodown): render block fallback for unsupported block types When a block has no dedicated renderer, render its optional `fallback` plain-text node as a paragraph instead of returning null, mirroring the existing inline fallback handling. Lets unsupported blocks degrade to their original markup rather than being dropped. --- .changeset/block-fallback-rendering.md | 5 +++++ packages/gazzodown/src/Markup.tsx | 11 ++++++++++- packages/gazzodown/src/PreviewMarkup.tsx | 8 +++++++- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 .changeset/block-fallback-rendering.md diff --git a/.changeset/block-fallback-rendering.md b/.changeset/block-fallback-rendering.md new file mode 100644 index 0000000000000..f1139ed300ca5 --- /dev/null +++ b/.changeset/block-fallback-rendering.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/gazzodown": patch +--- + +Renders a block's optional `fallback` plain-text representation (as a paragraph) when there is no dedicated renderer for its type, instead of dropping the block. This mirrors the existing inline `fallback` handling and lets unsupported blocks degrade to their original markup rather than disappearing. diff --git a/packages/gazzodown/src/Markup.tsx b/packages/gazzodown/src/Markup.tsx index a789c4beb136d..97afbc8760eb5 100644 --- a/packages/gazzodown/src/Markup.tsx +++ b/packages/gazzodown/src/Markup.tsx @@ -63,8 +63,17 @@ const Markup = ({ tokens }: MarkupProps) => ( case 'LINE_BREAK': return
; - default: + default: { + // Graceful degradation: blocks may carry a `fallback` plain-text + // representation, rendered as a paragraph when there is no + // dedicated renderer for the block type. + const { fallback } = block as { fallback?: MessageParser.Plain }; + if (fallback) { + const inlines: MessageParser.Inlines[] = [fallback]; + return {inlines}; + } return null; + } } })} diff --git a/packages/gazzodown/src/PreviewMarkup.tsx b/packages/gazzodown/src/PreviewMarkup.tsx index 9ec62bfcbfa3f..649eaf20f632b 100644 --- a/packages/gazzodown/src/PreviewMarkup.tsx +++ b/packages/gazzodown/src/PreviewMarkup.tsx @@ -84,8 +84,14 @@ const PreviewMarkup = ({ tokens }: PreviewMarkupProps) => { ); - default: + default: { + const { fallback } = firstBlock as { fallback?: MessageParser.Plain }; + if (fallback) { + const inlines: MessageParser.Inlines[] = [fallback]; + return {inlines}; + } return null; + } } }; From 0f23d99c11b8ec959f951134ce72f3069e3ca235 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 17:01:15 -0300 Subject: [PATCH 2/7] refactor(gazzodown): render block fallback by slicing source offsets Block fallback is now a [start, end] offset span instead of inline text. Markup/PreviewMarkup take an optional `source` prop (the original message text) and slice it to render the raw markup for blocks without a dedicated renderer. --- .changeset/block-fallback-rendering.md | 2 +- packages/gazzodown/src/Markup.tsx | 16 +++++++++------- packages/gazzodown/src/PreviewMarkup.tsx | 10 ++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.changeset/block-fallback-rendering.md b/.changeset/block-fallback-rendering.md index f1139ed300ca5..4b6ef1733355d 100644 --- a/.changeset/block-fallback-rendering.md +++ b/.changeset/block-fallback-rendering.md @@ -2,4 +2,4 @@ "@rocket.chat/gazzodown": patch --- -Renders a block's optional `fallback` plain-text representation (as a paragraph) when there is no dedicated renderer for its type, instead of dropping the block. This mirrors the existing inline `fallback` handling and lets unsupported blocks degrade to their original markup rather than disappearing. +Degrades blocks without a dedicated renderer to their raw markup instead of dropping them. When a block carries a `fallback` `[start, end]` offset span, `Markup`/`PreviewMarkup` slice the original message source (passed via the new optional `source` prop) and render that text. This avoids duplicating the markup into the AST while keeping unsupported blocks visible. diff --git a/packages/gazzodown/src/Markup.tsx b/packages/gazzodown/src/Markup.tsx index 97afbc8760eb5..19722b1902a20 100644 --- a/packages/gazzodown/src/Markup.tsx +++ b/packages/gazzodown/src/Markup.tsx @@ -16,9 +16,11 @@ const KatexBlock = lazy(() => import('./katex/KatexBlock')); type MarkupProps = { tokens: MessageParser.Root; + /** Original message source, used to render the `fallback` of blocks without a dedicated renderer. */ + source?: string; }; -const Markup = ({ tokens }: MarkupProps) => ( +const Markup = ({ tokens, source }: MarkupProps) => ( <> {tokens.map((block, index) => { switch (block.type) { @@ -64,12 +66,12 @@ const Markup = ({ tokens }: MarkupProps) => ( return
; default: { - // Graceful degradation: blocks may carry a `fallback` plain-text - // representation, rendered as a paragraph when there is no - // dedicated renderer for the block type. - const { fallback } = block as { fallback?: MessageParser.Plain }; - if (fallback) { - const inlines: MessageParser.Inlines[] = [fallback]; + // Graceful degradation: blocks may carry a `fallback` [start, end] offset + // span into the source. With no dedicated renderer, slice the source and + // render the raw markup as a paragraph instead of dropping the block. + const { fallback } = block as { fallback?: [number, number] }; + if (fallback && source !== undefined) { + const inlines: MessageParser.Inlines[] = [{ type: 'PLAIN_TEXT', value: source.slice(fallback[0], fallback[1]) }]; return {inlines}; } return null; diff --git a/packages/gazzodown/src/PreviewMarkup.tsx b/packages/gazzodown/src/PreviewMarkup.tsx index 649eaf20f632b..c9d79f57287f6 100644 --- a/packages/gazzodown/src/PreviewMarkup.tsx +++ b/packages/gazzodown/src/PreviewMarkup.tsx @@ -12,9 +12,11 @@ const isOnlyBigEmojiBlock = (tokens: MessageParser.Root): tokens is [MessagePars type PreviewMarkupProps = { tokens: MessageParser.Root; + /** Original message source, used to render the `fallback` of blocks without a dedicated renderer. */ + source?: string; }; -const PreviewMarkup = ({ tokens }: PreviewMarkupProps) => { +const PreviewMarkup = ({ tokens, source }: PreviewMarkupProps) => { if (isOnlyBigEmojiBlock(tokens)) { return ; } @@ -85,9 +87,9 @@ const PreviewMarkup = ({ tokens }: PreviewMarkupProps) => { ); default: { - const { fallback } = firstBlock as { fallback?: MessageParser.Plain }; - if (fallback) { - const inlines: MessageParser.Inlines[] = [fallback]; + const { fallback } = firstBlock as { fallback?: [number, number] }; + if (fallback && source !== undefined) { + const inlines: MessageParser.Inlines[] = [{ type: 'PLAIN_TEXT', value: source.slice(fallback[0], fallback[1]) }]; return {inlines}; } return null; From fc4b2f2ba430f21f0907bef6f2fcaaecf059090a Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 17:11:23 -0300 Subject: [PATCH 3/7] feat(meteor): pass message source to Markup for block fallback Thread the original message text (msg) into MessageContentBody and on to gazzodown's Markup as `source`, so blocks without a dedicated renderer can slice the source to show their raw markup via the parser fallback offsets. --- .changeset/message-content-body-source.md | 5 +++++ .../client/components/message/MessageContentBody.tsx | 6 ++++-- .../message/variants/room/RoomMessageContent.tsx | 1 + .../message/variants/thread/ThreadMessageContent.tsx | 7 ++++++- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 .changeset/message-content-body-source.md diff --git a/.changeset/message-content-body-source.md b/.changeset/message-content-body-source.md new file mode 100644 index 0000000000000..439b1a1d6ada2 --- /dev/null +++ b/.changeset/message-content-body-source.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Passes the original message text to the message renderer so blocks without a dedicated renderer (e.g. tables on clients that don't render them yet) can degrade to their raw markup via the parser's `fallback` source offsets, instead of disappearing. diff --git a/apps/meteor/client/components/message/MessageContentBody.tsx b/apps/meteor/client/components/message/MessageContentBody.tsx index ff0735539a63e..c811643ed6b16 100644 --- a/apps/meteor/client/components/message/MessageContentBody.tsx +++ b/apps/meteor/client/components/message/MessageContentBody.tsx @@ -8,17 +8,19 @@ import type { MessageWithMdEnforced } from '../../lib/parseMessageTextToAstMarkd import GazzodownText from '../GazzodownText'; type MessageContentBodyProps = Pick & { + /** Original source text the `md` was parsed from; used to render the fallback of unsupported blocks. */ + msg?: string; searchText?: string; } & ComponentProps; -const MessageContentBody = ({ mentions, channels, md, searchText, ...props }: MessageContentBodyProps) => { +const MessageContentBody = ({ mentions, channels, md, msg, searchText, ...props }: MessageContentBodyProps) => { const { t } = useTranslation(); return ( }> - + diff --git a/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx b/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx index 1816414cd4bf1..d6d6a6148b26b 100644 --- a/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx +++ b/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx @@ -65,6 +65,7 @@ const RoomMessageContent = ({ message, unread, all, mention, searchText }: RoomM { {!normalizedMessage.blocks?.length && !!normalizedMessage.md?.length && ( <> {(!encrypted || normalizedMessage.e2e === 'done') && ( - + )} )} From c16dcd1908e2ad1c9c2dc8edb4cb73b407ab3f4d Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 17:16:30 -0300 Subject: [PATCH 4/7] fix(meteor): slice block fallback from the exact parsed source Expose mdSource (the translation/E2EE-aware text that md was parsed from) from parseMessageTextToAstMarkdown and pass it as the Markup source, so fallback offsets slice against the right string for translated messages too. --- .../message/variants/room/RoomMessageContent.tsx | 2 +- .../message/variants/thread/ThreadMessageContent.tsx | 2 +- apps/meteor/client/lib/parseMessageTextToAstMarkdown.ts | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx b/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx index d6d6a6148b26b..afc482c40955e 100644 --- a/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx +++ b/apps/meteor/client/components/message/variants/room/RoomMessageContent.tsx @@ -65,7 +65,7 @@ const RoomMessageContent = ({ message, unread, all, mention, searchText }: RoomM { {(!encrypted || normalizedMessage.e2e === 'done') && ( diff --git a/apps/meteor/client/lib/parseMessageTextToAstMarkdown.ts b/apps/meteor/client/lib/parseMessageTextToAstMarkdown.ts index df84785e26351..40c5271605cfc 100644 --- a/apps/meteor/client/lib/parseMessageTextToAstMarkdown.ts +++ b/apps/meteor/client/lib/parseMessageTextToAstMarkdown.ts @@ -18,7 +18,10 @@ type WithRequiredProperty = Omit & { }; export type MessageWithMdEnforced = IMessage & Partial> = - WithRequiredProperty; + WithRequiredProperty & { + /** The exact source text `md` was parsed from (translation-aware), so its `fallback` offsets can be sliced. */ + mdSource?: string; + }; /** * Removes null values for known properties values. * Adds a property `md` to the message with the parsed message if is not provided. @@ -46,6 +49,9 @@ export const parseMessageTextToAstMarkdown = < return { ...msg, md: isE2EEMessage(message) || translated ? textToMessageToken(text, parseOptions) : (msg.md ?? textToMessageToken(text, parseOptions)), + // `text` is the exact string `md` was parsed from (translation/E2EE-aware, and equal to + // `msg.msg` otherwise), so block `fallback` offsets slice against the right source. + mdSource: text, ...(msg.attachments && { attachments: parseMessageAttachments(msg.attachments, parseOptions, { autoTranslateLanguage, translated }), }), From 20273e30c8187fe38bade03597e123dca4510c69 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 22:51:22 -0300 Subject: [PATCH 5/7] refactor(gazzodown): normalize block fallback handling to offset form Type the block fallback as the union of the new offset span and the original form, and narrow with Array.isArray before slicing the source. The non-array (original) form is intentionally ignored. --- packages/gazzodown/src/Markup.tsx | 10 +++++----- packages/gazzodown/src/PreviewMarkup.tsx | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/gazzodown/src/Markup.tsx b/packages/gazzodown/src/Markup.tsx index 19722b1902a20..1f7b6d64e1d05 100644 --- a/packages/gazzodown/src/Markup.tsx +++ b/packages/gazzodown/src/Markup.tsx @@ -66,11 +66,11 @@ const Markup = ({ tokens, source }: MarkupProps) => ( return
; default: { - // Graceful degradation: blocks may carry a `fallback` [start, end] offset - // span into the source. With no dedicated renderer, slice the source and - // render the raw markup as a paragraph instead of dropping the block. - const { fallback } = block as { fallback?: [number, number] }; - if (fallback && source !== undefined) { + // Graceful degradation: blocks may carry a `fallback`. The current form is a + // `[start, end]` offset span into the source (sliced to render the raw markup); + // the union keeps the original form too, which we intentionally ignore. + const { fallback } = block as { fallback?: [number, number] | MessageParser.Plain }; + if (Array.isArray(fallback) && source !== undefined) { const inlines: MessageParser.Inlines[] = [{ type: 'PLAIN_TEXT', value: source.slice(fallback[0], fallback[1]) }]; return {inlines}; } diff --git a/packages/gazzodown/src/PreviewMarkup.tsx b/packages/gazzodown/src/PreviewMarkup.tsx index c9d79f57287f6..1544924146fda 100644 --- a/packages/gazzodown/src/PreviewMarkup.tsx +++ b/packages/gazzodown/src/PreviewMarkup.tsx @@ -87,8 +87,10 @@ const PreviewMarkup = ({ tokens, source }: PreviewMarkupProps) => { ); default: { - const { fallback } = firstBlock as { fallback?: [number, number] }; - if (fallback && source !== undefined) { + // Only the `[start, end]` offset form is rendered (sliced from source); the union + // keeps the original fallback form too, which we intentionally ignore. + const { fallback } = firstBlock as { fallback?: [number, number] | MessageParser.Plain }; + if (Array.isArray(fallback) && source !== undefined) { const inlines: MessageParser.Inlines[] = [{ type: 'PLAIN_TEXT', value: source.slice(fallback[0], fallback[1]) }]; return {inlines}; } From d093b62a7681a986afa0312827745e227498e4c1 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 30 Jun 2026 22:58:32 -0300 Subject: [PATCH 6/7] refactor(message-parser): timestamp fallback as source offsets Emit the Timestamp `fallback` as a [start, end] source-offset span (via the grammar's range()), matching the other blocks. The field type keeps the previous `Plain` form so already-persisted data still type-checks and is ignored at render time. --- .changeset/timestamp-fallback-offsets.md | 5 ++ packages/message-parser/src/definitions.ts | 9 ++- packages/message-parser/src/grammar.pegjs | 2 +- packages/message-parser/src/utils.ts | 5 +- .../message-parser/tests/timestamp.test.ts | 58 +++++++++++-------- 5 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 .changeset/timestamp-fallback-offsets.md diff --git a/.changeset/timestamp-fallback-offsets.md b/.changeset/timestamp-fallback-offsets.md new file mode 100644 index 0000000000000..59bf60364fbff --- /dev/null +++ b/.changeset/timestamp-fallback-offsets.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/message-parser": minor +--- + +Normalizes the `Timestamp` node's `fallback` to the same `[start, end]` source-offset span used by other blocks, instead of a reconstructed plain-text node. The type still allows the previous `Plain` form so already-persisted data keeps type-checking and is safely ignored at render time. diff --git a/packages/message-parser/src/definitions.ts b/packages/message-parser/src/definitions.ts index fdc7179b7c6b7..16e3cda127fd8 100644 --- a/packages/message-parser/src/definitions.ts +++ b/packages/message-parser/src/definitions.ts @@ -118,6 +118,11 @@ export type Plain = { value: string; }; +// [start, end] offsets into the original parsed source. Consumers that don't +// implement a renderer for a node can slice the source to show the raw markup, +// without duplicating the text into the AST. +export type SourceRange = [number, number]; + export type LineBreak = { type: 'LINE_BREAK'; value: undefined; @@ -170,7 +175,9 @@ export type Timestamp = { timestamp: string; format: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'; }; - fallback?: Plain; + // New form is a `[start, end]` offset span; the `Plain` form is kept in the + // type only to tolerate previously-persisted data at runtime. + fallback?: SourceRange | Plain; }; export type Types = { diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 871c661e51a48..b81b0f79fcaf7 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -109,7 +109,7 @@ ISO8601Date = year:$(Digit |4|) "-" month:$(Digit |2|) "-" day:$(Digit |2|) "T" ISO8601DateWithoutMilliseconds = year:$(Digit |4|) "-" month:$(Digit |2|) "-" day:$(Digit |2|) "T" hours:$(Digit |2|) ":" minutes:$(Digit |2|) ":" seconds:$(Digit |2|) tz:Timezone? { return timestampFromIsoTime({ year, month, day, hours, minutes, seconds, timezone: tz }); } -TimestampRules = "" { return timestamp(date, format); } / "" { return timestamp(date); } +TimestampRules = "" { return timestamp(date, format, [range().start, range().end]); } / "" { return timestamp(date, undefined, [range().start, range().end]); } /** * diff --git a/packages/message-parser/src/utils.ts b/packages/message-parser/src/utils.ts index 9ac83ec8c9001..5504c123ffdbf 100644 --- a/packages/message-parser/src/utils.ts +++ b/packages/message-parser/src/utils.ts @@ -17,6 +17,7 @@ import type { InlineKaTeX, Link, Timestamp, + SourceRange, } from './definitions'; const generate = @@ -287,14 +288,14 @@ export const phoneChecker = (text: string, number: string) => { return link(`tel:${number}`, [plain(text)]); }; -export const timestamp = (value: string, type?: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R'): Timestamp => { +export const timestamp = (value: string, type?: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R', fallback?: SourceRange): Timestamp => { return { type: 'TIMESTAMP', value: { timestamp: value, format: type || 't', }, - fallback: plain(``), + ...(fallback !== undefined && { fallback }), }; }; diff --git a/packages/message-parser/tests/timestamp.test.ts b/packages/message-parser/tests/timestamp.test.ts index 63c1cd1a9fc26..6e6eab6ccab32 100644 --- a/packages/message-parser/tests/timestamp.test.ts +++ b/packages/message-parser/tests/timestamp.test.ts @@ -8,21 +8,29 @@ const bold = (value: Array>) => ({ type: 'BOLD' as const const strike = (value: Array>) => ({ type: 'STRIKE' as const, value }); -const timestampNode = (value: string, format: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R' = 't') => ({ +// `fallback` is the [start, end] offset span of the raw `` in the source. +const timestampNode = (value: string, format: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R' = 't', fallback?: [number, number]) => ({ type: 'TIMESTAMP' as const, value: { timestamp: value, format, }, - fallback: plain(``), + ...(fallback !== undefined ? { fallback } : {}), }); +const spanOf = (input: string, raw: string): [number, number] => { + const start = input.indexOf(raw); + return [start, start + raw.length]; +}; + test.each([ - [``, [paragraph([timestampNode('1708551317')])]], - [``, [paragraph([timestampNode('1708551317', 'R')])]], - ['hello ', [paragraph([plain('hello '), timestampNode('1708551317')])]], -])('parses %p', (input, output) => { - expect(parse(input)).toEqual(output); + ['', '', '1708551317', 't' as const], + ['', '', '1708551317', 'R' as const], + ['hello ', '', '1708551317', 't' as const], +])('parses %p', (input, raw, value, format) => { + const node = timestampNode(value, format, spanOf(input, raw)); + const prefix = input.slice(0, input.indexOf(raw)); + expect(parse(input)).toEqual([paragraph(prefix ? [plain(prefix), node] : [node])]); }); test.each([ @@ -33,20 +41,21 @@ test.each([ }); test.each([ - ['~~', [paragraph([strike([timestampNode('1708551317')])])]], - ['~~', [paragraph([strike([timestampNode('1708551317', 'R')])])]], - ['**', [paragraph([bold([timestampNode('1708551317')])])]], -])('parses %p', (input, output) => { - expect(parse(input)).toEqual(output); + ['~~', '', '1708551317', 't' as const, strike], + ['~~', '', '1708551317', 'R' as const, strike], + ['**', '', '1708551317', 't' as const, bold], +])('parses %p', (input, raw, value, format, wrapper) => { + const node = timestampNode(value, format, spanOf(input, raw)); + expect(parse(input)).toEqual([paragraph([wrapper([node])])]); }); test.each([ - ['', [paragraph([timestampNode('1753178400', 'R')])]], - ['', [paragraph([timestampNode('1753178400', 'R')])]], - - ['', [paragraph([timestampNode('1753388398', 'R')])]], -])('parses %p', (input, output) => { - expect(parse(input)).toEqual(output); + ['', '1753178400', 'R' as const], + ['', '1753178400', 'R' as const], + ['', '1753388398', 'R' as const], +])('parses %p', (input, value, format) => { + const node = timestampNode(value, format, [0, input.length]); + expect(parse(input)).toEqual([paragraph([node])]); }); describe('relative hour timestamp parsing', () => { @@ -60,11 +69,12 @@ describe('relative hour timestamp parsing', () => { }); test.each([ - ['', [paragraph([timestampNode('1753178400', 'R')])]], - ['', [paragraph([timestampNode('1753178400', 'R')])]], - ['', [paragraph([timestampNode('1753178405')])]], - ['', [paragraph([timestampNode('1753178400')])]], - ])('parses %p', (input, output) => { - expect(parse(input)).toEqual(output); + ['', '1753178400', 'R' as const], + ['', '1753178400', 'R' as const], + ['', '1753178405', 't' as const], + ['', '1753178400', 't' as const], + ])('parses %p', (input, value, format) => { + const node = timestampNode(value, format, [0, input.length]); + expect(parse(input)).toEqual([paragraph([node])]); }); }); From a2f28661d11c3c62ff0a77851a69a1394204f255 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Wed, 1 Jul 2026 00:13:12 -0300 Subject: [PATCH 7/7] test(meteor): assert mdSource in parseMessageTextToAstMarkdown output The function now returns mdSource; update the full-object toStrictEqual assertions for translated messages to include it. --- apps/meteor/client/lib/parseMessageTextToAstMarkdown.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/meteor/client/lib/parseMessageTextToAstMarkdown.spec.ts b/apps/meteor/client/lib/parseMessageTextToAstMarkdown.spec.ts index e48eb15f885cf..77a632b7d74bf 100644 --- a/apps/meteor/client/lib/parseMessageTextToAstMarkdown.spec.ts +++ b/apps/meteor/client/lib/parseMessageTextToAstMarkdown.spec.ts @@ -192,6 +192,7 @@ describe('parseMessageTextToAstMarkdown', () => { const attachmentTranslatedMessageParsed = { ...translatedMessage, md: translatedMessageParsed, + mdSource: 'message translated', attachments: [ { description: 'description', @@ -233,6 +234,7 @@ describe('parseMessageTextToAstMarkdown', () => { const attachmentTranslatedMessageParsed = { ...translatedMessage, md: translatedMessageParsed, + mdSource: 'message translated', attachments: [ { text: 'text', @@ -275,6 +277,7 @@ describe('parseMessageTextToAstMarkdown', () => { const attachmentTranslatedMessageParsed = { ...translatedMessage, md: translatedMessageParsed, + mdSource: 'message translated', attachments: [ { text: 'text',