From da16556c586e99d33907ccf127beee5694cf80d1 Mon Sep 17 00:00:00 2001 From: sonarly-bot Date: Wed, 13 May 2026 03:21:43 +0000 Subject: [PATCH] fix: avoid Lingui uncompiled-message warnings in metadata ti Authored via Sonarly Slack mention (run 42732). --- .../resolve-page-layout-tab-title.util.spec.ts | 16 ++++++++++++++++ .../utils/resolve-page-layout-tab-title.util.ts | 9 +++++++++ ...resolve-page-layout-widget-title.util.spec.ts | 16 ++++++++++++++++ .../resolve-page-layout-widget-title.util.ts | 9 +++++++++ packages/twenty-server/src/instrument.ts | 12 ++++++++++++ 5 files changed, 62 insertions(+) diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/__tests__/resolve-page-layout-tab-title.util.spec.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/__tests__/resolve-page-layout-tab-title.util.spec.ts index 9dd1b243b3d..11c859e3f21 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/__tests__/resolve-page-layout-tab-title.util.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/__tests__/resolve-page-layout-tab-title.util.spec.ts @@ -53,6 +53,22 @@ describe('resolvePageLayoutTabTitle', () => { expect(result).toBe('My Custom Tab'); }); + it('should return original title without translating when message is not compiled', () => { + mockGenerateMessageId.mockReturnValue('missing-translation'); + mockI18n.messages = {}; + + const result = resolvePageLayoutTabTitle({ + title: 'My Custom Tab', + applicationId: STANDARD_APPLICATION_ID, + twentyStandardApplicationId: STANDARD_APPLICATION_ID, + i18nInstance: mockI18n, + }); + + expect(mockGenerateMessageId).toHaveBeenCalledWith('My Custom Tab'); + expect(mockI18n._).not.toHaveBeenCalled(); + expect(result).toBe('My Custom Tab'); + }); + it('should return original title for empty string', () => { mockGenerateMessageId.mockReturnValue('empty-hash'); mockI18n._.mockReturnValue('empty-hash'); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/resolve-page-layout-tab-title.util.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/resolve-page-layout-tab-title.util.ts index 3cb698dcc31..36c90c269ff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/resolve-page-layout-tab-title.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/utils/resolve-page-layout-tab-title.util.ts @@ -27,6 +27,15 @@ export const resolvePageLayoutTabTitle = ({ } const messageId = generateMessageId(title); + + const isMessageCompiled = + !isDefined(i18nInstance.messages) || + isDefined(i18nInstance.messages[messageId]); + + if (!isMessageCompiled) { + return title; + } + const translatedMessage = i18nInstance._(messageId); if (translatedMessage === messageId) { diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/__tests__/resolve-page-layout-widget-title.util.spec.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/__tests__/resolve-page-layout-widget-title.util.spec.ts index 18a781b437f..25f17faf10d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/__tests__/resolve-page-layout-widget-title.util.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/__tests__/resolve-page-layout-widget-title.util.spec.ts @@ -53,6 +53,22 @@ describe('resolvePageLayoutWidgetTitle', () => { expect(result).toBe('My Custom Widget'); }); + it('should return original title without translating when message is not compiled', () => { + mockGenerateMessageId.mockReturnValue('missing-translation'); + mockI18n.messages = {}; + + const result = resolvePageLayoutWidgetTitle({ + title: 'My Custom Widget', + applicationId: STANDARD_APPLICATION_ID, + twentyStandardApplicationId: STANDARD_APPLICATION_ID, + i18nInstance: mockI18n, + }); + + expect(mockGenerateMessageId).toHaveBeenCalledWith('My Custom Widget'); + expect(mockI18n._).not.toHaveBeenCalled(); + expect(result).toBe('My Custom Widget'); + }); + it('should return original title for empty string', () => { mockGenerateMessageId.mockReturnValue('empty-hash'); mockI18n._.mockReturnValue('empty-hash'); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/resolve-page-layout-widget-title.util.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/resolve-page-layout-widget-title.util.ts index 01148028c28..8c57dbf2cba 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/resolve-page-layout-widget-title.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/utils/resolve-page-layout-widget-title.util.ts @@ -27,6 +27,15 @@ export const resolvePageLayoutWidgetTitle = ({ } const messageId = generateMessageId(title); + + const isMessageCompiled = + !isDefined(i18nInstance.messages) || + isDefined(i18nInstance.messages[messageId]); + + if (!isMessageCompiled) { + return title; + } + const translatedMessage = i18nInstance._(messageId); if (translatedMessage === messageId) { diff --git a/packages/twenty-server/src/instrument.ts b/packages/twenty-server/src/instrument.ts index bcdb07da45c..63a5d4e345d 100644 --- a/packages/twenty-server/src/instrument.ts +++ b/packages/twenty-server/src/instrument.ts @@ -68,6 +68,18 @@ if (process.env.EXCEPTION_HANDLER_DRIVER === ExceptionHandlerDriver.SENTRY) { return span; }, + beforeBreadcrumb: (breadcrumb) => { + const isLinguiUncompiledWarning = + breadcrumb.category === 'console' && + breadcrumb.level === 'warning' && + breadcrumb.message?.startsWith('Uncompiled message detected! Message:'); + + if (isLinguiUncompiledWarning) { + return null; + } + + return breadcrumb; + }, }); }