From a68326c95aedddeb91deda4eb582f0f6b818103b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 Sep 2023 11:41:48 +0200 Subject: [PATCH 1/3] core-plugin-api: remove the need to declare translation messages as const Signed-off-by: Patrik Oldsberg --- .../TranslationApi/I18nextTranslationApi.test.ts | 4 +++- packages/core-plugin-api/alpha-api-report.md | 2 +- .../src/translation/TranslationMessages.test.ts | 2 +- packages/core-plugin-api/src/translation/TranslationRef.ts | 2 +- plugins/adr/src/translations.ts | 2 +- plugins/user-settings/src/translation.ts | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts index 0605cb6f16..b53a285342 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts @@ -360,7 +360,9 @@ describe('I18nextTranslationApi', () => { await new Promise(resolve => { const subscription = translationApi.translation$(plainRef).subscribe({ next(snapshot) { - const translation = snapshot.ready ? snapshot.t('foo') : null; + const translation = snapshot.ready + ? (snapshot.t('foo') as string) + : null; translations.push(translation); if (translation === 'foo') { diff --git a/packages/core-plugin-api/alpha-api-report.md b/packages/core-plugin-api/alpha-api-report.md index bea27cfa5e..d50bb0abd6 100644 --- a/packages/core-plugin-api/alpha-api-report.md +++ b/packages/core-plugin-api/alpha-api-report.md @@ -41,7 +41,7 @@ export function createTranslationMessages< // @alpha (undocumented) export function createTranslationRef< TId extends string, - TMessages extends { + const TMessages extends { [key in string]: string; }, TTranslations extends { diff --git a/packages/core-plugin-api/src/translation/TranslationMessages.test.ts b/packages/core-plugin-api/src/translation/TranslationMessages.test.ts index 5314c8a054..a4ba376e66 100644 --- a/packages/core-plugin-api/src/translation/TranslationMessages.test.ts +++ b/packages/core-plugin-api/src/translation/TranslationMessages.test.ts @@ -23,7 +23,7 @@ const ref = createTranslationRef({ one: 'one', two: 'two', three: 'three', - } as const, + }, }); describe('createTranslationMessages', () => { diff --git a/packages/core-plugin-api/src/translation/TranslationRef.ts b/packages/core-plugin-api/src/translation/TranslationRef.ts index 9ebf39a423..345a9c3f65 100644 --- a/packages/core-plugin-api/src/translation/TranslationRef.ts +++ b/packages/core-plugin-api/src/translation/TranslationRef.ts @@ -108,7 +108,7 @@ class TranslationRefImpl< /** @alpha */ export function createTranslationRef< TId extends string, - TMessages extends { [key in string]: string }, + const TMessages extends { [key in string]: string }, TTranslations extends { [language in string]: () => Promise<{ default: { [key in keyof TMessages]: string | null }; diff --git a/plugins/adr/src/translations.ts b/plugins/adr/src/translations.ts index 5cef279e66..cc0995f597 100644 --- a/plugins/adr/src/translations.ts +++ b/plugins/adr/src/translations.ts @@ -22,5 +22,5 @@ export const adrTranslationRef = createTranslationRef({ content_header_title: 'Architecture Decision Records', failed_to_fetch: 'Failed to fetch ADRs', no_adrs: 'No ADRs found', - } as const, + }, }); diff --git a/plugins/user-settings/src/translation.ts b/plugins/user-settings/src/translation.ts index 79b817c828..42fd8311e2 100644 --- a/plugins/user-settings/src/translation.ts +++ b/plugins/user-settings/src/translation.ts @@ -30,5 +30,5 @@ export const userSettingsTranslationRef = createTranslationRef({ select_theme: 'Select {{theme}}', select_theme_auto: 'Select Auto Theme', select_lng: 'Select language {{language}}', - } as const, + }, }); From e3f62dc619764ffa18a394815c193fdcefce947d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Sep 2023 20:34:56 +0200 Subject: [PATCH 2/3] avoid as const in TranslationApi tests Signed-off-by: Patrik Oldsberg --- .../TranslationApi/I18nextTranslationApi.test.ts | 14 +++++++------- .../TranslationApi/MockTranslationApi.test.ts | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts index b53a285342..224430752c 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts @@ -383,7 +383,7 @@ describe('I18nextTranslationApi', () => { describe('formatting', () => { function snapshotWithMessages< - TMessages extends { [key in string]: string }, + const TMessages extends { [key in string]: string }, >(messages: TMessages) { const translationApi = I18nextTranslationApi.create({ languageApi: AppLanguageSelector.create(), @@ -400,7 +400,7 @@ describe('I18nextTranslationApi', () => { foo: 'Foo', bar: 'Bar', baz: 'Baz', - } as const); + }); expect(snapshot.t('foo')).toBe('Foo'); expect(snapshot.t('bar')).toBe('Bar'); @@ -412,7 +412,7 @@ describe('I18nextTranslationApi', () => { shallow: 'Foo {{ bar }}', multiple: 'Foo {{ bar }} {{ baz }}', deep: 'Foo {{ bar.baz }}', - } as const); + }); // @ts-expect-error expect(snapshot.t('shallow')).toBe('Foo {{ bar }}'); @@ -441,7 +441,7 @@ describe('I18nextTranslationApi', () => { it('should not escape by default', () => { const snapshot = snapshotWithMessages({ foo: 'Foo {{ foo }}', - } as const); + }); expect(snapshot.t('foo', { replace: { foo: '
' } })).toBe( 'Foo
', @@ -459,7 +459,7 @@ describe('I18nextTranslationApi', () => { foo: 'Foo $t(bar) $t(baz)', bar: 'Nested', baz: 'Baz {{ qux }}', - } as const); + }); expect(snapshot.t('foo', { qux: 'Deep' })).toBe('Foo Nested Baz Deep'); }); @@ -474,7 +474,7 @@ describe('I18nextTranslationApi', () => { relativeSecondsShort: '= {{ x, relativeTime(range: second; style: short) }}', list: '= {{ x, list }}', - } as const); + }); expect(snapshot.t('plain', { replace: { x: '5' } })).toBe('= 5'); expect(snapshot.t('number', { replace: { x: 5 } })).toBe('= 5'); @@ -530,7 +530,7 @@ describe('I18nextTranslationApi', () => { derp_other: 'derps', derpWithCount_one: '{{ count }} derp', derpWithCount_other: '{{ count }} derps', - } as const); + }); expect(snapshot.t('derp', { count: 1 })).toBe('derp'); expect(snapshot.t('derp', { count: 2 })).toBe('derps'); diff --git a/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts b/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts index 45d23d9db2..0cc755ecb5 100644 --- a/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts +++ b/packages/test-utils/src/testUtils/apis/TranslationApi/MockTranslationApi.test.ts @@ -18,9 +18,9 @@ import { createTranslationRef } from '@backstage/core-plugin-api/alpha'; import { MockTranslationApi } from './MockTranslationApi'; describe('MockTranslationApi', () => { - function snapshotWithMessages( - messages: TMessages, - ) { + function snapshotWithMessages< + const TMessages extends { [key in string]: string }, + >(messages: TMessages) { const translationApi = MockTranslationApi.create(); const ref = createTranslationRef({ id: 'test', @@ -50,7 +50,7 @@ describe('MockTranslationApi', () => { shallow: 'Foo {{ bar }}', multiple: 'Foo {{ bar }} {{ baz }}', deep: 'Foo {{ bar.baz }}', - } as const); + }); // @ts-expect-error expect(snapshot.t('shallow')).toBe('Foo {{ bar }}'); @@ -73,7 +73,7 @@ describe('MockTranslationApi', () => { it('should not escape by default', () => { const snapshot = snapshotWithMessages({ foo: 'Foo {{ foo }}', - } as const); + }); expect(snapshot.t('foo', { foo: '
' })).toBe('Foo
'); expect( @@ -89,7 +89,7 @@ describe('MockTranslationApi', () => { foo: 'Foo $t(bar) $t(baz)', bar: 'Nested', baz: 'Baz {{ qux }}', - } as const); + }); expect(snapshot.t('foo', { qux: 'Deep' })).toBe('Foo Nested Baz Deep'); }); @@ -104,7 +104,7 @@ describe('MockTranslationApi', () => { relativeSecondsShort: '= {{ x, relativeTime(range: second; style: short) }}', list: '= {{ x, list }}', - } as const); + }); expect(snapshot.t('plain', { x: '5' })).toBe('= 5'); expect(snapshot.t('number', { x: 5 })).toBe('= 5'); @@ -154,7 +154,7 @@ describe('MockTranslationApi', () => { derp_other: 'derps', derpWithCount_one: '{{ count }} derp', derpWithCount_other: '{{ count }} derps', - } as const); + }); expect(snapshot.t('derp', { count: 1 })).toBe('derp'); expect(snapshot.t('derp', { count: 2 })).toBe('derps'); From 7034eb790efca441588bd8b05561dc1eda1e0f72 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 18 Sep 2023 21:01:12 +0200 Subject: [PATCH 3/3] core-app-api: avoid dependency on core-plugin-api/alpha Signed-off-by: Patrik Oldsberg --- packages/core-app-api/api-report.md | 15 ++++++++++++--- packages/core-app-api/src/app/types.ts | 15 ++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/core-app-api/api-report.md b/packages/core-app-api/api-report.md index bd99874a71..6824dbcf4c 100644 --- a/packages/core-app-api/api-report.md +++ b/packages/core-app-api/api-report.md @@ -64,8 +64,6 @@ import { SessionState } from '@backstage/core-plugin-api'; import { StorageApi } from '@backstage/core-plugin-api'; import { StorageValueSnapshot } from '@backstage/core-plugin-api'; import { SubRouteRef } from '@backstage/core-plugin-api'; -import { TranslationMessages } from '@backstage/core-plugin-api/alpha'; -import { TranslationResource } from '@backstage/core-plugin-api/alpha'; // @public export class AlertApiForwarder implements AlertApi { @@ -225,7 +223,18 @@ export type AppOptions = { __experimentalTranslations?: { defaultLanguage?: string; availableLanguages?: string[]; - resources?: Array; + resources?: Array< + | { + $$type: '@backstage/TranslationResource'; + id: string; + } + | { + $$type: '@backstage/TranslationMessages'; + id: string; + full: boolean; + messages: Record; + } + >; }; }; diff --git a/packages/core-app-api/src/app/types.ts b/packages/core-app-api/src/app/types.ts index f203ce9278..523e35e9cb 100644 --- a/packages/core-app-api/src/app/types.ts +++ b/packages/core-app-api/src/app/types.ts @@ -27,10 +27,6 @@ import { FeatureFlag, } from '@backstage/core-plugin-api'; import { AppConfig } from '@backstage/config'; -import { - TranslationMessages, - TranslationResource, -} from '@backstage/core-plugin-api/alpha'; /** * Props for the `BootErrorPage` component of {@link AppComponents}. @@ -286,7 +282,16 @@ export type AppOptions = { __experimentalTranslations?: { defaultLanguage?: string; availableLanguages?: string[]; - resources?: Array; + resources?: Array< + // Separate declaration for now to avoid dependency on core-plugin-api/alpha and TS 5.0 + | { $$type: '@backstage/TranslationResource'; id: string } + | { + $$type: '@backstage/TranslationMessages'; + id: string; + full: boolean; + messages: Record; + } + >; }; };