From cb568597dc90caa352847de5f35989983abf17ef Mon Sep 17 00:00:00 2001 From: Keith Solomon Date: Sat, 16 May 2026 15:23:40 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix:=20Update=20config=20file=20?= =?UTF-8?q?handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/config.ts | 11 ++++++++++- tests/config.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/config/config.ts b/src/config/config.ts index 6235ed7..d52cc12 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -111,12 +111,21 @@ function camelize(value: unknown): unknown { return value; } +function objectFromNull(value: unknown): unknown { + return value === null ? {} : value; +} + export function expandHome(path: string): string { return path.startsWith('~/') ? resolve(homedir(), path.slice(2)) : path; } export function loadConfigFromString(source: string): AppConfig { - const parsed = camelize(YAML.parse(source) ?? {}); + const parsed = camelize(YAML.parse(source) ?? {}) as Record; + parsed.newsletters = objectFromNull(parsed.newsletters); + parsed.categories = objectFromNull(parsed.categories) as Record; + if (parsed.categories && typeof parsed.categories === 'object') { + parsed.categories.llm = objectFromNull(parsed.categories.llm); + } return configSchema.parse(parsed); } diff --git a/tests/config.test.ts b/tests/config.test.ts index 8147e73..bbdc427 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -19,6 +19,28 @@ output: expect(config.enrichment.concurrency).toBe(3); }); + it('treats comment-only YAML maps as empty objects', () => { + const config = loadConfigFromString(` +gmail: + folder: Newsletters +output: + name: Newsletter Link Catalog + excel: + enabled: true + path: ./output/catalog.xlsx +newsletters: + # sender@example.com: +categories: + custom: + - Rust + llm: + # provider: anthropic +`); + + expect(config.newsletters).toEqual({}); + expect(config.categories.llm.provider).toBe('anthropic'); + }); + it('rejects conflicting relative and absolute date filters', () => { expect(() => validateDateFilters({ last: '30d', from: '2026-01-01' })).toThrow( /cannot be combined/i