@fayz-ai/shop 0.8.3 → 0.8.4
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.
- package/dist/catalog.cjs +8 -0
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.js +8 -0
- package/dist/catalog.js.map +1 -1
- package/dist/index.cjs +121 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -6
- package/dist/index.js.map +1 -1
- package/dist/mock-catalog.d.ts.map +1 -1
- package/dist/mock-provider.d.ts +8 -1
- package/dist/mock-provider.d.ts.map +1 -1
- package/dist/mock.cjs +62 -5
- package/dist/mock.cjs.map +1 -1
- package/dist/mock.js +62 -5
- package/dist/mock.js.map +1 -1
- package/dist/provider.d.ts +5 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/runtime.cjs +62 -5
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +62 -5
- package/dist/runtime.js.map +1 -1
- package/dist/supabase-provider.d.ts +5 -1
- package/dist/supabase-provider.d.ts.map +1 -1
- package/dist/tables.d.ts +1 -0
- package/dist/tables.d.ts.map +1 -1
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -0
- package/src/mock-catalog.ts +8 -0
- package/src/mock-provider.ts +63 -5
- package/src/provider.ts +8 -0
- package/src/supabase-provider.ts +64 -1
- package/src/tables.ts +1 -0
- package/src/types.ts +67 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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 minSubtotal: null,\n appliesTo: 'all',\n productIds: [],\n categoryIds: [],\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 minSubtotal: null,\n appliesTo: 'all',\n productIds: [],\n categoryIds: [],\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 SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\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'\nconst CHANNELS_KEY = 'fayz.shop.mock.channels.v1'\n\nconst DEFAULT_CHANNELS: SalesChannel[] = [\n { id: 'online-store', tenantId: 'mock', kind: 'online_store', label: 'Loja Online', url: null, enabled: true, position: 0, createdAt: now(), updatedAt: now() },\n]\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 private channels: SalesChannel[] = (() => {\n const stored = loadStored<SalesChannel>(CHANNELS_KEY)\n return stored.length ? stored : DEFAULT_CHANNELS.map(c => ({ ...c }))\n })()\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 syncChannels() {\n const stored = loadStored<SalesChannel>(CHANNELS_KEY)\n if (stored.length) this.channels = stored\n }\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 private persistChannels() { store(CHANNELS_KEY, this.channels) }\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 // Per-line facts for coupon scoping (productId, categoryId, line total).\n const lineDetails: Array<{ productId: string; categoryId: string | null; lineTotal: number }> = []\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 const lineTotal = product.price * line.quantity\n subtotal += lineTotal\n lineDetails.push({ productId: product.id, categoryId: product.categoryId, lineTotal })\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 meetsMin = !d?.minSubtotal || subtotal >= d.minSubtotal\n const valid = !!d && d.status === 'active' && d.startsAt <= ts && (!d.endsAt || d.endsAt >= ts) && (d.usageLimit == null || d.timesUsed < d.usageLimit) && meetsMin\n if (valid && d) {\n appliedCode = d.code\n // Eligible subtotal = the part of the cart the coupon is scoped to.\n // applies_to='all' → whole subtotal (unchanged for legacy coupons).\n let eligible = subtotal\n if (d.appliesTo === 'products') {\n eligible = lineDetails.filter(l => d.productIds.includes(l.productId)).reduce((s, l) => s + l.lineTotal, 0)\n } else if (d.appliesTo === 'categories') {\n eligible = lineDetails.filter(l => l.categoryId && d.categoryIds.includes(l.categoryId)).reduce((s, l) => s + l.lineTotal, 0)\n }\n eligible = Math.round(eligible * 100) / 100\n if (d.type === 'percentage') discountTotal = Math.round(eligible * d.value) / 100\n else if (d.type === 'fixed_amount') discountTotal = Math.min(d.value, eligible)\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, minSubtotal: input.minSubtotal ?? null, appliesTo: input.appliesTo ?? 'all', productIds: input.productIds ?? [], categoryIds: input.categoryIds ?? [], 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 // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n this.syncChannels()\n return [...this.channels].sort((a, b) => a.position - b.position)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n this.syncChannels()\n const c: SalesChannel = { id: uid(), tenantId: 'mock', kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? this.channels.length, createdAt: now(), updatedAt: now() }\n this.channels.push(c); this.persistChannels(); return c\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n this.syncChannels()\n const i = this.channels.findIndex(c => c.id === id)\n if (i < 0) throw new Error('Sales channel not found')\n this.channels[i] = { ...this.channels[i], ...input, updatedAt: now() }\n this.persistChannels(); return this.channels[i]\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n this.syncChannels()\n this.channels = this.channels.filter(c => c.id !== id)\n this.persistChannels()\n }\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 salesChannels: 'plg_shop_channels',\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 SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\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 minSubtotal: row.min_subtotal ?? null,\n appliesTo: row.applies_to ?? 'all',\n productIds: row.product_ids ?? [],\n categoryIds: row.category_ids ?? [],\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\nfunction rowToSalesChannel(row: any): SalesChannel {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind,\n label: row.label,\n url: row.url,\n enabled: row.enabled ?? true,\n position: row.position ?? 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, min_subtotal: input.minSubtotal ?? null, applies_to: input.appliesTo ?? 'all', product_ids: input.productIds ?? [], category_ids: input.categoryIds ?? [], 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.minSubtotal !== undefined) updates.min_subtotal = input.minSubtotal\n if (input.appliesTo !== undefined) updates.applies_to = input.appliesTo\n if (input.productIds !== undefined) updates.product_ids = input.productIds\n if (input.categoryIds !== undefined) updates.category_ids = input.categoryIds\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 // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.salesChannels).select('*').order('position', { 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(rowToSalesChannel)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n const { data, error } = await getDb()\n .from(T.salesChannels)\n .insert({ tenant_id: getTenantId(), kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? 0 })\n .select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n const updates: Record<string, unknown> = {}\n if (input.kind !== undefined) updates.kind = input.kind\n if (input.label !== undefined) updates.label = input.label\n if (input.url !== undefined) updates.url = input.url\n if (input.enabled !== undefined) updates.enabled = input.enabled\n if (input.position !== undefined) updates.position = input.position\n const { data, error } = await getDb().from(T.salesChannels).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n const { error } = await getDb().from(T.salesChannels).delete().eq('id', id)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n"]}
|