@fayz-ai/shop 0.9.0 → 0.10.0

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.
Files changed (144) hide show
  1. package/README.md +18 -1
  2. package/dist/admin.d.ts +2 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/catalog.d.ts +1 -3
  5. package/dist/catalog.d.ts.map +1 -1
  6. package/dist/catalog.js +2 -2
  7. package/dist/chunk-3GERSY5F.js +526 -0
  8. package/dist/chunk-3GERSY5F.js.map +1 -0
  9. package/dist/chunk-FQPGE3YN.js +3 -0
  10. package/dist/{chunk-JR25TISO.js.map → chunk-FQPGE3YN.js.map} +1 -1
  11. package/dist/{chunk-CTKZ6O2J.js → chunk-IKNGCRUM.js} +41 -15
  12. package/dist/chunk-IKNGCRUM.js.map +1 -0
  13. package/dist/{chunk-IYQHKMLB.js → chunk-IL6GA4ER.js} +4 -4
  14. package/dist/chunk-IL6GA4ER.js.map +1 -0
  15. package/dist/chunk-KLDS7IPU.js +17 -0
  16. package/dist/chunk-KLDS7IPU.js.map +1 -0
  17. package/dist/chunk-RGTIJQJL.js +93 -0
  18. package/dist/chunk-RGTIJQJL.js.map +1 -0
  19. package/dist/{chunk-SVTCJ6HP.js → chunk-U3O2I3RM.js} +395 -27
  20. package/dist/chunk-U3O2I3RM.js.map +1 -0
  21. package/dist/chunk-XERLK5LD.js +1415 -0
  22. package/dist/chunk-XERLK5LD.js.map +1 -0
  23. package/dist/chunk-XOP6SHPB.js +142 -0
  24. package/dist/chunk-XOP6SHPB.js.map +1 -0
  25. package/dist/client.d.ts +2 -0
  26. package/dist/client.d.ts.map +1 -0
  27. package/dist/{mock-catalog.d.ts → data/mock-catalog.d.ts} +21 -1
  28. package/dist/data/mock-catalog.d.ts.map +1 -0
  29. package/dist/data/mock-provider.d.ts +133 -0
  30. package/dist/data/mock-provider.d.ts.map +1 -0
  31. package/dist/data/mock.d.ts +3 -0
  32. package/dist/data/mock.d.ts.map +1 -0
  33. package/dist/data/provider.d.ts +142 -0
  34. package/dist/data/provider.d.ts.map +1 -0
  35. package/dist/data/supabase-provider.d.ts +100 -0
  36. package/dist/data/supabase-provider.d.ts.map +1 -0
  37. package/dist/data/tables.d.ts +35 -0
  38. package/dist/data/tables.d.ts.map +1 -0
  39. package/dist/data/tenant.d.ts.map +1 -0
  40. package/dist/entities/entity-reconcile.d.ts +32 -0
  41. package/dist/entities/entity-reconcile.d.ts.map +1 -0
  42. package/dist/entities/entity-sql.d.ts +50 -0
  43. package/dist/entities/entity-sql.d.ts.map +1 -0
  44. package/dist/entities/entity-store.d.ts +58 -0
  45. package/dist/entities/entity-store.d.ts.map +1 -0
  46. package/dist/entities/index.d.ts +11 -0
  47. package/dist/entities/index.d.ts.map +1 -0
  48. package/dist/entities/mock-entity-store.d.ts +17 -0
  49. package/dist/entities/mock-entity-store.d.ts.map +1 -0
  50. package/dist/entities/sidecar.d.ts +9 -0
  51. package/dist/entities/sidecar.d.ts.map +1 -0
  52. package/dist/entities/supabase-entity-store.d.ts +8 -0
  53. package/dist/entities/supabase-entity-store.d.ts.map +1 -0
  54. package/dist/entities.js +159 -0
  55. package/dist/entities.js.map +1 -0
  56. package/dist/index.d.ts +17 -10
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +728 -41
  59. package/dist/index.js.map +1 -1
  60. package/dist/inventory/allocation.d.ts +98 -0
  61. package/dist/inventory/allocation.d.ts.map +1 -0
  62. package/dist/inventory/index.d.ts +13 -0
  63. package/dist/inventory/index.d.ts.map +1 -0
  64. package/dist/inventory/mock-stock-store.d.ts +89 -0
  65. package/dist/inventory/mock-stock-store.d.ts.map +1 -0
  66. package/dist/inventory/postgrest-double.d.ts +65 -0
  67. package/dist/inventory/postgrest-double.d.ts.map +1 -0
  68. package/dist/inventory/shopify-mapping.d.ts +67 -0
  69. package/dist/inventory/shopify-mapping.d.ts.map +1 -0
  70. package/dist/inventory/stock-contract.d.ts +46 -0
  71. package/dist/inventory/stock-contract.d.ts.map +1 -0
  72. package/dist/inventory/stock-store.d.ts +96 -0
  73. package/dist/inventory/stock-store.d.ts.map +1 -0
  74. package/dist/inventory/stock-types.d.ts +292 -0
  75. package/dist/inventory/stock-types.d.ts.map +1 -0
  76. package/dist/inventory/supabase-stock-store.d.ts +59 -0
  77. package/dist/inventory/supabase-stock-store.d.ts.map +1 -0
  78. package/dist/inventory/vocabulary.d.ts +86 -0
  79. package/dist/inventory/vocabulary.d.ts.map +1 -0
  80. package/dist/inventory.js +4 -0
  81. package/dist/inventory.js.map +1 -0
  82. package/dist/lib/catalog.d.ts +4 -0
  83. package/dist/lib/catalog.d.ts.map +1 -0
  84. package/dist/{commerce.d.ts → lib/commerce.d.ts} +2 -2
  85. package/dist/lib/commerce.d.ts.map +1 -0
  86. package/dist/lib/emails.d.ts +50 -0
  87. package/dist/lib/emails.d.ts.map +1 -0
  88. package/dist/lib/message-events.d.ts +4 -0
  89. package/dist/lib/message-events.d.ts.map +1 -0
  90. package/dist/lib/runtime.d.ts +5 -0
  91. package/dist/lib/runtime.d.ts.map +1 -0
  92. package/dist/mock.d.ts +1 -2
  93. package/dist/mock.d.ts.map +1 -1
  94. package/dist/mock.js +4 -2
  95. package/dist/provider.d.ts +1 -88
  96. package/dist/provider.d.ts.map +1 -1
  97. package/dist/rules/adapter.d.ts +36 -0
  98. package/dist/rules/adapter.d.ts.map +1 -0
  99. package/dist/rules/attributes.d.ts +64 -0
  100. package/dist/rules/attributes.d.ts.map +1 -0
  101. package/dist/rules/context.d.ts +43 -0
  102. package/dist/rules/context.d.ts.map +1 -0
  103. package/dist/rules/evaluator.d.ts +37 -0
  104. package/dist/rules/evaluator.d.ts.map +1 -0
  105. package/dist/rules/index.d.ts +13 -0
  106. package/dist/rules/index.d.ts.map +1 -0
  107. package/dist/rules/prices.d.ts +25 -0
  108. package/dist/rules/prices.d.ts.map +1 -0
  109. package/dist/rules/rule-types.d.ts +160 -0
  110. package/dist/rules/rule-types.d.ts.map +1 -0
  111. package/dist/rules.js +22 -0
  112. package/dist/rules.js.map +1 -0
  113. package/dist/runtime.d.ts +1 -4
  114. package/dist/runtime.d.ts.map +1 -1
  115. package/dist/runtime.js +5 -3
  116. package/dist/types.d.ts +231 -0
  117. package/dist/types.d.ts.map +1 -1
  118. package/package.json +26 -20
  119. package/dist/chunk-CTKZ6O2J.js.map +0 -1
  120. package/dist/chunk-IYQHKMLB.js.map +0 -1
  121. package/dist/chunk-JR25TISO.js +0 -3
  122. package/dist/chunk-SVTCJ6HP.js.map +0 -1
  123. package/dist/commerce.d.ts.map +0 -1
  124. package/dist/mock-catalog.d.ts.map +0 -1
  125. package/dist/mock-provider.d.ts +0 -60
  126. package/dist/mock-provider.d.ts.map +0 -1
  127. package/dist/supabase-provider.d.ts +0 -56
  128. package/dist/supabase-provider.d.ts.map +0 -1
  129. package/dist/tables.d.ts +0 -12
  130. package/dist/tables.d.ts.map +0 -1
  131. package/dist/tenant.d.ts.map +0 -1
  132. package/src/catalog.ts +0 -3
  133. package/src/commerce.ts +0 -120
  134. package/src/index.ts +0 -40
  135. package/src/mock-catalog.ts +0 -266
  136. package/src/mock-provider.ts +0 -480
  137. package/src/mock.ts +0 -2
  138. package/src/provider.ts +0 -117
  139. package/src/runtime.ts +0 -20
  140. package/src/supabase-provider.ts +0 -754
  141. package/src/tables.ts +0 -17
  142. package/src/tenant.ts +0 -21
  143. package/src/types.ts +0 -623
  144. /package/dist/{tenant.d.ts → data/tenant.d.ts} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commerce.ts","../src/tenant.ts","../src/tables.ts","../src/supabase-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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"]}
1
+ {"version":3,"sources":["../src/lib/commerce.ts","../src/data/supabase-provider.ts","../src/lib/emails.ts","../src/lib/message-events.ts"],"names":["error"],"mappings":"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","file":"index.js","sourcesContent":["import { getShopProvider } from './runtime'\nimport type { ShopProvider } from '../data/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","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { resolveEntityStore } from '../entities/entity-store'\nimport type { EntityRecord, EntityRecordInput, ListEntityRecordsOptions } from '../entities/entity-store'\nimport { createSupabaseEntityStore } from '../entities/supabase-entity-store'\nimport { SIDECAR_TABLE, validateSidecarWrite } from '../entities/sidecar'\nimport type { ShopProvider } from './provider'\nimport type { ComputeAction, RuleCartSnapshot } from '../rules/rule-types'\nimport { getShopTenantId } from './tenant'\nimport { T } from './tables'\nimport type {\n Product, ProductImage, ProductOption, ProductVariant, ProductVariantSet, 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,\n Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, CreateGiftCardInput, UpdateGiftCardInput, EmailTemplate, UpsertEmailTemplateInput, MediaFile,\n} from '../types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\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\nfunction segmentPayload(input: Partial<CreateCustomerSegmentInput>): Record<string, unknown> {\n const p: Record<string, unknown> = {}\n if (input.name !== undefined) p.name = input.name\n if (input.description !== undefined) p.description = input.description\n if (input.minOrders !== undefined) p.min_orders = nullableNumber(input.minOrders)\n if (input.maxOrders !== undefined) p.max_orders = nullableNumber(input.maxOrders)\n if (input.minSpent !== undefined) p.min_spent = nullableNumber(input.minSpent)\n if (input.maxSpent !== undefined) p.max_spent = nullableNumber(input.maxSpent)\n if (input.joinedAfter !== undefined) p.joined_after = input.joinedAfter || null\n if (input.joinedBefore !== undefined) p.joined_before = input.joinedBefore || null\n return p\n}\n\nconst GIFT_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRTUVWXY2346789'\nconst IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'bmp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mov', 'webm', 'm4v', 'avi', 'mkv'])\n\nfunction generateGiftCardCode(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto.getRandomValues(bytes)\n const chars = Array.from(bytes, (b) => GIFT_CODE_ALPHABET[b % GIFT_CODE_ALPHABET.length])\n return `${chars.slice(0, 4).join('')}-${chars.slice(4, 8).join('')}-${chars.slice(8, 12).join('')}`\n}\n\nexport function mediaKindOf(name: string, mime?: string | null): MediaFile['kind'] {\n if (mime?.startsWith('image/')) return 'image'\n if (mime?.startsWith('video/')) return 'video'\n const ext = (name.split('.').pop() ?? '').toLowerCase()\n if (IMAGE_EXTENSIONS.has(ext)) return 'image'\n if (VIDEO_EXTENSIONS.has(ext)) return 'video'\n return 'document'\n}\n\n// ---------------------------------------------------------------------------\n// Mapeadores das entidades resgatadas da onda de 04-ago. Nenhum toca variante\n// nem o ledger de estoque — esses seguem os desta branch.\n// ---------------------------------------------------------------------------\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToCollection(row: any): Collection {\n // Members arrive as the embedded join rows; the editorial order lives on the\n // join, so sort by it here rather than trusting PostgREST's arrival order.\n const members = (row.members ?? []) as Array<{ product_id: string; position: number | null }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n handle: row.handle ?? slugify(row.title ?? ''),\n description: row.description ?? null,\n imageUrl: row.image_url ?? null,\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n published: row.published ?? true,\n sortOrder: row.sort_order ?? 0,\n productIds: [...members]\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((m) => m.product_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerGroup(row: any): CustomerGroup {\n const members = (row.members ?? []) as Array<{ customer_id: string }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n color: row.color ?? null,\n customerIds: members.map((m) => m.customer_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerSegment(row: any): CustomerSegment {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n minOrders: nullableNumber(row.min_orders),\n maxOrders: nullableNumber(row.max_orders),\n minSpent: nullableNumber(row.min_spent),\n maxSpent: nullableNumber(row.max_spent),\n joinedAfter: row.joined_after ?? null,\n joinedBefore: row.joined_before ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n// A plg_automations_templates row: `event_key` carries the owning module\n// ('shop.order_shipped') and the shop's own vocabulary is what follows the dot.\nconst SHOP_EVENT_PREFIX = 'shop.'\nconst EMAIL_CHANNEL = 'email'\n\nfunction rowToEmailTemplate(row: any): EmailTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n event: String(row.event_key ?? '').slice(SHOP_EVENT_PREFIX.length) as EmailTemplate['event'],\n // NULL stays NULL: the catalog resolves the default (resolveEmailTemplates),\n // not this mapping. Collapsing to `false` here would silently disable every\n // template whose row exists only because its text was edited.\n enabled: row.enabled ?? null,\n // Empty string and NULL both mean \"no override\" — a subject the merchant\n // cleared should fall back to the default, not send a blank subject line.\n subject: row.subject || null,\n body: row.body || null,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToGiftCard(row: any): GiftCard {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n code: String(row.code ?? '').toUpperCase(),\n initialBalance: Number(row.initial_balance ?? 0),\n balance: Number(row.balance ?? 0),\n currency: row.currency ?? 'BRL',\n status: (row.status ?? 'active') as GiftCard['status'],\n expiresAt: row.expires_at ?? null,\n customerId: row.customer_id ?? null,\n customerEmail: row.customer_email ?? null,\n note: row.note ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_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 /** Option axes + variants from the 0028 tables (spine M5). The storefront\n * RLS on both tables already restricts anon reads to active variants of\n * publicly readable products; the status filter here keeps the admin path\n * (authenticated tenant member, who CAN see archived rows) consistent. */\n async getProductVariants(productId: string): Promise<ProductVariantSet> {\n const db = getDb()\n const [optionsRes, variantsRes] = await Promise.all([\n db.from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true }),\n db\n .from(T.productVariants)\n .select('*')\n .eq('product_id', productId)\n .eq('status', 'active')\n .order('position', { ascending: true }),\n ])\n if (optionsRes.error) throw optionsRes.error\n if (variantsRes.error) throw variantsRes.error\n const options: ProductOption[] = (optionsRes.data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n const variants: ProductVariant[] = (variantsRes.data ?? []).map((row: any) => ({\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: row.status ?? 'active',\n imageId: row.image_id ?? null,\n }))\n return { options, variants }\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 // variant_id rides on each line (0029): the RPC prices and decrements\n // the variant when present, product-level otherwise. Pre-0029 servers\n // ignore unknown jsonb keys, so this stays compatible either way.\n p_items: input.items.map(i => ({\n product_id: i.productId,\n variant_id: asUuid(i.variantId) ?? undefined,\n quantity: i.quantity,\n options_label: i.optionsLabel ?? null,\n })),\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 // Only when something contributed: p_metadata exists from 0029 on, and\n // a pre-0029 server rejects unknown NAMED arguments (unlike unknown\n // jsonb keys). Absent metadata therefore must not send the key at all.\n ...(input.metadata !== undefined ? { p_metadata: input.metadata } : {}),\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 // Promotions (spine M6) — evaluation happens INSIDE the database via the\n // SECURITY DEFINER function (migrations/0033), so an anonymous storefront\n // never reads promotion rows or codes directly: it sends the cart snapshot\n // and receives ordered actions. The function mirrors the TS reference\n // evaluator (src/rules/evaluator.ts), which is the tested spec.\n // ---------------------------------------------------------------------------\n\n async evaluatePromotions(input: { cart: RuleCartSnapshot }): Promise<ComputeAction[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: evaluatePromotions requires a tenant id (configure the shop tenant resolver).')\n const cart = input.cart\n const { data, error } = await db.rpc('shop_compute_promotion_actions', {\n p_tenant_id: tenantId,\n // The serializable RuleCartSnapshot, snake_case on the wire — the same\n // contract 0033 documents for p_cart.\n p_cart: {\n items: cart.items.map((item) => ({\n id: item.id ?? item.productId,\n product_id: item.productId,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n category_id: item.categoryId ?? null,\n collection_id: item.collectionId ?? null,\n })),\n shipping_total: cart.shippingTotal ?? null,\n region: cart.region ?? null,\n customer: cart.customer\n ? { email: cart.customer.email ?? null, tags: cart.customer.tags ?? [] }\n : null,\n codes: cart.codes ?? [],\n },\n })\n if (error) throw error\n const rows: Array<Record<string, unknown>> = Array.isArray(data) ? data : []\n return rows.map((row): ComputeAction => {\n const code = (row.code as string | null) ?? null\n if (row.action === 'addShippingDiscount') {\n return { action: 'addShippingDiscount', promotionId: String(row.promotion_id), code, amount: Number(row.amount) }\n }\n if (row.action === 'addFreeItem') {\n return { action: 'addFreeItem', promotionId: String(row.promotion_id), code, productId: String(row.product_id), quantity: Number(row.quantity) }\n }\n return { action: 'addItemDiscount', promotionId: String(row.promotion_id), code, itemId: String(row.item_id), amount: Number(row.amount) }\n })\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 // ---------------------------------------------------------------------------\n // Custom entities (spine M4). Storage resolves through the EntityStore\n // indirection (I5): a promoted entity's registered store wins; everything\n // else reads/writes the generic jsonb table (migration 0030), whose row\n // access is the RLS generated from each declaration (I6).\n // ---------------------------------------------------------------------------\n\n private entityStore(entity: string) {\n return resolveEntityStore(entity, createSupabaseEntityStore)\n }\n\n async listEntityRecords(entity: string, options?: ListEntityRecordsOptions): Promise<EntityRecord[]> {\n return this.entityStore(entity).list(options)\n }\n\n async getEntityRecord(entity: string, id: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).get(id)\n }\n\n async getEntityRecordBySlug(entity: string, slug: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).getBySlug(slug)\n }\n\n async createEntityRecord(entity: string, input: EntityRecordInput): Promise<EntityRecord> {\n return this.entityStore(entity).create(input)\n }\n\n async updateEntityRecord(entity: string, id: string, input: Partial<EntityRecordInput>): Promise<EntityRecord> {\n return this.entityStore(entity).update(id, input)\n }\n\n async deleteEntityRecord(entity: string, id: string): Promise<void> {\n return this.entityStore(entity).delete(id)\n }\n\n // Sidecar fields on core records (migration 0031): one row per\n // (reference, reference_id), validated on write against defineSidecarFields.\n\n async getEntityFields(reference: string, referenceId: string): Promise<Record<string, unknown> | null> {\n const { data, error } = await getDb()\n .from(SIDECAR_TABLE)\n .select('data')\n .eq('reference', reference)\n .eq('reference_id', referenceId)\n .maybeSingle()\n if (error) throw error\n return data ? (data.data ?? {}) : null\n }\n\n async setEntityFields(reference: string, referenceId: string, fields: Record<string, unknown>): Promise<Record<string, unknown>> {\n validateSidecarWrite(reference, fields)\n const { data, error } = await getDb()\n .from(SIDECAR_TABLE)\n .upsert(\n { tenant_id: getTenantId(), reference, reference_id: referenceId, data: fields },\n { onConflict: 'tenant_id,reference,reference_id' },\n )\n .select('data')\n .single()\n if (error) throw error\n return data.data ?? {}\n }\n\n // -------------------------------------------------------------------------\n // Coleções, grupos/segmentos, vale-presente, e-mails e mídia.\n // -------------------------------------------------------------------------\n\nasync listCollections(): Promise<Collection[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .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(rowToCollection)\n }\n\n async getCollection(id: string): Promise<Collection | null> {\n const { data, error } = await getDb()\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToCollection(data) : null\n }\n\n async createCollection(input: CreateCollectionInput): Promise<Collection> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.collections)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n handle: input.handle?.trim() || slugify(input.title),\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n published: input.published ?? true,\n sort_order: input.sortOrder ?? 0,\n })\n .select().single()\n if (error) throw error\n await this.syncCollectionProducts(data.id, tenantId, input.productIds)\n return (await this.getCollection(data.id)) ?? rowToCollection(data)\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<Collection> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.handle !== undefined) updates.handle = input.handle?.trim() || slugify(String(input.title ?? ''))\n if (input.description !== undefined) updates.description = input.description\n if (input.imageUrl !== undefined) updates.image_url = input.imageUrl\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.published !== undefined) updates.published = input.published\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.collections).update(updates).eq('id', id)\n if (error) throw error\n }\n // `undefined` means \"leave the membership alone\" — an edit that only renamed\n // the collection must not empty it.\n if (input.productIds !== undefined) {\n await this.syncCollectionProducts(id, getTenantId(), input.productIds)\n }\n const updated = await this.getCollection(id)\n if (!updated) throw new Error('Collection not found')\n return updated\n }\n\n async deleteCollection(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE.\n const { error } = await getDb().from(T.collections).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerGroups(): Promise<CustomerGroup[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .order('name', { 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(rowToCustomerGroup)\n }\n\n async createCustomerGroup(input: CreateCustomerGroupInput): Promise<CustomerGroup> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.customerGroups)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n color: input.color ?? null,\n })\n .select().single()\n if (error) throw error\n await this.syncGroupMembers(data.id, tenantId, input.customerIds)\n return { ...rowToCustomerGroup(data), customerIds: input.customerIds ?? [] }\n }\n\n async updateCustomerGroup(id: string, input: UpdateCustomerGroupInput): Promise<CustomerGroup> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.color !== undefined) updates.color = input.color\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.customerGroups).update(updates).eq('id', id)\n if (error) throw error\n }\n // undefined means \"leave the membership alone\" — renaming a group must not\n // empty it.\n if (input.customerIds !== undefined) {\n await this.syncGroupMembers(id, getTenantId(), input.customerIds)\n }\n const { data, error } = await db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .eq('id', id).single()\n if (error) throw error\n return rowToCustomerGroup(data)\n }\n\n async deleteCustomerGroup(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE. The CUSTOMERS are untouched —\n // deleting a grouping must never delete the people in it.\n const { error } = await getDb().from(T.customerGroups).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerSegments(): Promise<CustomerSegment[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customerSegments).select('*').order('name', { 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(rowToCustomerSegment)\n }\n\n async createCustomerSegment(input: CreateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments)\n .insert({ tenant_id: getTenantId(), ...segmentPayload(input), name: input.name })\n .select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async updateCustomerSegment(id: string, input: UpdateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments).update(segmentPayload(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async deleteCustomerSegment(id: string): Promise<void> {\n const { error } = await getDb().from(T.customerSegments).delete().eq('id', id)\n if (error) throw error\n }\n\n async listGiftCards(): Promise<GiftCard[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.giftCards).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToGiftCard)\n }\n\n async createGiftCard(input: CreateGiftCardInput): Promise<GiftCard> {\n const amount = Number(input.initialBalance) || 0\n const { data, error } = await getDb()\n .from(T.giftCards)\n .insert({\n tenant_id: getTenantId(),\n code: (input.code?.trim() || generateGiftCardCode()).toUpperCase(),\n initial_balance: amount,\n // A new card is worth its face value. The admin never types the\n // remaining balance at issue — that is what redemption is for.\n balance: amount,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n expires_at: input.expiresAt ?? null,\n customer_id: asUuid(input.customerId),\n customer_email: input.customerEmail ?? null,\n note: input.note ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async updateGiftCard(id: string, input: UpdateGiftCardInput): Promise<GiftCard> {\n const updates: Record<string, unknown> = {}\n if (input.code !== undefined) updates.code = input.code.trim().toUpperCase()\n if (input.balance !== undefined) updates.balance = input.balance\n if (input.status !== undefined) updates.status = input.status\n if (input.expiresAt !== undefined) updates.expires_at = input.expiresAt\n if (input.customerId !== undefined) updates.customer_id = asUuid(input.customerId)\n if (input.customerEmail !== undefined) updates.customer_email = input.customerEmail\n if (input.note !== undefined) updates.note = input.note\n const { data, error } = await getDb().from(T.giftCards).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async deleteGiftCard(id: string): Promise<void> {\n const { error } = await getDb().from(T.giftCards).delete().eq('id', id)\n if (error) throw error\n }\n\n async listEmailTemplates(): Promise<EmailTemplate[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Only this store's own events: the table is shared with every other module\n // that sends a message, so an unfiltered read would hand the shop screens\n // rows whose event key their catalog cannot resolve.\n let q = db.from(T.messageTemplates).select('*')\n .like('event_key', `${SHOP_EVENT_PREFIX}%`)\n .eq('channel', EMAIL_CHANNEL)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToEmailTemplate)\n }\n\n async upsertEmailTemplate(input: UpsertEmailTemplateInput): Promise<EmailTemplate> {\n const payload: Record<string, unknown> = {\n tenant_id: getTenantId(),\n event_key: `${SHOP_EVENT_PREFIX}${input.event}`,\n channel: EMAIL_CHANNEL,\n }\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n // Upsert on (tenant, event, channel): the row is an override that may not\n // exist yet, and toggling a never-customised template is the common case.\n const { data, error } = await getDb()\n .from(T.messageTemplates)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToEmailTemplate(data)\n }\n\n async listMediaFiles(): Promise<MediaFile[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) return []\n const bucket = db.storage.from(T.mediaBucket)\n\n // The bucket is laid out {tenant}/library and {tenant}/products/{id}, and\n // storage.list walks one level at a time. Bounded to the tenant root plus\n // one level: that covers both layouts without an unbounded recursion over a\n // depth we do not control.\n const listAt = async (prefix: string): Promise<{ prefix: string; entry: any }[]> => {\n const { data, error } = await bucket.list(prefix, {\n limit: 1000,\n sortBy: { column: 'created_at', order: 'desc' },\n })\n if (error) return []\n return (data ?? []).map((entry: any) => ({ prefix, entry }))\n }\n\n const top = await listAt(tenantId)\n // An entry with no `id` is a folder placeholder, not an object.\n const folders = top.filter(({ entry }) => !entry.id).map(({ entry }) => `${tenantId}/${entry.name}`)\n const nested = (await Promise.all(folders.map(listAt))).flat()\n\n return [...top, ...nested]\n .filter(({ entry }) => entry.id)\n .map(({ prefix, entry }) => {\n const path = `${prefix}/${entry.name}`\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const file: MediaFile = {\n id: path,\n name: entry.name,\n url: publicUrl,\n kind: mediaKindOf(entry.name, entry.metadata?.mimetype),\n size: Number(entry.metadata?.size ?? 0),\n extension: (entry.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: entry.created_at ?? entry.updated_at ?? '',\n }\n return file\n })\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n }\n\n async uploadMediaFile(file: File): Promise<MediaFile> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: no active tenant for media upload')\n // `library/` keeps hand-uploaded assets out of products/{id}, so deleting a\n // product never takes a banner the merchant uploaded here down with it.\n const path = `${tenantId}/library/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error } = await bucket.upload(path, file)\n if (error) throw error\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n return {\n id: path,\n name: file.name,\n url: publicUrl,\n kind: mediaKindOf(file.name, file.type),\n size: file.size,\n extension: (file.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: new Date().toISOString(),\n }\n }\n\n async deleteMediaFile(id: string): Promise<void> {\n const { error } = await getDb().storage.from(T.mediaBucket).remove([id])\n if (error) throw error\n }\n\nprivate async syncCollectionProducts(\n collectionId: string,\n tenantId: string | undefined,\n productIds: string[] | undefined,\n ): Promise<void> {\n if (productIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.collectionProducts).delete().eq('collection_id', collectionId)\n if (delErr) throw delErr\n if (productIds.length === 0) return\n const rows = productIds.map((productId, position) => ({\n collection_id: collectionId, product_id: productId, tenant_id: tenantId, position,\n }))\n const { error } = await db.from(T.collectionProducts).insert(rows)\n if (error) throw error\n }\n\n private async syncGroupMembers(\n groupId: string,\n tenantId: string | undefined,\n customerIds: string[] | undefined,\n ): Promise<void> {\n if (customerIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.customerGroupMembers).delete().eq('group_id', groupId)\n if (delErr) throw delErr\n if (customerIds.length === 0) return\n const rows = customerIds.map((customerId) => ({\n group_id: groupId, customer_id: customerId, tenant_id: tenantId,\n }))\n const { error } = await db.from(T.customerGroupMembers).insert(rows)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n","import type { EmailEventKey, EmailTemplate, EmailTemplateKind } from '../types'\n\n// ---------------------------------------------------------------------------\n// The store's email event catalog.\n//\n// It lives in CODE, not the database: fulfilment is what fires \"order shipped\",\n// so an event only exists if code emits it. A catalog table would need a\n// migration per new event and would keep orphan rows when one went away.\n//\n// The database holds only the merchant's OVERRIDE (plg_automations_templates):\n// on or off, and the text where they rewrote it. No row means \"use the default\n// here\" — true for most stores, and it lets improvements to the default text\n// reach everyone who never customised.\n// ---------------------------------------------------------------------------\n\nexport interface EmailEventDef {\n event: EmailEventKey\n kind: EmailTemplateKind\n /** Template name in the list. */\n title: string\n /** What it does, in one line. */\n description: string\n /** When it fires — the \"event\" half of the pair. */\n trigger: string\n defaultSubject: string\n defaultBody: string\n /** lucide icon for the row. */\n icon: string\n /** On by default in a new store. Order confirmation is the only email a buyer\n * EXPECTS; the rest are the merchant's choice. */\n defaultEnabled: boolean\n}\n\n/** Placeholders the send substitutes. Documented here because this is what the\n * merchant may type in the editor without breaking anything. */\nexport const EMAIL_PLACEHOLDERS = [\n '{{store_name}}', '{{customer_name}}', '{{order_number}}', '{{order_total}}',\n '{{order_items}}', '{{tracking_code}}', '{{cart_url}}',\n] as const\n\nexport const SHOP_EMAIL_EVENTS: EmailEventDef[] = [\n {\n event: 'order_confirmation', kind: 'transactional', icon: 'CircleCheck',\n title: 'Confirmação de pedido',\n description: 'Enviado quando o cliente conclui a compra',\n trigger: 'Imediatamente após o checkout',\n defaultSubject: 'Pedido #{{order_number}} confirmado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nRecebemos seu pedido #{{order_number}}.\\n\\n{{order_items}}\\n\\nTotal: {{order_total}}\\n\\nObrigado por comprar na {{store_name}}!',\n defaultEnabled: true,\n },\n {\n event: 'order_paid', kind: 'transactional', icon: 'CreditCard',\n title: 'Pagamento aprovado',\n description: 'Enviado quando o pagamento é confirmado',\n trigger: 'Quando o pagamento é aprovado',\n defaultSubject: 'Pagamento aprovado — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pagamento de {{order_total}} foi aprovado. Já estamos preparando o pedido #{{order_number}}.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_shipped', kind: 'transactional', icon: 'Truck',\n title: 'Pedido enviado',\n description: 'Enviado quando o pedido sai para entrega, com o rastreio',\n trigger: 'Quando a entrega é marcada como enviada',\n defaultSubject: 'Seu pedido saiu para entrega — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} está a caminho.\\n\\nRastreio: {{tracking_code}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_delivered', kind: 'transactional', icon: 'PackageCheck',\n title: 'Pedido entregue',\n description: 'Enviado quando a entrega é concluída',\n trigger: 'Quando a entrega é marcada como concluída',\n defaultSubject: 'Seu pedido chegou — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi entregue. Esperamos que goste!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_cancelled', kind: 'transactional', icon: 'CircleX',\n title: 'Pedido cancelado',\n description: 'Enviado quando um pedido é cancelado',\n trigger: 'Quando o pedido é cancelado',\n defaultSubject: 'Pedido #{{order_number}} cancelado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi cancelado. Se você não pediu isso, responda este e-mail.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'refund_confirmation', kind: 'transactional', icon: 'RotateCcw',\n title: 'Reembolso processado',\n description: 'Enviado quando um reembolso é processado',\n trigger: 'Quando o pagamento é estornado',\n defaultSubject: 'Reembolso emitido — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nO reembolso de {{order_total}} do pedido #{{order_number}} foi processado. O prazo de crédito depende do seu banco.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'customer_welcome', kind: 'transactional', icon: 'Mail',\n title: 'Boas-vindas',\n description: 'Enviado quando um cliente cria conta na loja',\n trigger: 'Quando o cliente se cadastra',\n defaultSubject: 'Bem-vindo(a) à {{store_name}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSua conta na {{store_name}} está pronta. Bom proveito!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'abandoned_cart', kind: 'marketing', icon: 'ShoppingCart',\n title: 'Carrinho abandonado',\n description: 'Enviado quando o cliente deixa itens no carrinho sem finalizar',\n trigger: '1 hora após o abandono do carrinho',\n defaultSubject: 'Você esqueceu alguns itens no carrinho',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeus itens ainda estão te esperando.\\n\\n{{cart_url}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n]\n\n/**\n * Substitutes the placeholders. Beside the catalog because PREVIEW and SEND must\n * agree: a screen doing its own `replace` has the merchant approve one text and\n * the customer receive another.\n *\n * An unknown placeholder stays visible as `{{foo}}` on purpose — in the preview\n * that exposes the typo; hiding it would hide the gap until the email had gone.\n */\nexport function renderEmailTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/** Sample data for the preview. From no real order — the screen says so. */\nexport const EMAIL_PREVIEW_SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja',\n customer_name: 'Maria Silva',\n order_number: '1042',\n order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR',\n cart_url: 'https://sualoja.com.br/carrinho',\n}\n\nexport interface ResolvedEmailTemplate extends EmailEventDef {\n /** The merchant's override, when there is one. */\n override: EmailTemplate | null\n enabled: boolean\n /** Text in force: the merchant's if any, else the default. */\n subject: string\n body: string\n /** true when the merchant rewrote the text — the list flags it. */\n customized: boolean\n}\n\n/**\n * Joins the code catalog with the database overrides. A function and not a\n * query: the merge must give the same answer in the list, the editor and the\n * send, and three places doing the same `??` is how they start to disagree.\n */\nexport function resolveEmailTemplates(overrides: EmailTemplate[]): ResolvedEmailTemplate[] {\n const byEvent = new Map(overrides.map((o) => [o.event, o]))\n return SHOP_EMAIL_EVENTS.map((def) => {\n const override = byEvent.get(def.event) ?? null\n return {\n ...def,\n override,\n enabled: override?.enabled ?? def.defaultEnabled,\n subject: override?.subject ?? def.defaultSubject,\n body: override?.body ?? def.defaultBody,\n customized: Boolean(override?.subject || override?.body),\n }\n })\n}\n","import type { PluginEventDefinition, MessageDefaultsDef, EventField } from '@fayz-ai/core'\nimport { SHOP_EMAIL_EVENTS } from './emails'\n\n// ---------------------------------------------------------------------------\n// The FACTS the store emits and, separately, the text we suggest for each.\n//\n// buildShopDomainEvents() the fact's contract: what happened, what data\n// comes with it, whether it is audited. Webhooks\n// and the audit trail read this.\n// buildShopMessageDefaults() a REACTION to the fact: which channel, which\n// text. Only automations read it.\n//\n// Merging the two would mean whoever writes a Google Calendar integration has to\n// import email vocabulary to find out what fields \"order paid\" carries — and an\n// event with no text could not exist.\n// ---------------------------------------------------------------------------\n\n/** The fields every order event carries. */\nconst ORDER_FIELDS: EventField[] = [\n { name: 'order_number', label: 'Número do pedido', type: 'string', example: '1042' },\n { name: 'order_total', label: 'Total', type: 'money', example: 'R$ 189,90' },\n { name: 'order_items', label: 'Itens', type: 'string', example: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00' },\n { name: 'customer_name', label: 'Cliente', type: 'string', example: 'Maria Silva' },\n { name: 'store_name', label: 'Loja', type: 'string', example: 'Sua Loja' },\n]\n\nconst TRACKING_FIELD: EventField = {\n name: 'tracking_code', label: 'Código de rastreio', type: 'string', example: 'BR123456789BR',\n}\nconst CART_FIELD: EventField = {\n name: 'cart_url', label: 'Link do carrinho', type: 'url', example: 'https://sualoja.com.br/carrinho',\n}\n\n/** Fields per event — what the emitter actually sends in each. */\nconst FIELDS_BY_EVENT: Record<string, EventField[]> = {\n order_shipped: [...ORDER_FIELDS, TRACKING_FIELD],\n order_delivered: [...ORDER_FIELDS, TRACKING_FIELD],\n abandoned_cart: [...ORDER_FIELDS, CART_FIELD],\n}\n\n/**\n * Facts that are NOT audited: nobody performed them. \"Abandoned cart\" is the\n * absence of an act, and a trail full of non-acts is a trail nobody reads.\n */\nconst NOT_AUDITED = new Set(['abandoned_cart'])\n\nexport function buildShopDomainEvents(): PluginEventDefinition[] {\n return SHOP_EMAIL_EVENTS.map((def) => ({\n name: `shop.${def.event}`,\n title: def.title,\n description: def.description,\n trigger: def.trigger,\n icon: def.icon,\n fields: FIELDS_BY_EVENT[def.event] ?? ORDER_FIELDS,\n audit: !NOT_AUDITED.has(def.event),\n }))\n}\n\n/** Events whose WhatsApp notification is routine in a Brazilian store. */\nconst WHATSAPP_EVENTS = new Set(['order_confirmation', 'order_shipped', 'abandoned_cart'])\n\n/** WhatsApp text is short and subject-less — not the email body, truncated. */\nconst WHATSAPP_BODY: Record<string, string> = {\n order_confirmation:\n 'Oi {{customer_name}}! Recebemos seu pedido #{{order_number}} ✅\\n\\nTotal: {{order_total}}\\n\\nQualquer dúvida é só chamar aqui. — {{store_name}}',\n order_shipped:\n 'Oi {{customer_name}}! Seu pedido #{{order_number}} saiu para entrega 🚚\\n\\nRastreio: {{tracking_code}}\\n\\n— {{store_name}}',\n abandoned_cart:\n 'Oi {{customer_name}}! Vi que ficaram itens no seu carrinho 🛒\\n\\nQuer que eu segure para você?\\n{{cart_url}}\\n\\n— {{store_name}}',\n}\n\nexport function buildShopMessageDefaults(): MessageDefaultsDef[] {\n return SHOP_EMAIL_EVENTS.map((def) => {\n const whatsapp = WHATSAPP_EVENTS.has(def.event) ? WHATSAPP_BODY[def.event] : undefined\n return {\n eventKey: `shop.${def.event}`,\n kind: def.kind,\n channels: whatsapp ? (['email', 'whatsapp'] as const).slice() : ['email' as const],\n defaults: {\n email: { subject: def.defaultSubject, body: def.defaultBody },\n ...(whatsapp ? { whatsapp: { body: whatsapp } } : {}),\n },\n // Only email inherits \"on by default\". WhatsApp bills per message and\n // needs an approved number — switching itself on would spend someone's\n // money unasked.\n defaultEnabled: { email: def.defaultEnabled },\n }\n })\n}\n"]}