From e144dcabebc52a4468d0b24fe816a039ef6ad9a5 Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Tue, 21 Apr 2026 21:01:53 -0400 Subject: [PATCH] fix: accept nullable marketplace prices in formatter --- packages/core/src/utils/format.ts | 16 +++++++++++++--- packages/core/test/facebook-core.test.ts | 4 ++-- packages/core/test/facebook-integration.test.ts | 2 +- packages/core/test/kijiji-utils.test.ts | 3 ++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/core/src/utils/format.ts b/packages/core/src/utils/format.ts index f4d0f09..0a59040 100644 --- a/packages/core/src/utils/format.ts +++ b/packages/core/src/utils/format.ts @@ -5,9 +5,19 @@ * @returns Formatted currency string */ export function formatCentsToCurrency( - cents: number, + cents: number | string | null | undefined, locale: string = "en-CA", ): string { + if (cents == null) { + return ""; + } + + const numericCents = + typeof cents === "string" ? Number.parseFloat(cents) : cents; + if (!Number.isFinite(numericCents)) { + return ""; + } + try { const formatter = new Intl.NumberFormat(locale, { style: "currency", @@ -15,10 +25,10 @@ export function formatCentsToCurrency( minimumFractionDigits: 2, maximumFractionDigits: 2, }); - return formatter.format(cents / 100); + return formatter.format(numericCents / 100); } catch { // Fallback if locale is not supported - const dollars = (cents / 100).toFixed(2); + const dollars = (numericCents / 100).toFixed(2); return `$${dollars}`; } } diff --git a/packages/core/test/facebook-core.test.ts b/packages/core/test/facebook-core.test.ts index 66c7b8b..1e0bdba 100644 --- a/packages/core/test/facebook-core.test.ts +++ b/packages/core/test/facebook-core.test.ts @@ -1,10 +1,10 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test"; +import { formatCookiesForHeader } from "../src/utils/cookies"; +import { formatCentsToCurrency } from "../src/utils/format"; import { extractFacebookItemData, extractFacebookMarketplaceData, fetchFacebookItem, - formatCentsToCurrency, - formatCookiesForHeader, parseFacebookAds, parseFacebookCookieString, parseFacebookItem, diff --git a/packages/core/test/facebook-integration.test.ts b/packages/core/test/facebook-integration.test.ts index 0f9af80..3e481f3 100644 --- a/packages/core/test/facebook-integration.test.ts +++ b/packages/core/test/facebook-integration.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test"; -import { fetchFacebookItems } from "../src/scrapers/facebook"; +import fetchFacebookItems from "../src/scrapers/facebook"; // Mock fetch globally const originalFetch = global.fetch; diff --git a/packages/core/test/kijiji-utils.test.ts b/packages/core/test/kijiji-utils.test.ts index e33525e..1488027 100644 --- a/packages/core/test/kijiji-utils.test.ts +++ b/packages/core/test/kijiji-utils.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test } from "bun:test"; -import { formatCentsToCurrency, slugify } from "../src/scrapers/kijiji"; +import { slugify } from "../src/scrapers/kijiji"; +import { formatCentsToCurrency } from "../src/utils/format"; describe("Utility Functions", () => { describe("slugify", () => {