@fayz-ai/shop 0.7.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mock-catalog.ts","../src/mock-provider.ts","../src/runtime.ts","../src/commerce.ts","../src/tenant.ts","../src/supabase-provider.ts"],"names":["o","provider","now","getSupabaseClientOptional"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Product, ProductImage, Category, Discount } from './types'\n\n// ---------------------------------------------------------------------------\n// Deterministic, offline product catalog for the mock provider.\n// Product names sourced from the Fayz client repo references\n// (apps/web ShopSection mockups + original shop seeds), expanded to a\n// 16-product / 4-category Shopify-style catalog.\n// ---------------------------------------------------------------------------\n\nconst T0 = '2026-01-01T12:00:00.000Z'\n\n/** 600x600 gradient SVG with product initials — no network, e2e-stable. */\nexport function svgPlaceholder(label: string, hueA: number, hueB: number): string {\n const initials = label\n .split(/\\s+/)\n .map((w) => w[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"600\" height=\"600\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0\" stop-color=\"hsl(${hueA},45%,82%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${hueB},50%,62%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"600\" height=\"600\" fill=\"url(#g)\"/>` +\n `<text x=\"300\" y=\"330\" font-family=\"sans-serif\" font-size=\"120\" font-weight=\"700\" ` +\n `fill=\"rgba(255,255,255,0.85)\" text-anchor=\"middle\">${initials}</text>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n\nfunction image(productId: string, name: string, hueA: number, hueB: number, idx = 0): ProductImage {\n return {\n id: `img-${productId}-${idx}`,\n productId,\n url: svgPlaceholder(name, hueA, hueB),\n altText: name,\n sortOrder: idx,\n isPrimary: idx === 0,\n createdAt: T0,\n }\n}\n\nexport const MOCK_CATEGORIES: Category[] = [\n { id: 'cat-apparel', tenantId: 'mock', name: 'Apparel', slug: 'apparel', description: 'Clothing and wearables', parentId: null, sortOrder: 0, createdAt: T0 },\n { id: 'cat-bags', tenantId: 'mock', name: 'Bags & Accessories', slug: 'bags-accessories', description: 'Bags, wallets and carry gear', parentId: null, sortOrder: 1, createdAt: T0 },\n { id: 'cat-home', tenantId: 'mock', name: 'Home & Kitchen', slug: 'home-kitchen', description: 'Everyday home goods', parentId: null, sortOrder: 2, createdAt: T0 },\n { id: 'cat-tech', tenantId: 'mock', name: 'Stationery & Tech', slug: 'stationery-tech', description: 'Desk, audio and paper goods', parentId: null, sortOrder: 3, createdAt: T0 },\n]\n\ninterface SeedProduct {\n id: string\n name: string\n slug: string\n description: string\n price: number\n compareAtPrice?: number\n inventoryCount: number\n sku: string\n categoryId: string\n hues: [number, number]\n weight: number\n}\n\nconst SEEDS: SeedProduct[] = [\n // --- Apparel ---\n { id: 'p-01', name: 'Classic T-Shirt', slug: 'classic-t-shirt', description: 'A timeless crew-neck tee in heavyweight combed cotton. Pre-shrunk, breathable, and built to outlast trends.', price: 59.9, compareAtPrice: 79.9, inventoryCount: 50, sku: 'TSH-001', categoryId: 'cat-apparel', hues: [210, 240], weight: 0.2 },\n { id: 'p-02', name: 'Linen Shirt', slug: 'linen-shirt', description: 'A relaxed-fit shirt in 100% European linen. Naturally breathable and softer with every wash.', price: 189.9, inventoryCount: 24, sku: 'LNS-002', categoryId: 'cat-apparel', hues: [35, 20], weight: 0.3 },\n { id: 'p-03', name: 'Denim Jacket', slug: 'denim-jacket', description: 'A structured trucker jacket in 12oz raw denim. Ages beautifully with hidden interior pockets.', price: 299.9, inventoryCount: 12, sku: 'DNJ-003', categoryId: 'cat-apparel', hues: [215, 200], weight: 0.8 },\n { id: 'p-04', name: 'Wool Beanie', slug: 'wool-beanie', description: 'A double-layer merino wool beanie. Warm without itch, with a low-profile cuffed fit.', price: 79.9, inventoryCount: 0, sku: 'WBN-004', categoryId: 'cat-apparel', hues: [0, 350], weight: 0.1 },\n\n // --- Bags & Accessories ---\n { id: 'p-05', name: 'Canvas Tote Bag', slug: 'canvas-tote-bag', description: 'An everyday carryall in 16oz waxed canvas with reinforced straps and an interior zip pocket.', price: 39.9, inventoryCount: 30, sku: 'BAG-001', categoryId: 'cat-bags', hues: [80, 110], weight: 0.3 },\n { id: 'p-06', name: 'Leather Backpack', slug: 'leather-backpack', description: 'Full-grain leather backpack with a padded 15\" laptop sleeve, magnetic closures and brass hardware.', price: 549.9, inventoryCount: 8, sku: 'LBP-006', categoryId: 'cat-bags', hues: [25, 15], weight: 1.4 },\n { id: 'p-07', name: 'Leather Card Wallet', slug: 'leather-card-wallet', description: 'A slim six-card wallet in vegetable-tanned leather. RFID-shielded with a center cash slot.', price: 89.9, compareAtPrice: 119.9, inventoryCount: 45, sku: 'LCW-007', categoryId: 'cat-bags', hues: [30, 45], weight: 0.08 },\n { id: 'p-08', name: 'Travel Duffel', slug: 'travel-duffel', description: 'A 40L weekender in ballistic nylon with a trolley sleeve, shoe compartment and detachable strap.', price: 329.9, inventoryCount: 15, sku: 'TDF-008', categoryId: 'cat-bags', hues: [150, 170], weight: 1.1 },\n\n // --- Home & Kitchen ---\n { id: 'p-09', name: 'Ceramic Coffee Mug', slug: 'ceramic-coffee-mug', description: 'A 350ml stoneware mug with a matte glaze and comfortable wide handle. Dishwasher and microwave safe.', price: 34.9, inventoryCount: 0, sku: 'MUG-001', categoryId: 'cat-home', hues: [190, 210], weight: 0.4 },\n { id: 'p-10', name: 'Scented Soy Candle', slug: 'scented-soy-candle', description: 'Hand-poured soy wax candle with cedar and bergamot notes. 45-hour burn time in a reusable glass jar.', price: 69.9, inventoryCount: 60, sku: 'SSC-010', categoryId: 'cat-home', hues: [45, 30], weight: 0.5 },\n { id: 'p-11', name: 'Bamboo Cutting Board', slug: 'bamboo-cutting-board', description: 'An end-grain bamboo board that is gentle on knives, with a juice groove and inset handles.', price: 119.9, inventoryCount: 22, sku: 'BCB-011', categoryId: 'cat-home', hues: [90, 70], weight: 1.2 },\n { id: 'p-12', name: 'Stoneware Plate Set', slug: 'stoneware-plate-set', description: 'A set of four reactive-glaze dinner plates. Each piece is unique, oven-safe to 220°C.', price: 249.9, inventoryCount: 10, sku: 'SPS-012', categoryId: 'cat-home', hues: [200, 180], weight: 2.4 },\n\n // --- Stationery & Tech ---\n { id: 'p-13', name: 'Wireless Headphones', slug: 'wireless-headphones', description: 'Over-ear headphones with active noise cancelling, 40-hour battery and multipoint Bluetooth 5.3.', price: 899.9, inventoryCount: 18, sku: 'WHP-013', categoryId: 'cat-tech', hues: [260, 280], weight: 0.35 },\n { id: 'p-14', name: 'Notebook Set', slug: 'notebook-set', description: 'Three A5 dot-grid notebooks with 120gsm paper, lay-flat binding and numbered pages.', price: 29.9, inventoryCount: 80, sku: 'NBS-014', categoryId: 'cat-tech', hues: [330, 310], weight: 0.45 },\n { id: 'p-15', name: 'Bluetooth Speaker', slug: 'bluetooth-speaker', description: 'A pocket-size speaker with surprising low end, IPX7 waterproofing and 14-hour playtime.', price: 199.9, compareAtPrice: 259.9, inventoryCount: 26, sku: 'BTS-015', categoryId: 'cat-tech', hues: [170, 190], weight: 0.3 },\n { id: 'p-16', name: 'Felt Desk Mat', slug: 'felt-desk-mat', description: 'A 80x30cm merino felt desk mat with a cork base. Protects the desk and quiets the keyboard.', price: 99.9, inventoryCount: 34, sku: 'FDM-016', categoryId: 'cat-tech', hues: [220, 230], weight: 0.6 },\n]\n\nconst CATEGORY_NAME: Record<string, string> = Object.fromEntries(\n MOCK_CATEGORIES.map((c) => [c.id, c.name]),\n)\n\nexport const MOCK_PRODUCTS: Product[] = SEEDS.map((s, i) => ({\n id: s.id,\n tenantId: 'mock',\n name: s.name,\n slug: s.slug,\n description: s.description,\n price: s.price,\n compareAtPrice: s.compareAtPrice ?? null,\n currency: 'BRL',\n status: 'active',\n inventoryCount: s.inventoryCount,\n sku: s.sku,\n sortOrder: i,\n metadata: {},\n images: [image(s.id, s.name, s.hues[0], s.hues[1])],\n categoryId: s.categoryId,\n categoryName: CATEGORY_NAME[s.categoryId] ?? null,\n isPhysical: true,\n weight: s.weight,\n weightUnit: 'kg',\n // staggered timestamps → deterministic 'newest' sort (p-16 newest)\n createdAt: `2026-01-${String(i + 1).padStart(2, '0')}T12:00:00.000Z`,\n updatedAt: `2026-01-${String(i + 1).padStart(2, '0')}T12:00:00.000Z`,\n}))\n\nexport const MOCK_DISCOUNTS: Discount[] = [\n {\n id: 'disc-welcome',\n tenantId: 'mock',\n title: 'Welcome 10%',\n code: 'BEMVINDO10',\n type: 'percentage',\n method: 'code',\n value: 10,\n usageLimit: null,\n oncePerCustomer: false,\n startsAt: T0,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: T0,\n updatedAt: T0,\n },\n]\n\n// ---------------------------------------------------------------------------\n// buildMockCatalog — terse per-store catalog definition. Generates ids,\n// slugs, SVG imagery and staggered timestamps so every store gets a\n// deterministic, e2e-stable catalog from a few lines of data.\n// ---------------------------------------------------------------------------\n\nexport interface CatalogCategoryInput {\n name: string\n description?: string\n image?: string\n}\n\nexport interface CatalogProductInput {\n name: string\n description: string\n price: number\n compareAtPrice?: number\n inventory: number\n sku: string\n /** Category name — must match one of the categories */\n category: string\n hues?: [number, number]\n weight?: number\n image?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface CatalogInput {\n categories: CatalogCategoryInput[]\n products: CatalogProductInput[]\n /** Percentage discount codes, e.g. [{ code: 'BEMVINDO10', percent: 10 }] */\n discounts?: Array<{ code: string; percent: number; title?: string }>\n currency?: string\n}\n\nfunction slugifyName(name: string): string {\n return name\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\nexport function buildMockCatalog(input: CatalogInput): { products: Product[]; categories: Category[]; discounts: Discount[] } {\n const categories: Category[] = input.categories.map((c, i) => ({\n id: `cat-${slugifyName(c.name)}`,\n tenantId: 'mock',\n name: c.name,\n slug: slugifyName(c.name),\n description: c.description ?? null,\n parentId: null,\n sortOrder: i,\n imageUrl: c.image ?? null,\n createdAt: T0,\n }))\n const byName = Object.fromEntries(categories.map((c) => [c.name, c]))\n\n const products: Product[] = input.products.map((p, i) => {\n const cat = byName[p.category]\n const id = `p-${String(i + 1).padStart(2, '0')}`\n const hues = p.hues ?? [(i * 47) % 360, (i * 47 + 50) % 360]\n const stamp = `2026-01-${String((i % 27) + 1).padStart(2, '0')}T12:00:00.000Z`\n return {\n id,\n tenantId: 'mock',\n name: p.name,\n slug: slugifyName(p.name),\n description: p.description,\n price: p.price,\n compareAtPrice: p.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: 'active',\n inventoryCount: p.inventory,\n sku: p.sku,\n sortOrder: i,\n metadata: p.metadata ?? {},\n images: [\n {\n id: `img-${id}-0`,\n productId: id,\n url: p.image ?? svgPlaceholder(p.name, hues[0], hues[1]),\n altText: p.name,\n sortOrder: 0,\n isPrimary: true,\n createdAt: T0,\n },\n ],\n categoryId: cat?.id ?? null,\n categoryName: cat?.name ?? null,\n isPhysical: true,\n weight: p.weight ?? 0.5,\n weightUnit: 'kg',\n createdAt: stamp,\n updatedAt: stamp,\n }\n })\n\n const discounts: Discount[] = (input.discounts ?? []).map((d, i) => ({\n id: `disc-${slugifyName(d.code)}`,\n tenantId: 'mock',\n title: d.title ?? `${d.percent}% off`,\n code: d.code,\n type: 'percentage',\n method: 'code',\n value: d.percent,\n usageLimit: null,\n oncePerCustomer: false,\n startsAt: T0,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: T0,\n updatedAt: T0,\n }))\n\n return { products, categories, discounts }\n}\n","import type { ShopProvider } from './provider'\nimport type {\n Product, ProductImage, Category, Order, ShopCustomer, Discount, ProductEnquiry,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateProductEnquiryInput, ListProductEnquiriesOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions,\n} from './types'\nimport { MOCK_PRODUCTS, MOCK_CATEGORIES, MOCK_DISCOUNTS } from './mock-catalog'\n\nfunction uid() { return Math.random().toString(36).slice(2) }\nfunction now() { return new Date().toISOString() }\n\n// Orders/customers persist to localStorage so \"my purchases\" survives a page\n// reload. Products/categories/discounts always reseed from the catalog —\n// the storefront sees a deterministic catalog on every load.\nconst ORDERS_KEY = 'fayz.shop.mock.orders.v1'\nconst CUSTOMERS_KEY = 'fayz.shop.mock.customers.v1'\nconst ENQUIRIES_KEY = 'fayz.shop.mock.enquiries.v1'\n\nfunction loadStored<T>(key: string): T[] {\n try {\n if (typeof localStorage === 'undefined') return []\n const raw = localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as T[]) : []\n } catch {\n return []\n }\n}\n\nfunction store<T>(key: string, value: T[]): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(key, JSON.stringify(value))\n } catch {\n /* quota/serialization failures are non-fatal in mock mode */\n }\n}\n\nexport interface MockShopSeed {\n products?: Product[]\n categories?: Category[]\n discounts?: Discount[]\n}\n\nexport class MockShopProvider implements ShopProvider {\n private products: Product[]\n private categories: Category[]\n private discounts: Discount[]\n private orders: Order[] = loadStored<Order>(ORDERS_KEY)\n private customers: ShopCustomer[] = loadStored<ShopCustomer>(CUSTOMERS_KEY)\n private enquiries: ProductEnquiry[] = loadStored<ProductEnquiry>(ENQUIRIES_KEY)\n\n constructor(seed?: MockShopSeed) {\n this.products = (seed?.products ?? MOCK_PRODUCTS).map(p => ({ ...p }))\n this.categories = (seed?.categories ?? MOCK_CATEGORIES).map(c => ({ ...c }))\n this.discounts = (seed?.discounts ?? MOCK_DISCOUNTS).map(d => ({ ...d }))\n }\n\n // Re-read before mutating: HMR can re-instantiate the provider mid-session\n // and a stale in-memory copy must not clobber persisted records.\n private syncOrders() { this.orders = loadStored<Order>(ORDERS_KEY) }\n private syncCustomers() { this.customers = loadStored<ShopCustomer>(CUSTOMERS_KEY) }\n private syncEnquiries() { this.enquiries = loadStored<ProductEnquiry>(ENQUIRIES_KEY) }\n private persistOrders() { store(ORDERS_KEY, this.orders) }\n private persistCustomers() { store(CUSTOMERS_KEY, this.customers) }\n private persistEnquiries() { store(ENQUIRIES_KEY, this.enquiries) }\n\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(opts?: ListProductsOptions): Promise<Product[]> {\n let list = [...this.products]\n if (opts?.status) list = list.filter(p => p.status === opts.status)\n if (opts?.categoryId) list = list.filter(p => p.categoryId === opts.categoryId)\n if (opts?.slug) list = list.filter(p => p.slug === opts.slug)\n if (opts?.search) {\n const q = opts.search.toLowerCase()\n list = list.filter(p =>\n p.name.toLowerCase().includes(q) ||\n (p.description ?? '').toLowerCase().includes(q) ||\n (p.sku ?? '').toLowerCase().includes(q),\n )\n }\n const orderBy = opts?.orderBy ?? 'sort_order'\n const dir = opts?.order === 'desc' ? -1 : 1\n list.sort((a, b) => {\n switch (orderBy) {\n case 'name': return a.name.localeCompare(b.name) * dir\n case 'price': return (a.price - b.price) * dir\n case 'created_at': return a.createdAt.localeCompare(b.createdAt) * dir\n default: return (a.sortOrder - b.sortOrder) * dir\n }\n })\n const offset = opts?.offset ?? 0\n if (offset || opts?.limit) list = list.slice(offset, opts?.limit ? offset + opts.limit : undefined)\n return list\n }\n\n async getProduct(id: string) { return this.products.find(p => p.id === id) ?? null }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const p: Product = { id: uid(), tenantId: 'mock', name: input.name, slug: input.slug ?? input.name.toLowerCase().replace(/\\s+/g, '-'), description: input.description ?? null, price: input.price, compareAtPrice: input.compareAtPrice ?? null, currency: input.currency ?? 'BRL', status: input.status ?? 'active', inventoryCount: input.inventoryCount ?? 0, sku: input.sku ?? null, sortOrder: input.sortOrder ?? 0, metadata: input.metadata ?? {}, images: [], categoryId: input.categoryId ?? null, categoryName: null, isPhysical: input.isPhysical ?? true, weight: input.weight ?? null, weightUnit: input.weightUnit ?? 'kg', createdAt: now(), updatedAt: now() }\n this.products.push(p); return p\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const i = this.products.findIndex(p => p.id === id)\n if (i < 0) throw new Error('Product not found')\n this.products[i] = { ...this.products[i], ...input, updatedAt: now() }\n return this.products[i]\n }\n\n async deleteProduct(id: string) { this.products = this.products.filter(p => p.id !== id) }\n async uploadProductImage(_productId: string, _file: File): Promise<ProductImage> { throw new Error('Image upload not available in mock mode') }\n async deleteProductImage(_imageId: string) {}\n\n async createProductEnquiry(input: CreateProductEnquiryInput): Promise<ProductEnquiry> {\n this.syncEnquiries()\n const ts = now()\n const enquiry: ProductEnquiry = {\n id: uid(),\n tenantId: 'mock',\n productId: input.productId ?? null,\n productName: input.productName,\n productSlug: input.productSlug ?? null,\n customerName: input.customerName,\n customerEmail: input.customerEmail,\n customerPhone: input.customerPhone ?? null,\n subject: input.subject ?? null,\n message: input.message,\n sourceUrl: input.sourceUrl ?? null,\n status: 'new',\n metadata: input.metadata ?? {},\n createdAt: ts,\n updatedAt: ts,\n }\n this.enquiries.unshift(enquiry)\n this.persistEnquiries()\n return enquiry\n }\n\n async listProductEnquiries(opts?: ListProductEnquiriesOptions): Promise<ProductEnquiry[]> {\n this.syncEnquiries()\n let list = [...this.enquiries]\n if (opts?.productId) list = list.filter((e) => e.productId === opts.productId)\n if (opts?.customerEmail) {\n const email = opts.customerEmail.toLowerCase()\n list = list.filter((e) => e.customerEmail.toLowerCase() === email)\n }\n if (opts?.status) list = list.filter((e) => e.status === opts.status)\n list.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n const offset = opts?.offset ?? 0\n if (offset || opts?.limit) list = list.slice(offset, opts?.limit ? offset + opts.limit : undefined)\n return list\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories() { return [...this.categories].sort((a, b) => a.sortOrder - b.sortOrder) }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const c: Category = { id: uid(), tenantId: 'mock', name: input.name, slug: input.slug ?? input.name.toLowerCase().replace(/\\s+/g, '-'), description: input.description ?? null, parentId: input.parentId ?? null, sortOrder: input.sortOrder ?? 0, createdAt: now() }\n this.categories.push(c); return c\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const i = this.categories.findIndex(c => c.id === id)\n if (i < 0) throw new Error('Category not found')\n this.categories[i] = { ...this.categories[i], ...input }\n return this.categories[i]\n }\n\n async deleteCategory(id: string) { this.categories = this.categories.filter(c => c.id !== id) }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(opts?: ListOrdersOptions): Promise<Order[]> {\n this.syncOrders()\n let list = [...this.orders]\n if (opts?.status) list = list.filter(o => o.status === opts.status)\n if (opts?.financialStatus) list = list.filter(o => o.financialStatus === opts.financialStatus)\n if (opts?.fulfillmentStatus) list = list.filter(o => o.fulfillmentStatus === opts.fulfillmentStatus)\n if (opts?.customerId) list = list.filter(o => o.customerId === opts.customerId)\n if (opts?.customerEmail) {\n const email = opts.customerEmail.toLowerCase()\n list = list.filter(o => (o.customerEmail ?? '').toLowerCase() === email)\n }\n if (opts?.search) {\n const q = opts.search.toLowerCase()\n list = list.filter(o =>\n (o.customerName ?? '').toLowerCase().includes(q) ||\n (o.customerEmail ?? '').toLowerCase().includes(q) ||\n String(o.orderNumber).includes(q),\n )\n }\n list.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getOrder(id: string) {\n this.syncOrders()\n return this.orders.find(o => o.id === id) ?? null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n this.syncOrders()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const orderId = uid()\n const maxNumber = this.orders.reduce((m, o) => Math.max(m, o.orderNumber), 1000)\n const o: Order = {\n id: orderId,\n tenantId: 'mock',\n orderNumber: maxNumber + 1,\n status: 'open',\n financialStatus: 'pending',\n fulfillmentStatus: 'unfulfilled',\n currency: input.currency ?? 'BRL',\n subtotal: Math.round(subtotal * 100) / 100,\n taxTotal: 0,\n discountTotal,\n shippingTotal,\n total,\n customerId: input.customerId ?? null,\n customerName: input.customerName ?? null,\n customerEmail: input.customerEmail ?? null,\n discountCode: input.discountCode ?? null,\n notes: input.notes ?? null,\n items: input.items.map(i => ({ id: uid(), orderId, productId: i.productId ?? null, name: i.name, sku: i.sku ?? null, quantity: i.quantity, unitPrice: i.unitPrice, total: Math.round(i.quantity * i.unitPrice * 100) / 100, imageUrl: i.imageUrl ?? null })),\n createdAt: now(),\n updatedAt: now(),\n }\n this.orders.push(o)\n this.persistOrders()\n return o\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n this.syncOrders()\n const i = this.orders.findIndex(o => o.id === id)\n if (i < 0) throw new Error('Order not found')\n this.orders[i] = { ...this.orders[i], ...input, updatedAt: now() }\n this.persistOrders()\n return this.orders[i]\n }\n\n // Trusted placement (mock parity with the shop_place_order RPC): re-reads\n // prices + stock from the catalog, validates the discount, decrements\n // inventory. The browser-supplied prices are never used.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n this.syncOrders()\n this.syncCustomers()\n\n // Resolve / create the customer (find-or-create by email).\n let customerId = input.customerId ?? null\n let customerName = input.customer?.name?.trim() || null\n const email = input.customer?.email?.trim().toLowerCase() || null\n if (!customerId && email) {\n const existing = this.customers.find(c => (c.email ?? '').toLowerCase() === email)\n if (existing) {\n customerId = existing.id\n customerName = customerName ?? `${existing.firstName} ${existing.lastName}`.trim()\n } else {\n const [first, ...rest] = (customerName ?? email).split(' ')\n const created = await this.createCustomer({ firstName: first || email, lastName: rest.join(' '), email })\n customerId = created.id\n }\n }\n\n // Re-read price + guard stock from the catalog (never trust the client).\n const items: CreateOrderInput['items'] = []\n let subtotal = 0\n for (const line of input.items) {\n const product = this.products.find(p => p.id === line.productId)\n if (!product || product.status !== 'active') throw new Error(`Product unavailable: ${line.productId}`)\n if (product.inventoryCount < line.quantity) throw new Error(`Insufficient stock for ${product.name}`)\n const name = line.optionsLabel ? `${product.name} (${line.optionsLabel})` : product.name\n subtotal += product.price * line.quantity\n items.push({ productId: product.id, name, sku: product.sku ?? undefined, quantity: line.quantity, unitPrice: product.price, imageUrl: product.images[0]?.url })\n }\n subtotal = Math.round(subtotal * 100) / 100\n\n // Validate + apply the discount server-side.\n let shippingTotal = Math.max(input.shippingTotal ?? 0, 0)\n let discountTotal = 0\n let appliedCode: string | null = null\n if (input.discountCode) {\n const code = input.discountCode.trim().toLowerCase()\n const d = this.discounts.find(x => (x.code ?? '').toLowerCase() === code)\n const ts = now()\n const valid = !!d && d.status === 'active' && d.startsAt <= ts && (!d.endsAt || d.endsAt >= ts) && (d.usageLimit == null || d.timesUsed < d.usageLimit)\n if (valid && d) {\n appliedCode = d.code\n if (d.type === 'percentage') discountTotal = Math.round(subtotal * d.value) / 100\n else if (d.type === 'fixed_amount') discountTotal = Math.min(d.value, subtotal)\n else if (d.type === 'free_shipping') shippingTotal = 0\n // buy_x_get_y unsupported in v1: code recorded, no monetary effect\n d.timesUsed += 1\n }\n }\n discountTotal = Math.round(Math.min(Math.max(discountTotal, 0), subtotal) * 100) / 100\n\n // Persist via createOrder (recomputes total from these trusted values).\n const order = await this.createOrder({\n customerId: customerId ?? undefined,\n customerName: customerName ?? undefined,\n customerEmail: input.customer?.email ?? undefined,\n currency: input.currency,\n notes: input.notes,\n discountCode: appliedCode ?? undefined,\n discountTotal,\n shippingTotal,\n items,\n })\n\n // Decrement inventory (in-memory; the mock catalog reseeds on reload).\n for (const line of input.items) {\n const product = this.products.find(p => p.id === line.productId)\n if (product) product.inventoryCount = Math.max(0, product.inventoryCount - line.quantity)\n }\n\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(opts?: ListCustomersOptions) {\n this.syncCustomers()\n let list = [...this.customers]\n if (opts?.search) list = list.filter(c => `${c.firstName} ${c.lastName} ${c.email}`.toLowerCase().includes(opts.search!.toLowerCase()))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getCustomer(id: string) {\n this.syncCustomers()\n return this.customers.find(c => c.id === id) ?? null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const c: ShopCustomer = { id: uid(), tenantId: 'mock', firstName: input.firstName, lastName: input.lastName ?? '', email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null, ordersCount: 0, totalSpent: 0, createdAt: now(), updatedAt: now() }\n this.customers.push(c)\n this.persistCustomers()\n return c\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const i = this.customers.findIndex(c => c.id === id)\n if (i < 0) throw new Error('Customer not found')\n this.customers[i] = { ...this.customers[i], ...input, updatedAt: now() }\n this.persistCustomers()\n return this.customers[i]\n }\n\n async deleteCustomer(id: string) {\n this.syncCustomers()\n this.customers = this.customers.filter(c => c.id !== id)\n this.persistCustomers()\n }\n\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const email = input.email.trim().toLowerCase()\n const existing = this.customers.find(c => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const [first, ...rest] = (input.name?.trim() || email).split(/\\s+/)\n return this.createCustomer({ firstName: first || email, lastName: rest.join(' '), email })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(opts?: ListDiscountsOptions) {\n let list = [...this.discounts]\n if (opts?.status) list = list.filter(d => d.status === opts.status)\n if (opts?.type) list = list.filter(d => d.type === opts.type)\n if (opts?.search) list = list.filter(d => d.title.toLowerCase().includes(opts.search!.toLowerCase()))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getDiscount(id: string) { return this.discounts.find(d => d.id === id) ?? null }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const d: Discount = { id: uid(), tenantId: 'mock', title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usageLimit: input.usageLimit ?? null, oncePerCustomer: input.oncePerCustomer ?? false, startsAt: input.startsAt ?? now(), endsAt: input.endsAt ?? null, status: input.status ?? 'active', timesUsed: 0, createdAt: now(), updatedAt: now() }\n this.discounts.push(d); return d\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const i = this.discounts.findIndex(d => d.id === id)\n if (i < 0) throw new Error('Discount not found')\n this.discounts[i] = { ...this.discounts[i], ...input, updatedAt: now() }\n return this.discounts[i]\n }\n\n async deleteDiscount(id: string) { this.discounts = this.discounts.filter(d => d.id !== id) }\n}\n\nexport function createMockShopProvider(seed?: MockShopSeed): ShopProvider {\n return new MockShopProvider(seed)\n}\n","import type { ShopProvider } from './provider'\nimport { createMockShopProvider } from './mock-provider'\n\nlet provider: ShopProvider | null = null\nlet mockFallback: ShopProvider | null = null\n\nexport function getShopProvider(): ShopProvider {\n if (provider) return provider\n if (!mockFallback) mockFallback = createMockShopProvider()\n return mockFallback\n}\n\nexport function setShopProvider(nextProvider: ShopProvider): void {\n provider = nextProvider\n}\n\nexport function resetShopProvider(): void {\n provider = null\n mockFallback = null\n}\n","import { getShopProvider } from './runtime'\nimport type { ShopProvider } from './provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","// Tenant scoping for shop queries. @fayz-ai/shop has no dependency on @fayz-ai/saas —\n// the host app (or @fayz-ai/plugin-shop) registers a resolver that returns the\n// current tenant id. When no resolver is set, queries are unscoped (RLS still\n// applies server-side).\n\nexport type TenantResolver = () => string | undefined\n\nlet _resolver: TenantResolver | null = null\n\nexport function setShopTenantResolver(resolver: TenantResolver): void {\n _resolver = resolver\n}\n\nexport function getShopTenantId(): string | undefined {\n if (!_resolver) return undefined\n try {\n return _resolver()\n } catch {\n return undefined\n }\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ShopProvider } from './provider'\nimport { getShopTenantId } from './tenant'\nimport type {\n Product, ProductImage, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions,\n} from './types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n items: Array.isArray(row.items) ? row.items : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from('shop_products').select('*, images:shop_product_images(*)')\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from('shop_products')\n .select('*, images:shop_product_images(*)')\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from('shop_products')\n .insert({\n tenant_id: tenantId,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n })\n .select('*, images:shop_product_images(*)')\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n const { data, error } = await db\n .from('shop_products').update(updates).eq('id', id)\n .select('*, images:shop_product_images(*)')\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from('shop_products').delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n const { data, error } = await db\n .from('shop_product_images')\n .insert({ product_id: productId, tenant_id: tenantId, url: publicUrl, sort_order: 0, is_primary: false })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const { error } = await getDb().from('shop_product_images').delete().eq('id', imageId)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from('shop_categories').select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from('shop_categories')\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from('shop_categories').update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from('shop_categories').delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from('shop_orders').select('*, items:shop_order_items(*)')\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const { data, error } = await getDb()\n .from('shop_orders').select('*, items:shop_order_items(*)')\n .eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToOrder(data) : null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from('shop_orders')\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from('shop_order_items').insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from('shop_orders').update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n p_items: input.items.map(i => ({ product_id: i.productId, quantity: i.quantity, options_label: i.optionsLabel ?? null })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n p_notes: input.notes ?? null,\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from('shop_customers').select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.search) q = q.or(`first_name.ilike.%${options.search}%,last_name.ilike.%${options.search}%,email.ilike.%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from('shop_customers').select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from('shop_customers')\n .insert({ tenant_id: getTenantId(), first_name: input.firstName, last_name: input.lastName ?? '', email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from('shop_customers').update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from('shop_customers').delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from('shop_discounts').select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from('shop_discounts').select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from('shop_discounts')\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from('shop_discounts').update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from('shop_discounts').delete().eq('id', id)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n"]}
1
+ {"version":3,"sources":["../src/mock-catalog.ts","../src/mock-provider.ts","../src/runtime.ts","../src/commerce.ts","../src/tenant.ts","../src/tables.ts","../src/supabase-provider.ts"],"names":["o","provider","now","getSupabaseClientOptional"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Product, ProductImage, Category, Discount } from './types'\n\n// ---------------------------------------------------------------------------\n// Deterministic, offline product catalog for the mock provider.\n// Product names sourced from the Fayz client repo references\n// (apps/web ShopSection mockups + original shop seeds), expanded to a\n// 16-product / 4-category Shopify-style catalog.\n// ---------------------------------------------------------------------------\n\nconst T0 = '2026-01-01T12:00:00.000Z'\n\n/** 600x600 gradient SVG with product initials — no network, e2e-stable. */\nexport function svgPlaceholder(label: string, hueA: number, hueB: number): string {\n const initials = label\n .split(/\\s+/)\n .map((w) => w[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"600\" height=\"600\">` +\n `<defs><linearGradient id=\"g\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0\" stop-color=\"hsl(${hueA},45%,82%)\"/>` +\n `<stop offset=\"1\" stop-color=\"hsl(${hueB},50%,62%)\"/>` +\n `</linearGradient></defs>` +\n `<rect width=\"600\" height=\"600\" fill=\"url(#g)\"/>` +\n `<text x=\"300\" y=\"330\" font-family=\"sans-serif\" font-size=\"120\" font-weight=\"700\" ` +\n `fill=\"rgba(255,255,255,0.85)\" text-anchor=\"middle\">${initials}</text>` +\n `</svg>`\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`\n}\n\nfunction image(productId: string, name: string, hueA: number, hueB: number, idx = 0): ProductImage {\n return {\n id: `img-${productId}-${idx}`,\n productId,\n url: svgPlaceholder(name, hueA, hueB),\n altText: name,\n sortOrder: idx,\n isPrimary: idx === 0,\n createdAt: T0,\n }\n}\n\nexport const MOCK_CATEGORIES: Category[] = [\n { id: 'cat-apparel', tenantId: 'mock', name: 'Apparel', slug: 'apparel', description: 'Clothing and wearables', parentId: null, sortOrder: 0, createdAt: T0 },\n { id: 'cat-bags', tenantId: 'mock', name: 'Bags & Accessories', slug: 'bags-accessories', description: 'Bags, wallets and carry gear', parentId: null, sortOrder: 1, createdAt: T0 },\n { id: 'cat-home', tenantId: 'mock', name: 'Home & Kitchen', slug: 'home-kitchen', description: 'Everyday home goods', parentId: null, sortOrder: 2, createdAt: T0 },\n { id: 'cat-tech', tenantId: 'mock', name: 'Stationery & Tech', slug: 'stationery-tech', description: 'Desk, audio and paper goods', parentId: null, sortOrder: 3, createdAt: T0 },\n]\n\ninterface SeedProduct {\n id: string\n name: string\n slug: string\n description: string\n price: number\n compareAtPrice?: number\n inventoryCount: number\n sku: string\n categoryId: string\n hues: [number, number]\n weight: number\n}\n\nconst SEEDS: SeedProduct[] = [\n // --- Apparel ---\n { id: 'p-01', name: 'Classic T-Shirt', slug: 'classic-t-shirt', description: 'A timeless crew-neck tee in heavyweight combed cotton. Pre-shrunk, breathable, and built to outlast trends.', price: 59.9, compareAtPrice: 79.9, inventoryCount: 50, sku: 'TSH-001', categoryId: 'cat-apparel', hues: [210, 240], weight: 0.2 },\n { id: 'p-02', name: 'Linen Shirt', slug: 'linen-shirt', description: 'A relaxed-fit shirt in 100% European linen. Naturally breathable and softer with every wash.', price: 189.9, inventoryCount: 24, sku: 'LNS-002', categoryId: 'cat-apparel', hues: [35, 20], weight: 0.3 },\n { id: 'p-03', name: 'Denim Jacket', slug: 'denim-jacket', description: 'A structured trucker jacket in 12oz raw denim. Ages beautifully with hidden interior pockets.', price: 299.9, inventoryCount: 12, sku: 'DNJ-003', categoryId: 'cat-apparel', hues: [215, 200], weight: 0.8 },\n { id: 'p-04', name: 'Wool Beanie', slug: 'wool-beanie', description: 'A double-layer merino wool beanie. Warm without itch, with a low-profile cuffed fit.', price: 79.9, inventoryCount: 0, sku: 'WBN-004', categoryId: 'cat-apparel', hues: [0, 350], weight: 0.1 },\n\n // --- Bags & Accessories ---\n { id: 'p-05', name: 'Canvas Tote Bag', slug: 'canvas-tote-bag', description: 'An everyday carryall in 16oz waxed canvas with reinforced straps and an interior zip pocket.', price: 39.9, inventoryCount: 30, sku: 'BAG-001', categoryId: 'cat-bags', hues: [80, 110], weight: 0.3 },\n { id: 'p-06', name: 'Leather Backpack', slug: 'leather-backpack', description: 'Full-grain leather backpack with a padded 15\" laptop sleeve, magnetic closures and brass hardware.', price: 549.9, inventoryCount: 8, sku: 'LBP-006', categoryId: 'cat-bags', hues: [25, 15], weight: 1.4 },\n { id: 'p-07', name: 'Leather Card Wallet', slug: 'leather-card-wallet', description: 'A slim six-card wallet in vegetable-tanned leather. RFID-shielded with a center cash slot.', price: 89.9, compareAtPrice: 119.9, inventoryCount: 45, sku: 'LCW-007', categoryId: 'cat-bags', hues: [30, 45], weight: 0.08 },\n { id: 'p-08', name: 'Travel Duffel', slug: 'travel-duffel', description: 'A 40L weekender in ballistic nylon with a trolley sleeve, shoe compartment and detachable strap.', price: 329.9, inventoryCount: 15, sku: 'TDF-008', categoryId: 'cat-bags', hues: [150, 170], weight: 1.1 },\n\n // --- Home & Kitchen ---\n { id: 'p-09', name: 'Ceramic Coffee Mug', slug: 'ceramic-coffee-mug', description: 'A 350ml stoneware mug with a matte glaze and comfortable wide handle. Dishwasher and microwave safe.', price: 34.9, inventoryCount: 0, sku: 'MUG-001', categoryId: 'cat-home', hues: [190, 210], weight: 0.4 },\n { id: 'p-10', name: 'Scented Soy Candle', slug: 'scented-soy-candle', description: 'Hand-poured soy wax candle with cedar and bergamot notes. 45-hour burn time in a reusable glass jar.', price: 69.9, inventoryCount: 60, sku: 'SSC-010', categoryId: 'cat-home', hues: [45, 30], weight: 0.5 },\n { id: 'p-11', name: 'Bamboo Cutting Board', slug: 'bamboo-cutting-board', description: 'An end-grain bamboo board that is gentle on knives, with a juice groove and inset handles.', price: 119.9, inventoryCount: 22, sku: 'BCB-011', categoryId: 'cat-home', hues: [90, 70], weight: 1.2 },\n { id: 'p-12', name: 'Stoneware Plate Set', slug: 'stoneware-plate-set', description: 'A set of four reactive-glaze dinner plates. Each piece is unique, oven-safe to 220°C.', price: 249.9, inventoryCount: 10, sku: 'SPS-012', categoryId: 'cat-home', hues: [200, 180], weight: 2.4 },\n\n // --- Stationery & Tech ---\n { id: 'p-13', name: 'Wireless Headphones', slug: 'wireless-headphones', description: 'Over-ear headphones with active noise cancelling, 40-hour battery and multipoint Bluetooth 5.3.', price: 899.9, inventoryCount: 18, sku: 'WHP-013', categoryId: 'cat-tech', hues: [260, 280], weight: 0.35 },\n { id: 'p-14', name: 'Notebook Set', slug: 'notebook-set', description: 'Three A5 dot-grid notebooks with 120gsm paper, lay-flat binding and numbered pages.', price: 29.9, inventoryCount: 80, sku: 'NBS-014', categoryId: 'cat-tech', hues: [330, 310], weight: 0.45 },\n { id: 'p-15', name: 'Bluetooth Speaker', slug: 'bluetooth-speaker', description: 'A pocket-size speaker with surprising low end, IPX7 waterproofing and 14-hour playtime.', price: 199.9, compareAtPrice: 259.9, inventoryCount: 26, sku: 'BTS-015', categoryId: 'cat-tech', hues: [170, 190], weight: 0.3 },\n { id: 'p-16', name: 'Felt Desk Mat', slug: 'felt-desk-mat', description: 'A 80x30cm merino felt desk mat with a cork base. Protects the desk and quiets the keyboard.', price: 99.9, inventoryCount: 34, sku: 'FDM-016', categoryId: 'cat-tech', hues: [220, 230], weight: 0.6 },\n]\n\nconst CATEGORY_NAME: Record<string, string> = Object.fromEntries(\n MOCK_CATEGORIES.map((c) => [c.id, c.name]),\n)\n\nexport const MOCK_PRODUCTS: Product[] = SEEDS.map((s, i) => ({\n id: s.id,\n tenantId: 'mock',\n name: s.name,\n slug: s.slug,\n description: s.description,\n price: s.price,\n compareAtPrice: s.compareAtPrice ?? null,\n currency: 'BRL',\n status: 'active',\n inventoryCount: s.inventoryCount,\n sku: s.sku,\n sortOrder: i,\n metadata: {},\n images: [image(s.id, s.name, s.hues[0], s.hues[1])],\n categoryId: s.categoryId,\n categoryName: CATEGORY_NAME[s.categoryId] ?? null,\n isPhysical: true,\n weight: s.weight,\n weightUnit: 'kg',\n // staggered timestamps → deterministic 'newest' sort (p-16 newest)\n createdAt: `2026-01-${String(i + 1).padStart(2, '0')}T12:00:00.000Z`,\n updatedAt: `2026-01-${String(i + 1).padStart(2, '0')}T12:00:00.000Z`,\n}))\n\nexport const MOCK_DISCOUNTS: Discount[] = [\n {\n id: 'disc-welcome',\n tenantId: 'mock',\n title: 'Welcome 10%',\n code: 'BEMVINDO10',\n type: 'percentage',\n method: 'code',\n value: 10,\n usageLimit: null,\n oncePerCustomer: false,\n startsAt: T0,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: T0,\n updatedAt: T0,\n },\n]\n\n// ---------------------------------------------------------------------------\n// buildMockCatalog — terse per-store catalog definition. Generates ids,\n// slugs, SVG imagery and staggered timestamps so every store gets a\n// deterministic, e2e-stable catalog from a few lines of data.\n// ---------------------------------------------------------------------------\n\nexport interface CatalogCategoryInput {\n name: string\n description?: string\n image?: string\n}\n\nexport interface CatalogProductInput {\n name: string\n description: string\n price: number\n compareAtPrice?: number\n inventory: number\n sku: string\n /** Category name — must match one of the categories */\n category: string\n hues?: [number, number]\n weight?: number\n image?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface CatalogInput {\n categories: CatalogCategoryInput[]\n products: CatalogProductInput[]\n /** Percentage discount codes, e.g. [{ code: 'BEMVINDO10', percent: 10 }] */\n discounts?: Array<{ code: string; percent: number; title?: string }>\n currency?: string\n}\n\nfunction slugifyName(name: string): string {\n return name\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\nexport function buildMockCatalog(input: CatalogInput): { products: Product[]; categories: Category[]; discounts: Discount[] } {\n const categories: Category[] = input.categories.map((c, i) => ({\n id: `cat-${slugifyName(c.name)}`,\n tenantId: 'mock',\n name: c.name,\n slug: slugifyName(c.name),\n description: c.description ?? null,\n parentId: null,\n sortOrder: i,\n imageUrl: c.image ?? null,\n createdAt: T0,\n }))\n const byName = Object.fromEntries(categories.map((c) => [c.name, c]))\n\n const products: Product[] = input.products.map((p, i) => {\n const cat = byName[p.category]\n const id = `p-${String(i + 1).padStart(2, '0')}`\n const hues = p.hues ?? [(i * 47) % 360, (i * 47 + 50) % 360]\n const stamp = `2026-01-${String((i % 27) + 1).padStart(2, '0')}T12:00:00.000Z`\n return {\n id,\n tenantId: 'mock',\n name: p.name,\n slug: slugifyName(p.name),\n description: p.description,\n price: p.price,\n compareAtPrice: p.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: 'active',\n inventoryCount: p.inventory,\n sku: p.sku,\n sortOrder: i,\n metadata: p.metadata ?? {},\n images: [\n {\n id: `img-${id}-0`,\n productId: id,\n url: p.image ?? svgPlaceholder(p.name, hues[0], hues[1]),\n altText: p.name,\n sortOrder: 0,\n isPrimary: true,\n createdAt: T0,\n },\n ],\n categoryId: cat?.id ?? null,\n categoryName: cat?.name ?? null,\n isPhysical: true,\n weight: p.weight ?? 0.5,\n weightUnit: 'kg',\n createdAt: stamp,\n updatedAt: stamp,\n }\n })\n\n const discounts: Discount[] = (input.discounts ?? []).map((d, i) => ({\n id: `disc-${slugifyName(d.code)}`,\n tenantId: 'mock',\n title: d.title ?? `${d.percent}% off`,\n code: d.code,\n type: 'percentage',\n method: 'code',\n value: d.percent,\n usageLimit: null,\n oncePerCustomer: false,\n startsAt: T0,\n endsAt: null,\n status: 'active',\n timesUsed: 0,\n createdAt: T0,\n updatedAt: T0,\n }))\n\n return { products, categories, discounts }\n}\n","import type { ShopProvider } from './provider'\nimport type {\n Product, ProductImage, Category, Order, ShopCustomer, Discount, ProductEnquiry,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateProductEnquiryInput, ListProductEnquiriesOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions,\n} from './types'\nimport { MOCK_PRODUCTS, MOCK_CATEGORIES, MOCK_DISCOUNTS } from './mock-catalog'\n\nfunction uid() { return Math.random().toString(36).slice(2) }\nfunction now() { return new Date().toISOString() }\n\n// Orders/customers persist to localStorage so \"my purchases\" survives a page\n// reload. Products/categories/discounts always reseed from the catalog —\n// the storefront sees a deterministic catalog on every load.\nconst ORDERS_KEY = 'fayz.shop.mock.orders.v1'\nconst CUSTOMERS_KEY = 'fayz.shop.mock.customers.v1'\nconst ENQUIRIES_KEY = 'fayz.shop.mock.enquiries.v1'\n\nfunction loadStored<T>(key: string): T[] {\n try {\n if (typeof localStorage === 'undefined') return []\n const raw = localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as T[]) : []\n } catch {\n return []\n }\n}\n\nfunction store<T>(key: string, value: T[]): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(key, JSON.stringify(value))\n } catch {\n /* quota/serialization failures are non-fatal in mock mode */\n }\n}\n\nexport interface MockShopSeed {\n products?: Product[]\n categories?: Category[]\n discounts?: Discount[]\n}\n\nexport class MockShopProvider implements ShopProvider {\n private products: Product[]\n private categories: Category[]\n private discounts: Discount[]\n private orders: Order[] = loadStored<Order>(ORDERS_KEY)\n private customers: ShopCustomer[] = loadStored<ShopCustomer>(CUSTOMERS_KEY)\n private enquiries: ProductEnquiry[] = loadStored<ProductEnquiry>(ENQUIRIES_KEY)\n\n constructor(seed?: MockShopSeed) {\n this.products = (seed?.products ?? MOCK_PRODUCTS).map(p => ({ ...p }))\n this.categories = (seed?.categories ?? MOCK_CATEGORIES).map(c => ({ ...c }))\n this.discounts = (seed?.discounts ?? MOCK_DISCOUNTS).map(d => ({ ...d }))\n }\n\n // Re-read before mutating: HMR can re-instantiate the provider mid-session\n // and a stale in-memory copy must not clobber persisted records.\n private syncOrders() { this.orders = loadStored<Order>(ORDERS_KEY) }\n private syncCustomers() { this.customers = loadStored<ShopCustomer>(CUSTOMERS_KEY) }\n private syncEnquiries() { this.enquiries = loadStored<ProductEnquiry>(ENQUIRIES_KEY) }\n private persistOrders() { store(ORDERS_KEY, this.orders) }\n private persistCustomers() { store(CUSTOMERS_KEY, this.customers) }\n private persistEnquiries() { store(ENQUIRIES_KEY, this.enquiries) }\n\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(opts?: ListProductsOptions): Promise<Product[]> {\n let list = [...this.products]\n if (opts?.status) list = list.filter(p => p.status === opts.status)\n if (opts?.categoryId) list = list.filter(p => p.categoryId === opts.categoryId)\n if (opts?.slug) list = list.filter(p => p.slug === opts.slug)\n if (opts?.search) {\n const q = opts.search.toLowerCase()\n list = list.filter(p =>\n p.name.toLowerCase().includes(q) ||\n (p.description ?? '').toLowerCase().includes(q) ||\n (p.sku ?? '').toLowerCase().includes(q),\n )\n }\n const orderBy = opts?.orderBy ?? 'sort_order'\n const dir = opts?.order === 'desc' ? -1 : 1\n list.sort((a, b) => {\n switch (orderBy) {\n case 'name': return a.name.localeCompare(b.name) * dir\n case 'price': return (a.price - b.price) * dir\n case 'created_at': return a.createdAt.localeCompare(b.createdAt) * dir\n default: return (a.sortOrder - b.sortOrder) * dir\n }\n })\n const offset = opts?.offset ?? 0\n if (offset || opts?.limit) list = list.slice(offset, opts?.limit ? offset + opts.limit : undefined)\n return list\n }\n\n async getProduct(id: string) { return this.products.find(p => p.id === id) ?? null }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const p: Product = { id: uid(), tenantId: 'mock', name: input.name, slug: input.slug ?? input.name.toLowerCase().replace(/\\s+/g, '-'), description: input.description ?? null, price: input.price, compareAtPrice: input.compareAtPrice ?? null, currency: input.currency ?? 'BRL', status: input.status ?? 'active', inventoryCount: input.inventoryCount ?? 0, sku: input.sku ?? null, sortOrder: input.sortOrder ?? 0, metadata: input.metadata ?? {}, images: [], categoryId: input.categoryId ?? null, categoryName: null, isPhysical: input.isPhysical ?? true, weight: input.weight ?? null, weightUnit: input.weightUnit ?? 'kg', createdAt: now(), updatedAt: now() }\n this.products.push(p); return p\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const i = this.products.findIndex(p => p.id === id)\n if (i < 0) throw new Error('Product not found')\n this.products[i] = { ...this.products[i], ...input, updatedAt: now() }\n return this.products[i]\n }\n\n async deleteProduct(id: string) { this.products = this.products.filter(p => p.id !== id) }\n async uploadProductImage(_productId: string, _file: File): Promise<ProductImage> { throw new Error('Image upload not available in mock mode') }\n async deleteProductImage(_imageId: string) {}\n\n async createProductEnquiry(input: CreateProductEnquiryInput): Promise<ProductEnquiry> {\n this.syncEnquiries()\n const ts = now()\n const enquiry: ProductEnquiry = {\n id: uid(),\n tenantId: 'mock',\n productId: input.productId ?? null,\n productName: input.productName,\n productSlug: input.productSlug ?? null,\n customerName: input.customerName,\n customerEmail: input.customerEmail,\n customerPhone: input.customerPhone ?? null,\n subject: input.subject ?? null,\n message: input.message,\n sourceUrl: input.sourceUrl ?? null,\n status: 'new',\n metadata: input.metadata ?? {},\n createdAt: ts,\n updatedAt: ts,\n }\n this.enquiries.unshift(enquiry)\n this.persistEnquiries()\n return enquiry\n }\n\n async listProductEnquiries(opts?: ListProductEnquiriesOptions): Promise<ProductEnquiry[]> {\n this.syncEnquiries()\n let list = [...this.enquiries]\n if (opts?.productId) list = list.filter((e) => e.productId === opts.productId)\n if (opts?.customerEmail) {\n const email = opts.customerEmail.toLowerCase()\n list = list.filter((e) => e.customerEmail.toLowerCase() === email)\n }\n if (opts?.status) list = list.filter((e) => e.status === opts.status)\n list.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n const offset = opts?.offset ?? 0\n if (offset || opts?.limit) list = list.slice(offset, opts?.limit ? offset + opts.limit : undefined)\n return list\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories() { return [...this.categories].sort((a, b) => a.sortOrder - b.sortOrder) }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const c: Category = { id: uid(), tenantId: 'mock', name: input.name, slug: input.slug ?? input.name.toLowerCase().replace(/\\s+/g, '-'), description: input.description ?? null, parentId: input.parentId ?? null, sortOrder: input.sortOrder ?? 0, createdAt: now() }\n this.categories.push(c); return c\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const i = this.categories.findIndex(c => c.id === id)\n if (i < 0) throw new Error('Category not found')\n this.categories[i] = { ...this.categories[i], ...input }\n return this.categories[i]\n }\n\n async deleteCategory(id: string) { this.categories = this.categories.filter(c => c.id !== id) }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(opts?: ListOrdersOptions): Promise<Order[]> {\n this.syncOrders()\n let list = [...this.orders]\n if (opts?.status) list = list.filter(o => o.status === opts.status)\n if (opts?.financialStatus) list = list.filter(o => o.financialStatus === opts.financialStatus)\n if (opts?.fulfillmentStatus) list = list.filter(o => o.fulfillmentStatus === opts.fulfillmentStatus)\n if (opts?.customerId) list = list.filter(o => o.customerId === opts.customerId)\n if (opts?.customerEmail) {\n const email = opts.customerEmail.toLowerCase()\n list = list.filter(o => (o.customerEmail ?? '').toLowerCase() === email)\n }\n if (opts?.search) {\n const q = opts.search.toLowerCase()\n list = list.filter(o =>\n (o.customerName ?? '').toLowerCase().includes(q) ||\n (o.customerEmail ?? '').toLowerCase().includes(q) ||\n String(o.orderNumber).includes(q),\n )\n }\n list.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getOrder(id: string) {\n this.syncOrders()\n return this.orders.find(o => o.id === id) ?? null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n this.syncOrders()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const orderId = uid()\n const maxNumber = this.orders.reduce((m, o) => Math.max(m, o.orderNumber), 1000)\n const o: Order = {\n id: orderId,\n tenantId: 'mock',\n orderNumber: maxNumber + 1,\n status: 'open',\n financialStatus: 'pending',\n fulfillmentStatus: 'unfulfilled',\n currency: input.currency ?? 'BRL',\n subtotal: Math.round(subtotal * 100) / 100,\n taxTotal: 0,\n discountTotal,\n shippingTotal,\n total,\n customerId: input.customerId ?? null,\n customerName: input.customerName ?? null,\n customerEmail: input.customerEmail ?? null,\n discountCode: input.discountCode ?? null,\n notes: input.notes ?? null,\n shippingAddress: null,\n // CreateOrderInput has no payment method — that is a PlaceOrderInput\n // concern; the mock records none rather than inventing one.\n paymentMethodKind: null,\n paidAt: null,\n items: input.items.map(i => ({ id: uid(), orderId, productId: i.productId ?? null, name: i.name, sku: i.sku ?? null, quantity: i.quantity, unitPrice: i.unitPrice, total: Math.round(i.quantity * i.unitPrice * 100) / 100, imageUrl: i.imageUrl ?? null })),\n createdAt: now(),\n updatedAt: now(),\n }\n this.orders.push(o)\n this.persistOrders()\n return o\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n this.syncOrders()\n const i = this.orders.findIndex(o => o.id === id)\n if (i < 0) throw new Error('Order not found')\n this.orders[i] = { ...this.orders[i], ...input, updatedAt: now() }\n this.persistOrders()\n return this.orders[i]\n }\n\n // Trusted placement (mock parity with the shop_place_order RPC): re-reads\n // prices + stock from the catalog, validates the discount, decrements\n // inventory. The browser-supplied prices are never used.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n this.syncOrders()\n this.syncCustomers()\n\n // Resolve / create the customer (find-or-create by email).\n let customerId = input.customerId ?? null\n let customerName = input.customer?.name?.trim() || null\n const email = input.customer?.email?.trim().toLowerCase() || null\n if (!customerId && email) {\n const existing = this.customers.find(c => (c.email ?? '').toLowerCase() === email)\n if (existing) {\n customerId = existing.id\n customerName = customerName ?? `${existing.firstName} ${existing.lastName}`.trim()\n } else {\n const [first, ...rest] = (customerName ?? email).split(' ')\n const created = await this.createCustomer({ firstName: first || email, lastName: rest.join(' '), email })\n customerId = created.id\n }\n }\n\n // Re-read price + guard stock from the catalog (never trust the client).\n const items: CreateOrderInput['items'] = []\n let subtotal = 0\n for (const line of input.items) {\n const product = this.products.find(p => p.id === line.productId)\n if (!product || product.status !== 'active') throw new Error(`Product unavailable: ${line.productId}`)\n if (product.inventoryCount < line.quantity) throw new Error(`Insufficient stock for ${product.name}`)\n const name = line.optionsLabel ? `${product.name} (${line.optionsLabel})` : product.name\n subtotal += product.price * line.quantity\n items.push({ productId: product.id, name, sku: product.sku ?? undefined, quantity: line.quantity, unitPrice: product.price, imageUrl: product.images[0]?.url })\n }\n subtotal = Math.round(subtotal * 100) / 100\n\n // Validate + apply the discount server-side.\n let shippingTotal = Math.max(input.shippingTotal ?? 0, 0)\n let discountTotal = 0\n let appliedCode: string | null = null\n if (input.discountCode) {\n const code = input.discountCode.trim().toLowerCase()\n const d = this.discounts.find(x => (x.code ?? '').toLowerCase() === code)\n const ts = now()\n const valid = !!d && d.status === 'active' && d.startsAt <= ts && (!d.endsAt || d.endsAt >= ts) && (d.usageLimit == null || d.timesUsed < d.usageLimit)\n if (valid && d) {\n appliedCode = d.code\n if (d.type === 'percentage') discountTotal = Math.round(subtotal * d.value) / 100\n else if (d.type === 'fixed_amount') discountTotal = Math.min(d.value, subtotal)\n else if (d.type === 'free_shipping') shippingTotal = 0\n // buy_x_get_y unsupported in v1: code recorded, no monetary effect\n d.timesUsed += 1\n }\n }\n discountTotal = Math.round(Math.min(Math.max(discountTotal, 0), subtotal) * 100) / 100\n\n // Persist via createOrder (recomputes total from these trusted values).\n const order = await this.createOrder({\n customerId: customerId ?? undefined,\n customerName: customerName ?? undefined,\n customerEmail: input.customer?.email ?? undefined,\n currency: input.currency,\n notes: input.notes,\n discountCode: appliedCode ?? undefined,\n discountTotal,\n shippingTotal,\n items,\n })\n\n // Decrement inventory (in-memory; the mock catalog reseeds on reload).\n for (const line of input.items) {\n const product = this.products.find(p => p.id === line.productId)\n if (product) product.inventoryCount = Math.max(0, product.inventoryCount - line.quantity)\n }\n\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(opts?: ListCustomersOptions) {\n this.syncCustomers()\n let list = [...this.customers]\n if (opts?.search) list = list.filter(c => `${c.firstName} ${c.lastName} ${c.email}`.toLowerCase().includes(opts.search!.toLowerCase()))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getCustomer(id: string) {\n this.syncCustomers()\n return this.customers.find(c => c.id === id) ?? null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const c: ShopCustomer = { id: uid(), tenantId: 'mock', firstName: input.firstName, lastName: input.lastName ?? '', email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null, ordersCount: 0, totalSpent: 0, createdAt: now(), updatedAt: now() }\n this.customers.push(c)\n this.persistCustomers()\n return c\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const i = this.customers.findIndex(c => c.id === id)\n if (i < 0) throw new Error('Customer not found')\n this.customers[i] = { ...this.customers[i], ...input, updatedAt: now() }\n this.persistCustomers()\n return this.customers[i]\n }\n\n async deleteCustomer(id: string) {\n this.syncCustomers()\n this.customers = this.customers.filter(c => c.id !== id)\n this.persistCustomers()\n }\n\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n this.syncCustomers()\n const email = input.email.trim().toLowerCase()\n const existing = this.customers.find(c => (c.email ?? '').toLowerCase() === email)\n if (existing) return existing\n const [first, ...rest] = (input.name?.trim() || email).split(/\\s+/)\n return this.createCustomer({ firstName: first || email, lastName: rest.join(' '), email })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(opts?: ListDiscountsOptions) {\n let list = [...this.discounts]\n if (opts?.status) list = list.filter(d => d.status === opts.status)\n if (opts?.type) list = list.filter(d => d.type === opts.type)\n if (opts?.search) list = list.filter(d => d.title.toLowerCase().includes(opts.search!.toLowerCase()))\n if (opts?.limit) list = list.slice(0, opts.limit)\n return list\n }\n\n async getDiscount(id: string) { return this.discounts.find(d => d.id === id) ?? null }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const d: Discount = { id: uid(), tenantId: 'mock', title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usageLimit: input.usageLimit ?? null, oncePerCustomer: input.oncePerCustomer ?? false, startsAt: input.startsAt ?? now(), endsAt: input.endsAt ?? null, status: input.status ?? 'active', timesUsed: 0, createdAt: now(), updatedAt: now() }\n this.discounts.push(d); return d\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const i = this.discounts.findIndex(d => d.id === id)\n if (i < 0) throw new Error('Discount not found')\n this.discounts[i] = { ...this.discounts[i], ...input, updatedAt: now() }\n return this.discounts[i]\n }\n\n async deleteDiscount(id: string) { this.discounts = this.discounts.filter(d => d.id !== id) }\n}\n\nexport function createMockShopProvider(seed?: MockShopSeed): ShopProvider {\n return new MockShopProvider(seed)\n}\n","import type { ShopProvider } from './provider'\nimport { createMockShopProvider } from './mock-provider'\n\nlet provider: ShopProvider | null = null\nlet mockFallback: ShopProvider | null = null\n\nexport function getShopProvider(): ShopProvider {\n if (provider) return provider\n if (!mockFallback) mockFallback = createMockShopProvider()\n return mockFallback\n}\n\nexport function setShopProvider(nextProvider: ShopProvider): void {\n provider = nextProvider\n}\n\nexport function resetShopProvider(): void {\n provider = null\n mockFallback = null\n}\n","import { getShopProvider } from './runtime'\nimport type { ShopProvider } from './provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","// Tenant scoping for shop queries. @fayz-ai/shop has no dependency on @fayz-ai/saas —\n// the host app (or @fayz-ai/plugin-shop) registers a resolver that returns the\n// current tenant id. When no resolver is set, queries are unscoped (RLS still\n// applies server-side).\n\nexport type TenantResolver = () => string | undefined\n\nlet _resolver: TenantResolver | null = null\n\nexport function setShopTenantResolver(resolver: TenantResolver): void {\n _resolver = resolver\n}\n\nexport function getShopTenantId(): string | undefined {\n if (!_resolver) return undefined\n try {\n return _resolver()\n } catch {\n return undefined\n }\n}\n","// Physical table names for @fayz-ai/shop. Renamed to the plg_shop_* industry-pool\n// prefix (was shop_*) when the core DB moved into the public schema. RPC function\n// names (shop_place_order, shop_get_order, shop_resolve_customer) are unchanged.\nexport const T = {\n products: 'plg_shop_products',\n productImages: 'plg_shop_product_images',\n categories: 'plg_shop_categories',\n orders: 'plg_shop_orders',\n orderItems: 'plg_shop_order_items',\n customers: 'plg_shop_customers',\n discounts: 'plg_shop_discounts',\n // Core, not plg_shop_*: a delivery zone is a fact about the business, and\n // fulfilment and financial read it too. Same reasoning as addresses and\n // orders — see migration 0021.\n shippingZones: 'shipping_zones',\n} as const\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ShopProvider } from './provider'\nimport { getShopTenantId } from './tenant'\nimport { T } from './tables'\nimport type {\n Product, ProductImage, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, OrderItem,\n ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput } from './types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\n/** 8 bare digits, zero-padded — the shape shipping_zones stores and compares. */\nfunction toPostalDigits(value: string | undefined | null): string | undefined {\n const digits = String(value ?? '').replace(/\\D/g, '')\n return digits ? digits.padStart(8, '0').slice(0, 8) : undefined\n}\n\nfunction rowToShippingZone(row: any): ShippingZone {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n carrier: row.carrier ?? null,\n postalFrom: String(row.postal_from ?? '').trim(),\n postalTo: String(row.postal_to ?? '').trim(),\n rate: Number(row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? null,\n etaMaxDays: row.eta_max_days ?? null,\n active: row.active ?? true,\n sortOrder: row.sort_order ?? 0,\n }\n}\n\nfunction shippingZonePayload(input: Partial<CreateShippingZoneInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrier !== undefined) payload.carrier = input.carrier || null\n if (input.postalFrom !== undefined) payload.postal_from = toPostalDigits(input.postalFrom)\n if (input.postalTo !== undefined) payload.postal_to = toPostalDigits(input.postalTo)\n if (input.rate !== undefined) payload.rate = input.rate\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove ?? null\n if (input.etaMinDays !== undefined) payload.eta_min_days = input.etaMinDays ?? null\n if (input.etaMaxDays !== undefined) payload.eta_max_days = input.etaMaxDays ?? null\n if (input.active !== undefined) payload.active = input.active\n if (input.sortOrder !== undefined) payload.sort_order = input.sortOrder\n return payload\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\n/**\n * Order items were being passed through raw, so every snake_case column arrived\n * undefined on the camelCase type: unit_price, image_url and product_id were all\n * lost. `total` survived only because the name matches in both, which is exactly\n * why the bug looked like \"price is zero\" instead of \"nothing is mapped\".\n */\nfunction rowToOrderItem(row: any): OrderItem {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.products).select(`*, images:${T.productImages}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.products)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n })\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n const { data, error } = await db\n .from(T.products).update(updates).eq('id', id)\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from(T.products).delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n\n // Every upload used to land as sort_order 0 / is_primary false, so a product\n // whose only photo was uploaded here had NO primary at all, and a second one\n // tied with the first for position. New photos now go to the end, and the\n // first photo a product ever gets becomes its primary.\n const { data: existing } = await db\n .from(T.productImages)\n .select('id,sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: false })\n .limit(1)\n const first = !existing || existing.length === 0\n const nextOrder = first ? 0 : (existing[0].sort_order ?? 0) + 1\n\n const { data, error } = await db\n .from(T.productImages)\n .insert({\n product_id: productId, tenant_id: tenantId, url: publicUrl,\n sort_order: nextOrder, is_primary: first,\n })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async updateProductImage(\n imageId: string,\n input: { isPrimary?: boolean; sortOrder?: number; altText?: string | null },\n ): Promise<ProductImage> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n if (input.altText !== undefined) updates.alt_text = input.altText\n if (input.isPrimary !== undefined) updates.is_primary = input.isPrimary\n\n // Demote the incumbent first. Doing it after would leave a window with two\n // primaries, and if the second statement failed the product would keep two\n // for good.\n if (input.isPrimary) {\n const { data: target } = await db\n .from(T.productImages).select('product_id').eq('id', imageId).single()\n if (target?.product_id) {\n await db.from(T.productImages)\n .update({ is_primary: false })\n .eq('product_id', target.product_id)\n .neq('id', imageId)\n }\n }\n\n const { data, error } = await db\n .from(T.productImages).update(updates).eq('id', imageId).select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const { error } = await getDb().from(T.productImages).delete().eq('id', imageId)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.categories).select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from(T.categories)\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from(T.categories).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from(T.categories).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.orders).select(`*, items:${T.orderItems}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const { data, error } = await getDb()\n .from(T.orders).select(`*, items:${T.orderItems}(*)`)\n .eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToOrder(data) : null\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from(T.orders)\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from(T.orderItems).insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from(T.orders).update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // -------------------------------------------------------------------------\n // Delivery zones\n //\n // Postal codes are stored as 8 bare digits so the range test in\n // shop_quote_shipping is a plain BETWEEN. Accepting '22.041-001' from the\n // form and normalising here means the merchant never has to think about it.\n // -------------------------------------------------------------------------\n async listShippingZones(): Promise<ShippingZone[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n .order('postal_from', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingZone)\n }\n\n async createShippingZone(input: CreateShippingZoneInput): Promise<ShippingZone> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingZone requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .insert({ tenant_id: tenantId, ...shippingZonePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async updateShippingZone(id: string, input: UpdateShippingZoneInput): Promise<ShippingZone> {\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .update(shippingZonePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async deleteShippingZone(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingZones).delete().eq('id', id)\n if (error) throw error\n }\n\n /**\n * Settle a pending order: the merchant confirming that the money arrived.\n *\n * Goes through the RPC rather than an UPDATE so the payment ledger row in\n * public.transactions closes in the same transaction as the order — set\n * financial_status by hand and the order says paid while the ledger still\n * says pending. Since 0019 the RPC also enforces who may call it: a member of\n * the owning tenant, or a PSP webhook with the service role.\n */\n async confirmPayment(id: string, reference?: string): Promise<Order | null> {\n const { error } = await getDb().rpc('shop_confirm_payment', {\n p_order_id: id,\n p_reference: reference ?? null,\n })\n if (error) throw error\n return this.getOrder(id)\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n p_items: input.items.map(i => ({ product_id: i.productId, quantity: i.quantity, options_label: i.optionsLabel ?? null })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customers).select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.search) q = q.or(`first_name.ilike.%${options.search}%,last_name.ilike.%${options.search}%,email.ilike.%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from(T.customers).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from(T.customers)\n .insert({ tenant_id: getTenantId(), first_name: input.firstName, last_name: input.lastName ?? '', email: input.email ?? null, phone: input.phone ?? null, notes: input.notes ?? null })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from(T.customers).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from(T.customers).delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.discounts).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from(T.discounts).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from(T.discounts)\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from(T.discounts).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from(T.discounts).delete().eq('id', id)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n"]}