From fabdefcd8318de670e7053af8b5c7a280d4f516a Mon Sep 17 00:00:00 2001 From: rzzf Date: Sat, 14 Feb 2026 18:15:46 +0800 Subject: [PATCH 1/4] fix: prevent duplicate items in column selection --- app/composables/usePreferencesProvider.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/composables/usePreferencesProvider.ts b/app/composables/usePreferencesProvider.ts index 305545540..06955aeab 100644 --- a/app/composables/usePreferencesProvider.ts +++ b/app/composables/usePreferencesProvider.ts @@ -1,4 +1,4 @@ -import { defu } from 'defu' +import { createDefu } from 'defu' /** * Abstraction for preferences storage @@ -13,6 +13,13 @@ interface StorageProvider { remove: () => void } +const defu = createDefu((object, key, value) => { + if (Array.isArray(object[key]) && Array.isArray(value)) { + object[key] = value + return true + } +}) + /** * Creates a localStorage-based storage provider */ From a01c3b5d0f99300910c65d8f6dcad6a0b81e3186 Mon Sep 17 00:00:00 2001 From: rzzf Date: Sun, 15 Feb 2026 00:10:31 +0800 Subject: [PATCH 2/4] test: add use-preferences-provider tests --- .../use-preferences-provider.spec.ts | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 test/nuxt/composables/use-preferences-provider.spec.ts diff --git a/test/nuxt/composables/use-preferences-provider.spec.ts b/test/nuxt/composables/use-preferences-provider.spec.ts new file mode 100644 index 000000000..09d6e4bab --- /dev/null +++ b/test/nuxt/composables/use-preferences-provider.spec.ts @@ -0,0 +1,63 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import { defineComponent } from 'vue' +import { mount } from '@vue/test-utils' +import { usePreferencesProvider } from '../../../app/composables/usePreferencesProvider' + +const STORAGE_KEY = 'npmx-list-prefs' + +function mountWithSetup(run: () => void) { + return mount( + defineComponent({ + name: 'TestHarness', + setup() { + run() + return () => null + }, + }), + { attachTo: document.body }, + ) +} + +function setLocalStorage(stored: Record) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(stored)) +} + +describe('usePreferencesProvider', () => { + beforeEach(() => { + localStorage.clear() + }) + + it('initializes with default values when storage is empty', () => { + mountWithSetup(() => { + const defaults = { theme: 'light', cols: ['name', 'version'] } + const { data } = usePreferencesProvider(defaults) + onMounted(() => { + expect(data.value).toEqual(defaults) + }) + }) + }) + + it('loads values from localStorage', () => { + mountWithSetup(() => { + const defaults = { theme: 'light' } + const stored = { theme: 'dark' } + setLocalStorage(stored) + const { data } = usePreferencesProvider(defaults) + onMounted(() => { + expect(data.value).toEqual(stored) + }) + }) + }) + + it('handles array merging by replacement (preventing duplicates)', () => { + mountWithSetup(() => { + const defaults = { cols: ['name', 'version', 'date'] } + const stored = { cols: ['name', 'version'] } + setLocalStorage(stored) + const { data } = usePreferencesProvider(defaults) + onMounted(() => { + expect(data.value.cols).toEqual(['name', 'version']) + }) + }) + }) +}) From 82f727e60c93bae7d4b9435c0843f93ba0903f4d Mon Sep 17 00:00:00 2001 From: rzzf Date: Sun, 15 Feb 2026 00:15:11 +0800 Subject: [PATCH 3/4] chore: apply coderabbit suggest Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- test/nuxt/composables/use-preferences-provider.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nuxt/composables/use-preferences-provider.spec.ts b/test/nuxt/composables/use-preferences-provider.spec.ts index 09d6e4bab..525feef69 100644 --- a/test/nuxt/composables/use-preferences-provider.spec.ts +++ b/test/nuxt/composables/use-preferences-provider.spec.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeEach } from 'vitest' -import { defineComponent } from 'vue' +import { defineComponent, onMounted } from 'vue' import { mount } from '@vue/test-utils' import { usePreferencesProvider } from '../../../app/composables/usePreferencesProvider' From 40c67fe74d9fd30e4d2d5b61be839a1e69df2f2a Mon Sep 17 00:00:00 2001 From: rzzf Date: Sun, 15 Feb 2026 00:58:07 +0800 Subject: [PATCH 4/4] test: update name --- test/nuxt/composables/use-preferences-provider.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nuxt/composables/use-preferences-provider.spec.ts b/test/nuxt/composables/use-preferences-provider.spec.ts index 525feef69..21d06e9af 100644 --- a/test/nuxt/composables/use-preferences-provider.spec.ts +++ b/test/nuxt/composables/use-preferences-provider.spec.ts @@ -49,7 +49,7 @@ describe('usePreferencesProvider', () => { }) }) - it('handles array merging by replacement (preventing duplicates)', () => { + it('handles array merging by replacement', () => { mountWithSetup(() => { const defaults = { cols: ['name', 'version', 'date'] } const stored = { cols: ['name', 'version'] }