From a45586326b0cdaec80416d90b146d323872fd6b7 Mon Sep 17 00:00:00 2001 From: greptile-bot Date: Sat, 25 Jul 2026 14:51:30 -0700 Subject: [PATCH] Add cart pricing module --- src/cart.ts | 25 +++++++++++++++++++++++++ src/format.ts | 7 +++++++ 2 files changed, 32 insertions(+) create mode 100644 src/cart.ts create mode 100644 src/format.ts diff --git a/src/cart.ts b/src/cart.ts new file mode 100644 index 0000000..2573f83 --- /dev/null +++ b/src/cart.ts @@ -0,0 +1,25 @@ +export interface CartItem { + sku: string + name: string + unitPriceCents: number + quantity: number +} + +export interface Discount { + code: string + percentOff: number +} + +export function subtotalCents(items: CartItem[]): number { + return items.reduce((sum, item) => sum + item.unitPriceCents * item.quantity, 0) +} + +export function applyDiscount(subtotal: number, discount?: Discount): number { + if (!discount) return subtotal + const factor = 1 - discount.percentOff / 100 + return Math.round(subtotal * factor) +} + +export function totalCents(items: CartItem[], discount?: Discount): number { + return applyDiscount(subtotalCents(items), discount) +} diff --git a/src/format.ts b/src/format.ts new file mode 100644 index 0000000..6608736 --- /dev/null +++ b/src/format.ts @@ -0,0 +1,7 @@ +export function formatCents(cents: number, currency = 'USD'): string { + return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(cents / 100) +} + +export function formatLineItem(name: string, quantity: number, unitPriceCents: number): string { + return `${name} x${quantity} — ${formatCents(unitPriceCents * quantity)}` +}