From bc6fcd1dd8e3b3b49b7b10c314640f74da5fac5d Mon Sep 17 00:00:00 2001 From: Wesley Finck Date: Thu, 6 Nov 2025 14:25:14 -0500 Subject: [PATCH] feat: add trailing slash only for bare root URLs without paths or parameters Co-authored-by: aider (anthropic/claude-sonnet-4-20250514) --- src/modules/cards/domain/value-objects/URL.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/modules/cards/domain/value-objects/URL.ts b/src/modules/cards/domain/value-objects/URL.ts index 2307012b..772ee098 100644 --- a/src/modules/cards/domain/value-objects/URL.ts +++ b/src/modules/cards/domain/value-objects/URL.ts @@ -30,8 +30,21 @@ export class URL extends ValueObject { try { // Validate URL format using the global URL constructor - new globalThis.URL(trimmedUrl); - return ok(new URL({ value: trimmedUrl })); + const parsedUrl = new globalThis.URL(trimmedUrl); + + // Add trailing slash only to truly bare root URLs + // (no path, no query parameters, no fragments) + let normalizedUrl = trimmedUrl; + if ( + (parsedUrl.pathname === '' || parsedUrl.pathname === '/') && + parsedUrl.search === '' && + parsedUrl.hash === '' && + !trimmedUrl.endsWith('/') + ) { + normalizedUrl = trimmedUrl + '/'; + } + + return ok(new URL({ value: normalizedUrl })); } catch (error) { return err(new InvalidURLError('Invalid URL format')); } -- 2.51.2