From 499196b0f623e022fcd335b173e939dc59d2d538 Mon Sep 17 00:00:00 2001 From: Yiannis <1515939+styiannis@users.noreply.github.com> Date: Wed, 11 Mar 2026 02:31:07 +0200 Subject: [PATCH] chore(frontend): harden settings parsing and update store imports --- frontend/src/static/js/utils/settings/pages.ts | 5 +++-- frontend/src/static/js/utils/settings/taxonomies.ts | 5 +++-- frontend/src/static/js/utils/stores/PageStore.js | 2 +- .../src/static/js/utils/stores/PlaylistPageStore.js | 2 +- .../src/static/js/utils/stores/ProfilePageStore.js | 2 +- .../src/static/js/utils/stores/SearchFieldStore.js | 2 +- .../src/static/js/utils/stores/VideoViewerStore.js | 2 +- frontend/src/static/js/utils/stores/index.ts | 2 +- frontend/tests/utils/settings/pages.test.ts | 12 ++++++++++++ frontend/tests/utils/settings/taxonomies.test.ts | 10 ++++++++++ 10 files changed, 34 insertions(+), 10 deletions(-) diff --git a/frontend/src/static/js/utils/settings/pages.ts b/frontend/src/static/js/utils/settings/pages.ts index 85bb3eea..49a685ca 100755 --- a/frontend/src/static/js/utils/settings/pages.ts +++ b/frontend/src/static/js/utils/settings/pages.ts @@ -21,8 +21,9 @@ export function pagesConfig( ret[key].enabled = settings[key]?.enabled === false ? false : true; - if (settings[key]?.title !== undefined) { - ret[key].title = settings[key].title.trim(); + const title = settings[key]?.title; + if (typeof title === 'string') { + ret[key].title = title.trim(); } } diff --git a/frontend/src/static/js/utils/settings/taxonomies.ts b/frontend/src/static/js/utils/settings/taxonomies.ts index be8332ca..5d66dc13 100755 --- a/frontend/src/static/js/utils/settings/taxonomies.ts +++ b/frontend/src/static/js/utils/settings/taxonomies.ts @@ -16,8 +16,9 @@ export function taxonomiesConfig(settings?: DeepPartial { expect(cfg.recommended.title).toBe('Recommended'); }); + test('Ignores non-string titles and keeps defaults', () => { + const cfg = pagesConfig({ + latest: { title: null as any }, + featured: { title: 123 as any }, + recommended: { title: true as any }, + }); + + expect(cfg.latest.title).toBe('Recent uploads'); + expect(cfg.featured.title).toBe('Featured'); + expect(cfg.recommended.title).toBe('Recommended'); + }); + test('Ignores unknown keys in settings', () => { const cfg = pagesConfig({ // @ts-ignore diff --git a/frontend/tests/utils/settings/taxonomies.test.ts b/frontend/tests/utils/settings/taxonomies.test.ts index 18f6d219..44995ac3 100644 --- a/frontend/tests/utils/settings/taxonomies.test.ts +++ b/frontend/tests/utils/settings/taxonomies.test.ts @@ -30,6 +30,16 @@ describe('utils/settings', () => { expect(res.tags).toStrictEqual({ enabled: true, title: 'My Tags' }); }); + test('Should ignore non-string title values and keep defaults', () => { + const res = taxonomiesConfig({ + tags: { title: null as any }, + categories: { title: 123 as any }, + }); + + expect(res.tags).toStrictEqual({ enabled: true, title: 'Tags' }); + expect(res.categories).toStrictEqual({ enabled: true, title: 'Categories' }); + }); + test('Should ignore unknown taxonomy keys', () => { const input = { unknownKey: { enabled: true, title: 'X' },