From dbde1ec02d29f36ecbca3f99bd0985c415058c11 Mon Sep 17 00:00:00 2001 From: Agent Date: Wed, 16 Sep 2026 09:28:03 -0400 Subject: [PATCH] Normalize EVENT_VIEWER_URL trailing slash once in env.ts, remove 6 ad-hoc strips EVENT_VIEWER_URL.replace(/\/$/, '') was duplicated across: - env.ts (BRAND_LOGO, 1x) - server.ts (settingsUrl in confirm routes, 3x) - mailer.ts (settingsUrl in sendConfirm/sendDigest, 2x) Now trailing-slash normalization happens at the export source in env.ts, so all consumers get a clean URL without ad-hoc stripping. --- src/env.ts | 4 ++-- src/mailer.ts | 4 ++-- src/server.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/env.ts b/src/env.ts index 648795a..da16c85 100644 --- a/src/env.ts +++ b/src/env.ts @@ -22,11 +22,11 @@ if (!process.env.BASE_URL) throw new Error('BASE_URL is not defined.') export const MAILSHIP_URL = process.env.MAILSHIP_URL export const MAILSHIP_NAME = process.env.MAILSHIP_NAME export const BASE_URL = process.env.BASE_URL -export const EVENT_VIEWER_URL = process.env.EVENT_VIEWER_URL || 'https://app.flotilla.social' +export const EVENT_VIEWER_URL = (process.env.EVENT_VIEWER_URL || 'https://app.flotilla.social').replace(/\/$/, '') export const BRAND_ACCENT = process.env.BRAND_ACCENT || '#7161FF' export const BRAND_NAME = process.env.BRAND_NAME || 'Flotilla' export const BRAND_LOGO = - process.env.BRAND_LOGO || `${EVENT_VIEWER_URL.replace(/\/$/, '')}/logo.png` + process.env.BRAND_LOGO || `${EVENT_VIEWER_URL}/logo.png` export const appSigner = Nip01Signer.fromSecret(process.env.MAILSHIP_SECRET) export const DEFAULT_RELAYS = process.env.DEFAULT_RELAYS.split(',').map(normalizeRelayUrl) export const INDEXER_RELAYS = process.env.INDEXER_RELAYS.split(',').map(normalizeRelayUrl) diff --git a/src/mailer.ts b/src/mailer.ts index a67b24d..043f2e9 100644 --- a/src/mailer.ts +++ b/src/mailer.ts @@ -29,7 +29,7 @@ const transporter = nodemailer.createTransport({ export const sendConfirm = (sub: Subscription) => { const href = `${BASE_URL}/confirm?token=${sub.key}` - const settingsUrl = `${EVENT_VIEWER_URL.replace(/\/$/, '')}/settings/alerts` + const settingsUrl = `${EVENT_VIEWER_URL}/settings/alerts` return transporter .sendMail({ @@ -86,7 +86,7 @@ export const sendDigest = async (sub: Subscription, variables: Record { diff --git a/src/server.ts b/src/server.ts index 0e9220e..5cdd626 100644 --- a/src/server.ts +++ b/src/server.ts @@ -308,7 +308,7 @@ addRoute('get', '/confirm', async (req: Request, res: Response) => { brandName: BRAND_NAME, brandAccent: BRAND_ACCENT, brandLogo: BRAND_LOGO, - settingsUrl: `${EVENT_VIEWER_URL.replace(/\/$/, '')}/settings/alerts`, + settingsUrl: `${EVENT_VIEWER_URL}/settings/alerts`, }) ) } @@ -320,7 +320,7 @@ addRoute('get', '/confirm', async (req: Request, res: Response) => { brandName: BRAND_NAME, brandAccent: BRAND_ACCENT, brandLogo: BRAND_LOGO, - settingsUrl: `${EVENT_VIEWER_URL.replace(/\/$/, '')}/settings/alerts`, + settingsUrl: `${EVENT_VIEWER_URL}/settings/alerts`, })) } catch (error) { const isActionError = error instanceof ActionError @@ -331,7 +331,7 @@ addRoute('get', '/confirm', async (req: Request, res: Response) => { brandName: BRAND_NAME, brandAccent: BRAND_ACCENT, brandLogo: BRAND_LOGO, - settingsUrl: `${EVENT_VIEWER_URL.replace(/\/$/, '')}/settings/alerts`, + settingsUrl: `${EVENT_VIEWER_URL}/settings/alerts`, })) if (!isActionError) { -- 2.45.2