diff --git a/packages/ui/package.json b/packages/ui/package.json index f1cb68d..efa6b0f 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -16,8 +16,7 @@ "lint": "biome lint .", "format": "biome format --write .", "typecheck": "tsc --noEmit", - "test": "vitest run --passWithNoTests", - "test:watch": "vitest", + "test": "vitest --passWithNoTests", "test:ci": "vitest run --passWithNoTests" }, "devDependencies": { diff --git a/packages/utils/src/__tests__/storage.test.ts b/packages/utils/src/__tests__/storage.test.ts index 2ab74a9..ddfb42d 100644 --- a/packages/utils/src/__tests__/storage.test.ts +++ b/packages/utils/src/__tests__/storage.test.ts @@ -8,15 +8,12 @@ const ORIGINAL_ENV = process.env.NODE_ENV; describe('storage utils', () => { function ensureWindowWithLocalStorage() { - // Ensure a Window-like global for Node environment if (typeof window === 'undefined') { Object.defineProperty(globalThis, 'window', { - // unknown avoids explicit any; cast to Window shape for tests value: {} as unknown as Window & typeof globalThis, configurable: true }); } - // Polyfill localStorage if missing if (!('localStorage' in window)) { const store = new Map(); Object.defineProperty(window, 'localStorage', { @@ -35,7 +32,7 @@ describe('storage utils', () => { } beforeEach(() => { - // Ensure clean slate + ensureWindowWithLocalStorage(); try { window.localStorage.removeItem(KEY); } catch { @@ -53,14 +50,12 @@ describe('storage utils', () => { }); it('SSR/test guard disables storage (returns fallback in test env)', () => { - // In vitest, NODE_ENV is "test" by default. Verify guard path returns fallback. window.localStorage.setItem(KEY, JSON.stringify({ value: 123 })); const result = loadFromStorage(KEY, { value: 999 }); expect(result).toEqual({ value: 999 }); }); it('Malformed JSON returns fallback', () => { - // Enable storage access by switching to a non-test env for this test process.env.NODE_ENV = 'development'; ensureWindowWithLocalStorage(); window.localStorage.setItem(KEY, '{not json'); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index e3de15e..176d12f 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -2,5 +2,3 @@ export { cn } from './cn'; export type { Todo, TodoFilter, TodoStore } from './types'; export { loadFromStorage, saveToStorage, removeFromStorage } from './storage'; export type { StorageLike } from './storage'; -// Re-export type for validator usage in tests and apps -export type { } from './storage'; diff --git a/packages/utils/src/storage.ts b/packages/utils/src/storage.ts index 9778326..0d7515b 100644 --- a/packages/utils/src/storage.ts +++ b/packages/utils/src/storage.ts @@ -18,16 +18,14 @@ function getStorage(): StorageLike | null { } } -export function loadFromStorage(key: string, fallback: T): T; -export function loadFromStorage(key: string, fallback: T, validate: (value: unknown) => value is T | boolean): T; -export function loadFromStorage(key: string, fallback: T, validate?: (value: unknown) => value is T | boolean): T { +export function loadFromStorage(key: string, fallback: T, validate?: (value: unknown) => value is T): T { const storage = getStorage(); if (!storage) return fallback; try { const raw = storage.getItem(key); if (!raw) return fallback; const parsed = JSON.parse(raw) as unknown; - if (validate && !validate(parsed)) return fallback; // Add optional validation guard + if (validate && !validate(parsed)) return fallback; return parsed as T; } catch { return fallback; diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts index d88b63c..0a5d623 100644 --- a/packages/utils/vitest.config.ts +++ b/packages/utils/vitest.config.ts @@ -2,15 +2,6 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - // Default to jsdom for React + DOM/localStorage tests - environment: 'jsdom', - - // Optional: run Node env for server-only utils tests - environmentMatchGlobs: [ - ['packages/utils/**', 'node'], - ], - - // Optional (we already import from 'vitest') - // globals: true, - }, -}); \ No newline at end of file + environment: 'jsdom' + } +});