diff --git a/packages/core/src/utils/errors.test.ts b/packages/core/src/utils/errors.test.ts index b4e07718965..f56d2088971 100644 --- a/packages/core/src/utils/errors.test.ts +++ b/packages/core/src/utils/errors.test.ts @@ -47,6 +47,30 @@ describe('getErrorMessage', () => { }; expect(getErrorMessage(error)).toBe('Bad Request Message'); }); + + it('should remove a trailing period from URLs in error messages', () => { + const error = new Error('Migrate to https://antigravity.google.'); + + expect(getErrorMessage(error)).toBe( + 'Migrate to https://antigravity.google', + ); + }); + + it('should preserve periods that do not trail a URL', () => { + expect(getErrorMessage(new Error('Authentication failed.'))).toBe( + 'Authentication failed.', + ); + }); + + it.each([null, undefined])( + 'should handle an Error with a nullish message', + (message) => { + const error = new Error('original'); + Object.defineProperty(error, 'message', { value: message }); + + expect(getErrorMessage(error)).toBe(''); + }, + ); }); describe('isAbortError', () => { diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index ca3637a358c..8e9b0a4de2b 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -33,10 +33,16 @@ export function isAbortError(error: unknown): boolean { return error instanceof Error && error.name === 'AbortError'; } +function stripTrailingPeriodsFromUrls( + message: string | null | undefined, +): string { + return message?.replace(/(https?:\/\/\S+)\.(?=\s|$)/g, '$1') ?? ''; +} + export function getErrorMessage(error: unknown): string { const friendlyError = toFriendlyError(error); if (friendlyError instanceof Error) { - return friendlyError.message; + return stripTrailingPeriodsFromUrls(friendlyError.message); } if ( typeof friendlyError === 'object' && @@ -45,10 +51,11 @@ export function getErrorMessage(error: unknown): string { typeof (friendlyError as { message: unknown }).message === 'string' ) { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion - return (friendlyError as { message: string }).message; + const message = (friendlyError as { message: string }).message; + return stripTrailingPeriodsFromUrls(message); } try { - return String(friendlyError); + return stripTrailingPeriodsFromUrls(String(friendlyError)); } catch { return 'Failed to get error details'; }