@asteby/storefront 0.19.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mock.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/availability.ts","../src/payments.ts","../src/order-progress.ts","../src/geo.ts","../src/mock/account-seed.ts","../src/mock/region-mx.seed.ts","../src/mock/region.ts","../src/subjects.ts","../src/mock/seed.ts","../src/mock/subjects.ts","../src/mock/index.ts"],"names":["key","money","distanceKm","line","address","r"],"mappings":"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","file":"mock.cjs","sourcesContent":["/**\n * Availability presentation: the single source of the texts and states a\n * storefront shows for stock. Pure functions, no DOM: safe in loaders, SSR and\n * edge runtimes.\n *\n * The server decides the state (`Availability.status`, already filtered by the\n * shop's `show_stock`); this module only turns it into labels. Shops may\n * override texts by key (`messages`) but never the logic. Numbers shown here\n * (\"Quedan 3\") come from `availability.quantity`, which the server sends only\n * when the shop allows it and past its own threshold: there is no threshold in\n * this code.\n */\nimport type { Availability, AvailabilityStatus, CartLineProblem, InsufficientStockLine, Product, ProductVariant } from './types.js'\n\nexport type AvailabilityTone = 'success' | 'warning' | 'danger' | 'info'\n\nexport type AvailabilityLocale = 'es' | 'en'\n\n/** Text keys, overridable per shop. `{n}` and `{date}` are replaced. */\nexport type AvailabilityMessageKey =\n | 'status.in_stock'\n | 'status.low_stock'\n | 'status.low_stock_n'\n | 'status.out_of_stock'\n | 'status.backorder'\n | 'status.preorder'\n | 'sub.backorder_eta'\n | 'sub.preorder_date'\n | 'cta.add'\n | 'cta.out_of_stock'\n | 'cta.backorder'\n | 'cta.preorder'\n | 'sr.in_stock'\n | 'sr.low_stock'\n | 'sr.low_stock_n'\n | 'sr.out_of_stock'\n | 'sr.backorder'\n | 'sr.preorder'\n | 'option.sold_out'\n | 'option.backorder'\n | 'option.preorder'\n | 'max_per_order'\n | 'notify.title'\n | 'notify.email'\n | 'notify.phone'\n | 'notify.consent'\n | 'notify.submit'\n | 'notify.done'\n | 'notify.error'\n | 'problem.out_of_stock'\n | 'problem.insufficient_stock'\n | 'problem.insufficient_stock_n'\n | 'problem.adjust'\n | 'problem.remove'\n | 'conflict.title'\n | 'conflict.body'\n | 'conflict.dismiss'\n\nexport type AvailabilityMessages = Record<AvailabilityMessageKey, string>\n\nconst ES: AvailabilityMessages = {\n 'status.in_stock': 'Disponible',\n 'status.low_stock': 'Pocas piezas',\n 'status.low_stock_n': 'Quedan {n}',\n 'status.out_of_stock': 'Agotado',\n 'status.backorder': 'Bajo pedido',\n 'status.preorder': 'Preventa',\n 'sub.backorder_eta': 'Se envía a partir del {date}',\n 'sub.preorder_date': 'Sale a la venta el {date}',\n 'cta.add': 'Agregar al carrito',\n 'cta.out_of_stock': 'Agotado',\n 'cta.backorder': 'Pedir bajo pedido',\n 'cta.preorder': 'Apartar en preventa',\n 'sr.in_stock': 'Disponible',\n 'sr.low_stock': 'Quedan pocas piezas',\n 'sr.low_stock_n': 'Quedan solo {n} piezas',\n 'sr.out_of_stock': 'Producto agotado',\n 'sr.backorder': 'Disponible bajo pedido',\n 'sr.preorder': 'Disponible en preventa',\n 'option.sold_out': 'agotado',\n 'option.backorder': 'bajo pedido',\n 'option.preorder': 'preventa',\n max_per_order: 'Máximo {n} por pedido',\n 'notify.title': 'Avísame cuando vuelva',\n 'notify.email': 'Correo electrónico',\n 'notify.phone': 'WhatsApp o teléfono',\n 'notify.consent': 'Acepto recibir un aviso cuando vuelva a estar disponible',\n 'notify.submit': 'Avísame',\n 'notify.done': 'Listo. Te avisaremos cuando vuelva a estar disponible.',\n 'notify.error': 'No pudimos guardar tu aviso. Revisa tus datos e inténtalo de nuevo.',\n 'problem.out_of_stock': 'Ya no hay existencias',\n 'problem.insufficient_stock': 'No hay suficientes piezas para esta cantidad',\n 'problem.insufficient_stock_n': 'Solo puedes llevar {n}',\n 'problem.adjust': 'Ajustar a {n}',\n 'problem.remove': 'Quitar',\n 'conflict.title': 'Algunos productos cambiaron de existencias',\n 'conflict.body': 'Revisa las líneas marcadas. Tu carrito y tus datos se conservaron; ajusta o quita lo que ya no está disponible y continúa.',\n 'conflict.dismiss': 'Entendido',\n}\n\nconst EN: AvailabilityMessages = {\n 'status.in_stock': 'In stock',\n 'status.low_stock': 'Low stock',\n 'status.low_stock_n': 'Only {n} left',\n 'status.out_of_stock': 'Sold out',\n 'status.backorder': 'Made to order',\n 'status.preorder': 'Pre-order',\n 'sub.backorder_eta': 'Ships from {date}',\n 'sub.preorder_date': 'Available on {date}',\n 'cta.add': 'Add to cart',\n 'cta.out_of_stock': 'Sold out',\n 'cta.backorder': 'Order now, ships later',\n 'cta.preorder': 'Pre-order',\n 'sr.in_stock': 'In stock',\n 'sr.low_stock': 'Low stock',\n 'sr.low_stock_n': 'Only {n} left in stock',\n 'sr.out_of_stock': 'Sold out',\n 'sr.backorder': 'Available to order, ships later',\n 'sr.preorder': 'Available for pre-order',\n 'option.sold_out': 'sold out',\n 'option.backorder': 'made to order',\n 'option.preorder': 'pre-order',\n max_per_order: 'Maximum {n} per order',\n 'notify.title': 'Notify me when it is back',\n 'notify.email': 'Email',\n 'notify.phone': 'WhatsApp or phone',\n 'notify.consent': 'I agree to receive a notice when it is back in stock',\n 'notify.submit': 'Notify me',\n 'notify.done': 'Done. We will let you know when it is back in stock.',\n 'notify.error': 'We could not save your request. Check your details and try again.',\n 'problem.out_of_stock': 'No longer in stock',\n 'problem.insufficient_stock': 'Not enough stock for this quantity',\n 'problem.insufficient_stock_n': 'You can take up to {n}',\n 'problem.adjust': 'Adjust to {n}',\n 'problem.remove': 'Remove',\n 'conflict.title': 'Some items changed stock',\n 'conflict.body': 'Review the marked lines. Your cart and your details were kept; adjust or remove what is no longer available and continue.',\n 'conflict.dismiss': 'Got it',\n}\n\nconst CATALOG: Record<AvailabilityLocale, AvailabilityMessages> = { es: ES, en: EN }\n\n/** `es-MX` -> `es`, `en-US` -> `en`; anything else falls back to Spanish. */\nexport function availabilityLocale(locale: string | null | undefined): AvailabilityLocale {\n return (locale ?? '').toLowerCase().startsWith('en') ? 'en' : 'es'\n}\n\n/** Catalog for a locale with the shop's per-key overrides applied. */\nexport function availabilityMessages(locale: string | null | undefined, overrides?: Partial<AvailabilityMessages> | null): AvailabilityMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as AvailabilityMessageKey] = v\n return out\n}\n\n/** Replaces `{name}` placeholders. */\nexport function formatAvailabilityMessage(template: string, values: Record<string, string | number> = {}): string {\n return template.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in values ? String(values[k]) : m))\n}\n\nfunction formatDate(value: string | null | undefined, locale: string | null | undefined): string | null {\n if (!value) return null\n const d = /^\\d{4}-\\d{2}-\\d{2}$/.test(value) ? new Date(`${value}T00:00:00Z`) : new Date(value)\n if (Number.isNaN(d.getTime())) return null\n try {\n // UTC keeps server and client renders identical (no hydration mismatch).\n return new Intl.DateTimeFormat(locale || 'es', { dateStyle: 'long', timeZone: 'UTC' }).format(d)\n } catch {\n return value.slice(0, 10)\n }\n}\n\nexport type ResolveAvailabilityOptions = {\n /**\n * Polyfill only: shop-level \"low stock\" threshold to derive `low_stock` from\n * `quantity_available` on servers older than contract 1.1. Without it the\n * polyfill never reports `low_stock`. Ignored when the server sends `availability`.\n */\n lowStockThreshold?: number | null\n}\n\ntype AvailabilitySource = Pick<Product | ProductVariant, 'available_for_sale'> & {\n availability?: Availability | null\n quantity_available?: number | null\n}\n\n/**\n * The `Availability` of a variant or product. Uses the server's `availability`\n * when present; otherwise derives `in_stock | low_stock | out_of_stock` from\n * `available_for_sale` / `quantity_available` so storefronts can migrate before\n * the backend does. A malformed `availability` falls back to the polyfill.\n */\nexport function resolveAvailability(source: AvailabilitySource, options: ResolveAvailabilityOptions = {}): Availability {\n const a = source.availability\n if (a && typeof a === 'object' && typeof a.status === 'string') return a\n const qty = typeof source.quantity_available === 'number' ? source.quantity_available : null\n const sellable = source.available_for_sale && (qty === null || qty > 0)\n const threshold = options.lowStockThreshold\n const low = sellable && qty !== null && typeof threshold === 'number' && threshold > 0 && qty <= threshold\n const status: AvailabilityStatus = !sellable ? 'out_of_stock' : low ? 'low_stock' : 'in_stock'\n return {\n status,\n quantity: sellable ? qty : null,\n max_per_order: sellable ? qty : null,\n restock_eta: null,\n preorder_release_at: null,\n // Old servers have no subscription route: never offer a form that cannot work.\n notify_available: false,\n }\n}\n\nexport type AvailabilityView = {\n status: AvailabilityStatus\n tone: AvailabilityTone\n /** Short badge text: \"Agotado\", \"Quedan 3\", \"Bajo pedido\"... Never empty. */\n label: string\n /** ETA / release date text, or `null`. */\n sublabel: string | null\n /** Primary button text. */\n ctaLabel: string\n /** The primary button may be pressed (backorder/preorder are purchasable). */\n ctaEnabled: boolean\n /** Offer the \"Notify me when it is back\" form. */\n showNotify: boolean\n /** Full sentence for screen readers. */\n srText: string\n /** Units to cap the quantity picker at, or `null`. */\n maxPerOrder: number | null\n /** Show a badge on listing cards (everything but plain `in_stock`: do not clutter). */\n showOnCard: boolean\n}\n\nexport type AvailabilityViewOptions = {\n messages?: Partial<AvailabilityMessages> | null\n}\n\nconst TONES: Record<AvailabilityStatus, AvailabilityTone> = {\n in_stock: 'success',\n low_stock: 'warning',\n out_of_stock: 'danger',\n backorder: 'info',\n preorder: 'info',\n}\n\n/**\n * Texts and flags for one availability. `availability` accepts anything with an\n * unknown `status` (a future server): it is treated as `out_of_stock`.\n */\nexport function availabilityView(availability: Availability, locale: string | null | undefined, options: AvailabilityViewOptions = {}): AvailabilityView {\n const m = availabilityMessages(locale, options.messages)\n const known = (['in_stock', 'low_stock', 'out_of_stock', 'backorder', 'preorder'] as const).includes(availability.status)\n const status: AvailabilityStatus = known ? availability.status : 'out_of_stock'\n const qty = typeof availability.quantity === 'number' && availability.quantity > 0 ? availability.quantity : null\n const f = formatAvailabilityMessage\n\n let label: string\n let sr: string\n let cta: string\n let sublabel: string | null = null\n let enabled = true\n switch (status) {\n case 'in_stock':\n label = m['status.in_stock']\n sr = m['sr.in_stock']\n cta = m['cta.add']\n break\n case 'low_stock':\n // Without a visible quantity the server still says \"low\": no number is invented.\n label = qty !== null ? f(m['status.low_stock_n'], { n: qty }) : m['status.low_stock']\n sr = qty !== null ? f(m['sr.low_stock_n'], { n: qty }) : m['sr.low_stock']\n cta = m['cta.add']\n break\n case 'backorder': {\n label = m['status.backorder']\n sr = m['sr.backorder']\n cta = m['cta.backorder']\n const date = formatDate(availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.backorder_eta'], { date })\n break\n }\n case 'preorder': {\n label = m['status.preorder']\n sr = m['sr.preorder']\n cta = m['cta.preorder']\n const date = formatDate(availability.preorder_release_at ?? availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.preorder_date'], { date })\n break\n }\n default:\n label = m['status.out_of_stock']\n sr = m['sr.out_of_stock']\n cta = m['cta.out_of_stock']\n enabled = false\n }\n return {\n status,\n tone: TONES[status],\n label,\n sublabel,\n ctaLabel: cta,\n ctaEnabled: enabled,\n showNotify: status === 'out_of_stock' && availability.notify_available === true,\n srText: sublabel ? `${sr}. ${sublabel}` : sr,\n maxPerOrder: typeof availability.max_per_order === 'number' && availability.max_per_order > 0 ? availability.max_per_order : null,\n showOnCard: status !== 'in_stock',\n }\n}\n\nexport type CartLineProblemView = {\n code: CartLineProblem['code']\n /** \"Ya no hay existencias\" / \"Solo puedes llevar 2\". */\n message: string\n /** Quantity to adjust the line to, or `null` (remove only). */\n adjustTo: number | null\n adjustLabel: string | null\n removeLabel: string\n}\n\n/** Texts and actions for a cart line problem. Offers \"Adjust to N\" only when `max_quantity` is a positive number different from the line quantity (a refused change leaves the cart at its old quantity). */\nexport function cartLineProblemView(\n problem: CartLineProblem | InsufficientStockLine,\n locale: string | null | undefined,\n options: AvailabilityViewOptions & { lineQuantity?: number } = {},\n): CartLineProblemView {\n const m = availabilityMessages(locale, options.messages)\n const code: CartLineProblem['code'] = 'code' in problem ? problem.code : problem.status === 'out_of_stock' ? 'out_of_stock' : 'insufficient_stock'\n const max = typeof problem.max_quantity === 'number' && problem.max_quantity >= 0 ? problem.max_quantity : null\n const canAdjust = max !== null && max > 0 && (options.lineQuantity === undefined || max !== options.lineQuantity)\n const message =\n code === 'out_of_stock' || max === 0\n ? m['problem.out_of_stock']\n : max !== null\n ? formatAvailabilityMessage(m['problem.insufficient_stock_n'], { n: max })\n : m['problem.insufficient_stock']\n return {\n code,\n message,\n adjustTo: canAdjust ? max : null,\n adjustLabel: canAdjust ? formatAvailabilityMessage(m['problem.adjust'], { n: max }) : null,\n removeLabel: m['problem.remove'],\n }\n}\n\nconst SCHEMA_AVAILABILITY: Record<AvailabilityStatus, string> = {\n in_stock: 'https://schema.org/InStock',\n low_stock: 'https://schema.org/LimitedAvailability',\n out_of_stock: 'https://schema.org/OutOfStock',\n backorder: 'https://schema.org/BackOrder',\n preorder: 'https://schema.org/PreOrder',\n}\n\n/** schema.org `ItemAvailability` URL for a status (unknown -> `OutOfStock`). */\nexport function schemaAvailability(status: AvailabilityStatus | string): string {\n return SCHEMA_AVAILABILITY[status as AvailabilityStatus] ?? SCHEMA_AVAILABILITY.out_of_stock\n}\n\n/** Best state among variants for a product summary (when the server sends none). */\nexport function productAvailability(product: Pick<Product, 'variants' | 'available_for_sale' | 'availability'>, options: ResolveAvailabilityOptions = {}): Availability {\n if (product.availability) return product.availability\n const all = product.variants.map((v) => resolveAvailability(v, options))\n const rank: AvailabilityStatus[] = ['in_stock', 'low_stock', 'backorder', 'preorder', 'out_of_stock']\n const best = all.slice().sort((a, b) => rank.indexOf(a.status) - rank.indexOf(b.status))[0]\n return best ?? resolveAvailability(product, options)\n}\n","/**\n * Embedded payment presentation: the single source of the texts and states a\n * storefront shows around an in-page payment. Pure functions, no DOM: safe in\n * loaders, SSR and edge runtimes.\n *\n * Rules this module encodes (DISENO-PAGO-INTEGRADO-BRICKS):\n * - The server decides the outcome and the amount. Nothing here computes or\n * compares money; `expected_total` is the server's own number echoed back.\n * - A rejection is explained with an actionable text built from the neutral\n * `decline_code`. A raw provider code is never shown.\n * - Vouchers and redirects only trust https URLs.\n */\nimport { availabilityLocale, formatAvailabilityMessage, type AvailabilityLocale } from './availability.js'\nimport { StorefrontError } from './errors.js'\nimport type { DeclineCode, Money, PaymentAction, PaymentAttemptResult, PaymentNextStep, PaymentVoucher } from './types.js'\n\nexport type PaymentLocale = AvailabilityLocale\n\nexport type PaymentMessageKey =\n | `decline.${DeclineCode}`\n | 'state.loading'\n | 'state.processing'\n | 'state.approved'\n | 'state.in_review'\n | 'state.voucher'\n | 'state.challenge'\n | 'state.expired'\n | 'state.cancelled'\n | 'state.redirect'\n | 'state.fallback'\n | 'error.network'\n | 'error.card_data'\n | 'error.price_mismatch'\n | 'error.payment_in_progress'\n | 'error.expired'\n | 'error.too_many_attempts'\n | 'error.generic'\n | 'action.retry'\n | 'action.try_again'\n | 'action.pay'\n | 'action.cancel'\n | 'voucher.title'\n | 'voucher.point'\n | 'voucher.reference'\n | 'voucher.amount'\n | 'voucher.expires'\n | 'voucher.clabe'\n | 'voucher.barcode'\n | 'voucher.open'\n | 'voucher.email'\n | 'form.label'\n | 'challenge.title'\n | 'challenge.escape'\n | 'challenge.escape_hint'\n | 'challenge.left'\n\nexport type PaymentMessages = Record<PaymentMessageKey, string>\n\nconst ES: PaymentMessages = {\n 'decline.insufficient_funds': 'Tu tarjeta no tiene saldo suficiente. Prueba con otra tarjeta o paga en efectivo.',\n 'decline.invalid_cvc': 'El código de seguridad no es correcto. Revísalo e intenta de nuevo.',\n 'decline.invalid_expiry': 'La fecha de vencimiento no es correcta.',\n 'decline.invalid_card_data': 'Revisa los datos de tu tarjeta.',\n 'decline.call_issuer': 'Tu banco necesita que autorices este pago. Llama al número al reverso de tu tarjeta y vuelve a intentarlo.',\n 'decline.card_disabled': 'Tu tarjeta no está activa. Actívala con tu banco o usa otra.',\n 'decline.duplicate': 'Ya hiciste un pago igual hace un momento. Revisa tu correo antes de volver a pagar.',\n 'decline.max_attempts': 'Llegaste al límite de intentos con esta tarjeta. Usa otra o paga en efectivo.',\n 'decline.authentication_failed': 'Tu banco no pudo verificar el pago. Intenta de nuevo o usa otra tarjeta.',\n 'decline.declined': 'Tu banco rechazó el pago. Usa otra tarjeta o paga en efectivo.',\n 'state.loading': 'Cargando pago seguro…',\n 'state.processing': 'Procesando pago…',\n 'state.approved': '¡Pago aprobado!',\n 'state.in_review': 'Tu pago está en revisión. Te avisamos por correo en máximo 2 días hábiles. No vuelvas a pagar.',\n 'state.voucher': 'Tu ficha de pago está lista. El pedido se confirma cuando pagues.',\n 'state.challenge': 'Tu banco necesita verificar el pago. Termina la verificación para continuar.',\n 'state.expired': 'La ficha venció. Vuelve a armar tu carrito para pagar.',\n 'state.cancelled': 'El pago se canceló. Puedes intentarlo de nuevo.',\n 'state.redirect': 'Te llevamos a la página de pago…',\n 'state.fallback': 'No pudimos cargar el formulario seguro de tarjeta. Puedes pagar con tarjeta en el sitio del proveedor y regresar aquí.',\n 'error.network': 'No pudimos conectar. Revisa tu conexión e intenta de nuevo; no se te cobrará dos veces.',\n 'error.card_data': 'Revisa los datos de tu tarjeta.',\n 'error.price_mismatch': 'El total cambió. Revisa el nuevo total y vuelve a pagar.',\n 'error.payment_in_progress': 'Ya hay un pago en proceso para este pedido. No vuelvas a pagar; revisa tu correo.',\n 'error.expired': 'Tu apartado venció. Vuelve a armar tu carrito.',\n 'error.too_many_attempts': 'Por seguridad no podemos intentar con más tarjetas. Paga en efectivo o escríbenos.',\n 'error.generic': 'No pudimos procesar tu pago. Intenta de nuevo.',\n 'action.retry': 'Reintentar',\n 'action.try_again': 'Intentar de nuevo',\n 'action.pay': 'Pagar',\n 'action.cancel': 'Cancelar',\n 'voucher.title': 'Ficha de pago',\n 'voucher.point': 'Punto de pago',\n 'voucher.reference': 'Referencia',\n 'voucher.amount': 'Monto exacto',\n 'voucher.expires': 'Vence el {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Código de barras',\n 'voucher.open': 'Ver o imprimir ficha',\n 'voucher.email': 'También te la enviamos a tu correo.',\n 'form.label': 'Datos de tu tarjeta',\n 'challenge.title': 'Verificación de tu banco',\n 'challenge.escape': 'Cancelar y volver al pago',\n 'challenge.escape_hint': '¿Tarda demasiado? Puedes cerrar la verificación. Si ya la aprobaste en tu banco, el pago aún puede completarse: te confirmamos aquí antes de dejarte pagar de nuevo.',\n 'challenge.left': 'Cerraste la verificación. Estamos confirmando con tu banco si el pago se completó; no vuelvas a pagar todavía.',\n}\n\nconst EN: PaymentMessages = {\n 'decline.insufficient_funds': 'Your card has insufficient funds. Try another card or pay in cash.',\n 'decline.invalid_cvc': 'The security code is not correct. Check it and try again.',\n 'decline.invalid_expiry': 'The expiry date is not correct.',\n 'decline.invalid_card_data': 'Check your card details.',\n 'decline.call_issuer': 'Your bank needs you to authorize this payment. Call the number on the back of your card and try again.',\n 'decline.card_disabled': 'Your card is not active. Activate it with your bank or use another one.',\n 'decline.duplicate': 'You already made the same payment a moment ago. Check your email before paying again.',\n 'decline.max_attempts': 'You reached the attempt limit for this card. Use another card or pay in cash.',\n 'decline.authentication_failed': 'Your bank could not verify the payment. Try again or use another card.',\n 'decline.declined': 'Your bank declined the payment. Use another card or pay in cash.',\n 'state.loading': 'Loading secure payment…',\n 'state.processing': 'Processing payment…',\n 'state.approved': 'Payment approved!',\n 'state.in_review': 'Your payment is under review. We will email you within 2 business days. Do not pay again.',\n 'state.voucher': 'Your payment voucher is ready. The order is confirmed once you pay.',\n 'state.challenge': 'Your bank needs to verify the payment. Finish the verification to continue.',\n 'state.expired': 'The voucher expired. Rebuild your cart to pay.',\n 'state.cancelled': 'The payment was cancelled. You can try again.',\n 'state.redirect': 'Taking you to the payment page…',\n 'state.fallback': 'We could not load the secure card form. You can pay by card on the provider site and come back here.',\n 'error.network': 'We could not connect. Check your connection and try again; you will not be charged twice.',\n 'error.card_data': 'Check your card details.',\n 'error.price_mismatch': 'The total changed. Review the new total and pay again.',\n 'error.payment_in_progress': 'A payment is already in progress for this order. Do not pay again; check your email.',\n 'error.expired': 'Your reservation expired. Rebuild your cart.',\n 'error.too_many_attempts': 'For security we cannot try more cards. Pay in cash or contact us.',\n 'error.generic': 'We could not process your payment. Please try again.',\n 'action.retry': 'Retry',\n 'action.try_again': 'Try again',\n 'action.pay': 'Pay',\n 'action.cancel': 'Cancel',\n 'voucher.title': 'Payment voucher',\n 'voucher.point': 'Payment point',\n 'voucher.reference': 'Reference',\n 'voucher.amount': 'Exact amount',\n 'voucher.expires': 'Expires on {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Barcode',\n 'voucher.open': 'View or print voucher',\n 'voucher.email': 'We also emailed it to you.',\n 'form.label': 'Your card details',\n 'challenge.title': 'Your bank verification',\n 'challenge.escape': 'Cancel and go back to payment',\n 'challenge.escape_hint': 'Taking too long? You can close the verification. If you already approved it with your bank the payment may still go through: we confirm here before letting you pay again.',\n 'challenge.left': 'You closed the verification. We are checking with your bank whether the payment went through; do not pay again yet.',\n}\n\nconst CATALOG: Record<PaymentLocale, PaymentMessages> = { es: ES, en: EN }\n\n/** Catalog for a locale (`es-MX` -> es, `en-US` -> en) with the shop's per-key overrides applied. */\nexport function paymentMessages(locale: string | null | undefined, overrides?: Partial<PaymentMessages> | null): PaymentMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as PaymentMessageKey] = v\n return out\n}\n\nconst DECLINE_CODES: ReadonlySet<string> = new Set<DeclineCode>([\n 'insufficient_funds',\n 'invalid_cvc',\n 'invalid_expiry',\n 'invalid_card_data',\n 'call_issuer',\n 'card_disabled',\n 'duplicate',\n 'max_attempts',\n 'authentication_failed',\n 'declined',\n])\n\n/** i18n key of a decline code; unknown or missing codes map to `declined` (never a raw provider code). */\nexport function declineMessageKey(code: string | null | undefined): `decline.${DeclineCode}` {\n return `decline.${code && DECLINE_CODES.has(code) ? (code as DeclineCode) : 'declined'}`\n}\n\n/** Actionable text for a decline code. */\nexport function declineMessage(code: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string {\n return paymentMessages(locale, overrides)[declineMessageKey(code)]\n}\n\n/** The value only if it is an absolute `https:` URL without credentials; `null` otherwise. */\nexport function safeHttpsUrl(value: unknown): string | null {\n if (typeof value !== 'string' || value.length > 2048) return null\n try {\n const u = new URL(value)\n if (u.protocol !== 'https:' || u.username || u.password) return null\n return u.toString()\n } catch {\n return null\n }\n}\n\n/** What the UI should do with an attempt result. */\nexport type PaymentOutcomeKind =\n | 'approved' // paid: go to the thanks page\n | 'in_review' // pending without action: do not charge again\n | 'voucher' // cash/SPEI voucher with reference and expiry\n | 'challenge' // 3DS inside the page\n | 'redirect' // leave to the provider\n | 'rejected' // failed: show the reason and let the buyer retry\n | 'expired'\n | 'cancelled'\n\n/** A voucher ready to render: https-only link and the amount as `Money` (or `null` when the server sent none). */\nexport type PaymentOutcomeVoucher = Omit<PaymentVoucher, 'amount' | 'voucher_url' | 'currency'> & {\n voucher_url: string | null\n amount: Money | null\n}\n\nconst NEXT_STEP: Record<DeclineCode, PaymentNextStep> = {\n insufficient_funds: 'use_other_card',\n invalid_cvc: 'fix_card_data',\n invalid_expiry: 'fix_card_data',\n invalid_card_data: 'fix_card_data',\n call_issuer: 'contact_issuer',\n card_disabled: 'use_other_card',\n duplicate: 'check_email',\n max_attempts: 'use_other_card',\n authentication_failed: 'retry',\n declined: 'use_other_card',\n}\n\nfunction voucherMoney(v: PaymentVoucher): Money | null {\n const a = v.amount\n if (a && typeof a === 'object' && typeof a.amount === 'string') return a\n const text = typeof a === 'number' ? String(a) : typeof a === 'string' ? a : ''\n if (!text || !/^\\d+(\\.\\d+)?$/.test(text) || !v.currency) return null\n return { amount: text.includes('.') ? text : `${text}.00`, currency_code: v.currency }\n}\n\nexport type PaymentOutcome = {\n kind: PaymentOutcomeKind\n /** Text for the buyer (no codes). */\n message: string\n decline_code: DeclineCode | null\n /** `true` when the buyer can try again with the checkout still open. */\n retryable: boolean\n /** https-only. */\n redirect_url: string | null\n challenge: { url: string | null; creq: string | null } | null\n voucher: PaymentOutcomeVoucher | null\n attempts_left: number | null\n /** What to do next (server value, or derived from the decline code): fix the card, use another, rebuild the cart... */\n next_step: PaymentNextStep | null\n}\n\n/**\n * Classifies an attempt result. Unknown statuses are treated as `in_review`\n * (never as approved, never as a reason to charge again).\n */\nexport function paymentOutcome(result: PaymentAttemptResult, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentOutcome {\n const m = paymentMessages(locale, overrides)\n const p = result.payment\n const action: PaymentAction | null = p.action ?? null\n const base = {\n decline_code: null as DeclineCode | null,\n retryable: false,\n redirect_url: null as string | null,\n challenge: null as PaymentOutcome['challenge'],\n voucher: null as PaymentOutcome['voucher'],\n attempts_left: typeof result.attempts_left === 'number' ? result.attempts_left : null,\n next_step: (p.next_step ?? null) as PaymentNextStep | null,\n }\n const out = (kind: PaymentOutcomeKind, message: string, extra: Partial<PaymentOutcome> = {}): PaymentOutcome => ({ ...base, kind, message, ...extra })\n\n if (p.status === 'paid') return out('approved', m['state.approved'])\n if (p.status === 'failed') {\n const code = p.decline_code ?? 'declined'\n const known: DeclineCode = DECLINE_CODES.has(code) ? code : 'declined'\n return out('rejected', m[declineMessageKey(code)], {\n decline_code: known,\n next_step: p.next_step ?? NEXT_STEP[known],\n retryable: p.retryable !== false && base.attempts_left !== 0,\n })\n }\n if (p.status === 'expired') return out('expired', m['state.expired'], { next_step: 'rebuild_cart' })\n if (p.status === 'cancelled') return out('cancelled', m['state.cancelled'], { retryable: true, next_step: 'rebuild_cart' })\n\n if (action?.type === 'redirect') {\n const url = safeHttpsUrl(action.redirect_url)\n if (url) return out('redirect', m['state.redirect'], { redirect_url: url })\n }\n if (p.status === 'requires_action' || p.status === 'pending') {\n if (action?.type === 'voucher' && action.voucher) {\n const { amount: _a, currency: _c, voucher_url, ...rest } = action.voucher\n return out('voucher', m['state.voucher'], {\n next_step: 'pay_cash',\n voucher: { ...rest, voucher_url: safeHttpsUrl(voucher_url), amount: voucherMoney(action.voucher) },\n })\n }\n if (action?.type === 'challenge' && action.challenge) {\n return out('challenge', m['state.challenge'], {\n challenge: { url: safeHttpsUrl(action.challenge.url), creq: typeof action.challenge.creq === 'string' ? action.challenge.creq : null },\n })\n }\n }\n return out('in_review', m['state.in_review'])\n}\n\n/** Failures of `POST /payment` the form maps to a specific text and next step. */\nexport type PaymentErrorKind =\n | 'network' // no answer: retry with the SAME attempt (idempotent)\n | 'price_mismatch' // total changed: show it, remount, pay again with a NEW attempt\n | 'payment_in_progress' // 409 payment_in_progress: another attempt is paid/pending: do not retry\n | 'expired' // 409: reservation expired\n | 'too_many_attempts' // 429\n | 'generic'\n\nexport type PaymentErrorView = { kind: PaymentErrorKind; message: string; retrySameAttempt: boolean; canRetry: boolean }\n\n/**\n * Maps a transport error (a `StorefrontError` or anything with `status`/`code`)\n * to a view. Network failures and 502/503/504 are safe to retry with the same\n * idempotency key; 409/422/429 are answers, not outages.\n */\nexport function paymentErrorView(err: unknown, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentErrorView {\n const m = paymentMessages(locale, overrides)\n const e = (err ?? {}) as Partial<StorefrontError> & { status?: number; code?: string }\n const status = typeof e.status === 'number' ? e.status : 0\n const code = typeof e.code === 'string' ? e.code : ''\n if (code === 'price_mismatch') {\n return { kind: 'price_mismatch', message: m['error.price_mismatch'], retrySameAttempt: false, canRetry: true }\n }\n if (status === 409 && code === 'expired') return { kind: 'expired', message: m['error.expired'], retrySameAttempt: false, canRetry: false }\n if (status === 409 && code === 'payment_in_progress') {\n return { kind: 'payment_in_progress', message: m['error.payment_in_progress'], retrySameAttempt: false, canRetry: false }\n }\n // 409 conflict: that Idempotency-Key was already used with a DIFFERENT payment (e.g. a new card after a reload).\n // Not an outage and not \"in progress\": start a new attempt.\n if (status === 409) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 429 || code === 'too_many_attempts') {\n return { kind: 'too_many_attempts', message: m['error.too_many_attempts'], retrySameAttempt: false, canRetry: false }\n }\n // What OPS declared wins over the status: `retryable:false` is an answer (generic), any other 5xx (also a 500 with no readable body) is an outage whose charge may have happened: same key.\n const declared = (e as { retryable?: unknown }).retryable\n if (status >= 500 && declared === false) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 0 || status === 502 || status === 503 || status === 504 || code === 'network' || code === 'timeout' || status >= 500) {\n return { kind: 'network', message: m['error.network'], retrySameAttempt: true, canRetry: true }\n }\n return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n}\n\n/** `Vence el 5 de noviembre de 2026, 18:00` style text for a voucher deadline; `null` when absent or invalid. */\nexport function formatVoucherExpiry(expiresAt: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string | null {\n if (!expiresAt) return null\n const d = new Date(expiresAt)\n if (Number.isNaN(d.getTime())) return null\n let date: string\n try {\n date = new Intl.DateTimeFormat(locale ?? undefined, { dateStyle: 'long', timeStyle: 'short' }).format(d)\n } catch {\n date = d.toISOString()\n }\n return formatAvailabilityMessage(paymentMessages(locale, overrides)['voucher.expires'], { date })\n}\n\n/** Builds an idempotency key for a payment attempt: the same attempt always yields the same key. */\nexport function paymentIdempotencyKey(checkoutId: string, attempt: string): string {\n return `pay-${checkoutId}-${attempt}`\n}\n","/**\n * Pure helpers over an `Order` (contract 1.8): the unified progress, the one next action, shipment ordering and the\n * \"test\" rules. They READ what the server sent and only derive what an older server (no `progress` / `next_action`)\n * did not. Every enum is open: an unknown stage, step state or shipment status never throws, it is kept as is and the\n * UI shows its safe fallback.\n */\nimport { safeHttpsUrl } from './payments.js'\nimport type {\n InvoiceDoc,\n NextAction,\n Order,\n OrderProblem,\n OrderProgress,\n OrderProgressStep,\n OrderStage,\n OrderStepKey,\n Shipment,\n ShipmentEvent,\n ShipmentStatus,\n} from './types.js'\n\n/** Steps of an order that ships, in order. */\nexport const SHIPPING_STEPS = ['paid', 'preparing', 'shipped', 'in_transit', 'delivered'] as const\n/** Steps of an order the buyer picks up. */\nexport const PICKUP_STEPS = ['paid', 'preparing', 'ready_for_pickup', 'delivered'] as const\n\n/** Shipment statuses that mean the package is not where it should be. */\nconst SHIPMENT_PROBLEMS: Record<string, string> = { exception: 'delivery_exception', returned: 'returned', lost: 'lost' }\n\nconst RANK: Record<string, number> = { pending: 0, label_created: 1, in_transit: 2, out_for_delivery: 3, delivered: 4 }\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/** A shipment the buyer can be told about as real: not a sandbox one. */\nexport function isTestShipment(s: Pick<Shipment, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!s && (s.test_mode === true || s.environment === 'sandbox')\n}\n\n/** An invoice or credit note from a sandbox PAC. */\nexport function isTestInvoice(d: Pick<InvoiceDoc, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!d && (d.test_mode === true || d.environment === 'sandbox')\n}\n\n/** `https` URL with no credentials, or `null`. The only kind of link a tracking or voucher button may carry. */\nexport function safeTrackingUrl(value: unknown): string | null {\n return safeHttpsUrl(value)\n}\n\nfunction time(iso: string | null | undefined): number {\n const t = iso ? Date.parse(iso) : NaN\n return Number.isNaN(t) ? -Infinity : t\n}\n\n/** Newest first, invalid dates last, ties keep the server's order; at most `limit` (default 50, the contract's cap). */\nexport function sortTrackingEvents(events: readonly ShipmentEvent[] | null | undefined, limit = 50): ShipmentEvent[] {\n if (!Array.isArray(events)) return []\n return events\n .filter(isRecord as (e: unknown) => e is ShipmentEvent)\n .map((e, i) => ({ e, i }))\n .sort((a, b) => time(b.e.occurred_at) - time(a.e.occurred_at) || a.i - b.i)\n .slice(0, Math.max(0, limit))\n .map((x) => x.e)\n}\n\n/** The shipments of the order that count: outbound/pickup/local first, returns after; stable otherwise. */\nexport function orderShipments(order: Pick<Order, 'shipments'> | null | undefined): Shipment[] {\n const list = Array.isArray(order?.shipments) ? order!.shipments!.filter(isRecord as (s: unknown) => s is Shipment) : []\n return [...list.filter((s) => s.kind !== 'return'), ...list.filter((s) => s.kind === 'return')]\n}\n\nfunction validProgress(p: unknown): p is OrderProgress {\n return isRecord(p) && typeof p.stage === 'string' && Array.isArray(p.steps)\n}\n\nconst validStep = (s: unknown): s is OrderProgressStep => isRecord(s) && typeof s.key === 'string' && typeof s.state === 'string'\n\n/** The server's progress with anything malformed dropped: a bad step or problem never reaches the UI. */\nfunction cleanProgress(p: OrderProgress): OrderProgress {\n if (p.steps.every(validStep) && (p.problem === undefined || p.problem === null || (isRecord(p.problem) && typeof p.problem.code === 'string'))) return p\n const problem = isRecord(p.problem) && typeof p.problem.code === 'string' ? p.problem : null\n return { stage: p.stage, problem, steps: p.steps.filter(validStep) }\n}\n\n/** Shipments that tell the buyer something real about delivery: not returns, not sandbox. */\nconst liveShipments = (shipments: Shipment[]) => shipments.filter((s) => s.kind !== 'return' && !isTestShipment(s))\n\n/** The stage of an order from its legacy `status` / `payment_status` and its shipments (servers before contract 1.8). */\nfunction legacyStage(order: Order, shipments: Shipment[]): OrderStage {\n const status = typeof order.status === 'string' ? order.status.toLowerCase() : ''\n const pickup = order.delivery_method === 'pickup'\n if (status === 'cancelled' || status === 'canceled') return 'cancelled'\n if (status === 'refunded') return 'refunded'\n if (status === 'pending_payment' || order.payment_status === 'pending') return 'pending_payment'\n if (status === 'delivered' || status === 'fulfilled') return 'delivered'\n // The order is as far as its LEAST advanced live shipment (a partial delivery is not a delivered order); cancelled\n // legs and legs with a problem (flagged apart) do not hold it back. Same rule as the server.\n const live = liveShipments(shipments)\n const ranked = live.filter((s) => RANK[s.status] !== undefined)\n const least = ranked.reduce<string | null>((acc, s) => (acc === null || RANK[s.status]! < RANK[acc]! ? s.status : acc), null)\n if (least === 'delivered') return 'delivered'\n if (least === 'out_for_delivery') return 'out_for_delivery'\n if (least === 'in_transit') return 'in_transit'\n if (status === 'ready_for_pickup' || (status === 'ready' && pickup)) return 'ready_for_pickup'\n // A `shipped` status whose every shipment is a sandbox one: the package is not really on its way.\n const onlySandbox = shipments.some((s) => s.kind !== 'return') && live.length === 0\n if ((status === 'shipped' && !onlySandbox) || least === 'label_created') return 'shipped'\n if (status === 'fulfilling' || status === 'accepted' || status === 'ready' || status === 'shipped') return 'preparing'\n return 'paid'\n}\n\nconst STAGE_TO_STEP: Record<string, OrderStepKey> = {\n paid: 'paid',\n preparing: 'preparing',\n ready_for_pickup: 'ready_for_pickup',\n shipped: 'shipped',\n in_transit: 'in_transit',\n out_for_delivery: 'in_transit',\n delivered: 'delivered',\n}\n\n/** When the payment was confirmed (not when the order was placed: a cash voucher is paid days later), or `null`. */\nfunction paidAt(order: Order): string | null {\n const paid = Array.isArray(order.payments) ? order.payments.find((p) => isRecord(p) && typeof p.paid_at === 'string' && p.paid_at) : undefined\n return paid?.paid_at ?? null\n}\n\n/**\n * The unified progress. The server's `order.progress` wins when it is well formed; otherwise it is derived, so a store\n * on an older OPS still gets a timeline. Pending payment, cancelled and refunded orders have no steps to walk: `steps`\n * lists them as `pending` (or `[]` when cancelled/refunded) and the stage says why.\n */\nexport function orderProgress(order: Order): OrderProgress {\n if (validProgress(order.progress)) return cleanProgress(order.progress)\n const shipments = orderShipments(order)\n const stage = legacyStage(order, shipments)\n const keys: readonly string[] = order.delivery_method === 'pickup' ? PICKUP_STEPS : SHIPPING_STEPS\n const dead = stage === 'cancelled' || stage === 'refunded'\n const awaiting = stage === 'pending_payment'\n const current = STAGE_TO_STEP[stage] ?? 'paid'\n const at = keys.indexOf(current)\n const failed = liveShipments(shipments).find((s) => SHIPMENT_PROBLEMS[s.status])\n const problem: OrderProblem | null = failed\n ? { code: SHIPMENT_PROBLEMS[failed.status]!, at: sortTrackingEvents(failed.events)[0]?.occurred_at ?? null }\n : order.payment_status === 'failed'\n ? { code: 'payment_failed' }\n : null\n const steps: OrderProgressStep[] = dead\n ? []\n : keys.map((key, i) => {\n if (awaiting) return { key, state: 'pending', at: null }\n const state = i < at || stage === 'delivered' ? 'done' : i === at ? (problem && i >= keys.indexOf('shipped') ? 'problem' : 'current') : 'pending'\n return { key, state, at: key === 'paid' && state === 'done' ? paidAt(order) : null }\n })\n return { stage, problem, steps }\n}\n\n/**\n * The action to put first. The server's `next_action` wins (its `href` is re-checked: only `https`); an older server\n * gets one derived from the order and its invoice. Never `null`: `{ kind: 'none' }` means \"nothing to offer\".\n */\nexport function nextAction(order: Order): NextAction {\n // A 1.8 server that sends `next_action: null` means \"nothing to offer\"; only an older server (no key) is derived.\n if (order.next_action === null) return { kind: 'none', href: null, ref: null }\n if (isRecord(order.next_action) && typeof order.next_action.kind === 'string') {\n const href = safeTrackingUrl(order.next_action.href)\n return { kind: order.next_action.kind, href, ref: typeof order.next_action.ref === 'string' ? order.next_action.ref : null }\n }\n const progress = orderProgress(order)\n if (progress.stage === 'pending_payment') return { kind: 'pay', href: null, ref: null }\n if (progress.stage === 'cancelled' || progress.stage === 'refunded') return { kind: 'none', href: null, ref: null }\n const live = orderShipments(order).find((s) => s.kind !== 'return' && !isTestShipment(s) && s.status !== 'delivered' && s.status !== 'cancelled')\n const trackUrl = safeTrackingUrl(live?.tracking_url)\n if (live && trackUrl) return { kind: 'track', href: trackUrl, ref: live.id }\n if (progress.stage === 'ready_for_pickup') return { kind: 'pickup', href: null, ref: null }\n const inv = isRecord(order.invoice) ? order.invoice : undefined\n // The server's `action` wins over the stage: an issued invoice it does not offer (no file yet) is not a button.\n if (inv?.action === 'download' || (inv?.action === undefined && inv?.stage === 'issued')) {\n const docs = Array.isArray(order.invoices) ? order.invoices.filter((d) => isRecord(d) && d.kind === 'invoice' && d.status !== 'cancelled') : []\n const real = docs.find((d) => !isTestInvoice(d))\n // Detail with only sandbox invoices: never offer one as the buyer's invoice.\n if (docs.length === 0 || real) return { kind: 'download_invoice', href: null, ref: real?.id ?? null }\n }\n if (inv?.action === 'correct_data') return { kind: 'correct_invoice_data', href: null, ref: null }\n if (inv?.action === 'contact_store') return { kind: 'contact_store', href: null, ref: null }\n if (inv?.can_request === true && inv.stage !== 'requested') return { kind: 'request_invoice', href: null, ref: null }\n return { kind: 'none', href: null, ref: null }\n}\n\n/** Latest known status among the live (non-sandbox, non-return) shipments, or `null`. */\nexport function shipmentsStatus(order: Order): ShipmentStatus | null {\n if (order.shipments_summary && typeof order.shipments_summary.status === 'string') return order.shipments_summary.status\n const live = orderShipments(order).filter((s) => s.kind !== 'return' && !isTestShipment(s))\n return live.length ? live[0]!.status : null\n}\n","/**\n * Geo helpers: pure TypeScript, no network and no DOM. Works in Node 20, edge\n * runtimes and browsers. Behaviour is pinned by `geo-vectors.json`, which the\n * Go side copies verbatim, so keep both implementations in sync.\n */\n\nexport type GeoPoint = { lat: number; lng: number }\n\n/** `(0, 0)` means \"unset\" on this platform, so it is never a valid point. */\ntype MaybePoint = { lat?: number | null; lng?: number | null } | null | undefined\n\nexport type OpeningHours = {\n /** `day`: 1 = Monday ... 7 = Sunday. Several entries per day are allowed. A `close` at or before `open` crosses midnight. */\n weekly: { day: number; open: string; close: string }[]\n /** Dated overrides of the weekly rule. `closed`, or both `open` and `close`. */\n exceptions?: { date: string; closed?: true; open?: string; close?: string; note?: string }[]\n}\n\nexport type OpenStatus = {\n open: boolean\n /** ISO instant (UTC) when the current interval ends; `null` when closed. */\n closesAt: string | null\n /** ISO instant (UTC) of the next opening; `null` when open or none within 8 days. */\n nextOpenAt: string | null\n}\n\nconst RAD = Math.PI / 180\n\n/** Great-circle distance in km (haversine, earth radius 6371.0088 km). */\nexport function distanceKm(a: GeoPoint, b: GeoPoint): number {\n const dLat = (b.lat - a.lat) * RAD\n const dLng = (b.lng - a.lng) * RAD\n const h = Math.sin(dLat / 2) ** 2 + Math.cos(a.lat * RAD) * Math.cos(b.lat * RAD) * Math.sin(dLng / 2) ** 2\n return 2 * 6371.0088 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h))\n}\n\n/** Finite, in range and not the `(0, 0)` \"unset\" pair. */\nexport function isValidPoint(p: MaybePoint): p is GeoPoint {\n const { lat, lng } = p ?? {}\n // Number.isFinite is false for null, undefined and non-numbers.\n return Number.isFinite(lat) && Number.isFinite(lng) && Math.abs(lat!) <= 90 && Math.abs(lng!) <= 180 && !(lat === 0 && lng === 0)\n}\n\n/** `'19.43,-99.13'` (spaces allowed) to a point; `null` when malformed or invalid. */\nexport function parseLatLng(s: string | null | undefined): GeoPoint | null {\n const [a, b, ...rest] = (s ?? '').split(',')\n const p = !rest.length && a?.trim() && b?.trim() ? { lat: Number(a), lng: Number(b) } : null\n return isValidPoint(p) ? p : null\n}\n\nexport type RankOptions<T> = {\n /** Keep items at most this far away (inclusive). */\n radiusKm?: number\n /** Keep the first N after sorting. */\n limit?: number\n /** Defaults to reading `lat` / `lng` from the item. */\n getPoint?: (item: T) => MaybePoint\n}\n\n/**\n * Sorts by distance from `origin` (stable: ties keep input order). Items without\n * a valid point are EXCLUDED, not placed last, because they have no distance.\n */\nexport function rankByDistance<T>(\n items: readonly T[],\n origin: GeoPoint,\n { radiusKm, limit, getPoint = (i) => i as MaybePoint }: RankOptions<T> = {},\n): { item: T; distanceKm: number }[] {\n const out: { item: T; distanceKm: number }[] = []\n for (const item of items) {\n const p = getPoint(item)\n if (!isValidPoint(p)) continue\n const d = distanceKm(origin, p)\n if (radiusKm === undefined || d <= radiusKm) out.push({ item, distanceKm: d })\n }\n // Array.prototype.sort is stable (ES2019), so ties keep input order.\n out.sort((x, y) => x.distanceKm - y.distanceKm)\n return limit === undefined ? out : out.slice(0, Math.max(0, limit))\n}\n\n/** Under 1 km: meters rounded to 50 m. Otherwise km with one decimal. */\nexport function formatDistance(km: number, locale = 'es-MX'): string {\n const m = Math.round((km * 1000) / 50) * 50\n const [value, unit, digits] = m < 1000 ? [m, 'meter', 0] : [km, 'kilometer', 1]\n return new Intl.NumberFormat(locale, {\n style: 'unit', unit, minimumFractionDigits: digits, maximumFractionDigits: digits,\n }).format(value)\n}\n\n/** Destination for directions: coordinates when valid, else the address text. */\nexport function directionsUrl(\n location: { lat?: number | null; lng?: number | null; address?: string | null; city?: string | null },\n { provider = 'google' }: { provider?: 'google' | 'apple' | 'geo' } = {},\n): string | null {\n const ll = isValidPoint(location) ? `${location.lat},${location.lng}` : null\n const text = [location.address, location.city].filter(Boolean).join(', ')\n const dest = ll ?? text\n if (!dest) return null\n const q = encodeURIComponent(dest)\n if (provider === 'apple') return `https://maps.apple.com/?daddr=${q}`\n if (provider === 'geo') return ll ? `geo:${ll}?q=${ll}` : `geo:0,0?q=${q}`\n return `https://www.google.com/maps/dir/?api=1&destination=${q}`\n}\n\n// --- opening hours -------------------------------------------------------\n\nconst toMin = (t: string | undefined): number => {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(t ?? '')\n return m ? Number(m[1]) * 60 + Number(m[2]) : NaN\n}\n\ntype Iv = [number, number]\n\n/** Intervals in minutes; an end at or before the start crosses midnight. */\nconst interval = (open: string | undefined, close: string | undefined): Iv[] => {\n const s = toMin(open)\n let e = toMin(close)\n if (Number.isNaN(s) || Number.isNaN(e)) return []\n if (e <= s) e += 1440\n return [[s, e]]\n}\n\nconst dayIntervals = (h: OpeningHours, day: number, date: string): Iv[] => {\n const x = h.exceptions?.find((e) => e.date === date)\n if (x?.closed) return []\n if (x && x.open && x.close) return interval(x.open, x.close)\n return h.weekly.filter((w) => w.day === day).flatMap((w) => interval(w.open, w.close))\n}\n\n/**\n * Whether the place is open at `now` in the IANA `timeZone` (throws RangeError\n * for an unknown zone). Looks 8 days ahead for the next opening. Handles\n * intervals crossing midnight, several per day, dated exceptions and DST.\n */\nexport function openStatus(hours: OpeningHours, timeZone: string, now: Date = new Date()): OpenStatus {\n const fmt = new Intl.DateTimeFormat('en-US', {\n timeZone, hourCycle: 'h23', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric',\n })\n // Wall-clock minutes since the epoch as seen in `timeZone`.\n const wall = (ms: number): number => {\n const p: Record<string, number> = {}\n for (const { type, value } of fmt.formatToParts(ms)) p[type] = Number(value)\n return Date.UTC(p.year!, p.month! - 1, p.day!, (p.hour ?? 0) % 24, p.minute!) / 60000\n }\n const nowMs = now.getTime()\n const w = wall(nowMs)\n const day0 = Math.floor(w / 1440) * 1440\n // Offset from UTC, in minutes, at an instant.\n const offset = (ms: number): number => wall(ms) - Math.floor(ms / 60000)\n const toInstant = (t: number): string => {\n const guess = (t - offset(nowMs)) * 60000\n return new Date((t - offset(guess)) * 60000).toISOString()\n }\n\n const all: Iv[] = []\n for (let d = -1; d <= 8; d++) {\n const at = new Date((day0 + d * 1440) * 60000)\n const day = at.getUTCDay() || 7\n for (const [s, e] of dayIntervals(hours, day, at.toISOString().slice(0, 10))) all.push([day0 + d * 1440 + s, day0 + d * 1440 + e])\n }\n all.sort((a, b) => a[0] - b[0])\n const merged: Iv[] = []\n for (const iv of all) {\n const last = merged[merged.length - 1]\n if (last && iv[0] <= last[1]) last[1] = Math.max(last[1], iv[1])\n else merged.push([iv[0], iv[1]])\n }\n const current = merged.find(([s, e]) => s <= w && w < e)\n if (current) return { open: true, closesAt: toInstant(current[1]), nextOpenAt: null }\n const next = merged.find(([s]) => s > w)\n return { open: false, closesAt: null, nextOpenAt: next ? toInstant(next[0]) : null }\n}\n\ntype Run = { from: number; to: number; iv: Iv[] }\n\n/** Consecutive days (1..7) with identical intervals, in week order. */\nconst runs = (h: OpeningHours): Run[] => {\n const out: Run[] = []\n for (let day = 1; day <= 7; day++) {\n const iv = h.weekly.filter((x) => x.day === day).flatMap((x) => interval(x.open, x.close)).sort((a, b) => a[0] - b[0])\n if (!iv.length) continue\n const last = out[out.length - 1]\n if (last && last.to === day - 1 && JSON.stringify(last.iv) === JSON.stringify(iv)) last.to = day\n else out.push({ from: day, to: day, iv })\n }\n return out\n}\n\n/** Hour (24 for an end at midnight) and padded minutes of a minute-of-day value. */\nconst hm = (min: number): [number, string] => [min && min % 1440 === 0 ? 24 : Math.floor(min / 60) % 24, String(min % 60).padStart(2, '0')]\n\n/** Compact text, e.g. `Lun–Vie 9:00–19:00 · Sáb 9:00–14:00` (24 h) or `Mon–Fri 9:00 AM–7:00 PM` (en). */\nexport function formatOpeningHours(hours: OpeningHours, locale = 'es-MX'): string {\n const en = /^en/i.test(locale)\n const name = (d: number): string => {\n const s = new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }).format(Date.UTC(2024, 0, d)).replace(/\\.$/, '')\n return s.charAt(0).toUpperCase() + s.slice(1)\n }\n const time = (min: number): string => {\n const [h, m] = hm(min)\n return en ? `${h % 12 || 12}:${m} ${h % 24 < 12 ? 'AM' : 'PM'}` : `${h}:${m}`\n }\n return runs(hours)\n .map((r) => `${name(r.from)}${r.from === r.to ? '' : '–' + name(r.to)} ${r.iv.map(([s, e]) => `${time(s)}–${time(e)}`).join(', ')}`)\n .join(' · ')\n}\n\n/** schema.org `openingHours` strings, one per interval, e.g. `Mo-Fr 09:00-19:00`. */\nexport function toSchemaOpeningHours(hours: OpeningHours): string[] {\n const code = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']\n const t = (min: number): string => { const [h, m] = hm(min); return `${String(h).padStart(2, '0')}:${m}` }\n return runs(hours).flatMap((r) =>\n r.iv.map(([s, e]) => `${code[r.from - 1]}${r.from === r.to ? '' : '-' + code[r.to - 1]} ${t(s)}-${t(e)}`),\n )\n}\n","/**\n * Orders of the demo buyer (`cus_1`) that rehearse every state of the account screen (contract 1.8): shipped with\n * events, an issued invoice with its credit note and a refund, a sandbox shipment (never shown as real), a pickup that\n * is ready with a section the server could not read, and a cash voucher waiting for payment. Numbers are below 1000 and\n * dates older than the original seed order, so the order list still starts at `1000` and the first checkout is `1001`.\n */\nimport type { InvoiceDoc, Money, Order, PendingPayment, Shipment } from '../types.js'\n\ntype Seeded = Order & { customer_id: string | null }\n\nconst money = (cents: number, currency: string): Money => ({ amount: (cents / 100).toFixed(2), currency_code: currency })\n\nconst line = (title: string, variant: string | null, quantity: number, unitCents: number, currency: string) => ({\n title,\n variant_title: variant,\n sku: null,\n quantity,\n unit: money(unitCents, currency),\n total: money(unitCents * quantity, currency),\n image: null,\n})\n\nconst address = { first_name: 'Ana', last_name: 'Prueba', city: 'Querétaro', province: 'Qro.', zip: '76000', country_code: 'MX' }\n\nexport function buildAccountOrders(currency: string): Seeded[] {\n const inTransit: Shipment = {\n id: 'shp_seed_1',\n number: 'ENV-00001',\n kind: 'outbound',\n status: 'in_transit',\n environment: 'production',\n test_mode: false,\n carrier: 'Estafeta',\n carrier_logo_key: 'estafeta',\n service: 'Terrestre',\n tracking_number: '8012345678',\n tracking_url: 'https://rastreo.example.com/estafeta/8012345678',\n shipped_at: '2026-08-12T15:00:00.000Z',\n delivered_at: null,\n promised_by: '2026-08-16',\n label_url: null,\n events: [\n { id: 'evt_3', status: 'in_transit', description: 'En tránsito hacia tu ciudad', location: 'Querétaro, Qro.', occurred_at: '2026-08-14T09:30:00.000Z', source: 'carrier' },\n { id: 'evt_2', status: 'in_transit', description: 'Salió del centro de distribución', location: 'Ciudad de México, CDMX', occurred_at: '2026-08-13T07:10:00.000Z', source: 'carrier' },\n { id: 'evt_1', status: 'label_created', description: 'Guía generada', location: null, occurred_at: '2026-08-12T15:00:00.000Z', source: 'store' },\n ],\n map: {\n origin: { label: 'Ciudad de México, CDMX', lat: 19.43, lng: -99.13, precision: 'city' },\n destination: { label: 'Querétaro, Qro.', lat: 20.6, lng: -100.4, precision: 'city' },\n path: [{ label: 'Querétaro, Qro.', lat: 20.59, lng: -100.39, precision: 'city' }],\n },\n }\n const invoice: InvoiceDoc = {\n id: 'inv_seed_1',\n status: 'issued',\n kind: 'invoice',\n stage: 'issued',\n action: 'download',\n can_request: false,\n folio: '8F3C1A52-6E0B-4B58-9C0D-2B7D6B4D7A11',\n series: 'A',\n folio_number: '1042',\n total: money(129900, currency),\n issued_at: '2026-08-13T10:00:00.000Z',\n test_mode: false,\n environment: 'production',\n }\n const creditNote: InvoiceDoc = {\n id: 'inv_seed_1_nc',\n status: 'issued',\n kind: 'credit_note',\n stage: 'issued',\n action: 'download',\n can_request: false,\n folio: '1D9B7E20-4A5C-4C4B-8F11-6A0E3C9D5B02',\n series: 'NC',\n folio_number: '7',\n total: money(20000, currency),\n issued_at: '2026-08-15T10:00:00.000Z',\n related_to: 'inv_seed_1',\n test_mode: false,\n environment: 'production',\n }\n return [\n {\n id: 'ord_seed_shipped',\n number: '0999',\n status: 'shipped',\n created_at: '2026-08-12T12:00:00.000Z',\n total: money(129900, currency),\n customer_id: 'cus_1',\n lines: [line('Kit de frenos', 'Delantero', 1, 109900, currency), line('Líquido de frenos', '500 ml', 1, 20000, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n subtotal: money(111983, currency),\n tax: money(17917, currency),\n shipping: money(0, currency),\n discount: money(0, currency),\n tax_included: true,\n shipping_method: 'Estándar',\n shipping_address: address,\n returns: [],\n shipments: [inTransit],\n invoices: [invoice, creditNote],\n payments: [{ method_label: 'Tarjeta Visa terminada en 4242', family: 'card', status: 'partially_refunded', amount: money(129900, currency), paid_at: '2026-08-12T12:01:00.000Z' }],\n refunds: [{ id: 'rfd_seed_1', amount: money(20000, currency), status: 'completed', method_label: 'Tarjeta Visa terminada en 4242', created_at: '2026-08-15T09:00:00.000Z', completed_at: '2026-08-15T10:00:00.000Z', return_id: null }],\n },\n {\n id: 'ord_seed_preparing',\n number: '0998',\n status: 'fulfilling',\n created_at: '2026-08-11T12:00:00.000Z',\n total: money(54900, currency),\n customer_id: 'cus_1',\n lines: [line('Filtro de aceite', null, 3, 18300, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n shipping_method: 'shipping:Envío Estafeta',\n shipping_service: { title: 'Envío Estafeta', carrier: 'estafeta', carrier_logo_key: 'estafeta', eta_days_min: 1, eta_days_max: 3 },\n shipping_address: address,\n shipments: [],\n invoices: [],\n payments: [{ method_label: 'OXXO', family: 'cash_voucher', status: 'paid', amount: money(54900, currency), paid_at: '2026-08-11T18:00:00.000Z' }],\n refunds: [],\n },\n {\n id: 'ord_seed_sandbox',\n number: '0997',\n status: 'shipped',\n created_at: '2026-08-10T12:00:00.000Z',\n total: money(31000, currency),\n customer_id: 'cus_1',\n lines: [line('Bujía iridio', null, 4, 7750, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n shipments: [\n {\n id: 'shp_seed_test',\n kind: 'outbound',\n status: 'label_created',\n environment: 'sandbox',\n test_mode: true,\n carrier: 'Estafeta',\n carrier_logo_key: 'estafeta',\n tracking_number: null,\n tracking_url: null,\n events: [],\n map: null,\n },\n ],\n invoices: [\n { id: 'inv_seed_test', status: 'issued', kind: 'invoice', stage: 'issued', action: 'download', can_request: false, folio: '00000000-0000-4000-8000-000000000000', test_mode: true, environment: 'sandbox' },\n ],\n payments: [],\n refunds: [],\n },\n {\n id: 'ord_seed_pickup',\n number: '0996',\n status: 'ready_for_pickup',\n created_at: '2026-08-09T12:00:00.000Z',\n total: money(88000, currency),\n customer_id: 'cus_1',\n lines: [line('Batería 12V', null, 1, 88000, currency)],\n delivery_method: 'pickup',\n pickup: { location_id: null, name: 'Sucursal Centro', address: 'Av. Reforma 100', city: 'Ciudad de México', phone: null, ready_at: '2026-08-10T10:00:00.000Z', delivered_at: null },\n payment_status: 'paid',\n shipments: [],\n invoices: [],\n payments: [],\n refunds: [],\n degraded: ['invoices'],\n },\n ]\n}\n\n/** A voucher still valid (OXXO, with barcode) and one that already expired (SPEI). */\nexport function buildPendingPayments(currency: string, nowMs: number): PendingPayment[] {\n return [\n {\n id: 'chk_seed_oxxo',\n number: null,\n status: 'pending_payment',\n created_at: new Date(nowMs - 3_600_000).toISOString(),\n total: money(45000, currency),\n expires_at: new Date(nowMs + 47 * 3_600_000).toISOString(),\n payment: {\n provider: 'mercadopago',\n method: 'oxxo',\n reference: '12345678901234',\n barcode: '12345678901234',\n clabe: null,\n voucher_url: 'https://pagos.example.com/ficha/abc',\n instructions: 'Paga en cualquier OXXO antes de la fecha de vencimiento.',\n expires_at: new Date(nowMs + 47 * 3_600_000).toISOString(),\n amount: money(45000, currency),\n },\n },\n {\n id: 'chk_seed_spei',\n number: null,\n status: 'expired',\n created_at: new Date(nowMs - 9 * 86_400_000).toISOString(),\n total: money(120000, currency),\n expires_at: new Date(nowMs - 2 * 86_400_000).toISOString(),\n payment: {\n provider: 'mercadopago',\n method: 'spei',\n reference: null,\n barcode: null,\n clabe: '646180000000000001',\n voucher_url: null,\n instructions: null,\n expires_at: new Date(nowMs - 2 * 86_400_000).toISOString(),\n amount: money(120000, currency),\n },\n },\n ]\n}\n","/**\n * The Mexican region pack as `GET /storefront/region` publishes it: the MX seed of the region_mx addon\n * (manifest.json, models region_identity_documents, region_fiscal_catalogs and region_payment_methods; payload\n * shape of regionspec.BuildPublicDocuments / PublicFiscalID). Test and mock data only: the SDK engine knows no\n * country. Regenerate it from the addon when the seed changes.\n */\nimport type { IdentityDocumentSpec, RegionFiscalEntry, RegionPaymentMethod } from '../types.js'\n\nexport const SEED_MX_CSF: IdentityDocumentSpec = {\n \"kind\": \"MX:csf\",\n \"country_code\": \"MX\",\n \"label\": \"Constancia de situación fiscal\",\n \"help\": \"Es el PDF que te da el SAT con tu RFC, tu nombre o razón social, tu régimen y tu código postal fiscal. Lo leemos en tu dispositivo para llenar tus datos de facturación.\",\n \"obtain_url\": \"https://www.sat.gob.mx/portal/public/tramites/constancia-de-situacion-fiscal\",\n \"accept\": [\n \"application/pdf\"\n ],\n \"max_bytes\": 5242880,\n \"max_pages\": 6,\n \"engine\": \"rules@1\",\n \"rules\": {\n \"version\": 1,\n \"normalize\": [\n \"nbsp\",\n \"collapse_ws\"\n ],\n \"labels\": [\n \"RFC\",\n \"CURP\",\n \"Nombre \\\\(s\\\\)\",\n \"Nombre\",\n \"Primer Apellido\",\n \"Segundo Apellido\",\n \"Denominaci[óo]n\\\\s*/\\\\s*Raz[óo]n Social\",\n \"R[ée]gimen de capital\",\n \"Nombre Comercial\",\n \"Fecha (?:de )?inicio de operaciones\",\n \"Fecha de constituci[óo]n\",\n \"Estatus en el padr[óo]n\",\n \"Fecha de [úu]ltimo cambio de estado\",\n \"Datos del domicilio registrado\",\n \"C[óo]digo Postal\",\n \"Tipo de Vialidad\",\n \"Nombre de Vialidad\",\n \"N[úu]mero Exterior\",\n \"N[úu]mero Interior\",\n \"Nombre de la Colonia\",\n \"Nombre de la Localidad\",\n \"Nombre del Municipio o Demarcaci[óo]n Territorial\",\n \"Nombre de la Entidad Federativa\",\n \"Entre Calle\",\n \"Y Calle\",\n \"Actividades Econ[óo]micas\",\n \"Reg[íi]menes\",\n \"Obligaciones\",\n \"Correo Electr[óo]nico\"\n ],\n \"qr_canonical\": \"https://siat.sat.gob.mx/app/qr/faces/pages/mobile/validadorqr.jsf?D1=10&D2=1&D3={document_id}_{tax_id}\",\n \"fields\": [\n {\n \"key\": \"tax_id\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"RFC\",\n \"upper\": true,\n \"capture\": {\n \"pattern\": \"(?:^|[^A-Z0-9Ñ&])([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9Ñ&]|$)\",\n \"flags\": \"i\",\n \"group\": 1\n }\n },\n {\n \"strategy\": \"regex\",\n \"pattern\": \"(?:^|[^A-Z0-9Ñ&])([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9Ñ&]|$)\",\n \"flags\": \"i\",\n \"group\": 1,\n \"upper\": true\n },\n {\n \"strategy\": \"qr_param\",\n \"param\": \"D3\",\n \"split\": \"_\",\n \"parts\": 2,\n \"match\": \"^[A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3}$\"\n },\n {\n \"strategy\": \"qr_param\",\n \"scan\": \"(?:D3)?([0-9]{11})[^A-Z0-9Ñ&]{0,3}([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9]|$)\",\n \"flags\": \"i\",\n \"group\": 2\n }\n ]\n },\n {\n \"key\": \"legal_name\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"Denominaci[óo]n\\\\s*/\\\\s*Raz[óo]n Social\"\n },\n {\n \"strategy\": \"concat_labeled\",\n \"labels\": [\n \"Nombre \\\\(s\\\\)\",\n \"Primer Apellido\",\n \"Segundo Apellido\"\n ],\n \"separator\": \" \"\n }\n ]\n },\n {\n \"key\": \"postal_code\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"C[óo]digo Postal\",\n \"capture\": {\n \"pattern\": \"\\\\b([0-9]{5})\\\\b\",\n \"group\": 1\n }\n }\n ]\n },\n {\n \"key\": \"tax_regime\",\n \"required\": true,\n \"multiple\": true,\n \"strategies\": [\n {\n \"strategy\": \"catalog_phrases\",\n \"catalog\": \"fiscal_regime\",\n \"start\": \"Reg[íi]menes\\\\s*:?\",\n \"end\": \"Obligaciones\\\\s*:\"\n }\n ]\n },\n {\n \"key\": \"document_id\",\n \"strategies\": [\n {\n \"strategy\": \"regex\",\n \"pattern\": \"id\\\\s*CIF\\\\s*:?\\\\s*([0-9]{6,})\",\n \"flags\": \"i\",\n \"group\": 1\n },\n {\n \"strategy\": \"qr_param\",\n \"param\": \"D3\",\n \"split\": \"_\",\n \"parts\": 2,\n \"match\": \"^[0-9]+$\"\n },\n {\n \"strategy\": \"qr_param\",\n \"scan\": \"(?:D3)?([0-9]{11})[^A-Z0-9Ñ&]{0,3}([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9]|$)\",\n \"flags\": \"i\",\n \"group\": 1\n }\n ]\n },\n {\n \"key\": \"issued_on\",\n \"strategies\": [\n {\n \"strategy\": \"date\",\n \"order\": \"dmy\",\n \"pattern\": \"Fecha\\\\s+de\\\\s+Emisi[óo]n\\\\s*:?[^0-9]*?([0-9]{1,2})\\\\s+DE\\\\s+([A-Za-zÁÉÍÓÚÑáéíóúñ]+)\\\\s+DE\\\\s+([0-9]{4})\",\n \"flags\": \"i\",\n \"months\": [\n \"enero\",\n \"febrero\",\n \"marzo\",\n \"abril\",\n \"mayo\",\n \"junio\",\n \"julio\",\n \"agosto\",\n \"septiembre\",\n \"octubre\",\n \"noviembre\",\n \"diciembre\"\n ]\n }\n ]\n }\n ]\n },\n \"verify_kind\": \"qr_validator\",\n \"freshness_days\": 90,\n \"image_mode\": \"qr_only\",\n \"discard_fields\": [\n \"curp\",\n \"street\",\n \"exterior_number\",\n \"neighborhood\",\n \"activities\"\n ]\n} as IdentityDocumentSpec\n\nexport const SEED_MX_REGIMES: RegionFiscalEntry[] = [\n {\n \"code\": \"601\",\n \"label\": \"General de Ley Personas Morales\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"general de ley personas morales\"\n ]\n },\n {\n \"code\": \"603\",\n \"label\": \"Personas Morales con Fines no Lucrativos\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"fines no lucrativos\"\n ]\n },\n {\n \"code\": \"605\",\n \"label\": \"Sueldos y Salarios e Ingresos Asimilados a Salarios\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"sueldos y salarios\"\n ]\n },\n {\n \"code\": \"606\",\n \"label\": \"Arrendamiento\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"arrendamiento\"\n ]\n },\n {\n \"code\": \"607\",\n \"label\": \"Régimen de Enajenación o Adquisición de Bienes\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"enajenacion o adquisicion de bienes\"\n ]\n },\n {\n \"code\": \"608\",\n \"label\": \"Demás ingresos\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"demas ingresos\"\n ]\n },\n {\n \"code\": \"610\",\n \"label\": \"Residentes en el Extranjero sin Establecimiento Permanente en México\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"match_phrases\": [\n \"residentes en el extranjero\"\n ]\n },\n {\n \"code\": \"611\",\n \"label\": \"Ingresos por Dividendos (socios y accionistas)\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"dividendos\"\n ]\n },\n {\n \"code\": \"612\",\n \"label\": \"Personas Físicas con Actividades Empresariales y Profesionales\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"actividades empresariales y profesionales\"\n ]\n },\n {\n \"code\": \"614\",\n \"label\": \"Ingresos por intereses\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"ingresos por intereses\"\n ]\n },\n {\n \"code\": \"615\",\n \"label\": \"Régimen de los ingresos por obtención de premios\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"premios\"\n ]\n },\n {\n \"code\": \"616\",\n \"label\": \"Sin obligaciones fiscales\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"sin obligaciones fiscales\"\n ]\n },\n {\n \"code\": \"620\",\n \"label\": \"Sociedades Cooperativas de Producción que optan por diferir sus ingresos\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"sociedades cooperativas de produccion\"\n ]\n },\n {\n \"code\": \"621\",\n \"label\": \"Incorporación Fiscal\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"incorporacion fiscal\"\n ]\n },\n {\n \"code\": \"622\",\n \"label\": \"Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"actividades agricolas\"\n ]\n },\n {\n \"code\": \"623\",\n \"label\": \"Opcional para Grupos de Sociedades\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"opcional para grupos de sociedades\"\n ]\n },\n {\n \"code\": \"624\",\n \"label\": \"Coordinados\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"coordinados\"\n ]\n },\n {\n \"code\": \"625\",\n \"label\": \"Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"plataformas tecnologicas\"\n ]\n },\n {\n \"code\": \"626\",\n \"label\": \"Régimen Simplificado de Confianza\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"match_phrases\": [\n \"simplificado de confianza\"\n ]\n }\n]\n\nexport const SEED_MX_INVOICE_USES: RegionFiscalEntry[] = [\n {\n \"code\": \"G01\",\n \"label\": \"Adquisición de mercancías\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"G03\",\n \"label\": \"Gastos en general\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ],\n \"suggested_for_regimes\": [\n \"601\",\n \"612\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I01\",\n \"label\": \"Construcciones\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I02\",\n \"label\": \"Mobiliario y equipo de oficina por inversiones\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I03\",\n \"label\": \"Equipo de transporte\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I04\",\n \"label\": \"Equipo de cómputo y accesorios\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I05\",\n \"label\": \"Dados, troqueles, moldes, matrices y herramental\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I06\",\n \"label\": \"Comunicaciones telefónicas\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I07\",\n \"label\": \"Comunicaciones satelitales\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I08\",\n \"label\": \"Otra maquinaria y equipo\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"D01\",\n \"label\": \"Honorarios médicos, dentales y gastos hospitalarios\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D02\",\n \"label\": \"Gastos médicos por incapacidad o discapacidad\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D03\",\n \"label\": \"Gastos funerales\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D04\",\n \"label\": \"Donativos\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D05\",\n \"label\": \"Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación)\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D06\",\n \"label\": \"Aportaciones voluntarias al SAR\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D07\",\n \"label\": \"Primas por seguros de gastos médicos\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D08\",\n \"label\": \"Gastos de transportación escolar obligatoria\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D09\",\n \"label\": \"Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D10\",\n \"label\": \"Pagos por servicios educativos (colegiaturas)\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"S01\",\n \"label\": \"Sin efectos fiscales\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"610\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"616\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ],\n \"suggested_for_regimes\": [\n \"603\",\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"610\",\n \"611\",\n \"614\",\n \"615\",\n \"616\",\n \"620\"\n ]\n }\n]\n\nexport const SEED_MX_PAYMENT_METHODS: RegionPaymentMethod[] = [\n {\n \"code\": \"card\",\n \"label\": \"Tarjeta de crédito o débito\",\n \"description\": \"Visa, Mastercard y American Express. Pago seguro procesado por tu pasarela.\",\n \"kind\": \"card\",\n \"flow\": \"inline\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"icon\": \"CreditCard\",\n \"fiscal_payment_form\": \"04,28\"\n },\n {\n \"code\": \"mercadopago\",\n \"label\": \"Mercado Pago\",\n \"description\": \"Paga con tu cuenta de Mercado Pago: saldo, tarjetas guardadas o meses.\",\n \"kind\": \"wallet\",\n \"flow\": \"redirect\",\n \"providers\": [\n \"mercadopago\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"icon\": \"Wallet\",\n \"fiscal_payment_form\": \"06,04,28\"\n },\n {\n \"code\": \"oxxo\",\n \"label\": \"Efectivo en OXXO\",\n \"description\": \"Recibe una referencia y paga en cualquier tienda OXXO. Confirmamos tu pedido cuando se acredita el pago.\",\n \"kind\": \"cash_voucher\",\n \"flow\": \"voucher\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"expires_hours\": 72,\n \"icon\": \"Store\",\n \"fiscal_payment_form\": \"01\"\n },\n {\n \"code\": \"spei\",\n \"label\": \"Transferencia SPEI\",\n \"description\": \"Paga desde la app de tu banco con una CLABE única para tu pedido; se confirma en minutos.\",\n \"kind\": \"bank_transfer\",\n \"flow\": \"instructions\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"expires_hours\": 24,\n \"icon\": \"Landmark\",\n \"fiscal_payment_form\": \"03\"\n }\n] as RegionPaymentMethod[]\n\nexport const SEED_MX_FISCAL_ID_PATTERN = \"^[A-ZÑ&]{3,4}[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]$\"\nexport const SEED_MX_GENERIC_IDS: string[] = [\"XAXX010101000\", \"XEXX010101000\"]\n","/**\n * Region fixture of the mock: Mexico exactly as `GET /storefront/region` publishes it (see `region-mx.seed.ts`),\n * identity document `MX:csf` included, so a storefront can be built and tested without a server. It lives here,\n * and only here: the real data belongs to the region package, and the engine in `fiscal-document` knows no country.\n */\nimport type { IdentityDocumentSpec, IdentityRulesV1, InvoiceRequest, Region, RegionFiscalId } from '../types.js'\nimport { SEED_MX_CSF, SEED_MX_FISCAL_ID_PATTERN, SEED_MX_GENERIC_IDS, SEED_MX_INVOICE_USES, SEED_MX_PAYMENT_METHODS, SEED_MX_REGIMES } from './region-mx.seed.js'\n\nexport const MOCK_IDENTITY_DOCUMENT_MX_CSF: IdentityDocumentSpec = SEED_MX_CSF\nexport const MOCK_CSF_RULES = SEED_MX_CSF.rules as IdentityRulesV1\n\nexport const MOCK_FISCAL_ID_MX: RegionFiscalId = {\n kind: 'mx_rfc',\n label: 'RFC',\n pattern: SEED_MX_FISCAL_ID_PATTERN,\n generic_ids: SEED_MX_GENERIC_IDS,\n regimes: SEED_MX_REGIMES,\n invoice_uses: SEED_MX_INVOICE_USES,\n documents: [SEED_MX_CSF],\n // The pack's person-type patterns and check algorithm (region_settings.fiscal_id_person_patterns / _checksum).\n person_patterns: { individual: '^[A-ZÑ&]{4}[0-9]{6}[A-Z0-9]{3}$', company: '^[A-ZÑ&]{3}[0-9]{6}[A-Z0-9]{3}$' },\n checksum: 'mx_rfc',\n}\n\nexport const MOCK_REGION_MX: Region = {\n country_code: 'MX',\n name: 'México',\n locale: { default: 'es-MX', available: ['es-MX', 'en-US'], current: 'es-MX' },\n timezone: 'America/Mexico_City',\n currency: { code: 'MXN', symbol: '$', symbol_position: 'before', minor_units: 2 },\n formats: { date: 'dd/MM/yyyy', measurement: 'metric' },\n tax: { prices_include_tax: true, label: 'IVA', price_label: 'IVA incluido', show_breakdown: true, default_category: 'standard', categories: ['standard'] },\n address: { postal_code: { pattern: '^[0-9]{5}$', example: '06600' } },\n fiscal_id: MOCK_FISCAL_ID_MX,\n payment_methods: SEED_MX_PAYMENT_METHODS,\n}\n\nexport type InvoiceFieldError = { field: string; message: string }\n\n/** `individual` for a 13-character tax id, `company` for 12 (the mock's rule; a real region decides this server-side). */\nexport function mockPersonType(taxId: string): string | null {\n if (taxId.length === 13) return 'individual'\n if (taxId.length === 12) return 'company'\n return null\n}\n\n/** The first thing wrong with an invoice request against a region, as the API reports it (`field: invoice.<field>`), or `null`. */\nexport function validateInvoiceRequest(region: Region | null, input: InvoiceRequest, prefix = 'invoice'): InvoiceFieldError | null {\n const text = (...v: unknown[]) => v.map((x) => (typeof x === 'string' ? x.trim() : '')).find(Boolean) ?? ''\n const fid = region?.fiscal_id\n const taxId = text(input.tax_id, input.rfc).toUpperCase()\n const name = text(input.legal_name, input.razon_social)\n const regime = text(input.tax_regime, input.regimen)\n const use = text(input.use, input.uso_cfdi, input.invoice_use, input.cfdi_use)\n const postal = text(input.postal_code, input.cp, input.zip)\n const bad = (field: string, message: string): InvoiceFieldError => ({ field: `${prefix}.${field}`, message })\n\n if (!taxId) return bad('tax_id', 'The tax id is required')\n if (fid?.pattern && !fid.generic_ids.includes(taxId) && !new RegExp(fid.pattern).test(taxId)) return bad('tax_id', `Not a valid ${fid.kind}`)\n if (!name) return bad('legal_name', 'The legal name is required')\n if (!regime) return bad('tax_regime', 'The tax regime is required')\n const entry = fid?.regimes.find((r) => r.code === regime)\n if (fid && !entry) return bad('tax_regime', `Unknown tax regime ${regime}`)\n const person = fid?.generic_ids.includes(taxId) ? null : mockPersonType(taxId)\n if (entry && person && entry.person_types.length > 0 && !entry.person_types.includes(person)) {\n return bad('tax_regime', `The regime ${regime} does not apply to this ${fid!.kind}`)\n }\n const postalPattern = region?.address?.postal_code?.pattern\n if (!postal || (postalPattern && !new RegExp(postalPattern).test(postal))) return bad('postal_code', 'Not a valid postal code')\n if (!use) return bad('use', 'The invoice use is required')\n const useEntry = fid?.invoice_uses.find((u) => u.code === use)\n if (fid && !useEntry) return bad('use', `Unknown invoice use ${use}`)\n if (useEntry?.allowed_regimes && useEntry.allowed_regimes.length > 0 && !useEntry.allowed_regimes.includes(regime)) {\n return bad('use', `The regime ${regime} does not admit the use ${use}`)\n }\n return null\n}\n\nexport function maskTaxId(taxId: string): string {\n const v = taxId.trim()\n return v.length <= 4 ? '*'.repeat(v.length) : `${v.slice(0, 2)}${'*'.repeat(v.length - 5)}${v.slice(-3)}`\n}\n","// «My items» (contract 1.9): the pure side. The cascade of options a form shows, the same validation the server runs\n// (the server is the authority; this gives the buyer the answer without a round trip), the compatibility key and the\n// product tags it filters with. No UI, no storage, no copy, and no kind is named here: a kind is data the organization\n// publishes (`content.subjectKinds()`), and what a field \"means\" (make, size, breed) is only its label.\n//\n// Privacy: a `private` field (a licence plate) is kept apart. It is never part of `label`, `fit_key` or any tag, and\n// `maskedValue` / `isMasked` are how the server's mask is recognized so it is never sent back as if it were a value.\n\nimport type { SubjectCatalogNode, SubjectField, SubjectKind } from './types.js'\n\nexport const MIN_SUBJECT_YEAR = 1900\nexport const MAX_SUBJECT_YEAR = 2100\nconst MAX_VALUE_LENGTH = 80\nconst MAX_LABEL_LENGTH = 120\nconst MAX_FIT_KEY_LENGTH = 100\n\nexport type SubjectOption = { value: string; label: string }\nexport type SubjectValues = Record<string, string | number | null | undefined>\n\n/** Why a value was refused (the server answers `422` with the field `attributes.<key>` and never the value). */\nexport type SubjectProblemCode = 'required' | 'unknown' | 'invalid' | 'not_in_catalog' | 'year_range' | 'catalog_unavailable'\nexport type SubjectProblems = Record<string, SubjectProblemCode>\n\nexport type ResolvedSubject = {\n /** Built from the labels of the catalog and the public values, in field order. */\n label: string\n /** `''` when a placeholder of the template has no value (the item then never matches a product). */\n fit_key: string\n /** Public values, as the server stores them in `attributes`. */\n attributes: Record<string, string | number>\n /** Private values: never in the label, the key or a tag. */\n private: Record<string, string>\n}\n\nconst isPresent = (v: unknown): boolean => v !== null && v !== undefined && v !== ''\n\nconst asYear = (v: unknown): number | null => {\n const n = typeof v === 'number' ? v : typeof v === 'string' && /^\\s*\\d+\\s*$/.test(v) ? Number(v) : NaN\n return Number.isInteger(n) && n >= MIN_SUBJECT_YEAR && n <= MAX_SUBJECT_YEAR ? n : null\n}\n\n/** Collapses whitespace; `null` for a non-string, a control character or a value over `max` characters. */\nconst cleanText = (v: unknown, max: number): string | null => {\n if (typeof v !== 'string') return null\n const s = v.split(/\\s+/).filter(Boolean).join(' ')\n // eslint-disable-next-line no-control-regex\n return [...s].length > max || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(s) ? null : s\n}\n\nconst slug = (s: string): string => s.toLowerCase().replace(/[^a-z0-9._+-]+/g, '-').replace(/^-+|-+$/g, '')\n\n/** Does the option cover the model year? Declared `ranges` win; else `from`/`to`; an option with none covers any year. */\nexport function coversYear(node: Pick<SubjectCatalogNode, 'from' | 'to' | 'ranges'>, year: number): boolean {\n if (node.ranges && node.ranges.length > 0) return node.ranges.some(([a, b]) => year >= a && year <= b)\n if (node.from !== undefined && year < node.from) return false\n if (node.to !== undefined && year > node.to) return false\n return true\n}\n\nconst declaresYears = (n: SubjectCatalogNode): boolean => n.from !== undefined || n.to !== undefined || (n.ranges?.length ?? 0) > 0\n\n/** The catalog fields that make the tree's levels, in order: `source: catalog` and not a year. */\nexport function subjectLevels(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields.filter((f) => f.source === 'catalog' && f.type !== 'year')\n}\n\n/** The visible fields of a form: everything the buyer fills in, in the order of the kind. */\nexport function subjectFields(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields\n}\n\n/** Walks the chosen values down the tree; stops at the first level without a (valid) choice. */\nfunction walk(kind: SubjectKind, values: SubjectValues): { path: SubjectCatalogNode[]; ids: Record<string, string>; next: Record<string, SubjectCatalogNode> | undefined } {\n const path: SubjectCatalogNode[] = []\n const ids: Record<string, string> = {}\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n for (const f of subjectLevels(kind)) {\n const raw = values[f.key]\n const s = isPresent(raw) ? cleanText(raw, MAX_VALUE_LENGTH) : null\n const node: SubjectCatalogNode | undefined = s && tree ? (tree[s] ?? tree[s.toLowerCase()]) : undefined\n if (!s || !node) return { path, ids, next: tree }\n ids[f.key] = tree && tree[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n if (!tree) return { path, ids, next: undefined }\n }\n return { path, ids, next: tree }\n}\n\nconst byLabel = (a: SubjectOption, b: SubjectOption) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true })\n\n/**\n * The options a catalog field offers given what is already chosen (a cascade: a level shows nothing until the previous\n * one is chosen). A level narrows by the chosen year when the option declares years; a year field offers the model\n * years the chosen options cover (newest first), or nothing when no option declares years (a free number then).\n */\nexport function subjectOptions(kind: SubjectKind, fieldKey: string, values: SubjectValues): SubjectOption[] {\n const field = kind.fields.find((f) => f.key === fieldKey)\n if (!field || field.source !== 'catalog' || !kind.catalog) return []\n if (field.type === 'year') {\n // Only the options chosen BEFORE the year constrain it (a stale choice after it is reconciled against the year).\n const upto = kind.fields.slice(0, kind.fields.indexOf(field))\n const { path } = walk({ ...kind, fields: upto }, values)\n const declared = path.filter(declaresYears)\n if (declared.length === 0) return []\n let lo = Infinity\n let hi = -Infinity\n for (const n of declared) {\n for (const [a, b] of n.ranges?.length ? n.ranges : [[n.from ?? MIN_SUBJECT_YEAR, n.to ?? MAX_SUBJECT_YEAR] as [number, number]]) {\n lo = Math.min(lo, a)\n hi = Math.max(hi, b)\n }\n }\n const out: SubjectOption[] = []\n for (let y = Math.min(hi, MAX_SUBJECT_YEAR); y >= Math.max(lo, MIN_SUBJECT_YEAR); y--) if (declared.every((n) => coversYear(n, y))) out.push({ value: String(y), label: String(y) })\n return out\n }\n const levels = subjectLevels(kind)\n const at = levels.findIndex((f) => f.key === fieldKey)\n if (at < 0) return []\n // Only the levels before this one must be chosen.\n const before = Object.fromEntries(levels.slice(0, at).map((f) => [f.key, values[f.key]]))\n const { path, next } = walk({ ...kind, fields: kind.fields.filter((f) => levels.slice(0, at).includes(f) || f.type === 'year') }, before)\n if (path.length < at || !next) return []\n const year = asYear(values[kind.fields.find((f) => f.type === 'year' && f.source === 'catalog')?.key ?? ''])\n return Object.entries(next)\n .filter(([, n]) => year === null || coversYear(n, year))\n .map(([value, n]) => ({ value, label: n.label }))\n .sort(byLabel)\n}\n\n/**\n * Drops what was chosen and is no longer valid after a change (a new make clears the model; a year the model does not\n * cover is cleared), in field order. Free values are never touched.\n */\nexport function reconcileSubjectValues(kind: SubjectKind, values: SubjectValues): SubjectValues {\n const out: SubjectValues = { ...values }\n for (const f of kind.fields) {\n if (f.source !== 'catalog' || !isPresent(out[f.key])) continue\n const options = subjectOptions(kind, f.key, out)\n const v = String(out[f.key])\n const ok = f.type === 'year' ? options.length === 0 || options.some((o) => o.value === v) : options.some((o) => o.value === v || o.value === v.toLowerCase())\n if (!ok) out[f.key] = ''\n }\n return out\n}\n\n/**\n * Validates and resolves the values the way the server does: unknown field, wrong type, a value missing from the\n * catalog and a year outside the chosen options' years are refused, naming the field only.\n */\nexport function resolveSubject(kind: SubjectKind, values: SubjectValues): { ok: true; subject: ResolvedSubject } | { ok: false; problems: SubjectProblems } {\n const problems: SubjectProblems = {}\n const known = new Set(kind.fields.map((f) => f.key))\n for (const key of Object.keys(values)) if (isPresent(values[key]) && !known.has(key)) problems[key] = 'unknown'\n\n const attributes: Record<string, string | number> = {}\n const priv: Record<string, string> = {}\n const display: Record<string, string> = {}\n const ids: Record<string, string> = {}\n const path: SubjectCatalogNode[] = []\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n const years: string[] = []\n const put = (f: SubjectField, v: string | number) => {\n if (f.private) priv[f.key] = String(v)\n else attributes[f.key] = v\n }\n for (const f of kind.fields) {\n const raw = values[f.key]\n if (!isPresent(raw)) {\n if (f.required) problems[f.key] = 'required'\n if (f.source === 'catalog' && f.type !== 'year') tree = undefined // a skipped level ends the walk\n continue\n }\n const max = f.max ?? MAX_VALUE_LENGTH\n if (f.type === 'year') {\n const y = asYear(raw)\n if (y === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, y)\n display[f.key] = ids[f.key] = String(y)\n if (f.source === 'catalog') years.push(f.key)\n } else if (f.source === 'catalog') {\n if (!kind.catalog) {\n problems[f.key] = 'catalog_unavailable'\n continue\n }\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n const node: SubjectCatalogNode | undefined = tree?.[s] ?? tree?.[s.toLowerCase()]\n if (!node) {\n problems[f.key] = 'not_in_catalog'\n continue\n }\n const id = tree?.[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n put(f, id)\n display[f.key] = node.label\n ids[f.key] = id\n } else {\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, s)\n display[f.key] = s\n ids[f.key] = slug(s)\n }\n }\n for (const key of years) {\n const y = attributes[key] as number | undefined\n if (y !== undefined && !problems[key] && !path.every((n) => coversYear(n, y))) problems[key] = 'year_range'\n }\n if (Object.keys(problems).length > 0) return { ok: false, problems }\n\n const label = [...kind.fields.filter((f) => !f.private).map((f) => display[f.key]).filter(Boolean).join(' ')].slice(0, MAX_LABEL_LENGTH).join('').trim()\n if (!label) return { ok: false, problems: { _: 'required' } }\n let complete = true\n const key = kind.fit_key_template.replace(/\\{([a-z][a-z0-9_]*)\\}/g, (_m, name: string) => {\n const id = ids[name]\n if (!id) complete = false\n return id ?? ''\n })\n return { ok: true, subject: { label, fit_key: complete && key.length <= MAX_FIT_KEY_LENGTH ? key.toLowerCase() : '', attributes, private: priv } }\n}\n\n/** The mask the server puts in place of a private value («••34»). */\nexport const PRIVATE_MASK = '••'\nexport const isMasked = (v: unknown): boolean => typeof v === 'string' && v.startsWith(PRIVATE_MASK)\n\n/** Prefix of the tag that publishes compatibility (`<prefix><fit_key>`), as in `FitmentConfig.tagPrefix`. */\nexport const DEFAULT_FIT_TAG_PREFIX = 'fit:'\n\n/** The product tag that marks a part as fitting the item with this key. */\nexport const fitTag = (fitKey: string, prefix: string = DEFAULT_FIT_TAG_PREFIX): string => `${prefix}${fitKey}`\n\n/**\n * The `tags_any` of a listing \"only what fits my item\": its own tag plus the universal one (`<prefix>universal`).\n * `[]` when the item has no key (it does not resolve completely): ask for nothing rather than for the wrong thing.\n */\nexport function fitTagsAny(fitKey: string | null | undefined, opts: { prefix?: string; universal?: boolean } = {}): string[] {\n if (!fitKey) return []\n const prefix = opts.prefix ?? DEFAULT_FIT_TAG_PREFIX\n return opts.universal === false ? [fitTag(fitKey, prefix)] : [fitTag(fitKey, prefix), `${prefix}universal`]\n}\n\n/**\n * Budget of one catalog page, in bytes of the `tree` prop as OPS stores it (text, so every quote is escaped). Publishing\n * a page is ONE write of at most 64 KiB that carries the draft and the published copy: ~28 KB of tree per page.\n */\nexport const SUBJECT_CATALOG_PAGE_BYTES = 28 * 1024\n\nconst utf8Bytes = (s: string): number => new TextEncoder().encode(s).length\n\n/**\n * Splits a catalog tree by its first level into parts that each fit one page (`subject_catalog` section, prop `tree`).\n * Publish part `i` on its own page and name them all in the kind's `catalog_ref` (`[\"page:x-1\", \"page:x-2\", …]`); the\n * server joins them back. A real parts catalog (make → model → engine) does not fit in one page. Throws `RangeError`\n * when a single first-level option is larger than the budget on its own (split that level by hand, or trim labels).\n */\nexport function splitSubjectTree(\n tree: Record<string, SubjectCatalogNode>,\n maxBytes: number = SUBJECT_CATALOG_PAGE_BYTES,\n): Record<string, SubjectCatalogNode>[] {\n const size = (part: Record<string, SubjectCatalogNode>) => utf8Bytes(JSON.stringify(JSON.stringify(part)))\n const parts: Record<string, SubjectCatalogNode>[] = []\n let current: Record<string, SubjectCatalogNode> = {}\n for (const [id, node] of Object.entries(tree)) {\n if (size({ [id]: node }) > maxBytes) throw new RangeError(`splitSubjectTree: option ${id} alone exceeds ${maxBytes} bytes`)\n const next = { ...current, [id]: node }\n if (Object.keys(current).length > 0 && size(next) > maxBytes) {\n parts.push(current)\n current = { [id]: node }\n } else current = next\n }\n if (Object.keys(current).length > 0) parts.push(current)\n return parts\n}\n","import type {\n Article,\n Collection,\n Customer,\n Image,\n Location,\n Menu,\n Page,\n Product,\n ProductOption,\n ProductVariant,\n Shop,\n Theme,\n} from '../types.js'\n\n/**\n * Placeholder image source for all seed data. Swap it (or pass `imageUrl` to\n * `createMockStorefront`) to use your own assets.\n */\nexport const MOCK_IMAGE_URL = (seed: string, width = 800, height = 800): string =>\n `https://picsum.photos/seed/${encodeURIComponent(seed)}/${width}/${height}`\n\nexport type MockImageUrl = typeof MOCK_IMAGE_URL\n\nexport const MOCK_CURRENCY = 'MXN'\n\n/** Seed customer that already exists (log in with OTP `000000`). */\nexport const MOCK_CUSTOMER_EMAIL = 'cliente@example.com'\n\ntype ProductSpec = {\n handle: string\n title: string\n collection: string\n type: string\n vendor: string\n price: number\n compareAt?: number\n options?: ProductOption[]\n tags?: string[]\n attributes?: Product['attributes']\n /** Stock per variant index (default 12). */\n stock?: number | ((index: number, opts: Record<string, string>) => number)\n /** Extra price per option value, e.g. `{ XL: 50 }`. */\n priceDelta?: Record<string, number>\n description: string\n}\n\nconst OPT = {\n size: (values = ['S', 'M', 'L']): ProductOption => ({ name: 'Talla', values }),\n color: (values: string[]): ProductOption => ({ name: 'Color', values }),\n}\n\nexport const COLLECTION_SPECS: { handle: string; title: string; description: string; parent?: string }[] = [\n { handle: 'ropa', title: 'Ropa', description: 'Prendas básicas para todos los días.' },\n { handle: 'hogar', title: 'Hogar', description: 'Objetos útiles y bonitos para tu casa.' },\n { handle: 'accesorios', title: 'Accesorios', description: 'Complementos para llevar contigo.' },\n { handle: 'llantas', title: 'Llantas', description: 'Llantas para auto por medida.' },\n]\n\nconst tire = (width: number, aspect: number, rim: number) => ({\n width,\n aspect,\n rim,\n size_key: `${width}/${aspect}R${rim}`,\n})\n\nexport const PRODUCT_SPECS: ProductSpec[] = [\n // Ropa\n { handle: 'playera-basica', title: 'Playera básica', collection: 'ropa', type: 'Playera', vendor: 'Casa Textil', price: 249, compareAt: 299, options: [OPT.size(), OPT.color(['Blanco', 'Negro'])], tags: ['algodón', 'nuevo'], stock: (i) => (i === 5 ? 0 : 15), description: 'Playera de algodón peinado, corte recto.' },\n { handle: 'sudadera-capucha', title: 'Sudadera con capucha', collection: 'ropa', type: 'Sudadera', vendor: 'Casa Textil', price: 699, options: [OPT.size(['S', 'M', 'L', 'XL']), OPT.color(['Gris', 'Azul'])], priceDelta: { XL: 50 }, tags: ['invierno'], description: 'Sudadera afelpada con bolsa canguro.' },\n { handle: 'pantalon-chino', title: 'Pantalón chino', collection: 'ropa', type: 'Pantalón', vendor: 'Taller Urbano', price: 899, options: [OPT.size(['28', '30', '32', '34'])], stock: (i) => (i === 0 ? 0 : 6), description: 'Pantalón de gabardina con un toque de elasticidad.' },\n { handle: 'chamarra-ligera', title: 'Chamarra ligera', collection: 'ropa', type: 'Chamarra', vendor: 'Taller Urbano', price: 1299, compareAt: 1599, options: [OPT.size()], tags: ['oferta'], description: 'Chamarra rompevientos plegable.' },\n { handle: 'gorra-clasica', title: 'Gorra clásica', collection: 'ropa', type: 'Gorra', vendor: 'Casa Textil', price: 199, options: [OPT.color(['Negro', 'Beige', 'Verde'])], description: 'Gorra de seis paneles con ajuste trasero.' },\n { handle: 'calcetines-paquete', title: 'Calcetines (paquete de 3)', collection: 'ropa', type: 'Calcetines', vendor: 'Casa Textil', price: 149, stock: 0, description: 'Tres pares de calcetines de algodón.' },\n // Hogar\n { handle: 'taza-ceramica', title: 'Taza de cerámica', collection: 'hogar', type: 'Cocina', vendor: 'Barro Vivo', price: 129, options: [OPT.color(['Blanco', 'Terracota'])], tags: ['regalo'], description: 'Taza de 350 ml hecha a mano.' },\n { handle: 'lampara-mesa', title: 'Lámpara de mesa', collection: 'hogar', type: 'Iluminación', vendor: 'Luz Serena', price: 1199, description: 'Lámpara con pantalla de lino y base de madera.' },\n { handle: 'cojin-decorativo', title: 'Cojín decorativo', collection: 'hogar', type: 'Textil', vendor: 'Casa Textil', price: 349, compareAt: 399, options: [OPT.color(['Mostaza', 'Verde', 'Gris'])], description: 'Cojín de 45 × 45 cm con funda removible.' },\n { handle: 'set-sartenes', title: 'Set de sartenes', collection: 'hogar', type: 'Cocina', vendor: 'Cocina Diaria', price: 1899, compareAt: 2299, tags: ['oferta'], description: 'Tres sartenes antiadherentes de 20, 24 y 28 cm.' },\n { handle: 'manta-tejida', title: 'Manta tejida', collection: 'hogar', type: 'Textil', vendor: 'Casa Textil', price: 799, description: 'Manta de punto grueso, 130 × 170 cm.' },\n { handle: 'maceta-barro', title: 'Maceta de barro', collection: 'hogar', type: 'Jardín', vendor: 'Barro Vivo', price: 189, options: [{ name: 'Tamaño', values: ['Chica', 'Mediana', 'Grande'] }], priceDelta: { Mediana: 60, Grande: 140 }, description: 'Maceta de barro natural con plato.' },\n // Accesorios\n { handle: 'mochila-diaria', title: 'Mochila diaria', collection: 'accesorios', type: 'Mochila', vendor: 'Ruta Libre', price: 999, options: [OPT.color(['Negro', 'Azul'])], tags: ['nuevo'], description: 'Mochila de 20 L con compartimento para laptop.' },\n { handle: 'botella-termica', title: 'Botella térmica', collection: 'accesorios', type: 'Botella', vendor: 'Ruta Libre', price: 399, options: [{ name: 'Capacidad', values: ['500 ml', '750 ml'] }], priceDelta: { '750 ml': 80 }, description: 'Mantiene frío 24 h y caliente 12 h.' },\n { handle: 'lentes-sol', title: 'Lentes de sol', collection: 'accesorios', type: 'Lentes', vendor: 'Vista Clara', price: 599, compareAt: 749, description: 'Lentes polarizados con protección UV400.' },\n { handle: 'reloj-analogico', title: 'Reloj analógico', collection: 'accesorios', type: 'Reloj', vendor: 'Vista Clara', price: 1499, description: 'Reloj con correa de piel y cristal mineral.' },\n { handle: 'cartera-piel', title: 'Cartera de piel', collection: 'accesorios', type: 'Cartera', vendor: 'Taller Urbano', price: 549, options: [OPT.color(['Café', 'Negro'])], description: 'Cartera delgada con seis ranuras.' },\n { handle: 'paraguas-compacto', title: 'Paraguas compacto', collection: 'accesorios', type: 'Paraguas', vendor: 'Ruta Libre', price: 299, stock: 3, description: 'Paraguas plegable resistente al viento.' },\n // Llantas (exercise attribute facets)\n { handle: 'llanta-205-55-r16-touring', title: 'Llanta 205/55 R16 Touring', collection: 'llantas', type: 'Llanta', vendor: 'Marca Norte', price: 1899, compareAt: 2099, attributes: { ...tire(205, 55, 16), load_index: 91, speed_rating: 'V', runflat: false }, tags: ['auto'], description: 'Llanta de turismo silenciosa y de bajo consumo.' },\n { handle: 'llanta-205-55-r16-sport', title: 'Llanta 205/55 R16 Sport', collection: 'llantas', type: 'Llanta', vendor: 'Marca Sur', price: 2199, attributes: { ...tire(205, 55, 16), load_index: 94, speed_rating: 'W', runflat: false }, tags: ['auto'], description: 'Agarre deportivo en seco y mojado.' },\n { handle: 'llanta-195-65-r15-eco', title: 'Llanta 195/65 R15 Eco', collection: 'llantas', type: 'Llanta', vendor: 'Marca Norte', price: 1499, attributes: { ...tire(195, 65, 15), load_index: 91, speed_rating: 'H', runflat: false }, tags: ['auto'], description: 'Baja resistencia al rodamiento.' },\n { handle: 'llanta-225-45-r17-runflat', title: 'Llanta 225/45 R17 Run Flat', collection: 'llantas', type: 'Llanta', vendor: 'Marca Centro', price: 3299, attributes: { ...tire(225, 45, 17), load_index: 91, speed_rating: 'W', runflat: true }, tags: ['auto'], stock: 2, description: 'Permite rodar hasta 80 km sin presión.' },\n { handle: 'llanta-265-70-r16-at', title: 'Llanta 265/70 R16 All Terrain', collection: 'llantas', type: 'Llanta', vendor: 'Marca Sur', price: 3599, attributes: { ...tire(265, 70, 16), load_index: 112, speed_rating: 'T', runflat: false }, tags: ['camioneta'], description: 'Para camioneta, asfalto y terracería.' },\n { handle: 'llanta-175-70-r13-city', title: 'Llanta 175/70 R13 City', collection: 'llantas', type: 'Llanta', vendor: 'Marca Centro', price: 999, attributes: { ...tire(175, 70, 13), load_index: 82, speed_rating: 'T', runflat: false }, tags: ['auto'], stock: 0, description: 'Económica y durable para ciudad.' },\n]\n\nconst money = (n: number, currency: string) => ({ amount: n.toFixed(2), currency_code: currency })\n\nfunction cartesian(options: ProductOption[]): Record<string, string>[] {\n let combos: Record<string, string>[] = [{}]\n for (const opt of options) {\n const next: Record<string, string>[] = []\n for (const c of combos) for (const v of opt.values) next.push({ ...c, [opt.name]: v })\n combos = next\n }\n return combos\n}\n\nconst BASE_DATE = Date.UTC(2026, 8, 30, 12, 0, 0)\n\nfunction image(url: MockImageUrl, seed: string, alt: string): Image {\n return { url: url(seed), alt, width: 800, height: 800 }\n}\n\nexport function buildProducts(currency: string, imageUrl: MockImageUrl = MOCK_IMAGE_URL): Product[] {\n return PRODUCT_SPECS.map((spec, pi) => {\n const options = spec.options ?? []\n const combos = options.length ? cartesian(options) : [{}]\n const images = [image(imageUrl, spec.handle, spec.title), image(imageUrl, `${spec.handle}-2`, `${spec.title}, detalle`)]\n const variants: ProductVariant[] = combos.map((opts, vi) => {\n const delta = Object.values(opts).reduce((sum, v) => sum + (spec.priceDelta?.[v] ?? 0), 0)\n const price = spec.price + delta\n const stock = typeof spec.stock === 'function' ? spec.stock(vi, opts) : (spec.stock ?? 12)\n const title = Object.values(opts).join(' / ') || 'Predeterminado'\n const firstValue = Object.values(opts)[0]\n return {\n id: `var_${pi + 1}_${vi + 1}`,\n sku: `${spec.handle.toUpperCase().replace(/-/g, '')}-${vi + 1}`.slice(0, 32),\n title,\n selected_options: Object.entries(opts).map(([name, value]) => ({ name, value })),\n price: money(price, currency),\n compare_at_price: spec.compareAt ? money(spec.compareAt + delta, currency) : null,\n available_for_sale: stock > 0,\n quantity_available: stock,\n image: firstValue ? image(imageUrl, `${spec.handle}-${firstValue}`, `${spec.title} ${firstValue}`) : null,\n barcode: `75000000${String(pi * 100 + vi).padStart(5, '0')}`,\n }\n })\n const prices = variants.map((v) => Number(v.price.amount))\n const compares = variants.map((v) => (v.compare_at_price ? Number(v.compare_at_price.amount) : null)).filter((n): n is number => n !== null)\n const collection = COLLECTION_SPECS.find((c) => c.handle === spec.collection)!\n return {\n id: `prod_${pi + 1}`,\n handle: spec.handle,\n title: spec.title,\n description: spec.description,\n description_html: `<p>${spec.description}</p>`,\n vendor: spec.vendor,\n product_type: spec.type,\n category: { id: `cat_${spec.collection}`, handle: collection.handle, title: collection.title },\n tags: spec.tags ?? [],\n attributes: spec.attributes ?? {},\n featured_image: images[0] ?? null,\n images,\n options,\n variants,\n price_range: { min: money(Math.min(...prices), currency), max: money(Math.max(...prices), currency) },\n compare_at_price_range: compares.length\n ? { min: money(Math.min(...compares), currency), max: money(Math.max(...compares), currency) }\n : null,\n available_for_sale: variants.some((v) => v.available_for_sale),\n seo: { title: `${spec.title} | Mi tienda`, description: spec.description },\n updated_at: new Date(BASE_DATE - pi * 86_400_000).toISOString(),\n }\n })\n}\n\n/** Product handle → collection handles. */\nexport function buildMemberships(): Record<string, string[]> {\n const out: Record<string, string[]> = {}\n for (const p of PRODUCT_SPECS) out[p.handle] = [p.collection]\n return out\n}\n\nexport function buildCollections(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Collection[] {\n return COLLECTION_SPECS.map((c) => ({\n id: `col_${c.handle}`,\n handle: c.handle,\n title: c.title,\n description: c.description,\n image: image(imageUrl, `col-${c.handle}`, c.title),\n seo: { title: `${c.title} | Mi tienda`, description: c.description },\n parent_handle: c.parent ?? null,\n }))\n}\n\nconst MX_TZ = 'America/Mexico_City'\nconst weekdays = (open: string, close: string, days = [1, 2, 3, 4, 5]) => days.map((day) => ({ day, open, close }))\n\n/** Three example branches (CDMX, Monterrey, Guadalajara) with structured hours. */\nexport function buildLocations(currency: string): Location[] {\n const contacts = (phone: string | null) => ({ phone, email: null, whatsapp: null })\n return [\n {\n id: 'br_centro', name: 'Sucursal Centro', kind: 'store', address: 'Av. Principal 100, Col. Centro', city: 'Ciudad de México', postal_code: '06000',\n phone: '+52 55 0000 0001', lat: 19.4326, lng: -99.1332, timezone: MX_TZ,\n hours: 'Mo-Fr 09:00-19:00, Sa 09:00-14:00', opening_hours_text: 'Lun–Vie 9:00–19:00 · Sáb 9:00–14:00',\n opening_hours: { weekly: [...weekdays('09:00', '19:00'), { day: 6, open: '09:00', close: '14:00' }] },\n services: ['pickup', 'returns'], contacts: contacts('+52 55 0000 0001'),\n pickup: { enabled: true, fee: null, prep_days: 0 },\n },\n {\n id: 'br_norte', name: 'Sucursal Norte', kind: 'store', address: 'Calle Secundaria 25, Col. Norte', city: 'Monterrey', postal_code: '64000',\n phone: null, lat: 25.6866, lng: -100.3161, timezone: MX_TZ,\n hours: 'Mo-Sa 10:00-18:00', opening_hours_text: 'Lun–Sáb 10:00–18:00',\n opening_hours: { weekly: weekdays('10:00', '18:00', [1, 2, 3, 4, 5, 6]) },\n services: ['pickup'], contacts: contacts(null),\n pickup: { enabled: true, fee: money(30, currency), prep_days: 1 },\n },\n {\n id: 'br_occidente', name: 'Punto de recolección Occidente', kind: 'pickup_point', address: 'Av. Vallarta 1500, Col. Americana', city: 'Guadalajara', postal_code: '44100',\n phone: '+52 33 0000 0003', lat: 20.6736, lng: -103.3897, timezone: MX_TZ,\n hours: 'Mo-Fr 11:00-20:00', opening_hours_text: 'Lun–Vie 11:00–20:00',\n opening_hours: { weekly: weekdays('11:00', '20:00') },\n services: ['pickup'], contacts: contacts('+52 33 0000 0003'),\n pickup: { enabled: false, fee: null, prep_days: 2 },\n },\n ]\n}\n\n/** Postal-code centroids the mock can resolve (the real API resolves any Mexican CP). */\nexport const MOCK_POSTAL_CENTROIDS: Record<string, { lat: number; lng: number }> = {\n '06000': { lat: 19.4326, lng: -99.1332 },\n '64000': { lat: 25.6714, lng: -100.309 },\n '44100': { lat: 20.6767, lng: -103.3475 },\n '03100': { lat: 19.3885, lng: -99.1719 },\n}\n\nexport function buildShop(currency: string, imageUrl: MockImageUrl = MOCK_IMAGE_URL): Shop {\n return {\n name: 'Mi tienda',\n description: 'Tienda de ejemplo para desarrollar sin backend.',\n domain: 'mi-tienda.example',\n currency_code: currency,\n locale: 'es-MX',\n locales: ['es-MX', 'en-US'],\n country_code: 'MX',\n logo: { url: imageUrl('logo', 256, 256), alt: 'Mi tienda', width: 256, height: 256 },\n contact: { email: 'hola@mi-tienda.example', phone: '+52 55 0000 0000', whatsapp: '+5215500000000' },\n branches: buildLocations(currency),\n policies: { free_shipping_min: money(999, currency), returns_days: 30 },\n }\n}\n\nexport function buildTheme(): Theme {\n return {\n tokens: {\n background: '#ffffff',\n foreground: '#111827',\n primary: '#0f766e',\n 'primary-foreground': '#ffffff',\n secondary: '#f1f5f9',\n 'secondary-foreground': '#0f172a',\n muted: '#f8fafc',\n 'muted-foreground': '#64748b',\n accent: '#f59e0b',\n 'accent-foreground': '#111827',\n border: '#e2e8f0',\n destructive: '#dc2626',\n },\n fonts: { heading: 'Inter', body: 'Inter' },\n radius: '0.5rem',\n }\n}\n\nexport function buildPages(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Page[] {\n return [\n {\n handle: 'home',\n title: 'Inicio',\n seo: { title: 'Mi tienda', description: 'Ropa, hogar, accesorios y llantas con envío a todo el país.' },\n sections: [\n { id: 'hero-1', type: 'hero', props: { title: 'Todo lo que necesitas, en un solo lugar', subtitle: 'Envío gratis desde $999', cta_label: 'Ver productos', cta_url: '/collections/ropa', image: imageUrl('hero', 1600, 700) } },\n { id: 'grid-1', type: 'product_grid', props: { title: 'Lo más nuevo', collection: 'ropa', limit: 8 } },\n { id: 'collections-1', type: 'collection_list', props: { title: 'Compra por categoría', handles: ['ropa', 'hogar', 'accesorios', 'llantas'] } },\n { id: 'text-1', type: 'rich_text', props: { title: 'Sobre nosotros', html: '<p>Somos una tienda de ejemplo. Edita este texto desde el panel.</p>' } },\n {\n id: 'faq-1',\n type: 'faq',\n props: {\n title: 'Preguntas frecuentes',\n items: [\n { question: '¿Cuánto tarda el envío?', answer: 'De 2 a 5 días hábiles.' },\n { question: '¿Puedo recoger en tienda?', answer: 'Sí, elige recoger en sucursal al pagar.' },\n { question: '¿Cómo pido factura?', answer: 'Desde tu cuenta, en el detalle del pedido.' },\n ],\n },\n },\n ],\n },\n legal('terminos', 'Términos y condiciones', 'Al comprar en Mi tienda aceptas estos términos.'),\n legal('privacidad', 'Aviso de privacidad', 'Tratamos tus datos solo para procesar tus pedidos.'),\n legal('devoluciones', 'Política de devoluciones', 'Tienes 30 días para devolver tu compra.'),\n ]\n}\n\nfunction legal(handle: string, title: string, body: string): Page {\n return {\n handle,\n title,\n seo: { title: `${title} | Mi tienda`, description: body },\n sections: [{ id: `${handle}-text`, type: 'rich_text', props: { title, html: `<p>${body}</p>` } }],\n }\n}\n\nexport function buildMenus(): Menu[] {\n return [\n {\n handle: 'main',\n items: [\n { title: 'Inicio', url: '/' },\n {\n title: 'Tienda',\n url: '/search',\n items: COLLECTION_SPECS.map((c) => ({ title: c.title, url: `/collections/${c.handle}` })),\n },\n { title: 'Blog', url: '/blogs/noticias' },\n ],\n },\n {\n handle: 'footer',\n items: [\n { title: 'Términos y condiciones', url: '/pages/terminos' },\n { title: 'Aviso de privacidad', url: '/pages/privacidad' },\n { title: 'Devoluciones', url: '/pages/devoluciones' },\n ],\n },\n ]\n}\n\nexport function buildArticles(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Article[] {\n return [\n {\n id: 'art_1',\n handle: 'como-elegir-llantas',\n title: 'Cómo elegir las llantas correctas',\n excerpt: 'Lee la medida en el costado de tu llanta: ancho, perfil y rin.',\n content_html: '<p>La medida 205/55 R16 indica 205 mm de ancho, perfil del 55 % y rin de 16 pulgadas.</p>',\n image: image(imageUrl, 'blog-llantas', 'Llantas'),\n author: 'Equipo Mi tienda',\n tags: ['llantas', 'guías'],\n published_at: '2026-09-15T15:00:00.000Z',\n seo: { title: 'Cómo elegir llantas | Mi tienda', description: 'Guía rápida para leer la medida de tus llantas.' },\n },\n {\n id: 'art_2',\n handle: 'cuidado-prendas-algodon',\n title: 'Cuida tus prendas de algodón',\n excerpt: 'Tres consejos para que tus playeras duren más.',\n content_html: '<p>Lava en frío, seca a la sombra y plancha al revés.</p>',\n image: image(imageUrl, 'blog-algodon', 'Prendas de algodón'),\n author: 'Equipo Mi tienda',\n tags: ['ropa', 'guías'],\n published_at: '2026-09-01T15:00:00.000Z',\n seo: { title: 'Cuida tus prendas | Mi tienda', description: 'Consejos de lavado para prendas de algodón.' },\n },\n ]\n}\n\nexport function buildCustomers(): Customer[] {\n return [\n {\n id: 'cus_1',\n email: MOCK_CUSTOMER_EMAIL,\n phone: '+525500000002',\n first_name: 'Cliente',\n last_name: 'Demo',\n default_address_id: null,\n created_at: '2026-01-10T12:00:00.000Z',\n },\n ]\n}\n","// Subject kinds for the mock («My items», contract 1.9). A store that declares none (the default) has no such section;\n// pass `subjectKinds: MOCK_SUBJECT_KINDS` to rehearse one that declares a «garage» (a cascade catalog with model years\n// and a private field) and a catalog-less «size».\nimport type { SubjectKind } from '../types.js'\n\nexport const MOCK_SUBJECT_KINDS: SubjectKind[] = [\n {\n key: 'vehicle',\n label: 'Vehículo',\n label_plural: 'Mi garage',\n max_per_account: 3,\n attach_to_order: true,\n fit_key_template: '{make}/{model}/{year}/{engine}',\n fields: [\n { key: 'make', label: 'Marca', type: 'select', source: 'catalog', required: true },\n { key: 'model', label: 'Modelo', type: 'select', source: 'catalog', depends_on: 'make', required: true },\n { key: 'year', label: 'Año', type: 'year', source: 'catalog', depends_on: 'model', required: true },\n { key: 'engine', label: 'Versión / motor', type: 'select', source: 'catalog', depends_on: 'year' },\n { key: 'plate', label: 'Placas (opcional)', type: 'text', max: 12, private: true },\n ],\n catalog: {\n version: 'mock-1',\n tree: {\n nissan: {\n label: 'Nissan',\n children: {\n np300: {\n label: 'NP300 Frontier',\n from: 2008,\n to: 2022,\n children: { '2.5': { label: '2.5 L', ranges: [[2010, 2015]] }, '2.4': { label: '2.4 L' } },\n },\n versa: { label: 'Versa', from: 2012, to: 2024, children: { '1.6': { label: '1.6 L' } } },\n },\n },\n ford: { label: 'Ford', children: { f150: { label: 'F-150', from: 2000, to: 2020, children: { '5.0': { label: '5.0 L' } } } } },\n },\n },\n },\n {\n key: 'size',\n label: 'Talla',\n label_plural: 'Mis tallas',\n max_per_account: 5,\n fit_key_template: '{garment}/{value}',\n fields: [\n { key: 'garment', label: 'Prenda', type: 'text', required: true },\n { key: 'value', label: 'Talla', type: 'text', required: true, max: 8 },\n ],\n catalog: null,\n },\n]\n","/**\n * In-memory implementation of the whole Storefront API v1 contract, exposed\n * as a `fetch` function. Use it to develop and test storefronts without OPS:\n *\n * const mock = createMockStorefront()\n * const sf = createStorefrontClient({ baseUrl: 'https://mock.local/api/gw', token: 'sk_mock', fetch: mock.fetch })\n */\nimport type {\n Address,\n Availability,\n InsufficientStockLine,\n Article,\n Cart,\n CartLine,\n CartRecommendation,\n Collection,\n Customer,\n CustomerCapabilities,\n CustomerSession,\n FiscalIdentity,\n FiscalProfile,\n FiscalProfileInput,\n InvoiceRequest,\n InvoiceDoc,\n InvoiceFile,\n InvoiceStage,\n InvoiceSummary,\n Facet,\n Location,\n Menu,\n Order,\n PendingPayment,\n Page,\n PaymentAttemptResult,\n PaymentConfig,\n PaymentMethod,\n Product,\n ProductVariant,\n PromotionAnnouncement,\n Region,\n ShippingRate,\n Shop,\n StorefrontErrorCode,\n Subject,\n SubjectKind,\n Theme,\n} from '../types.js'\nimport { nextAction, orderProgress, orderShipments, shipmentsStatus, sortTrackingEvents, isTestShipment } from '../order-progress.js'\nimport { isValidPoint, rankByDistance } from '../geo.js'\nimport { resolveAvailability } from '../availability.js'\nimport { buildAccountOrders, buildPendingPayments } from './account-seed.js'\nimport { MOCK_REGION_MX, maskTaxId, validateInvoiceRequest } from './region.js'\nimport { isMasked, PRIVATE_MASK, resolveSubject, type SubjectValues } from '../subjects.js'\nimport {\n MOCK_CURRENCY,\n MOCK_IMAGE_URL,\n buildArticles,\n buildCollections,\n MOCK_POSTAL_CENTROIDS,\n buildCustomers,\n buildMemberships,\n buildMenus,\n buildPages,\n buildProducts,\n buildShop,\n buildTheme,\n type MockImageUrl,\n} from './seed.js'\n\nexport { MOCK_CURRENCY, MOCK_CUSTOMER_EMAIL, MOCK_IMAGE_URL, MOCK_POSTAL_CENTROIDS } from './seed.js'\nexport { MOCK_SUBJECT_KINDS } from './subjects.js'\nexport { MOCK_CSF_RULES, MOCK_FISCAL_ID_MX, MOCK_IDENTITY_DOCUMENT_MX_CSF, MOCK_REGION_MX } from './region.js'\nexport type { MockImageUrl } from './seed.js'\n\nexport type MockStorefrontOptions = {\n /** Currency for all prices (default `MXN`). */\n currency?: string\n /** Image URL builder for seed data (default: picsum.photos placeholders). */\n imageUrl?: MockImageUrl\n /** OTP code accepted by `/customer/session` (default `000000`). */\n otpCode?: string\n /**\n * What `GET /customer/capabilities` reports (default `{ password: true, email_verification: true, otp_channels: ['email'] }`).\n * `password: false` makes register / login / password routes answer `403`; `email_verification: false` makes `register`\n * create the account straight away (`201`).\n */\n customerCapabilities?: Partial<CustomerCapabilities>\n /**\n * Scopes the mock's `sk_`/`pk_` tokens do NOT have (e.g. `['customer:write']`), to rehearse an under-provisioned\n * store. Routes needing one answer `403 insufficient_scope` with `required_scopes`; `GET /_token` lists them in\n * `missing_scopes`; and `customer/capabilities` reports `password: false`, `unavailable_reason: 'missing_scope'`\n * when `customer:write` is among them. Implies scope enforcement.\n */\n missingScopes?: string[]\n /** Failed password logins per email before `429 rate_limited` (default 5; a success or a reset clears the count). */\n maxLoginAttempts?: number\n /** Discount codes → percentage off the subtotal (default `{ BIENVENIDA10: 10 }`). */\n discountCodes?: Record<string, number>\n /** Flat shipping rate (default 149). Free from `shop.policies.free_shipping_min`. */\n flatShipping?: number\n /** Enforce token scopes (`pk_` cannot checkout or use customer routes). Default true. */\n enforceScopes?: boolean\n /**\n * Mock `show_stock`: `low_stock_threshold:N` semantics. At or below this quantity a variant is `low_stock`\n * and only then `availability.quantity` is published (default 5; `0` disables `low_stock`).\n */\n lowStockThreshold?: number\n /** Artificial latency per request, in ms (default 0). */\n latencyMs?: number\n /** Override seed data. */\n shop?: Partial<Shop>\n products?: Product[]\n collections?: Collection[]\n /** Product handle → collection handles (required when overriding `products`). */\n memberships?: Record<string, string[]>\n theme?: Theme\n pages?: Page[]\n menus?: Menu[]\n articles?: Article[]\n /** Entry pop-up announcements served by `GET /storefront/promotions` (default none). */\n announcements?: PromotionAnnouncement[]\n /** Payment attempts allowed per checkout before `429 too_many_attempts` (default 5). */\n maxPaymentAttempts?: number\n /**\n * Carrier-style rates served by `delivery-options` instead of the flat / express pair (to design a checkout with\n * carriers, ETAs and quote deadlines). `expires_at` missing: 24 h from the request. Free shipping still applies.\n */\n shippingRates?: ShippingRate[]\n /**\n * `fixed_when_free`: past `policies.free_shipping_min` `delivery-options` serves ONLY the shop's free rate and flags\n * `free` / `fixed` (what the `storefront_cart` addon does with the setting of the same name). Default: the usual list.\n */\n shippingQuoteMode?: 'carriers' | 'fixed_when_free'\n /** Methods served by `payment-methods` (default one builtin `mock`). */\n paymentMethods?: PaymentMethod[]\n /**\n * What `GET /storefront/region` serves (default `MOCK_REGION_MX`, with its `MX:csf` identity document). `null`: the\n * organization has no region, the route answers `404` and invoice requests are not validated against a region.\n */\n region?: Region | null\n /**\n * The kinds of buyer item («My items») the store declares, served by `GET /subject-kinds` and enforced by\n * `customer.subjects`. Default none: no such section, as in a store that declares nothing (`MOCK_SUBJECT_KINDS` has two).\n */\n subjectKinds?: SubjectKind[]\n}\n\ntype CartRecord = {\n id: string\n lines: { id: string; variant_id: string; quantity: number }[]\n codes: string[]\n buyer: Cart['buyer']\n shipping_address: Address | null\n delivery: Cart['delivery']\n note: string | null\n /** Invoice asked for (`PUT /carts/:id/invoice`). */\n invoice: InvoiceRequest | null\n checkedOut: boolean\n updated_at: string\n}\n\nexport type MockState = {\n shop: Shop\n products: Product[]\n collections: Collection[]\n memberships: Record<string, string[]>\n theme: Theme\n pages: Page[]\n menus: Menu[]\n articles: Article[]\n carts: Map<string, CartRecord>\n customers: Customer[]\n addresses: Map<string, Address[]>\n /** Saved fiscal profiles by customer id (contract 1.9). */\n fiscalProfiles: Map<string, FiscalProfile[]>\n /** Saved items by customer id (contract 1.9); `private` holds the values the API only returns masked. */\n subjects: Map<string, (Subject & { private: Record<string, string> })[]>\n orders: (Order & { customer_id: string | null })[]\n otps: Map<string, string>\n /** Email → password (plain text: it is a mock). The seed customer starts without one. */\n passwords: Map<string, string>\n /** Registrations waiting for their code, by email. */\n pendingRegistrations: Map<string, { password: string; first_name: string | null; last_name: string | null }>\n /** Consecutive failed password logins by email. */\n loginFailures: Map<string, number>\n sessions: Map<string, string>\n /** What «Devices» shows for each session token (contract 1.9). */\n sessionInfo: Map<string, { id: string; customer_id: string; created_at: string; last_used_at: string; login_method: string; reauth_at: number | null }>\n /** Wrong re-authentications per customer (5 and the mock answers 429). */\n reauthFailures: Map<string, number>\n /** Data exports served per customer (3 a day). */\n exportsServed: Map<string, number>\n /** Tokens of accounts that were deleted: deleting again answers 204, as the server does. */\n deletedTokens: Set<string>\n idempotency: Map<string, { status: number; body: unknown }>\n checkouts: Map<string, unknown>\n /** Payment attempts per checkout (`n`, last result). */\n payments: Map<string, { attempts: number; last: PaymentAttemptResult | null }>\n /** `contact|sku` of accepted \"notify me\" subscriptions. */\n restock: Set<string>\n /** Cash vouchers waiting for payment (`GET /customer/pending-payments`); `cus_1` only. */\n pendingPayments: PendingPayment[]\n /** Invoice requested per order id. */\n invoices: Map<string, { stage: InvoiceStage; request: InvoiceRequest }>\n seq: number\n}\n\nclass HttpError extends Error {\n constructor(\n readonly status: number,\n readonly code: StorefrontErrorCode,\n message: string,\n readonly field?: string,\n readonly details?: unknown,\n readonly requiredScopes?: string[],\n ) {\n super(message)\n }\n}\n\nconst PUBLIC_CACHE = 'public, max-age=60, stale-while-revalidate=600'\nconst PRIVATE_CACHE = 'private, no-store'\n\nconst toCents = (amount: string) => Math.round(Number.parseFloat(amount) * 100)\nconst fromCents = (cents: number, currency: string) => ({ amount: (cents / 100).toFixed(2), currency_code: currency })\n\nfunction fnv1a(input: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(16)\n}\n\nfunction encodeCursor(offset: number): string {\n return btoa(`o:${offset}`)\n}\n\nfunction decodeCursor(cursor: string | null): number {\n if (!cursor) return 0\n try {\n const raw = atob(cursor)\n if (!raw.startsWith('o:')) throw new Error('bad cursor')\n const n = Number(raw.slice(2))\n if (!Number.isInteger(n) || n < 0) throw new Error('bad cursor')\n return n\n } catch {\n throw new HttpError(400, 'validation', 'Invalid cursor', 'after')\n }\n}\n\nfunction paginate<T>(items: T[], search: URLSearchParams, defaultFirst = 24, maxFirst = 100) {\n const first = search.has('first') ? Number(search.get('first')) : defaultFirst\n if (!Number.isInteger(first) || first < 1 || first > maxFirst) throw new HttpError(400, 'validation', `\\`first\\` must be between 1 and ${maxFirst}`, 'first')\n const start = decodeCursor(search.get('after'))\n const nodes = items.slice(start, start + first)\n const end = start + nodes.length\n return {\n nodes,\n page_info: { has_next_page: end < items.length, end_cursor: nodes.length ? encodeCursor(end) : null },\n total_count: items.length,\n }\n}\n\nconst now = () => new Date().toISOString()\n\nexport function createMockStorefront(options: MockStorefrontOptions = {}) {\n const currency = options.currency ?? MOCK_CURRENCY\n const imageUrl = options.imageUrl ?? MOCK_IMAGE_URL\n const otpCode = options.otpCode ?? '000000'\n const capabilities: CustomerCapabilities = {\n password: true,\n email_verification: true,\n otp_channels: ['email'],\n invoicing: {\n available: true,\n countries: ['MX'],\n checkout: 'optional',\n post_purchase: true,\n window_days: 30,\n identity_documents: ['MX:csf'],\n online_verify: false,\n },\n fiscal_profiles: { max: 10 },\n notifications: { channels: ['email'] },\n data_export: true,\n account_delete: true,\n ...((options.subjectKinds?.length ?? 0) > 0 ? { subjects: { kinds: options.subjectKinds!.map((k) => k.key), share_with_workshop: false } } : {}),\n ...options.customerCapabilities,\n }\n const missingScopes = options.missingScopes ?? []\n if (missingScopes.includes('customer:write')) {\n capabilities.password = false\n capabilities.unavailable_reason = 'missing_scope'\n capabilities.missing_scopes = ['customer:write']\n }\n const region = options.region === undefined ? MOCK_REGION_MX : options.region\n const maxLoginAttempts = options.maxLoginAttempts ?? 5\n const MIN_PASSWORD = 10\n const MAX_PASSWORD = 128\n const discountCodes = Object.fromEntries(\n Object.entries(options.discountCodes ?? { BIENVENIDA10: 10 }).map(([k, v]) => [k.toUpperCase(), v]),\n )\n const flatShippingCents = Math.round((options.flatShipping ?? 149) * 100)\n const enforceScopes = options.enforceScopes ?? true\n\n function seed(): MockState {\n return {\n shop: { ...buildShop(currency, imageUrl), ...options.shop },\n products: structuredClone(options.products ?? buildProducts(currency, imageUrl)),\n collections: structuredClone(options.collections ?? buildCollections(imageUrl)),\n memberships: structuredClone(options.memberships ?? buildMemberships()),\n theme: structuredClone(options.theme ?? buildTheme()),\n pages: structuredClone(options.pages ?? buildPages(imageUrl)),\n menus: structuredClone(options.menus ?? buildMenus()),\n articles: structuredClone(options.articles ?? buildArticles(imageUrl)),\n carts: new Map(),\n customers: buildCustomers(),\n addresses: new Map(),\n fiscalProfiles: new Map(),\n subjects: new Map(),\n orders: [\n {\n id: 'ord_seed_1',\n number: '1000',\n status: 'fulfilled',\n created_at: '2026-08-20T18:00:00.000Z',\n total: fromCents(24900, currency),\n customer_id: 'cus_1',\n lines: [\n { title: 'Playera básica', variant_title: 'M / Blanco', sku: null, quantity: 1, unit: fromCents(24900, currency), total: fromCents(24900, currency), image: null },\n ],\n },\n ...buildAccountOrders(currency),\n ],\n pendingPayments: buildPendingPayments(currency, Date.now()),\n otps: new Map(),\n passwords: new Map(),\n pendingRegistrations: new Map(),\n loginFailures: new Map(),\n sessions: new Map(),\n sessionInfo: new Map(),\n reauthFailures: new Map(),\n exportsServed: new Map(),\n deletedTokens: new Set(),\n idempotency: new Map(),\n checkouts: new Map(),\n payments: new Map(),\n restock: new Set(),\n invoices: new Map(),\n seq: 0,\n }\n }\n\n const lowStockThreshold = options.lowStockThreshold ?? 5\n\n /** Recomputes `availability` (and the legacy fields) of every variant/product from `quantity_available`. */\n function syncAvailability(products: Product[]) {\n for (const p of products) {\n for (const v of p.variants) {\n const qty = v.quantity_available\n const sellable = v.available_for_sale && (qty === null || qty > 0)\n v.available_for_sale = sellable\n const low = sellable && qty !== null && lowStockThreshold > 0 && qty <= lowStockThreshold\n v.availability = {\n status: !sellable ? 'out_of_stock' : low ? 'low_stock' : 'in_stock',\n quantity: low ? qty : null,\n max_per_order: sellable ? (qty === null ? null : Math.min(qty, 10)) : null,\n restock_eta: null,\n preorder_release_at: null,\n notify_available: !sellable,\n }\n }\n p.available_for_sale = p.variants.some((v) => v.available_for_sale)\n const rank = ['in_stock', 'low_stock', 'backorder', 'preorder', 'out_of_stock']\n const best = p.variants.map((v) => v.availability as Availability).sort((a, b) => rank.indexOf(a.status) - rank.indexOf(b.status))[0]\n p.availability = best ?? resolveAvailability(p)\n }\n }\n\n let state = seed()\n syncAvailability(state.products)\n const nextId = (prefix: string) => `${prefix}_${(++state.seq).toString(36)}${Math.random().toString(36).slice(2, 8)}`\n\n // -------------------------------------------------------------------------\n // Catalog helpers\n // -------------------------------------------------------------------------\n\n function findVariant(variantId: string): { product: Product; variant: ProductVariant } | null {\n for (const product of state.products) {\n const variant = product.variants.find((v) => v.id === variantId)\n if (variant) return { product, variant }\n }\n return null\n }\n\n const minPriceCents = (p: Product) => toCents(p.price_range.min.amount)\n\n function attrValue(p: Product, key: string): string | null {\n if (key === 'vendor') return p.vendor\n if (key === 'product_type') return p.product_type\n if (key === 'tag') return null\n const v = p.attributes[key]\n return v === undefined ? null : String(v)\n }\n\n function matchesText(p: Product, q: string): number {\n const terms = q.toLowerCase().split(/\\s+/).filter(Boolean)\n const hay = [p.title, p.description, p.vendor ?? '', p.product_type ?? '', ...p.tags, ...Object.values(p.attributes).map(String)]\n .join(' ')\n .toLowerCase()\n let score = 0\n for (const t of terms) {\n if (!hay.includes(t)) return 0\n score += p.title.toLowerCase().includes(t) ? 2 : 1\n }\n return score\n }\n\n function listProducts(search: URLSearchParams) {\n let items = state.products.slice()\n const q = search.get('q')?.trim()\n const scores = new Map<string, number>()\n if (q) {\n items = items.filter((p) => {\n const s = matchesText(p, q)\n scores.set(p.id, s)\n return s > 0\n })\n }\n const collection = search.get('collection')\n if (collection) {\n if (!state.collections.some((c) => c.handle === collection)) throw new HttpError(404, 'not_found', `Collection ${collection} not found`, 'collection')\n items = items.filter((p) => state.memberships[p.handle]?.includes(collection))\n }\n const handles = search.get('handles')\n if (handles) {\n const list = handles.split(',').map((h) => h.trim()).filter(Boolean)\n if (list.length > 100) throw new HttpError(400, 'validation', 'At most 100 handles', 'handles')\n items = items.filter((p) => list.includes(p.handle))\n }\n\n // `tags_any` (contract 1.9) is a hard filter of the base set: facets count inside it, nothing relaxes it.\n const tagsAny = (search.get('tags_any') ?? '').split(',').map((t) => t.trim().toLowerCase()).filter(Boolean)\n if (tagsAny.length > 5 || tagsAny.some((t) => t.length > 120)) throw new HttpError(400, 'validation', 'tags_any takes at most 5 tags of 120 characters', 'tags_any')\n if (tagsAny.length > 0) items = items.filter((p) => p.tags.some((t) => tagsAny.includes(t.toLowerCase())))\n\n // Facets are computed over the base set (text/collection/handles), before refinement.\n const base = items\n\n if (search.get('available') === 'true') items = items.filter((p) => p.available_for_sale)\n const priceMin = search.get('price_min')\n const priceMax = search.get('price_max')\n if (priceMin) items = items.filter((p) => minPriceCents(p) >= Math.round(Number(priceMin) * 100))\n if (priceMax) items = items.filter((p) => minPriceCents(p) <= Math.round(Number(priceMax) * 100))\n\n const filters = new Map<string, string[]>()\n for (const [key, value] of search) {\n if (!key.startsWith('filter.')) continue\n const name = key.slice(7)\n filters.set(name, [...(filters.get(name) ?? []), value])\n }\n for (const [key, values] of filters) {\n if (key === 'tag') items = items.filter((p) => values.some((v) => p.tags.includes(v)))\n else items = items.filter((p) => values.includes(attrValue(p, key) ?? '\\u0000'))\n }\n\n const sort = search.get('sort') ?? 'relevance'\n const sorters: Record<string, (a: Product, b: Product) => number> = {\n relevance: (a, b) => (scores.get(b.id) ?? 0) - (scores.get(a.id) ?? 0),\n price_asc: (a, b) => minPriceCents(a) - minPriceCents(b),\n price_desc: (a, b) => minPriceCents(b) - minPriceCents(a),\n newest: (a, b) => b.updated_at.localeCompare(a.updated_at),\n title_asc: (a, b) => a.title.localeCompare(b.title, 'es'),\n }\n const sorter = sorters[sort]\n if (!sorter) throw new HttpError(400, 'validation', `Unknown sort ${sort}`, 'sort')\n items = items.slice().sort(sorter)\n\n return { ...paginate(items, search), facets: buildFacets(base) }\n }\n\n function buildFacets(products: Product[]): Facet[] {\n const facets: Facet[] = []\n const listFacet = (key: string, label: string, pick: (p: Product) => string | null) => {\n const counts = new Map<string, number>()\n for (const p of products) {\n const v = pick(p)\n if (v !== null && v !== '') counts.set(v, (counts.get(v) ?? 0) + 1)\n }\n if (counts.size === 0) return\n const values = [...counts.entries()]\n .sort(([a], [b]) => a.localeCompare(b, 'es', { numeric: true }))\n .map(([value, count]) => ({ value, label: value, count }))\n facets.push({ key, label, type: 'list', values })\n }\n listFacet('vendor', 'Marca', (p) => p.vendor)\n listFacet('product_type', 'Tipo', (p) => p.product_type)\n const attrKeys = new Set<string>()\n for (const p of products) for (const k of Object.keys(p.attributes)) attrKeys.add(k)\n const labels: Record<string, string> = { width: 'Ancho', aspect: 'Perfil', rim: 'Rin', size_key: 'Medida', load_index: 'Índice de carga', speed_rating: 'Índice de velocidad', runflat: 'Run flat' }\n for (const k of [...attrKeys].sort()) listFacet(k, labels[k] ?? k, (p) => (p.attributes[k] === undefined ? null : String(p.attributes[k])))\n if (products.length) {\n const prices = products.map(minPriceCents)\n const min = Math.min(...prices)\n const max = Math.max(...prices)\n facets.push({\n key: 'price',\n label: 'Precio',\n type: 'price_range',\n values: [\n { value: (min / 100).toFixed(2), label: 'min', count: products.length },\n { value: (max / 100).toFixed(2), label: 'max', count: products.length },\n ],\n })\n }\n return facets\n }\n\n // -------------------------------------------------------------------------\n // Cart helpers\n // -------------------------------------------------------------------------\n\n function getCartRecord(id: string): CartRecord {\n const cart = state.carts.get(id)\n if (!cart) throw new HttpError(404, 'not_found', `Cart ${id} not found`, 'id')\n return cart\n }\n\n function validateLines(lines: unknown, cart?: CartRecord): { variant_id: string; quantity: number }[] {\n if (!Array.isArray(lines)) throw new HttpError(400, 'validation', '`lines` must be an array', 'lines')\n const toCheck: Parameters<typeof checkStock>[0] = []\n const out = lines.map((raw, i) => {\n const l = raw as { variant_id?: unknown; quantity?: unknown }\n if (typeof l.variant_id !== 'string') throw new HttpError(400, 'validation', 'variant_id is required', `lines[${i}].variant_id`)\n const quantity = l.quantity === undefined ? 1 : l.quantity\n if (typeof quantity !== 'number' || !Number.isInteger(quantity) || quantity < 1) {\n throw new HttpError(400, 'validation', 'quantity must be a positive integer', `lines[${i}].quantity`)\n }\n const found = findVariant(l.variant_id)\n if (!found) throw new HttpError(400, 'validation', `Unknown variant ${l.variant_id}`, `lines[${i}].variant_id`)\n const existing = cart?.lines.find((x) => x.variant_id === l.variant_id)\n toCheck.push({ variant: found.variant, quantity: (existing?.quantity ?? 0) + quantity, lineId: existing?.id ?? null, field: `lines[${i}].quantity` })\n return { variant_id: l.variant_id, quantity }\n })\n checkStock(toCheck)\n return out\n }\n\n /** Visible cap for a variant: only published when the mock's show_stock lets the buyer see it. */\n function visibleMax(variant: ProductVariant): number | null {\n const a = variant.availability\n if (!a || a.status === 'out_of_stock') return 0\n return a.status === 'low_stock' ? a.quantity : null\n }\n\n function lineProblem(variant: ProductVariant, quantity: number): CartLine['problem'] {\n if (!variant.available_for_sale) return { code: 'out_of_stock', max_quantity: 0 }\n if (variant.quantity_available !== null && quantity > variant.quantity_available) {\n return { code: 'insufficient_stock', max_quantity: visibleMax(variant) }\n }\n return null\n }\n\n /** Throws one `409 insufficient_stock` listing every affected line; the message never carries quantities. */\n function checkStock(items: { variant: ProductVariant; quantity: number; lineId: string | null; field: string }[]) {\n const bad = items.filter((i) => lineProblem(i.variant, i.quantity))\n if (bad.length === 0) return\n const lines: InsufficientStockLine[] = bad.map((i) => ({\n line_id: i.lineId,\n variant_id: i.variant.id,\n sku: i.variant.sku,\n status: i.variant.availability?.status ?? 'out_of_stock',\n max_quantity: visibleMax(i.variant),\n }))\n throw new HttpError(409, 'insufficient_stock', 'Algunos productos ya no tienen existencias suficientes', bad[0]!.field, { lines })\n }\n\n function addLines(cart: CartRecord, lines: { variant_id: string; quantity: number }[]) {\n for (const l of lines) {\n const existing = cart.lines.find((x) => x.variant_id === l.variant_id)\n if (existing) existing.quantity += l.quantity\n else cart.lines.push({ id: nextId('line'), variant_id: l.variant_id, quantity: l.quantity })\n }\n }\n\n const isKnownCode = (code: string) => code.toUpperCase() in discountCodes\n const percentFor = (code: string) => discountCodes[code.toUpperCase()] ?? 0\n\n function shippingRates(subtotalCents: number): ShippingRate[] {\n const freeMin = state.shop.policies.free_shipping_min\n const free = freeMin !== null && subtotalCents >= toCents(freeMin.amount)\n if (options.shippingRates?.length) {\n const expires = new Date(Date.now() + 24 * 3_600_000).toISOString()\n return options.shippingRates.map((r) => ({ ...r, expires_at: r.expires_at ?? expires, cost: free ? fromCents(0, r.cost.currency_code) : r.cost }))\n }\n // Like the server with `shipping_quote_mode: fixed_when_free`: past the free-shipping minimum the shop's own price is\n // the only rate (no carrier is asked, there is nothing to choose).\n if (free && options.shippingQuoteMode === 'fixed_when_free') return [{ id: 'flat', title: 'Envío gratis', cost: fromCents(0, currency), eta: '2 a 5 días hábiles' }]\n return [\n { id: 'flat', title: free ? 'Envío estándar (gratis)' : 'Envío estándar', cost: fromCents(free ? 0 : flatShippingCents, currency), eta: '2 a 5 días hábiles' },\n { id: 'express', title: 'Envío exprés', cost: fromCents(flatShippingCents + 10000, currency), eta: '1 a 2 días hábiles' },\n ]\n }\n\n function renderCart(cart: CartRecord): Cart {\n const lines: CartLine[] = []\n let subtotal = 0\n let quantity = 0\n for (const l of cart.lines) {\n const found = findVariant(l.variant_id)\n if (!found) continue\n const { product, variant } = found\n const unit = toCents(variant.price.amount)\n subtotal += unit * l.quantity\n quantity += l.quantity\n lines.push({\n id: l.id,\n quantity: l.quantity,\n problem: lineProblem(variant, l.quantity),\n merchandise: {\n ...variant,\n product: { handle: product.handle, title: product.title, featured_image: product.featured_image },\n },\n cost: {\n unit: variant.price,\n total: fromCents(unit * l.quantity, currency),\n compare_at_unit: variant.compare_at_price,\n },\n })\n }\n const codes = cart.codes.map((code) => ({ code, applicable: isKnownCode(code) && subtotal > 0 }))\n const percent = codes.filter((d) => d.applicable).reduce((max, d) => Math.max(max, percentFor(d.code)), 0)\n const discount = Math.round((subtotal * percent) / 100)\n let shipping: number | null = null\n if (cart.delivery.method === 'pickup') shipping = toCents(state.shop.branches.find((b) => b.id === cart.delivery.branch_id)?.pickup?.fee?.amount ?? '0')\n else if (cart.delivery.method === 'shipping' && cart.delivery.rate_id) {\n const rate = shippingRates(subtotal - discount).find((r) => r.id === cart.delivery.rate_id)\n shipping = rate ? toCents(rate.cost.amount) : null\n }\n const total = subtotal - discount + (shipping ?? 0)\n // IVA 16 % included in prices.\n const tax = Math.round(total - total / 1.16)\n return {\n id: cart.id,\n lines,\n total_quantity: quantity,\n discount_codes: codes,\n buyer: { ...cart.buyer },\n shipping_address: cart.shipping_address ? { ...cart.shipping_address } : null,\n delivery: { ...cart.delivery },\n cost: {\n subtotal: fromCents(subtotal, currency),\n discount: fromCents(discount, currency),\n shipping: shipping === null ? null : fromCents(shipping, currency),\n tax: fromCents(tax, currency),\n total: fromCents(total, currency),\n tax_included: true,\n },\n note: cart.note,\n invoice: cart.invoice ? cartInvoiceOf(cart.invoice) : null,\n updated_at: cart.updated_at,\n }\n }\n\n function cartInvoiceOf(inv: InvoiceRequest): NonNullable<Cart['invoice']> {\n const taxId = typeof inv.tax_id === 'string' ? inv.tax_id : typeof inv.rfc === 'string' ? inv.rfc : ''\n const name = typeof inv.legal_name === 'string' ? inv.legal_name : typeof inv.razon_social === 'string' ? inv.razon_social : null\n return {\n requested: true,\n tax_id_masked: taxId ? maskTaxId(taxId) : null,\n legal_name: name,\n country_code: inv.country_code ?? region?.country_code ?? null,\n document_kind: inv.document?.kind ?? null,\n }\n }\n\n /** `null` for \"no invoice\" (absent, `requested: false`), the request when it is valid, a 422 `invoice.<field>` otherwise. */\n function parseInvoice(raw: unknown, prefix = 'invoice'): InvoiceRequest | null {\n if (raw === null || raw === undefined) return null\n if (typeof raw !== 'object' || Array.isArray(raw)) throw new HttpError(400, 'validation', 'invoice must be an object', prefix)\n const inv = raw as InvoiceRequest\n if (inv.requested === false) return null\n const problem = validateInvoiceRequest(region, inv, prefix)\n if (problem) throw new HttpError(422, 'invalid_state', problem.message, problem.field)\n return inv\n }\n\n const orderInvoice = (order: MockState['orders'][number]): InvoiceSummary => {\n const doc = order.invoices?.find((d) => d.kind === 'invoice')\n if (doc) {\n // Seeded document: the summary says what the document says, with no link (the file comes from `invoiceFile`).\n const { id: _id, kind: _k, total: _t, issued_at: _i, cancelled_at: _c, series: _s, folio_number: _f, related_to: _r, links_expire_at: _l, test_mode: _tm, environment: _e, ...summary } = doc\n return { ...summary, url: null, xml_url: null }\n }\n const entry = state.invoices.get(order.id)\n const paid = order.status !== 'pending_payment'\n if (entry) {\n const stage: InvoiceStage = entry.stage === 'awaiting_payment' && paid ? 'queued' : entry.stage\n return { stage, requested: true, status: stage === 'issued' ? 'issued' : 'requested', action: stage === 'awaiting_payment' ? 'wait' : 'none', can_request: false, url: null, xml_url: null }\n }\n return paid\n ? { status: 'not_requested', stage: 'not_requested', requested: false, action: 'request', can_request: true, blocked_reason: null }\n : { status: 'not_requested', stage: 'not_requested', requested: false, action: 'none', can_request: false, blocked_reason: 'awaiting_payment' }\n }\n\n // -------------------------------------------------------------------------\n // Customer helpers\n // -------------------------------------------------------------------------\n\n function requireCustomer(headers: Headers): Customer {\n const token = headers.get('x-customer-token')\n const id = token ? state.sessions.get(token) : undefined\n const customer = id ? state.customers.find((c) => c.id === id) : undefined\n if (!customer) throw new HttpError(401, 'unauthorized', 'Missing or invalid customer session')\n return customer\n }\n\n function identifierOf(body: Record<string, unknown>): string {\n const email = typeof body.email === 'string' ? body.email.trim().toLowerCase() : ''\n const phone = typeof body.phone === 'string' ? body.phone.replace(/\\s+/g, '') : ''\n if (!email && !phone) throw new HttpError(400, 'validation', 'email or phone is required', 'email')\n if (email && !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n return email ? `email:${email}` : `phone:${phone}`\n }\n\n function emailOf(body: Record<string, unknown>): string {\n const email = typeof body.email === 'string' ? body.email.trim().toLowerCase() : ''\n if (!email || !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n return email\n }\n\n function passwordOf(body: Record<string, unknown>, field = 'password'): string {\n const value = body[field]\n if (typeof value !== 'string' || value.length < MIN_PASSWORD || value.length > MAX_PASSWORD) {\n throw new HttpError(400, 'validation', `${field} must be ${MIN_PASSWORD}-${MAX_PASSWORD} characters`, field)\n }\n return value\n }\n\n function requirePasswordEnabled() {\n if (!capabilities.password) throw new HttpError(403, 'forbidden', 'Password accounts are disabled for this store')\n }\n\n function sessionFor(email: string, extra: { first_name?: string | null; last_name?: string | null } = {}): CustomerSession {\n let customer = state.customers.find((c) => c.email === email)\n if (!customer) {\n customer = {\n id: nextId('cus'),\n email,\n phone: null,\n first_name: extra.first_name ?? null,\n last_name: extra.last_name ?? null,\n default_address_id: null,\n created_at: now(),\n }\n state.customers.push(customer)\n }\n const token = `ct_${customer.id}_${Math.random().toString(36).slice(2)}`\n state.sessions.set(token, customer.id)\n trackSession(token, 'password')\n return { token, expires_at: new Date(Date.now() + 30 * 86_400_000).toISOString(), customer }\n }\n\n function trackSession(token: string, loginMethod: string) {\n const at = now()\n state.sessionInfo.set(token, { id: nextId('ses'), customer_id: state.sessions.get(token) ?? '', created_at: at, last_used_at: at, login_method: loginMethod, reauth_at: null })\n }\n\n function validateAddress(body: Record<string, unknown>, partial = false): Partial<Address> {\n const required = ['address1', 'city', 'zip', 'country_code'] as const\n if (!partial) {\n for (const f of required) {\n if (typeof body[f] !== 'string' || !(body[f] as string).trim()) throw new HttpError(400, 'validation', `${f} is required`, f)\n }\n }\n const fields = ['first_name', 'last_name', 'company', 'address1', 'address2', 'city', 'province', 'zip', 'country_code', 'phone'] as const\n const out: Partial<Address> = {}\n for (const f of fields) {\n if (f in body) (out as Record<string, unknown>)[f] = body[f] ?? null\n else if (!partial) (out as Record<string, unknown>)[f] = null\n }\n return out\n }\n\n // -------------------------------------------------------------------------\n // Router\n // -------------------------------------------------------------------------\n\n type Ctx = {\n method: string\n params: string[]\n search: URLSearchParams\n headers: Headers\n body: Record<string, unknown>\n scopes: Set<string>\n }\n type Result = { status?: number; body?: unknown; cache?: 'public' | 'private'; headers?: Record<string, string> }\n type Route = { method: string; pattern: RegExp; scope: string; handler: (ctx: Ctx) => Result | Promise<Result> }\n\n const routes: Route[] = []\n const route = (method: string, path: string, scope: string, handler: Route['handler']) => {\n const pattern = new RegExp('^' + path.replace(/:[a-z_]+/g, '([^/]+)') + '$')\n routes.push({ method, pattern, scope, handler })\n }\n\n const requireNode = <T>(value: T | undefined, what: string, field = 'handle'): T => {\n if (value === undefined) throw new HttpError(404, 'not_found', `${what} not found`, field)\n return value\n }\n\n // Catalog\n route('GET', '/shop', 'catalog:read', () => ({ body: state.shop, cache: 'public' }))\n route('GET', '/region', 'catalog:read', () => {\n if (!region) throw new HttpError(404, 'not_found', 'No region configured')\n return { body: region, cache: 'public' }\n })\n route('GET', '/products', 'catalog:read', ({ search }) => ({ body: listProducts(search), cache: 'public' }))\n route('GET', '/products/:handle', 'catalog:read', ({ params }) => ({\n body: requireNode(state.products.find((p) => p.handle === params[0]), `Product ${params[0]}`),\n cache: 'public',\n }))\n route('GET', '/products/:handle/recommendations', 'catalog:read', ({ params }) => {\n const product = requireNode(state.products.find((p) => p.handle === params[0]), `Product ${params[0]}`)\n const cols = state.memberships[product.handle] ?? []\n const nodes = state.products\n .filter((p) => p.id !== product.id && p.available_for_sale && (state.memberships[p.handle] ?? []).some((c) => cols.includes(c)))\n .slice(0, 4)\n return { body: { nodes }, cache: 'public' }\n })\n route('GET', '/collections', 'catalog:read', ({ search }) => ({ body: paginate(state.collections, search), cache: 'public' }))\n route('GET', '/collections/:handle', 'catalog:read', ({ params }) => ({\n body: requireNode(state.collections.find((c) => c.handle === params[0]), `Collection ${params[0]}`),\n cache: 'public',\n }))\n // Locations. `nearest` must be registered before `:id`. Like the real API it rounds the point to 0.01° and keeps nothing.\n const visibleLocations = () => state.shop.branches as Location[]\n const round2 = (n: number) => Math.round(n * 100) / 100\n const withDistance = (origin: { lat: number; lng: number }) =>\n rankByDistance(visibleLocations(), origin).map(({ item, distanceKm }) => ({ ...item, distance_km: Math.round(distanceKm * 10) / 10 }))\n route('GET', '/locations', 'catalog:read', ({ search }) => {\n const cp = search.get('postal_code')\n const origin = cp ? MOCK_POSTAL_CENTROIDS[cp] : undefined\n return { body: { nodes: origin ? withDistance(origin) : visibleLocations() }, cache: 'public' }\n })\n route('GET', '/locations/nearest', 'catalog:read', ({ search }) => {\n const origin = { lat: Number(search.get('lat') ?? NaN), lng: Number(search.get('lng') ?? NaN) }\n if (search.get('lat') === null || search.get('lng') === null || !isValidPoint(origin)) {\n throw new HttpError(400, 'validation', 'lat and lng must be a valid point', 'lat')\n }\n return { body: { nodes: withDistance({ lat: round2(origin.lat), lng: round2(origin.lng) }) }, cache: 'private' }\n })\n route('GET', '/locations/:id', 'catalog:read', ({ params }) => ({\n body: requireNode(visibleLocations().find((b) => b.id === params[0]), `Location ${params[0]}`, 'id'),\n cache: 'public',\n }))\n route('GET', '/stock', 'catalog:read', ({ search }) => {\n const skus = search.getAll('sku')\n if (skus.length > 250) throw new HttpError(400, 'validation', 'At most 250 SKUs', 'sku')\n const nodes = skus.flatMap((sku) => {\n for (const p of state.products) {\n const v = p.variants.find((x) => x.sku === sku)\n if (v) return [{ sku, quantity_available: v.quantity_available, ...(v.availability ? { availability: v.availability } : {}) }]\n }\n return []\n })\n return { body: { nodes }, cache: 'public' }\n })\n\n // Cart\n route('POST', '/carts', 'cart:write', ({ body }) => {\n const cart: CartRecord = {\n id: nextId('cart'),\n lines: [],\n codes: [],\n buyer: { email: null, phone: null, customer_id: null },\n shipping_address: null,\n delivery: { method: null, rate_id: null, branch_id: null },\n note: null,\n invoice: null,\n checkedOut: false,\n updated_at: now(),\n }\n if (body.lines !== undefined) addLines(cart, validateLines(body.lines))\n state.carts.set(cart.id, cart)\n return { status: 201, body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id', 'cart:write', ({ params }) => ({ body: renderCart(getCartRecord(params[0]!)), cache: 'private' }))\n route('POST', '/carts/:id/lines', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n addLines(cart, validateLines(body.lines, cart))\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PATCH', '/carts/:id/lines', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (!Array.isArray(body.lines)) throw new HttpError(400, 'validation', '`lines` must be an array', 'lines')\n const updates = body.lines as { id?: unknown; quantity?: unknown }[]\n updates.forEach((u, i) => {\n const line = cart.lines.find((l) => l.id === u.id)\n if (!line) throw new HttpError(400, 'validation', `Unknown line ${String(u.id)}`, `lines[${i}].id`)\n if (typeof u.quantity !== 'number' || !Number.isInteger(u.quantity) || u.quantity < 0) {\n throw new HttpError(400, 'validation', 'quantity must be a non-negative integer', `lines[${i}].quantity`)\n }\n })\n checkStock(\n updates.flatMap((u, i) => {\n const line = cart.lines.find((l) => l.id === u.id)!\n return (u.quantity as number) > 0\n ? [{ variant: findVariant(line.variant_id)!.variant, quantity: u.quantity as number, lineId: line.id, field: `lines[${i}].quantity` }]\n : []\n }),\n )\n for (const u of updates) {\n const line = cart.lines.find((l) => l.id === u.id)!\n line.quantity = u.quantity as number\n }\n cart.lines = cart.lines.filter((l) => l.quantity > 0)\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/discount-codes', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (!Array.isArray(body.codes) || body.codes.some((c) => typeof c !== 'string')) {\n throw new HttpError(400, 'validation', '`codes` must be an array of strings', 'codes')\n }\n cart.codes = [...new Set((body.codes as string[]).map((c) => c.trim().toUpperCase()).filter(Boolean))]\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/buyer', 'cart:write', ({ params, body, headers }) => {\n const cart = getCartRecord(params[0]!)\n const email = typeof body.email === 'string' ? body.email.trim() : null\n const phone = typeof body.phone === 'string' ? body.phone.trim() : null\n if (email && !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n const token = headers.get('x-customer-token')\n const customerId = token ? (state.sessions.get(token) ?? null) : null\n cart.buyer = { email: email || null, phone: phone || null, customer_id: customerId }\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/shipping-address', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n cart.shipping_address = validateAddress(body) as Address\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id/delivery-options', 'cart:write', ({ params }) => {\n const cart = renderCart(getCartRecord(params[0]!))\n const net = toCents(cart.cost.subtotal.amount) - toCents(cart.cost.discount.amount)\n const rates = shippingRates(net)\n const free = options.shippingQuoteMode === 'fixed_when_free' && rates.length > 0 && rates.every((r) => toCents(r.cost.amount) === 0)\n return {\n body: { rates, free, fixed: free, pickup: state.shop.branches.filter((b) => b.pickup?.enabled !== false).map((b) => ({ branch_id: b.id, name: b.name, address: b.address, city: b.city })), partial: false, unavailable: [] },\n cache: 'private',\n }\n })\n route('GET', '/carts/:id/payment-methods', 'cart:write', ({ params }) => {\n getCartRecord(params[0]!)\n return { body: { methods: options.paymentMethods ?? [{ key: 'mock', kind: 'builtin', default: true }], market: null }, cache: 'private' }\n })\n route('PUT', '/carts/:id/delivery', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (body.method === 'shipping') {\n const rateId = body.rate_id\n if (typeof rateId !== 'string' || !shippingRates(0).some((r) => r.id === rateId)) {\n throw new HttpError(400, 'validation', 'Unknown rate_id', 'rate_id')\n }\n cart.delivery = { method: 'shipping', rate_id: rateId, branch_id: null }\n } else if (body.method === 'pickup') {\n const branchId = body.branch_id\n if (typeof branchId !== 'string' || !state.shop.branches.some((b) => b.id === branchId && b.pickup?.enabled !== false)) {\n throw new HttpError(400, 'validation', 'Unknown branch_id', 'branch_id')\n }\n cart.delivery = { method: 'pickup', rate_id: null, branch_id: branchId }\n } else {\n throw new HttpError(400, 'validation', 'method must be shipping or pickup', 'method')\n }\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/invoice', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (cart.checkedOut) throw new HttpError(409, 'already_checked_out', 'The cart is already an order')\n cart.invoice = parseInvoice(body)\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n // Order note, cross-sell and promotions (contract 1.2)\n route('PUT', '/carts/:id/note', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n const raw = body.note\n if (raw !== null && raw !== undefined && typeof raw !== 'string') throw new HttpError(400, 'validation', 'note must be a string or null', 'note')\n const text = typeof raw === 'string' ? raw.trim() : ''\n if (text.length > 1000) throw new HttpError(400, 'validation', 'note must be at most 1000 characters', 'note')\n cart.note = text || null\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id/recommendations', 'cart:write', ({ params, search }) => {\n const cart = getCartRecord(params[0]!)\n const first = Math.min(8, Math.max(1, Number.parseInt(search.get('first') ?? '4', 10) || 4))\n const inCart = new Set(cart.lines.map((l) => findVariant(l.variant_id)?.product.id))\n const nodes: CartRecommendation[] = []\n for (const p of state.products) {\n if (inCart.has(p.id)) continue\n const variants = p.variants.filter((v) => v.available_for_sale)\n if (variants.length === 0) continue\n nodes.push({\n product: { id: p.id, handle: p.handle, title: p.title, featured_image: p.featured_image, options: p.options, vendor: p.vendor },\n variants,\n default_variant_id: variants[0]!.id,\n source: 'similar',\n unlocks: null,\n })\n if (nodes.length >= first) break\n }\n return { body: { nodes, promotions: null }, cache: 'private' }\n })\n route('GET', '/promotions', 'catalog:read', () => ({\n body: { nodes: [], announcements: options.announcements ?? [] },\n cache: 'public',\n }))\n\n route('POST', '/carts/:id/checkout', 'checkout:write', ({ params, body, headers }) => {\n const key = headers.get('idempotency-key')\n if (key) {\n const prev = state.idempotency.get(`${params[0]}:${key}`)\n if (prev) return { status: prev.status, body: prev.body, cache: 'private' }\n }\n const record = getCartRecord(params[0]!)\n const cart = renderCart(record)\n if (cart.lines.length === 0) throw new HttpError(422, 'invalid_state', 'Cart is empty', 'lines')\n if (!cart.buyer.email && !cart.buyer.phone) throw new HttpError(422, 'invalid_state', 'Buyer email or phone is required', 'buyer')\n if (!cart.delivery.method) throw new HttpError(422, 'invalid_state', 'Delivery method is required', 'delivery')\n if (cart.delivery.method === 'shipping' && !cart.shipping_address) {\n throw new HttpError(422, 'invalid_state', 'Shipping address is required', 'shipping_address')\n }\n if (typeof body.payment_method !== 'string' || !body.payment_method) throw new HttpError(400, 'validation', 'payment_method is required', 'payment_method')\n if (typeof body.return_url !== 'string' || !body.return_url) throw new HttpError(400, 'validation', 'return_url is required', 'return_url')\n // The invoice is checked against the region BEFORE anything is reserved or charged.\n const invoice = body.invoice !== undefined ? parseInvoice(body.invoice) : record.invoice\n // Reserve stock.\n checkStock(record.lines.map((l, i) => ({ variant: findVariant(l.variant_id)!.variant, quantity: l.quantity, lineId: l.id, field: `lines[${i}].quantity` })))\n for (const l of record.lines) {\n const v = findVariant(l.variant_id)!.variant\n if (v.quantity_available !== null) {\n v.quantity_available -= l.quantity\n v.available_for_sale = v.quantity_available > 0\n }\n }\n syncAvailability(state.products)\n\n const orderId = nextId('ord')\n const number = String(Math.max(1000, ...state.orders.map((o) => Number(o.number) || 0)) + 1)\n const customerId = cart.buyer.customer_id ?? state.customers.find((c) => c.email && c.email === cart.buyer.email)?.id ?? null\n state.orders.push({\n id: orderId,\n number,\n status: 'pending_payment',\n created_at: now(),\n total: cart.cost.total,\n customer_id: customerId,\n lines: cart.lines.map((l) => ({\n title: l.merchandise.product.title,\n variant_title: l.merchandise.title,\n sku: l.merchandise.sku,\n quantity: l.quantity,\n unit: l.cost.unit,\n total: l.cost.total,\n image: l.merchandise.image ?? l.merchandise.product.featured_image,\n })),\n })\n const redirect = new URL(`https://mock.local/pay/${orderId}`)\n redirect.searchParams.set('return_url', body.return_url)\n const checkoutId = nextId('chk')\n const result = {\n order: { id: orderId, number },\n payment: { provider: 'mock', status: 'pending', redirect_url: redirect.toString(), client_secret: null, instructions: null },\n checkout: {\n id: checkoutId,\n status: 'pending',\n external_order_id: orderId,\n total: cart.cost.total,\n stock_hold_expires_at: new Date(Date.now() + 30 * 60_000).toISOString(),\n },\n }\n state.checkouts.set(checkoutId, result)\n record.checkedOut = true\n if (invoice) state.invoices.set(orderId, { stage: 'awaiting_payment', request: invoice })\n if (key) state.idempotency.set(`${params[0]}:${key}`, { status: 201, body: result })\n return { status: 201, body: result, cache: 'private' }\n })\n route('GET', '/checkouts/:id', 'checkout:write', ({ params }) => {\n const found = state.checkouts.get(params[0]!)\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n return { body: found, cache: 'private' }\n })\n\n // Embedded payment (contract 1.2). The result depends on the provider token, like the sandbox cardholder names.\n const DECLINES: Record<string, NonNullable<PaymentAttemptResult['payment']['decline_code']>> = {\n tok_OTHE: 'declined',\n tok_CALL: 'call_issuer',\n tok_FUND: 'insufficient_funds',\n tok_SECU: 'invalid_cvc',\n tok_EXPI: 'invalid_expiry',\n tok_FORM: 'invalid_card_data',\n }\n const maxPaymentAttempts = options.maxPaymentAttempts ?? 5\n route('GET', '/checkouts/:id/payment-config', 'checkout:write', ({ params }) => {\n const found = state.checkouts.get(params[0]!) as { checkout: PaymentConfig['checkout'] } | undefined\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n const st = state.payments.get(params[0]!)\n const config: PaymentConfig = {\n provider: 'mock',\n flow: 'embedded',\n option: 'card',\n payable: found.checkout.status === 'pending' && (st?.attempts ?? 0) < maxPaymentAttempts,\n reason: null,\n amount: found.checkout.total,\n currency: found.checkout.total.currency_code,\n public_key: 'TEST-mock-public-key',\n methods: ['card', 'cash'],\n options: [{ key: 'card', redirect: false, max_installments: 12 }, { key: 'cash', redirect: false }],\n client: { kind: 'mock', sdk_url: 'https://mock.local/sdk.js', public_key: 'TEST-mock-public-key' },\n checkout: found.checkout,\n action: st?.last?.payment.action ?? null,\n attempts_left: maxPaymentAttempts - (st?.attempts ?? 0),\n }\n return { body: config, cache: 'private' }\n })\n route('POST', '/checkouts/:id/payment', 'checkout:write', ({ params, body, headers }) => {\n const key = headers.get('idempotency-key')\n if (!key) throw new HttpError(400, 'validation', 'Idempotency-Key header is required', 'Idempotency-Key')\n const id = params[0]!\n const prev = state.idempotency.get(`pay:${id}:${key}`)\n if (prev) return { status: prev.status, body: prev.body, cache: 'private' }\n const found = state.checkouts.get(id) as { checkout: { status: string; external_order_id: string; total: { amount: string; currency_code: string }; stock_hold_expires_at: string | null } } | undefined\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n const method = body.method\n if (method !== 'card' && method !== 'cash' && method !== 'bank_transfer') throw new HttpError(400, 'validation', 'method must be card, cash or bank_transfer', 'method')\n const data = body.provider_data\n if (typeof data !== 'object' || data === null || Array.isArray(data)) throw new HttpError(400, 'validation', 'provider_data is required', 'provider_data')\n const exp = body.expected_total as { amount?: string } | undefined\n if (exp && exp.amount !== undefined && toCents(exp.amount) !== toCents(found.checkout.total.amount)) {\n throw new HttpError(422, 'price_mismatch', 'The total changed', 'expected_total', { cost: found.checkout.total })\n }\n const st = state.payments.get(id) ?? { attempts: 0, last: null }\n if (found.checkout.status === 'paid' || st.last?.payment.status === 'pending' || st.last?.payment.status === 'requires_action') {\n throw new HttpError(409, 'conflict', 'A payment is already in progress', 'payment_in_progress')\n }\n if (found.checkout.stock_hold_expires_at && Date.parse(found.checkout.stock_hold_expires_at) < Date.now()) {\n throw new HttpError(409, 'expired', 'The reservation expired')\n }\n if (st.attempts >= maxPaymentAttempts) throw new HttpError(429, 'rate_limited', 'too_many_attempts')\n st.attempts += 1\n const token = typeof (data as Record<string, unknown>).token === 'string' ? ((data as Record<string, unknown>).token as string) : ''\n const attemptsLeft = maxPaymentAttempts - st.attempts\n let payment: PaymentAttemptResult['payment']\n if (method !== 'card') {\n const pointId = String((data as Record<string, unknown>).payment_method_id ?? 'oxxo')\n payment = {\n provider: 'mock',\n status: 'requires_action',\n action: {\n type: 'voucher',\n voucher: {\n payment_point: pointId,\n reference: `${pointId.toUpperCase()}-${id.slice(-6).toUpperCase()}`,\n voucher_url: `https://mock.local/voucher/${id}`,\n amount: found.checkout.total.amount,\n currency: found.checkout.total.currency_code,\n expires_at: new Date(Date.now() + 48 * 3_600_000).toISOString(),\n },\n },\n }\n } else if (token in DECLINES) {\n payment = { provider: 'mock', status: 'failed', decline_code: DECLINES[token]!, retryable: true }\n } else if (token === 'tok_CONT') {\n payment = { provider: 'mock', status: 'pending', action: { type: 'none' } }\n } else if (token === 'tok_3DS') {\n payment = { provider: 'mock', status: 'requires_action', action: { type: 'challenge', challenge: { url: 'https://mock.local/3ds', creq: 'creq' } } }\n } else {\n payment = { provider: 'mock', status: 'paid' }\n found.checkout.status = 'paid'\n const order = state.orders.find((o) => o.id === found.checkout.external_order_id)\n if (order) order.status = 'paid'\n }\n payment.outcome =\n payment.status === 'paid' ? 'approved' : payment.status === 'failed' ? 'rejected' : payment.action?.type === 'challenge' ? 'challenge' : 'pending'\n const result: PaymentAttemptResult = { attempt: { n: st.attempts }, payment, checkout: found.checkout as PaymentAttemptResult['checkout'], attempts_left: attemptsLeft }\n st.last = result\n state.payments.set(id, st)\n state.idempotency.set(`pay:${id}:${key}`, { status: 200, body: result })\n return { body: result, cache: 'private' }\n })\n\n // Restock subscriptions (\"notify me when it is back\")\n route('POST', '/restock-subscriptions', 'customer:write', ({ body }) => {\n if (typeof body.sku !== 'string' || !body.sku) throw new HttpError(400, 'validation', 'sku is required', 'sku')\n if (typeof body.locale !== 'string' || !body.locale) throw new HttpError(400, 'validation', 'locale is required', 'locale')\n if (body.consent !== true) throw new HttpError(422, 'invalid_state', 'consent must be true', 'consent')\n const contact = typeof body.email === 'string' && body.email ? body.email.toLowerCase() : typeof body.phone === 'string' ? body.phone : ''\n if (!contact) throw new HttpError(400, 'validation', 'email or phone is required', 'email')\n const known = state.products.some((p) => p.variants.some((v) => v.sku === body.sku))\n if (!known) throw new HttpError(404, 'not_found', `SKU ${body.sku} not found`, 'sku')\n state.restock.add(`${contact}|${body.sku}`)\n return { status: 202, body: { status: 'pending' }, cache: 'private' }\n })\n\n // Customer\n route('POST', '/customer/otp', 'customer:write', ({ body }) => {\n state.otps.set(identifierOf(body), otpCode)\n return { status: 204 }\n })\n route('POST', '/customer/session', 'customer:write', ({ body }) => {\n const id = identifierOf(body)\n if (typeof body.code !== 'string' || state.otps.get(id) !== body.code) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.otps.delete(id)\n const [kind, value] = id.split(/:(.*)/s) as [string, string]\n let customer = state.customers.find((c) => (kind === 'email' ? c.email === value : c.phone === value))\n if (!customer) {\n customer = {\n id: nextId('cus'),\n email: kind === 'email' ? value : null,\n phone: kind === 'phone' ? value : null,\n first_name: null,\n last_name: null,\n default_address_id: null,\n created_at: now(),\n }\n state.customers.push(customer)\n }\n const token = `ct_${customer.id}_${Math.random().toString(36).slice(2)}`\n state.sessions.set(token, customer.id)\n trackSession(token, kind)\n return {\n status: 201,\n body: { token, expires_at: new Date(Date.now() + 30 * 86_400_000).toISOString(), customer },\n cache: 'private',\n }\n })\n route('GET', '/customer/capabilities', 'customer:read', () => ({ body: capabilities, cache: 'private' }))\n route('POST', '/customer/register', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const password = passwordOf(body)\n const text = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : null)\n const first_name = text(body.first_name)\n const last_name = text(body.last_name)\n if (state.passwords.has(email)) throw new HttpError(409, 'conflict', 'An account with this email already exists', 'email')\n if (capabilities.email_verification) {\n state.pendingRegistrations.set(email, { password, first_name, last_name })\n state.otps.set(`email:${email}`, otpCode)\n return { status: 202, body: { status: 'verification_required' }, cache: 'private' }\n }\n state.passwords.set(email, password)\n return { status: 201, body: sessionFor(email, { first_name, last_name }), cache: 'private' }\n })\n route('POST', '/customer/register/verify', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const pending = state.pendingRegistrations.get(email)\n if (!pending || typeof body.code !== 'string' || state.otps.get(`email:${email}`) !== body.code) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.pendingRegistrations.delete(email)\n state.otps.delete(`email:${email}`)\n state.passwords.set(email, pending.password)\n return { status: 201, body: sessionFor(email, pending), cache: 'private' }\n })\n route('POST', '/customer/login', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n if ((state.loginFailures.get(email) ?? 0) >= maxLoginAttempts) {\n throw new HttpError(429, 'rate_limited', 'Too many failed attempts, try again later')\n }\n const stored = state.passwords.get(email)\n if (stored === undefined || typeof body.password !== 'string' || body.password !== stored) {\n state.loginFailures.set(email, (state.loginFailures.get(email) ?? 0) + 1)\n throw new HttpError(401, 'unauthorized', 'Invalid email or password')\n }\n state.loginFailures.delete(email)\n return { status: 201, body: sessionFor(email), cache: 'private' }\n })\n route('PUT', '/customer/password', 'customer:write', ({ headers, body }) => {\n requirePasswordEnabled()\n const customer = requireCustomer(headers)\n const password = passwordOf(body)\n const email = customer.email\n if (!email) throw new HttpError(422, 'invalid_state', 'The account has no email', 'email')\n const current = state.passwords.get(email)\n if (current !== undefined && body.current_password !== current) {\n throw new HttpError(401, 'unauthorized', 'current_password is missing or wrong', 'current_password')\n }\n state.passwords.set(email, password)\n return { status: 204 }\n })\n route('POST', '/customer/password/reset', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const password = passwordOf(body)\n if (typeof body.code !== 'string' || state.otps.get(`email:${email}`) !== body.code || !state.customers.some((c) => c.email === email)) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.otps.delete(`email:${email}`)\n state.passwords.set(email, password)\n state.loginFailures.delete(email)\n return { status: 204 }\n })\n /** The customer as the API serves it: the fiscal evidence keeps no file hash. */\n const publicCustomer = (c0: Customer): Customer => {\n const c: Customer = { ...c0, locale: c0.locale ?? null, preferences: c0.preferences ?? { notifications: {} } }\n if (!c.fiscal?.document) return c\n const { sha256: _sha, ...document } = c.fiscal.document\n return { ...c, fiscal: { ...c.fiscal, document } }\n }\n route('GET', '/customer', 'customer:read', ({ headers }) => ({ body: publicCustomer(requireCustomer(headers)), cache: 'private' }))\n route('PATCH', '/customer', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const text = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : null)\n if ('first_name' in body) c.first_name = text(body.first_name)\n if ('last_name' in body) c.last_name = text(body.last_name)\n if ('phone' in body) c.phone = text(body.phone)\n if ('locale' in body) c.locale = parseLocale(body.locale)\n if ('preferences' in body) c.preferences = parsePreferences(c.preferences, body.preferences)\n if ('fiscal' in body) {\n if (body.fiscal === null) c.fiscal = null\n else {\n const fiscal = parseInvoice({ ...(body.fiscal as object), requested: true }, 'fiscal') as InvoiceRequest\n const fid: FiscalIdentity = {\n country_code: String(fiscal.country_code ?? region?.country_code ?? ''),\n tax_id: String(fiscal.tax_id ?? fiscal.rfc).toUpperCase(),\n legal_name: String(fiscal.legal_name ?? fiscal.razon_social),\n tax_regime: String(fiscal.tax_regime ?? fiscal.regimen),\n postal_code: String(fiscal.postal_code ?? fiscal.cp),\n invoice_use: String(fiscal.use ?? fiscal.uso_cfdi ?? fiscal.invoice_use ?? '') || null,\n document: fiscal.document ?? null,\n verification: { status: 'reviewed', checked_at: now() },\n }\n c.fiscal = fid\n }\n }\n return { body: publicCustomer(c), cache: 'private' }\n })\n // Account settings (contract 1.9): language, notification preferences, sessions, re-authentication, export, delete.\n const OPTIONAL_EVENTS = new Set(['order_updates', 'shipping', 'restock'])\n const MANDATORY_EVENTS = new Set(['order_confirmation', 'payment', 'invoice', 'security'])\n const CHANNELS = new Set(['email', 'whatsapp'])\n const REAUTH_WINDOW_MS = 5 * 60_000\n const supportedLocales = () => [state.shop.locale, ...state.shop.locales].filter((l, i, a) => l && a.indexOf(l) === i)\n\n function parseLocale(raw: unknown): string | null {\n if (raw === null || (typeof raw === 'string' && !raw.trim())) return null\n if (typeof raw !== 'string') throw new HttpError(400, 'validation', 'locale must be a string', 'locale')\n const tag = raw.trim().replace('_', '-')\n const [lang = '', ...rest] = tag.split('-')\n const canonical = [lang.toLowerCase(), ...rest.map((p) => p.toUpperCase())].join('-')\n const supported = supportedLocales()\n const hit = supported.find((l) => l.toLowerCase() === canonical.toLowerCase()) ?? (rest.length === 0 ? supported.find((l) => l.split('-')[0]!.toLowerCase() === canonical) : undefined)\n if (!hit) throw new HttpError(400, 'validation', 'this store is not available in that language', 'locale')\n return hit\n }\n\n function parsePreferences(current: Customer['preferences'], raw: unknown): Customer['preferences'] {\n if (raw === null) return { notifications: {} }\n if (typeof raw !== 'object' || Array.isArray(raw)) throw new HttpError(400, 'validation', 'preferences must be an object', 'preferences')\n const merged: Record<string, Record<string, boolean>> = structuredClone(current?.notifications ?? {})\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (key !== 'notifications') throw new HttpError(400, 'validation', 'unknown preference', `preferences.${key}`)\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new HttpError(400, 'validation', 'notifications must map each event to its channels', 'preferences.notifications')\n for (const [event, channels] of Object.entries(value as Record<string, unknown>)) {\n const field = `preferences.notifications.${event}`\n if (MANDATORY_EVENTS.has(event)) throw new HttpError(400, 'validation', 'this notification is required and cannot be turned off', field)\n if (!OPTIONAL_EVENTS.has(event)) throw new HttpError(400, 'validation', 'unknown notification', field)\n if (!channels || typeof channels !== 'object' || Array.isArray(channels)) throw new HttpError(400, 'validation', 'each event maps its channels to true or false', field)\n for (const [channel, on] of Object.entries(channels as Record<string, unknown>)) {\n if (!CHANNELS.has(channel)) throw new HttpError(400, 'validation', 'unknown channel', `${field}.${channel}`)\n if (typeof on !== 'boolean') throw new HttpError(400, 'validation', 'each channel must be true or false', `${field}.${channel}`)\n ;(merged[event] ??= {})[channel] = on\n }\n }\n }\n return { notifications: merged }\n }\n\n /** The session of the request (its token); the customer must have one. */\n function sessionOf(headers: Headers) {\n const c = requireCustomer(headers)\n const token = headers.get('x-customer-token')!\n if (!state.sessionInfo.has(token)) trackSession(token, 'email')\n return { c, token, info: state.sessionInfo.get(token)! }\n }\n function requireRecentReauth(info: { reauth_at: number | null }) {\n if (info.reauth_at === null || Date.now() - info.reauth_at > REAUTH_WINDOW_MS) {\n throw new HttpError(403, 'reauth_required', 'confirm your password or a code first (customer.reauth)')\n }\n }\n\n route('GET', '/customer/sessions', 'customer:read', ({ headers }) => {\n const { c, token } = sessionOf(headers)\n const nodes = [...state.sessions.entries()]\n .filter(([, id]) => id === c.id)\n .map(([t]) => ({ t, info: state.sessionInfo.get(t)! }))\n .sort((a, b) => b.info.last_used_at.localeCompare(a.info.last_used_at))\n .map(({ t, info }) => ({\n id: info.id,\n current: t === token,\n device_label: 'Mock browser · Test',\n login_method: info.login_method,\n last_used_at: info.last_used_at,\n created_at: info.created_at,\n }))\n return { body: { nodes }, cache: 'private' }\n })\n route('DELETE', '/customer/sessions/:id', 'customer:write', ({ headers, params }) => {\n const { c, token } = sessionOf(headers)\n const mine = [...state.sessions.entries()].filter(([, id]) => id === c.id).map(([t]) => t)\n if (params[0] === 'others') {\n for (const t of mine) if (t !== token) state.sessions.delete(t)\n return { status: 204 }\n }\n const entry = [...state.sessionInfo.entries()].find(([, i]) => i.id === params[0])\n // A session of someone else and one that never existed are the same 404; a closed one of mine is fine to close again.\n if (!entry || entry[1].customer_id !== c.id) throw new HttpError(404, 'not_found', 'Session not found', 'id')\n state.sessions.delete(entry[0])\n return { status: 204 }\n })\n route('POST', '/customer/reauth', 'customer:write', ({ headers, body }) => {\n const { c, info } = sessionOf(headers)\n const hasPassword = typeof body.password === 'string' && body.password !== ''\n const hasCode = typeof body.otp_code === 'string' && body.otp_code !== ''\n if (hasPassword === hasCode) throw new HttpError(400, 'validation', 'send either password or otp_code', 'password')\n if ((state.reauthFailures.get(c.id) ?? 0) >= 5) throw new HttpError(429, 'rate_limited', 'Too many attempts, try again later')\n const field = hasPassword ? 'password' : 'otp_code'\n const ok = hasPassword\n ? c.email !== null && state.passwords.get(c.email) === body.password\n : [c.email && `email:${c.email}`, c.phone && `phone:${c.phone}`].some((id) => !!id && state.otps.get(id) === body.otp_code)\n if (!ok) {\n state.reauthFailures.set(c.id, (state.reauthFailures.get(c.id) ?? 0) + 1)\n throw new HttpError(400, 'validation', 'could not verify; check the credential and try again', field)\n }\n state.reauthFailures.delete(c.id)\n info.reauth_at = Date.now()\n return { body: { reauth_at: new Date(info.reauth_at).toISOString(), valid_for_seconds: REAUTH_WINDOW_MS / 1000 }, cache: 'private' }\n })\n route('POST', '/customer/data-export', 'customer:write', ({ headers }) => {\n const { c, info } = sessionOf(headers)\n requireRecentReauth(info)\n if ((state.exportsServed.get(c.id) ?? 0) >= 3) throw new HttpError(429, 'rate_limited', 'Three exports a day; try again tomorrow')\n state.exportsServed.set(c.id, (state.exportsServed.get(c.id) ?? 0) + 1)\n const doc = {\n format: 'storefront-customer-data/1',\n exported_at: now(),\n account: { id: c.id, email: c.email, phone: c.phone, first_name: c.first_name, last_name: c.last_name, locale: c.locale ?? null, created_at: c.created_at },\n preferences: c.preferences ?? { notifications: {} },\n addresses: state.addresses.get(c.id) ?? [],\n fiscal_profiles: state.fiscalProfiles.get(c.id) ?? [],\n orders: state.orders.filter((o) => o.customer_id === c.id).map((o) => ({ id: o.id, number: o.number, created_at: o.created_at, status: o.status, total: o.total })),\n }\n return {\n body: {\n filename: `account-data-${now().slice(0, 10)}.json`,\n content_type: 'application/json',\n content_base64: btoa(unescape(encodeURIComponent(JSON.stringify(doc, null, 2)))),\n },\n cache: 'private',\n }\n })\n route('DELETE', '/customer', 'customer:write', ({ headers, body }) => {\n const token = headers.get('x-customer-token')\n if (token && state.deletedTokens.has(token)) return { status: 204 }\n const { c, info } = sessionOf(headers)\n requireRecentReauth(info)\n if (typeof body.confirm !== 'string' || !body.confirm.trim() || body.confirm.length > 100) {\n throw new HttpError(400, 'validation', 'confirm is required: the text the buyer typed', 'confirm')\n }\n const closed = new Set(['fulfilled', 'delivered', 'cancelled'])\n if (state.orders.some((o) => o.customer_id === c.id && !closed.has(o.status))) {\n throw new HttpError(409, 'conflict', 'you have an order in progress; you can delete the account once it is delivered', 'orders')\n }\n if (c.id === 'cus_1' && state.pendingPayments.some((p) => p.status === 'pending_payment')) {\n throw new HttpError(409, 'conflict', 'you have a payment waiting to be completed', 'pending_payments')\n }\n // Personal data goes; orders stay (they keep the customer id) and a new sign-up starts from nothing.\n for (const [t, id] of [...state.sessions.entries()]) {\n if (id === c.id) {\n state.sessions.delete(t)\n state.deletedTokens.add(t)\n }\n }\n if (c.email) state.passwords.delete(c.email)\n state.addresses.delete(c.id)\n state.fiscalProfiles.delete(c.id)\n state.customers = state.customers.filter((x) => x.id !== c.id)\n return { status: 204 }\n })\n\n /**\n * The order as the API serves it. The list is a summary (`shipments_summary`); the detail carries the shipments, invoices,\n * payments, refunds and the address. A sandbox shipment loses its guide, as the real server does in production.\n */\n const orderView = ({ customer_id: _c, ...o }: MockState['orders'][number], detail: boolean): Order => {\n const order: Order = { ...o, invoice: orderInvoice(o as MockState['orders'][number]) }\n if (order.shipments) order.shipments = order.shipments.map((s) => (isTestShipment(s) ? { ...s, tracking_number: null, tracking_url: null } : { ...s, events: sortTrackingEvents(s.events) }))\n order.progress = orderProgress(order)\n order.next_action = nextAction(order)\n const live = orderShipments(order).filter((s) => !isTestShipment(s))\n if (order.shipments?.length) {\n order.shipments_summary = { count: order.shipments.length, status: shipmentsStatus(order) ?? 'pending', carrier: live[0]?.carrier ?? null, ...(live[0]?.tracking_url ? { tracking_url: live[0].tracking_url } : {}) }\n }\n if (!detail) {\n delete order.shipments\n delete order.invoices\n delete order.payments\n delete order.refunds\n delete order.shipping_address\n }\n return order\n }\n route('GET', '/customer/orders', 'orders:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const orders = state.orders.filter((o) => o.customer_id === c.id).sort((a, b) => b.created_at.localeCompare(a.created_at)).map((o) => orderView(o, false))\n return { body: paginate(orders, search, 20), cache: 'private' }\n })\n const findOrder = (headers: Headers, id: string) => {\n const c = requireCustomer(headers)\n return requireNode(state.orders.find((o) => o.id === id && o.customer_id === c.id), `Order ${id}`, 'id')\n }\n route('GET', '/customer/orders/:id', 'orders:read', ({ headers, params }) => ({ body: orderView(findOrder(headers, params[0]!), true), cache: 'private' }))\n route('POST', '/customer/orders/:id/returns', 'customer:write', ({ headers, params, body }) => {\n const order = findOrder(headers, params[0]!)\n if (!Array.isArray(body.lines) || body.lines.length === 0) throw new HttpError(400, 'validation', 'lines are required', 'lines')\n return { status: 201, body: { id: nextId('ret'), order_id: order.id, status: 'requested' }, cache: 'private' }\n })\n route('POST', '/customer/orders/:id/invoice', 'customer:write', ({ headers, params, body }) => {\n const order = findOrder(headers, params[0]!)\n const existing = state.invoices.get(order.id)\n if (existing && existing.stage !== 'awaiting_payment') {\n return { status: existing.stage === 'issued' ? 200 : 202, body: { status: existing.stage === 'issued' ? 'issued' : 'requested', url: null, stage: existing.stage, invoice: orderInvoice(order) }, cache: 'private' }\n }\n const request = parseInvoice({ ...body, requested: true }, 'invoice') as InvoiceRequest\n if (order.status === 'pending_payment') throw new HttpError(409, 'awaiting_payment', 'The order is not paid yet')\n state.invoices.set(order.id, { stage: 'queued', request })\n return { status: 202, body: { status: 'requested', url: null, stage: 'queued', invoice: orderInvoice(order) }, cache: 'private' }\n })\n route('GET', '/customer/pending-payments', 'orders:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const nodes = c.id === 'cus_1' ? state.pendingPayments : []\n return { body: paginate(nodes, search, 20), cache: 'private' }\n })\n route('GET', '/customer/orders/:id/invoices/:invoice_id/:kind', 'orders:read', ({ headers, params }) => {\n const order = findOrder(headers, params[0]!)\n const doc = order.invoices?.find((d: InvoiceDoc) => d.id === params[1])\n if (!doc || (params[2] !== 'pdf' && params[2] !== 'xml')) throw new HttpError(404, 'not_found', 'Invoice file not found', 'invoice_id')\n const pdf = params[2] === 'pdf'\n const text = pdf ? `%PDF-1.4\\n% mock invoice ${doc.id}\\n%%EOF\\n` : `<?xml version=\"1.0\"?><cfdi:Comprobante mock=\"true\" id=\"${doc.id}\"/>`\n const file: InvoiceFile = {\n filename: `${doc.kind === 'credit_note' ? 'nota-de-credito' : 'factura'}-${doc.id}.${params[2]}`,\n content_type: pdf ? 'application/pdf' : 'application/xml',\n content_base64: btoa(text),\n }\n return { body: file, headers: { 'Cache-Control': 'no-store' } }\n })\n // Saved fiscal profiles (contract 1.9): up to MAX_FISCAL_PROFILES per buyer, one default, physical delete.\n const MAX_FISCAL_PROFILES = 10\n const profilesOf = (c: Customer) => state.fiscalProfiles.get(c.id) ?? []\n /** What the API serves: the evidence keeps no file hash. */\n const publicProfile = (p: FiscalProfile): FiscalProfile => {\n if (!p.document) return p\n const { sha256: _sha, ...document } = p.document\n return { ...p, document }\n }\n const personTypeOf = (taxId: string): string | null => {\n for (const [type, pattern] of Object.entries(region?.fiscal_id?.person_patterns ?? {})) if (new RegExp(pattern).test(taxId)) return type\n return null\n }\n /** `Customer.fiscal` mirrors the default profile, as the real server does. */\n const mirrorDefaultProfile = (c: Customer) => {\n const d = profilesOf(c).find((p) => p.is_default)\n c.fiscal = d\n ? { country_code: d.country_code, tax_id: d.tax_id, legal_name: d.legal_name, tax_regime: d.tax_regime, postal_code: d.postal_code, invoice_use: d.invoice_use ?? null, document: d.document ?? null, verification: d.verification ?? null }\n : null\n }\n const profileFields = (body: Record<string, unknown>, base?: FiscalProfile): FiscalIdentity => {\n const merged: Record<string, unknown> = {\n ...(base ? { tax_id: base.tax_id, legal_name: base.legal_name, tax_regime: base.tax_regime, postal_code: base.postal_code, country_code: base.country_code, ...(base.invoice_use ? { use: base.invoice_use } : {}) } : {}),\n ...body,\n requested: true,\n }\n delete merged.label\n delete merged.is_default\n delete merged.verification\n const fiscal = parseInvoice(merged, 'fiscal') as InvoiceRequest\n return {\n country_code: String(fiscal.country_code ?? region?.country_code ?? ''),\n tax_id: String(fiscal.tax_id ?? fiscal.rfc).toUpperCase(),\n legal_name: String(fiscal.legal_name ?? fiscal.razon_social),\n tax_regime: String(fiscal.tax_regime ?? fiscal.regimen),\n postal_code: String(fiscal.postal_code ?? fiscal.cp),\n invoice_use: String(fiscal.use ?? fiscal.uso_cfdi ?? fiscal.invoice_use ?? '') || null,\n document: fiscal.document ?? base?.document ?? null,\n }\n }\n const ownProfile = (c: Customer, id: string | undefined) => {\n const p = profilesOf(c).find((x) => x.id === id)\n if (!p) throw new HttpError(404, 'not_found', 'Fiscal profile not found', 'id')\n return p\n }\n const makeDefault = (c: Customer, id: string) => state.fiscalProfiles.set(c.id, profilesOf(c).map((p) => ({ ...p, is_default: p.id === id })))\n route('GET', '/customer/fiscal-profiles', 'customer:read', ({ headers }) => {\n const c = requireCustomer(headers)\n const nodes = [...profilesOf(c)].sort((a, b) => Number(b.is_default) - Number(a.is_default) || (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))\n return { body: { nodes: nodes.map(publicProfile) }, cache: 'private' }\n })\n route('POST', '/customer/fiscal-profiles', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const list = profilesOf(c)\n const fid = profileFields(body)\n if (list.length >= MAX_FISCAL_PROFILES) throw new HttpError(409, 'conflict', 'Fiscal profile limit reached; delete one first')\n if (list.some((p) => p.country_code === fid.country_code && p.tax_id === fid.tax_id)) throw new HttpError(409, 'conflict', 'A profile with this tax id already exists', 'tax_id')\n const at = now()\n const label = typeof body.label === 'string' && body.label.trim() ? body.label.trim().slice(0, 40) : fid.legal_name.slice(0, 40)\n const profile: FiscalProfile = { ...fid, id: nextId('fisc'), label, person_type: personTypeOf(fid.tax_id), is_default: false, last_used_at: null, created_at: at, updated_at: at, verification: { status: 'unverified', checked_at: null } }\n state.fiscalProfiles.set(c.id, [...list, profile])\n if (list.length === 0 || body.is_default === true) makeDefault(c, profile.id)\n mirrorDefaultProfile(c)\n return { status: 201, body: publicProfile(profilesOf(c).find((p) => p.id === profile.id)!), cache: 'private' }\n })\n route('PATCH', '/customer/fiscal-profiles/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const cur = ownProfile(c, params[0])\n if ('verification' in body) throw new HttpError(400, 'validation', 'verification is set by the server', 'verification')\n if (body.is_default === false && cur.is_default) throw new HttpError(400, 'validation', 'Make another profile the default instead', 'is_default')\n const fid = profileFields(body as FiscalProfileInput as Record<string, unknown>, cur)\n if (profilesOf(c).some((p) => p.id !== cur.id && p.country_code === fid.country_code && p.tax_id === fid.tax_id)) throw new HttpError(409, 'conflict', 'A profile with this tax id already exists', 'tax_id')\n const identityChanged = fid.tax_id !== cur.tax_id || fid.country_code !== cur.country_code\n const updated: FiscalProfile = {\n ...cur,\n ...fid,\n document: 'document' in body ? fid.document : identityChanged ? null : cur.document,\n label: typeof body.label === 'string' && body.label.trim() ? body.label.trim().slice(0, 40) : cur.label,\n person_type: personTypeOf(fid.tax_id),\n verification: identityChanged ? { status: 'unverified', checked_at: null } : cur.verification,\n updated_at: now(),\n }\n state.fiscalProfiles.set(c.id, profilesOf(c).map((p) => (p.id === cur.id ? updated : p)))\n if (body.is_default === true) makeDefault(c, cur.id)\n mirrorDefaultProfile(c)\n return { body: publicProfile(profilesOf(c).find((p) => p.id === cur.id)!), cache: 'private' }\n })\n route('DELETE', '/customer/fiscal-profiles/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const cur = ownProfile(c, params[0])\n const rest = profilesOf(c).filter((p) => p.id !== cur.id)\n state.fiscalProfiles.set(c.id, rest)\n if (cur.is_default && rest[0]) makeDefault(c, rest[0].id)\n mirrorDefaultProfile(c)\n return { status: 204 }\n })\n // Buyer items, «My items» (contract 1.9): kinds are data the store declares; the server validates against them,\n // builds `label` / `fit_key` and keeps private fields apart (returned only masked). Physical delete.\n const MAX_SUBJECTS = 50\n const subjectsOf = (c: Customer) => state.subjects.get(c.id) ?? []\n const kinds = () => options.subjectKinds ?? []\n const publicSubject = (s: Subject & { private: Record<string, string> }): Subject => {\n const { private: priv, ...rest } = s\n return { ...rest, attributes: { ...s.attributes, ...Object.fromEntries(Object.keys(priv).map((k) => [k, PRIVATE_MASK + (priv[k]!.length > 3 ? priv[k]!.slice(-2) : '')])) } }\n }\n const ownSubject = (c: Customer, id: string | undefined) => {\n const s = subjectsOf(c).find((x) => x.id === id)\n if (!s) throw new HttpError(404, 'not_found', 'Item not found', 'id')\n return s\n }\n const setDefaultSubject = (c: Customer, id: string) => {\n const kind = ownSubject(c, id).kind\n state.subjects.set(c.id, subjectsOf(c).map((s) => (s.kind !== kind ? s : s.id === id ? { ...s, is_default: true, last_used_at: now() } : { ...s, is_default: false })))\n }\n const resolveOrThrow = (kind: SubjectKind, values: SubjectValues) => {\n const r = resolveSubject(kind, values)\n if (!r.ok) {\n const [field, code] = Object.entries(r.problems)[0]!\n throw new HttpError(422, 'validation', `${field}: ${code}`, field === '_' ? 'attributes' : `attributes.${field}`)\n }\n return r.subject\n }\n const cleanNickname = (v: unknown): string | null => {\n if (v === undefined || v === null || v === '') return null\n if (typeof v !== 'string' || [...v.trim()].length > 40) throw new HttpError(422, 'validation', 'nickname is too long (max 40)', 'nickname')\n return v.trim().split(/\\s+/).join(' ')\n }\n route('GET', '/subject-kinds', 'content:read', () => ({ body: { nodes: kinds() }, cache: 'public' }))\n route('GET', '/customer/subjects', 'customer:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const kind = search.get('kind')\n const nodes = subjectsOf(c)\n .filter((s) => !kind || s.kind === kind)\n .sort((a, b) => a.kind.localeCompare(b.kind) || Number(b.is_default) - Number(a.is_default) || (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))\n return { body: { nodes: nodes.map(publicSubject) }, cache: 'private' }\n })\n route('POST', '/customer/subjects', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const kind = kinds().find((k) => k.key === body.kind)\n if (!kind) throw new HttpError(422, 'validation', 'This store has no such kind', 'kind')\n const attrs = body.attributes\n if (!attrs || typeof attrs !== 'object' || Array.isArray(attrs)) throw new HttpError(422, 'validation', 'attributes must be an object', 'attributes')\n const r = resolveOrThrow(kind, attrs as SubjectValues)\n const list = subjectsOf(c)\n if (list.length >= MAX_SUBJECTS || list.filter((s) => s.kind === kind.key).length >= kind.max_per_account) throw new HttpError(409, 'conflict', 'Limit reached; delete one first', 'kind')\n if (r.fit_key && list.some((s) => s.kind === kind.key && s.fit_key === r.fit_key)) throw new HttpError(409, 'conflict', 'You already saved this item', 'attributes')\n const subject = { id: nextId('subj'), kind: kind.key, label: r.label, nickname: cleanNickname(body.nickname), fit_key: r.fit_key, attributes: r.attributes, private: r.private, is_default: false, last_used_at: null, created_at: now() }\n state.subjects.set(c.id, [...list, subject])\n if (!list.some((s) => s.kind === kind.key) || body.is_default === true) setDefaultSubject(c, subject.id)\n return { status: 201, body: publicSubject(ownSubject(c, subject.id)), cache: 'private' }\n })\n route('PATCH', '/customer/subjects/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const cur = ownSubject(c, params[0])\n if (body.is_default === false && cur.is_default) throw new HttpError(422, 'validation', 'Make another item the default instead', 'is_default')\n let next = { ...cur }\n if ('nickname' in body) next.nickname = cleanNickname(body.nickname)\n if ('attributes' in body) {\n const kind = kinds().find((k) => k.key === cur.kind)\n if (!kind) throw new HttpError(422, 'validation', 'This store no longer offers this kind', 'kind')\n const sent = (body.attributes ?? {}) as Record<string, unknown>\n const merged: Record<string, unknown> = { ...cur.attributes, ...cur.private }\n for (const [k, v] of Object.entries(sent)) {\n if (k in cur.private && isMasked(v)) continue // the mask the client was shown: keep the stored value\n if (v === null) delete merged[k]\n else merged[k] = v\n }\n const r = resolveOrThrow(kind, merged as SubjectValues)\n if (r.fit_key && subjectsOf(c).some((s) => s.id !== cur.id && s.kind === cur.kind && s.fit_key === r.fit_key)) throw new HttpError(409, 'conflict', 'You already saved this item', 'attributes')\n next = { ...next, label: r.label, fit_key: r.fit_key, attributes: r.attributes, private: r.private }\n }\n state.subjects.set(c.id, subjectsOf(c).map((s) => (s.id === cur.id ? next : s)))\n if (body.is_default === true && !cur.is_default) setDefaultSubject(c, cur.id)\n return { body: publicSubject(ownSubject(c, cur.id)), cache: 'private' }\n })\n route('DELETE', '/customer/subjects/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const cur = ownSubject(c, params[0])\n state.subjects.set(c.id, subjectsOf(c).filter((s) => s.id !== cur.id))\n const heir = subjectsOf(c).filter((s) => s.kind === cur.kind).sort((a, b) => (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))[0]\n if (cur.is_default && heir) setDefaultSubject(c, heir.id)\n return { status: 204 }\n })\n route('GET', '/customer/addresses', 'customer:read', ({ headers }) => {\n const c = requireCustomer(headers)\n return { body: { nodes: state.addresses.get(c.id) ?? [] }, cache: 'private' }\n })\n route('POST', '/customer/addresses', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const address = { ...(validateAddress(body) as Address), id: nextId('addr') }\n state.addresses.set(c.id, [...(state.addresses.get(c.id) ?? []), address])\n if (!c.default_address_id) c.default_address_id = address.id\n return { status: 201, body: address, cache: 'private' }\n })\n route('PATCH', '/customer/addresses/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const list = state.addresses.get(c.id) ?? []\n const idx = list.findIndex((a) => a.id === params[0])\n if (idx < 0) throw new HttpError(404, 'not_found', 'Address not found', 'id')\n const updated = { ...list[idx]!, ...validateAddress(body, true), id: list[idx]!.id }\n list[idx] = updated\n return { body: updated, cache: 'private' }\n })\n route('DELETE', '/customer/addresses/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const list = state.addresses.get(c.id) ?? []\n if (!list.some((a) => a.id === params[0])) throw new HttpError(404, 'not_found', 'Address not found', 'id')\n state.addresses.set(c.id, list.filter((a) => a.id !== params[0]))\n if (c.default_address_id === params[0]) c.default_address_id = null\n return { status: 204 }\n })\n\n // Content\n const previewCache = (search: URLSearchParams): 'public' | 'private' => (search.has('preview') ? 'private' : 'public')\n route('GET', '/content/theme', 'content:read', () => ({ body: state.theme, cache: 'public' }))\n route('GET', '/content/pages/:handle', 'content:read', ({ params, search }) => {\n const page = requireNode(state.pages.find((p) => p.handle === params[0]), `Page ${params[0]}`)\n const body = search.has('preview') ? { ...page, title: `${page.title} (borrador)` } : page\n return { body, cache: previewCache(search) }\n })\n route('GET', '/content/menus/:handle', 'content:read', ({ params }) => ({\n body: requireNode(state.menus.find((m) => m.handle === params[0]), `Menu ${params[0]}`),\n cache: 'public',\n }))\n route('GET', '/content/articles', 'content:read', ({ search }) => {\n let items = state.articles.slice().sort((a, b) => b.published_at.localeCompare(a.published_at))\n const tag = search.get('tag')\n if (tag) items = items.filter((a) => a.tags.includes(tag))\n const q = search.get('q')?.toLowerCase()\n if (q) items = items.filter((a) => `${a.title} ${a.excerpt ?? ''}`.toLowerCase().includes(q))\n return { body: paginate(items, search, 10, 50), cache: 'public' }\n })\n route('GET', '/content/articles/:handle', 'content:read', ({ params, search }) => ({\n body: requireNode(state.articles.find((a) => a.handle === params[0]), `Article ${params[0]}`),\n cache: previewCache(search),\n }))\n\n // -------------------------------------------------------------------------\n // fetch\n // -------------------------------------------------------------------------\n\n function scopesFor(token: string | null): Set<string> | null {\n if (!token) return null\n let all: string[]\n if (token.startsWith('pk_')) all = ['catalog:read', 'content:read', 'cart:write']\n else if (token.startsWith('sk_')) all = ['catalog:read', 'content:read', 'cart:write', 'checkout:write', 'customer:read', 'customer:write', 'orders:read']\n else return null\n return new Set(all.filter((sc) => !missingScopes.includes(sc)))\n }\n\n function json(status: number, body: unknown, headers: Record<string, string> = {}): Response {\n return new Response(status === 204 || body === undefined ? null : JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json; charset=utf-8', ...headers },\n })\n }\n\n function errorResponse(err: HttpError): Response {\n return json(\n err.status,\n { error: { code: err.code, message: err.message, ...(err.field ? { field: err.field } : {}), ...(err.details !== undefined ? { details: err.details } : {}), ...(err.requiredScopes ? { required_scopes: err.requiredScopes } : {}) } },\n { 'Cache-Control': PRIVATE_CACHE },\n )\n }\n\n async function handle(request: Request): Promise<Response> {\n const url = new URL(request.url)\n if (/\\/_token\\/?$/.test(url.pathname)) {\n const tok = request.headers.get('authorization')?.match(/^Bearer\\s+(.+)$/i)?.[1] ?? null\n const granted = scopesFor(tok)\n if (!tok || !granted) return errorResponse(new HttpError(401, 'unauthorized', 'Missing or invalid storefront token'))\n return json(200, { success: true, data: { kind: tok.startsWith('pk_') ? 'publishable' : 'secret', environment: 'sandbox', scopes: [...granted], missing_scopes: missingScopes, connection_id: 'conn_mock', expires_at: null } }, { 'Cache-Control': PRIVATE_CACHE })\n }\n const idx = url.pathname.indexOf('/storefront/')\n if (idx < 0) return errorResponse(new HttpError(404, 'not_found', `No route for ${url.pathname}`))\n const path = url.pathname.slice(idx + '/storefront'.length).replace(/\\/+$/, '') || '/'\n const method = request.method.toUpperCase()\n\n const matching = routes.filter((r) => r.pattern.test(path))\n if (matching.length === 0) return errorResponse(new HttpError(404, 'not_found', `No route for ${method} ${path}`))\n const r = matching.find((x) => x.method === method)\n if (!r) return json(405, { error: { code: 'method_not_allowed', message: `${method} not allowed on ${path}` } }, { Allow: matching.map((x) => x.method).join(', ') })\n\n const auth = request.headers.get('authorization')\n const token = auth?.match(/^Bearer\\s+(.+)$/i)?.[1] ?? null\n const scopes = scopesFor(token)\n if (!scopes) return errorResponse(new HttpError(401, 'unauthorized', 'Missing or invalid storefront token'))\n if ((enforceScopes || missingScopes.length > 0) && !scopes.has(r.scope)) {\n return errorResponse(new HttpError(403, 'insufficient_scope', `Token lacks scope ${r.scope}`, undefined, undefined, [r.scope]))\n }\n\n let body: Record<string, unknown> = {}\n if (method !== 'GET') {\n const text = await request.text()\n if (text) {\n try {\n const parsed: unknown = JSON.parse(text)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) throw new Error('not an object')\n body = parsed as Record<string, unknown>\n } catch {\n return errorResponse(new HttpError(400, 'validation', 'Body must be a JSON object'))\n }\n }\n }\n\n const params = (r.pattern.exec(path) ?? []).slice(1).map((p) => decodeURIComponent(p))\n try {\n const result = await r.handler({ method, params, search: url.searchParams, headers: request.headers, body, scopes })\n const status = result.status ?? 200\n const headers: Record<string, string> = { ...result.headers }\n if (result.cache === 'public') headers['Cache-Control'] = PUBLIC_CACHE\n if (result.cache === 'private') headers['Cache-Control'] = PRIVATE_CACHE\n if (method === 'GET' && result.cache === 'public' && status === 200) {\n const etag = `W/\"${fnv1a(JSON.stringify(result.body))}\"`\n headers.ETag = etag\n if (request.headers.get('if-none-match') === etag) return new Response(null, { status: 304, headers })\n }\n return json(status, result.body, headers)\n } catch (err) {\n if (err instanceof HttpError) return errorResponse(err)\n return json(500, { error: { code: 'server_error', message: err instanceof Error ? err.message : 'Internal error' } })\n }\n }\n\n const mockFetch = async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n if (options.latencyMs) await new Promise((r) => setTimeout(r, options.latencyMs))\n const request = input instanceof Request && !init ? input : new Request(input instanceof Request ? input.url : String(input), init)\n if (request.signal?.aborted) throw request.signal.reason ?? new DOMException('Aborted', 'AbortError')\n return handle(request)\n }\n\n return {\n /** Drop-in `fetch` serving `/storefront/*` from memory. */\n fetch: mockFetch,\n /** Live in-memory state (mutable; useful in tests). */\n get state(): Readonly<MockState> {\n return state\n },\n /** Restores the seed data and clears carts, sessions and orders. */\n reset() {\n state = seed()\n syncAvailability(state.products)\n },\n /** OTP code accepted by `/customer/session`. */\n otpCode,\n }\n}\n\nexport type MockStorefront = ReturnType<typeof createMockStorefront>\n"]}
1
+ {"version":3,"sources":["../src/availability.ts","../src/payments.ts","../src/order-progress.ts","../src/geo.ts","../src/mock/account-seed.ts","../src/mock/region-mx.seed.ts","../src/mock/region.ts","../src/subjects.ts","../src/mock/seed.ts","../src/mock/subjects.ts","../src/mock/index.ts"],"names":["key","money","distanceKm","line","address","r"],"mappings":"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","file":"mock.cjs","sourcesContent":["/**\n * Availability presentation: the single source of the texts and states a\n * storefront shows for stock. Pure functions, no DOM: safe in loaders, SSR and\n * edge runtimes.\n *\n * The server decides the state (`Availability.status`, already filtered by the\n * shop's `show_stock`); this module only turns it into labels. Shops may\n * override texts by key (`messages`) but never the logic. Numbers shown here\n * (\"Quedan 3\") come from `availability.quantity`, which the server sends only\n * when the shop allows it and past its own threshold: there is no threshold in\n * this code.\n */\nimport type { Availability, AvailabilityStatus, CartLineProblem, InsufficientStockLine, Product, ProductVariant } from './types.js'\n\nexport type AvailabilityTone = 'success' | 'warning' | 'danger' | 'info'\n\nexport type AvailabilityLocale = 'es' | 'en'\n\n/** Text keys, overridable per shop. `{n}` and `{date}` are replaced. */\nexport type AvailabilityMessageKey =\n | 'status.in_stock'\n | 'status.low_stock'\n | 'status.low_stock_n'\n | 'status.out_of_stock'\n | 'status.backorder'\n | 'status.preorder'\n | 'sub.backorder_eta'\n | 'sub.preorder_date'\n | 'cta.add'\n | 'cta.out_of_stock'\n | 'cta.backorder'\n | 'cta.preorder'\n | 'sr.in_stock'\n | 'sr.low_stock'\n | 'sr.low_stock_n'\n | 'sr.out_of_stock'\n | 'sr.backorder'\n | 'sr.preorder'\n | 'option.sold_out'\n | 'option.backorder'\n | 'option.preorder'\n | 'max_per_order'\n | 'notify.title'\n | 'notify.email'\n | 'notify.phone'\n | 'notify.consent'\n | 'notify.submit'\n | 'notify.done'\n | 'notify.error'\n | 'problem.out_of_stock'\n | 'problem.insufficient_stock'\n | 'problem.insufficient_stock_n'\n | 'problem.adjust'\n | 'problem.remove'\n | 'conflict.title'\n | 'conflict.body'\n | 'conflict.dismiss'\n\nexport type AvailabilityMessages = Record<AvailabilityMessageKey, string>\n\nconst ES: AvailabilityMessages = {\n 'status.in_stock': 'Disponible',\n 'status.low_stock': 'Pocas piezas',\n 'status.low_stock_n': 'Quedan {n}',\n 'status.out_of_stock': 'Agotado',\n 'status.backorder': 'Bajo pedido',\n 'status.preorder': 'Preventa',\n 'sub.backorder_eta': 'Se envía a partir del {date}',\n 'sub.preorder_date': 'Sale a la venta el {date}',\n 'cta.add': 'Agregar al carrito',\n 'cta.out_of_stock': 'Agotado',\n 'cta.backorder': 'Pedir bajo pedido',\n 'cta.preorder': 'Apartar en preventa',\n 'sr.in_stock': 'Disponible',\n 'sr.low_stock': 'Quedan pocas piezas',\n 'sr.low_stock_n': 'Quedan solo {n} piezas',\n 'sr.out_of_stock': 'Producto agotado',\n 'sr.backorder': 'Disponible bajo pedido',\n 'sr.preorder': 'Disponible en preventa',\n 'option.sold_out': 'agotado',\n 'option.backorder': 'bajo pedido',\n 'option.preorder': 'preventa',\n max_per_order: 'Máximo {n} por pedido',\n 'notify.title': 'Avísame cuando vuelva',\n 'notify.email': 'Correo electrónico',\n 'notify.phone': 'WhatsApp o teléfono',\n 'notify.consent': 'Acepto recibir un aviso cuando vuelva a estar disponible',\n 'notify.submit': 'Avísame',\n 'notify.done': 'Listo. Te avisaremos cuando vuelva a estar disponible.',\n 'notify.error': 'No pudimos guardar tu aviso. Revisa tus datos e inténtalo de nuevo.',\n 'problem.out_of_stock': 'Ya no hay existencias',\n 'problem.insufficient_stock': 'No hay suficientes piezas para esta cantidad',\n 'problem.insufficient_stock_n': 'Solo puedes llevar {n}',\n 'problem.adjust': 'Ajustar a {n}',\n 'problem.remove': 'Quitar',\n 'conflict.title': 'Algunos productos cambiaron de existencias',\n 'conflict.body': 'Revisa las líneas marcadas. Tu carrito y tus datos se conservaron; ajusta o quita lo que ya no está disponible y continúa.',\n 'conflict.dismiss': 'Entendido',\n}\n\nconst EN: AvailabilityMessages = {\n 'status.in_stock': 'In stock',\n 'status.low_stock': 'Low stock',\n 'status.low_stock_n': 'Only {n} left',\n 'status.out_of_stock': 'Sold out',\n 'status.backorder': 'Made to order',\n 'status.preorder': 'Pre-order',\n 'sub.backorder_eta': 'Ships from {date}',\n 'sub.preorder_date': 'Available on {date}',\n 'cta.add': 'Add to cart',\n 'cta.out_of_stock': 'Sold out',\n 'cta.backorder': 'Order now, ships later',\n 'cta.preorder': 'Pre-order',\n 'sr.in_stock': 'In stock',\n 'sr.low_stock': 'Low stock',\n 'sr.low_stock_n': 'Only {n} left in stock',\n 'sr.out_of_stock': 'Sold out',\n 'sr.backorder': 'Available to order, ships later',\n 'sr.preorder': 'Available for pre-order',\n 'option.sold_out': 'sold out',\n 'option.backorder': 'made to order',\n 'option.preorder': 'pre-order',\n max_per_order: 'Maximum {n} per order',\n 'notify.title': 'Notify me when it is back',\n 'notify.email': 'Email',\n 'notify.phone': 'WhatsApp or phone',\n 'notify.consent': 'I agree to receive a notice when it is back in stock',\n 'notify.submit': 'Notify me',\n 'notify.done': 'Done. We will let you know when it is back in stock.',\n 'notify.error': 'We could not save your request. Check your details and try again.',\n 'problem.out_of_stock': 'No longer in stock',\n 'problem.insufficient_stock': 'Not enough stock for this quantity',\n 'problem.insufficient_stock_n': 'You can take up to {n}',\n 'problem.adjust': 'Adjust to {n}',\n 'problem.remove': 'Remove',\n 'conflict.title': 'Some items changed stock',\n 'conflict.body': 'Review the marked lines. Your cart and your details were kept; adjust or remove what is no longer available and continue.',\n 'conflict.dismiss': 'Got it',\n}\n\nconst CATALOG: Record<AvailabilityLocale, AvailabilityMessages> = { es: ES, en: EN }\n\n/** `es-MX` -> `es`, `en-US` -> `en`; anything else falls back to Spanish. */\nexport function availabilityLocale(locale: string | null | undefined): AvailabilityLocale {\n return (locale ?? '').toLowerCase().startsWith('en') ? 'en' : 'es'\n}\n\n/** Catalog for a locale with the shop's per-key overrides applied. */\nexport function availabilityMessages(locale: string | null | undefined, overrides?: Partial<AvailabilityMessages> | null): AvailabilityMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as AvailabilityMessageKey] = v\n return out\n}\n\n/** Replaces `{name}` placeholders. */\nexport function formatAvailabilityMessage(template: string, values: Record<string, string | number> = {}): string {\n return template.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in values ? String(values[k]) : m))\n}\n\nfunction formatDate(value: string | null | undefined, locale: string | null | undefined): string | null {\n if (!value) return null\n const d = /^\\d{4}-\\d{2}-\\d{2}$/.test(value) ? new Date(`${value}T00:00:00Z`) : new Date(value)\n if (Number.isNaN(d.getTime())) return null\n try {\n // UTC keeps server and client renders identical (no hydration mismatch).\n return new Intl.DateTimeFormat(locale || 'es', { dateStyle: 'long', timeZone: 'UTC' }).format(d)\n } catch {\n return value.slice(0, 10)\n }\n}\n\nexport type ResolveAvailabilityOptions = {\n /**\n * Polyfill only: shop-level \"low stock\" threshold to derive `low_stock` from\n * `quantity_available` on servers older than contract 1.1. Without it the\n * polyfill never reports `low_stock`. Ignored when the server sends `availability`.\n */\n lowStockThreshold?: number | null\n}\n\ntype AvailabilitySource = Pick<Product | ProductVariant, 'available_for_sale'> & {\n availability?: Availability | null\n quantity_available?: number | null\n}\n\n/**\n * The `Availability` of a variant or product. Uses the server's `availability`\n * when present; otherwise derives `in_stock | low_stock | out_of_stock` from\n * `available_for_sale` / `quantity_available` so storefronts can migrate before\n * the backend does. A malformed `availability` falls back to the polyfill.\n */\nexport function resolveAvailability(source: AvailabilitySource, options: ResolveAvailabilityOptions = {}): Availability {\n const a = source.availability\n if (a && typeof a === 'object' && typeof a.status === 'string') return a\n const qty = typeof source.quantity_available === 'number' ? source.quantity_available : null\n const sellable = source.available_for_sale && (qty === null || qty > 0)\n const threshold = options.lowStockThreshold\n const low = sellable && qty !== null && typeof threshold === 'number' && threshold > 0 && qty <= threshold\n const status: AvailabilityStatus = !sellable ? 'out_of_stock' : low ? 'low_stock' : 'in_stock'\n return {\n status,\n quantity: sellable ? qty : null,\n max_per_order: sellable ? qty : null,\n restock_eta: null,\n preorder_release_at: null,\n // Old servers have no subscription route: never offer a form that cannot work.\n notify_available: false,\n }\n}\n\nexport type AvailabilityView = {\n status: AvailabilityStatus\n tone: AvailabilityTone\n /** Short badge text: \"Agotado\", \"Quedan 3\", \"Bajo pedido\"... Never empty. */\n label: string\n /** ETA / release date text, or `null`. */\n sublabel: string | null\n /** Primary button text. */\n ctaLabel: string\n /** The primary button may be pressed (backorder/preorder are purchasable). */\n ctaEnabled: boolean\n /** Offer the \"Notify me when it is back\" form. */\n showNotify: boolean\n /** Full sentence for screen readers. */\n srText: string\n /** Units to cap the quantity picker at, or `null`. */\n maxPerOrder: number | null\n /** Show a badge on listing cards (everything but plain `in_stock`: do not clutter). */\n showOnCard: boolean\n}\n\nexport type AvailabilityViewOptions = {\n messages?: Partial<AvailabilityMessages> | null\n}\n\nconst TONES: Record<AvailabilityStatus, AvailabilityTone> = {\n in_stock: 'success',\n low_stock: 'warning',\n out_of_stock: 'danger',\n backorder: 'info',\n preorder: 'info',\n}\n\n/**\n * Texts and flags for one availability. `availability` accepts anything with an\n * unknown `status` (a future server): it is treated as `out_of_stock`.\n */\nexport function availabilityView(availability: Availability, locale: string | null | undefined, options: AvailabilityViewOptions = {}): AvailabilityView {\n const m = availabilityMessages(locale, options.messages)\n const known = (['in_stock', 'low_stock', 'out_of_stock', 'backorder', 'preorder'] as const).includes(availability.status)\n const status: AvailabilityStatus = known ? availability.status : 'out_of_stock'\n const qty = typeof availability.quantity === 'number' && availability.quantity > 0 ? availability.quantity : null\n const f = formatAvailabilityMessage\n\n let label: string\n let sr: string\n let cta: string\n let sublabel: string | null = null\n let enabled = true\n switch (status) {\n case 'in_stock':\n label = m['status.in_stock']\n sr = m['sr.in_stock']\n cta = m['cta.add']\n break\n case 'low_stock':\n // Without a visible quantity the server still says \"low\": no number is invented.\n label = qty !== null ? f(m['status.low_stock_n'], { n: qty }) : m['status.low_stock']\n sr = qty !== null ? f(m['sr.low_stock_n'], { n: qty }) : m['sr.low_stock']\n cta = m['cta.add']\n break\n case 'backorder': {\n label = m['status.backorder']\n sr = m['sr.backorder']\n cta = m['cta.backorder']\n const date = formatDate(availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.backorder_eta'], { date })\n break\n }\n case 'preorder': {\n label = m['status.preorder']\n sr = m['sr.preorder']\n cta = m['cta.preorder']\n const date = formatDate(availability.preorder_release_at ?? availability.restock_eta, locale)\n if (date) sublabel = f(m['sub.preorder_date'], { date })\n break\n }\n default:\n label = m['status.out_of_stock']\n sr = m['sr.out_of_stock']\n cta = m['cta.out_of_stock']\n enabled = false\n }\n return {\n status,\n tone: TONES[status],\n label,\n sublabel,\n ctaLabel: cta,\n ctaEnabled: enabled,\n showNotify: status === 'out_of_stock' && availability.notify_available === true,\n srText: sublabel ? `${sr}. ${sublabel}` : sr,\n maxPerOrder: typeof availability.max_per_order === 'number' && availability.max_per_order > 0 ? availability.max_per_order : null,\n showOnCard: status !== 'in_stock',\n }\n}\n\nexport type CartLineProblemView = {\n code: CartLineProblem['code']\n /** \"Ya no hay existencias\" / \"Solo puedes llevar 2\". */\n message: string\n /** Quantity to adjust the line to, or `null` (remove only). */\n adjustTo: number | null\n adjustLabel: string | null\n removeLabel: string\n}\n\n/** Texts and actions for a cart line problem. Offers \"Adjust to N\" only when `max_quantity` is a positive number different from the line quantity (a refused change leaves the cart at its old quantity). */\nexport function cartLineProblemView(\n problem: CartLineProblem | InsufficientStockLine,\n locale: string | null | undefined,\n options: AvailabilityViewOptions & { lineQuantity?: number } = {},\n): CartLineProblemView {\n const m = availabilityMessages(locale, options.messages)\n const code: CartLineProblem['code'] = 'code' in problem ? problem.code : problem.status === 'out_of_stock' ? 'out_of_stock' : 'insufficient_stock'\n const max = typeof problem.max_quantity === 'number' && problem.max_quantity >= 0 ? problem.max_quantity : null\n const canAdjust = max !== null && max > 0 && (options.lineQuantity === undefined || max !== options.lineQuantity)\n const message =\n code === 'out_of_stock' || max === 0\n ? m['problem.out_of_stock']\n : max !== null\n ? formatAvailabilityMessage(m['problem.insufficient_stock_n'], { n: max })\n : m['problem.insufficient_stock']\n return {\n code,\n message,\n adjustTo: canAdjust ? max : null,\n adjustLabel: canAdjust ? formatAvailabilityMessage(m['problem.adjust'], { n: max }) : null,\n removeLabel: m['problem.remove'],\n }\n}\n\nconst SCHEMA_AVAILABILITY: Record<AvailabilityStatus, string> = {\n in_stock: 'https://schema.org/InStock',\n low_stock: 'https://schema.org/LimitedAvailability',\n out_of_stock: 'https://schema.org/OutOfStock',\n backorder: 'https://schema.org/BackOrder',\n preorder: 'https://schema.org/PreOrder',\n}\n\n/** schema.org `ItemAvailability` URL for a status (unknown -> `OutOfStock`). */\nexport function schemaAvailability(status: AvailabilityStatus | string): string {\n return SCHEMA_AVAILABILITY[status as AvailabilityStatus] ?? SCHEMA_AVAILABILITY.out_of_stock\n}\n\n/** Best state among variants for a product summary (when the server sends none). */\nexport function productAvailability(product: Pick<Product, 'variants' | 'available_for_sale' | 'availability'>, options: ResolveAvailabilityOptions = {}): Availability {\n if (product.availability) return product.availability\n const all = product.variants.map((v) => resolveAvailability(v, options))\n const rank: AvailabilityStatus[] = ['in_stock', 'low_stock', 'backorder', 'preorder', 'out_of_stock']\n const best = all.slice().sort((a, b) => rank.indexOf(a.status) - rank.indexOf(b.status))[0]\n return best ?? resolveAvailability(product, options)\n}\n","/**\n * Embedded payment presentation: the single source of the texts and states a\n * storefront shows around an in-page payment. Pure functions, no DOM: safe in\n * loaders, SSR and edge runtimes.\n *\n * Rules this module encodes (DISENO-PAGO-INTEGRADO-BRICKS):\n * - The server decides the outcome and the amount. Nothing here computes or\n * compares money; `expected_total` is the server's own number echoed back.\n * - A rejection is explained with an actionable text built from the neutral\n * `decline_code`. A raw provider code is never shown.\n * - Vouchers and redirects only trust https URLs.\n */\nimport { availabilityLocale, formatAvailabilityMessage, type AvailabilityLocale } from './availability.js'\nimport { StorefrontError } from './errors.js'\nimport type { DeclineCode, Money, PaymentAction, PaymentAttemptResult, PaymentNextStep, PaymentVoucher } from './types.js'\n\nexport type PaymentLocale = AvailabilityLocale\n\nexport type PaymentMessageKey =\n | `decline.${DeclineCode}`\n | 'state.loading'\n | 'state.processing'\n | 'state.approved'\n | 'state.in_review'\n | 'state.voucher'\n | 'state.challenge'\n | 'state.expired'\n | 'state.cancelled'\n | 'state.redirect'\n | 'state.fallback'\n | 'error.network'\n | 'error.card_data'\n | 'error.price_mismatch'\n | 'error.payment_in_progress'\n | 'error.expired'\n | 'error.too_many_attempts'\n | 'error.generic'\n | 'action.retry'\n | 'action.try_again'\n | 'action.pay'\n | 'action.cancel'\n | 'voucher.title'\n | 'voucher.point'\n | 'voucher.reference'\n | 'voucher.amount'\n | 'voucher.expires'\n | 'voucher.clabe'\n | 'voucher.barcode'\n | 'voucher.open'\n | 'voucher.email'\n | 'form.label'\n | 'challenge.title'\n | 'challenge.escape'\n | 'challenge.escape_hint'\n | 'challenge.left'\n\nexport type PaymentMessages = Record<PaymentMessageKey, string>\n\nconst ES: PaymentMessages = {\n 'decline.insufficient_funds': 'Tu tarjeta no tiene saldo suficiente. Prueba con otra tarjeta o paga en efectivo.',\n 'decline.invalid_cvc': 'El código de seguridad no es correcto. Revísalo e intenta de nuevo.',\n 'decline.invalid_expiry': 'La fecha de vencimiento no es correcta.',\n 'decline.invalid_card_data': 'Revisa los datos de tu tarjeta.',\n 'decline.call_issuer': 'Tu banco necesita que autorices este pago. Llama al número al reverso de tu tarjeta y vuelve a intentarlo.',\n 'decline.card_disabled': 'Tu tarjeta no está activa. Actívala con tu banco o usa otra.',\n 'decline.duplicate': 'Ya hiciste un pago igual hace un momento. Revisa tu correo antes de volver a pagar.',\n 'decline.max_attempts': 'Llegaste al límite de intentos con esta tarjeta. Usa otra o paga en efectivo.',\n 'decline.authentication_failed': 'Tu banco no pudo verificar el pago. Intenta de nuevo o usa otra tarjeta.',\n 'decline.declined': 'Tu banco rechazó el pago. Usa otra tarjeta o paga en efectivo.',\n 'state.loading': 'Cargando pago seguro…',\n 'state.processing': 'Procesando pago…',\n 'state.approved': '¡Pago aprobado!',\n 'state.in_review': 'Tu pago está en revisión. Te avisamos por correo en máximo 2 días hábiles. No vuelvas a pagar.',\n 'state.voucher': 'Tu ficha de pago está lista. El pedido se confirma cuando pagues.',\n 'state.challenge': 'Tu banco necesita verificar el pago. Termina la verificación para continuar.',\n 'state.expired': 'La ficha venció. Vuelve a armar tu carrito para pagar.',\n 'state.cancelled': 'El pago se canceló. Puedes intentarlo de nuevo.',\n 'state.redirect': 'Te llevamos a la página de pago…',\n 'state.fallback': 'No pudimos cargar el formulario seguro de tarjeta. Puedes pagar con tarjeta en el sitio del proveedor y regresar aquí.',\n 'error.network': 'No pudimos conectar. Revisa tu conexión e intenta de nuevo; no se te cobrará dos veces.',\n 'error.card_data': 'Revisa los datos de tu tarjeta.',\n 'error.price_mismatch': 'El total cambió. Revisa el nuevo total y vuelve a pagar.',\n 'error.payment_in_progress': 'Ya hay un pago en proceso para este pedido. No vuelvas a pagar; revisa tu correo.',\n 'error.expired': 'Tu apartado venció. Vuelve a armar tu carrito.',\n 'error.too_many_attempts': 'Por seguridad no podemos intentar con más tarjetas. Paga en efectivo o escríbenos.',\n 'error.generic': 'No pudimos procesar tu pago. Intenta de nuevo.',\n 'action.retry': 'Reintentar',\n 'action.try_again': 'Intentar de nuevo',\n 'action.pay': 'Pagar',\n 'action.cancel': 'Cancelar',\n 'voucher.title': 'Ficha de pago',\n 'voucher.point': 'Punto de pago',\n 'voucher.reference': 'Referencia',\n 'voucher.amount': 'Monto exacto',\n 'voucher.expires': 'Vence el {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Código de barras',\n 'voucher.open': 'Ver o imprimir ficha',\n 'voucher.email': 'También te la enviamos a tu correo.',\n 'form.label': 'Datos de tu tarjeta',\n 'challenge.title': 'Verificación de tu banco',\n 'challenge.escape': 'Cancelar y volver al pago',\n 'challenge.escape_hint': '¿Tarda demasiado? Puedes cerrar la verificación. Si ya la aprobaste en tu banco, el pago aún puede completarse: te confirmamos aquí antes de dejarte pagar de nuevo.',\n 'challenge.left': 'Cerraste la verificación. Estamos confirmando con tu banco si el pago se completó; no vuelvas a pagar todavía.',\n}\n\nconst EN: PaymentMessages = {\n 'decline.insufficient_funds': 'Your card has insufficient funds. Try another card or pay in cash.',\n 'decline.invalid_cvc': 'The security code is not correct. Check it and try again.',\n 'decline.invalid_expiry': 'The expiry date is not correct.',\n 'decline.invalid_card_data': 'Check your card details.',\n 'decline.call_issuer': 'Your bank needs you to authorize this payment. Call the number on the back of your card and try again.',\n 'decline.card_disabled': 'Your card is not active. Activate it with your bank or use another one.',\n 'decline.duplicate': 'You already made the same payment a moment ago. Check your email before paying again.',\n 'decline.max_attempts': 'You reached the attempt limit for this card. Use another card or pay in cash.',\n 'decline.authentication_failed': 'Your bank could not verify the payment. Try again or use another card.',\n 'decline.declined': 'Your bank declined the payment. Use another card or pay in cash.',\n 'state.loading': 'Loading secure payment…',\n 'state.processing': 'Processing payment…',\n 'state.approved': 'Payment approved!',\n 'state.in_review': 'Your payment is under review. We will email you within 2 business days. Do not pay again.',\n 'state.voucher': 'Your payment voucher is ready. The order is confirmed once you pay.',\n 'state.challenge': 'Your bank needs to verify the payment. Finish the verification to continue.',\n 'state.expired': 'The voucher expired. Rebuild your cart to pay.',\n 'state.cancelled': 'The payment was cancelled. You can try again.',\n 'state.redirect': 'Taking you to the payment page…',\n 'state.fallback': 'We could not load the secure card form. You can pay by card on the provider site and come back here.',\n 'error.network': 'We could not connect. Check your connection and try again; you will not be charged twice.',\n 'error.card_data': 'Check your card details.',\n 'error.price_mismatch': 'The total changed. Review the new total and pay again.',\n 'error.payment_in_progress': 'A payment is already in progress for this order. Do not pay again; check your email.',\n 'error.expired': 'Your reservation expired. Rebuild your cart.',\n 'error.too_many_attempts': 'For security we cannot try more cards. Pay in cash or contact us.',\n 'error.generic': 'We could not process your payment. Please try again.',\n 'action.retry': 'Retry',\n 'action.try_again': 'Try again',\n 'action.pay': 'Pay',\n 'action.cancel': 'Cancel',\n 'voucher.title': 'Payment voucher',\n 'voucher.point': 'Payment point',\n 'voucher.reference': 'Reference',\n 'voucher.amount': 'Exact amount',\n 'voucher.expires': 'Expires on {date}',\n 'voucher.clabe': 'CLABE',\n 'voucher.barcode': 'Barcode',\n 'voucher.open': 'View or print voucher',\n 'voucher.email': 'We also emailed it to you.',\n 'form.label': 'Your card details',\n 'challenge.title': 'Your bank verification',\n 'challenge.escape': 'Cancel and go back to payment',\n 'challenge.escape_hint': 'Taking too long? You can close the verification. If you already approved it with your bank the payment may still go through: we confirm here before letting you pay again.',\n 'challenge.left': 'You closed the verification. We are checking with your bank whether the payment went through; do not pay again yet.',\n}\n\nconst CATALOG: Record<PaymentLocale, PaymentMessages> = { es: ES, en: EN }\n\n/** Catalog for a locale (`es-MX` -> es, `en-US` -> en) with the shop's per-key overrides applied. */\nexport function paymentMessages(locale: string | null | undefined, overrides?: Partial<PaymentMessages> | null): PaymentMessages {\n const base = CATALOG[availabilityLocale(locale)]\n if (!overrides) return base\n const out = { ...base }\n for (const [k, v] of Object.entries(overrides)) if (typeof v === 'string' && k in base) out[k as PaymentMessageKey] = v\n return out\n}\n\nconst DECLINE_CODES: ReadonlySet<string> = new Set<DeclineCode>([\n 'insufficient_funds',\n 'invalid_cvc',\n 'invalid_expiry',\n 'invalid_card_data',\n 'call_issuer',\n 'card_disabled',\n 'duplicate',\n 'max_attempts',\n 'authentication_failed',\n 'declined',\n])\n\n/** i18n key of a decline code; unknown or missing codes map to `declined` (never a raw provider code). */\nexport function declineMessageKey(code: string | null | undefined): `decline.${DeclineCode}` {\n return `decline.${code && DECLINE_CODES.has(code) ? (code as DeclineCode) : 'declined'}`\n}\n\n/** Actionable text for a decline code. */\nexport function declineMessage(code: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string {\n return paymentMessages(locale, overrides)[declineMessageKey(code)]\n}\n\n/** The value only if it is an absolute `https:` URL without credentials; `null` otherwise. */\nexport function safeHttpsUrl(value: unknown): string | null {\n if (typeof value !== 'string' || value.length > 2048) return null\n try {\n const u = new URL(value)\n if (u.protocol !== 'https:' || u.username || u.password) return null\n return u.toString()\n } catch {\n return null\n }\n}\n\n/** What the UI should do with an attempt result. */\nexport type PaymentOutcomeKind =\n | 'approved' // paid: go to the thanks page\n | 'in_review' // pending without action: do not charge again\n | 'voucher' // cash/SPEI voucher with reference and expiry\n | 'challenge' // 3DS inside the page\n | 'redirect' // leave to the provider\n | 'rejected' // failed: show the reason and let the buyer retry\n | 'expired'\n | 'cancelled'\n\n/** A voucher ready to render: https-only link and the amount as `Money` (or `null` when the server sent none). */\nexport type PaymentOutcomeVoucher = Omit<PaymentVoucher, 'amount' | 'voucher_url' | 'currency'> & {\n voucher_url: string | null\n amount: Money | null\n}\n\nconst NEXT_STEP: Record<DeclineCode, PaymentNextStep> = {\n insufficient_funds: 'use_other_card',\n invalid_cvc: 'fix_card_data',\n invalid_expiry: 'fix_card_data',\n invalid_card_data: 'fix_card_data',\n call_issuer: 'contact_issuer',\n card_disabled: 'use_other_card',\n duplicate: 'check_email',\n max_attempts: 'use_other_card',\n authentication_failed: 'retry',\n declined: 'use_other_card',\n}\n\nfunction voucherMoney(v: PaymentVoucher): Money | null {\n const a = v.amount\n if (a && typeof a === 'object' && typeof a.amount === 'string') return a\n const text = typeof a === 'number' ? String(a) : typeof a === 'string' ? a : ''\n if (!text || !/^\\d+(\\.\\d+)?$/.test(text) || !v.currency) return null\n return { amount: text.includes('.') ? text : `${text}.00`, currency_code: v.currency }\n}\n\nexport type PaymentOutcome = {\n kind: PaymentOutcomeKind\n /** Text for the buyer (no codes). */\n message: string\n decline_code: DeclineCode | null\n /** `true` when the buyer can try again with the checkout still open. */\n retryable: boolean\n /** https-only. */\n redirect_url: string | null\n challenge: { url: string | null; creq: string | null } | null\n voucher: PaymentOutcomeVoucher | null\n attempts_left: number | null\n /** What to do next (server value, or derived from the decline code): fix the card, use another, rebuild the cart... */\n next_step: PaymentNextStep | null\n}\n\n/**\n * Classifies an attempt result. Unknown statuses are treated as `in_review`\n * (never as approved, never as a reason to charge again).\n */\nexport function paymentOutcome(result: PaymentAttemptResult, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentOutcome {\n const m = paymentMessages(locale, overrides)\n const p = result.payment\n const action: PaymentAction | null = p.action ?? null\n const base = {\n decline_code: null as DeclineCode | null,\n retryable: false,\n redirect_url: null as string | null,\n challenge: null as PaymentOutcome['challenge'],\n voucher: null as PaymentOutcome['voucher'],\n attempts_left: typeof result.attempts_left === 'number' ? result.attempts_left : null,\n next_step: (p.next_step ?? null) as PaymentNextStep | null,\n }\n const out = (kind: PaymentOutcomeKind, message: string, extra: Partial<PaymentOutcome> = {}): PaymentOutcome => ({ ...base, kind, message, ...extra })\n\n if (p.status === 'paid') return out('approved', m['state.approved'])\n if (p.status === 'failed') {\n const code = p.decline_code ?? 'declined'\n const known: DeclineCode = DECLINE_CODES.has(code) ? code : 'declined'\n return out('rejected', m[declineMessageKey(code)], {\n decline_code: known,\n next_step: p.next_step ?? NEXT_STEP[known],\n retryable: p.retryable !== false && base.attempts_left !== 0,\n })\n }\n if (p.status === 'expired') return out('expired', m['state.expired'], { next_step: 'rebuild_cart' })\n if (p.status === 'cancelled') return out('cancelled', m['state.cancelled'], { retryable: true, next_step: 'rebuild_cart' })\n\n if (action?.type === 'redirect') {\n const url = safeHttpsUrl(action.redirect_url)\n if (url) return out('redirect', m['state.redirect'], { redirect_url: url })\n }\n if (p.status === 'requires_action' || p.status === 'pending') {\n if (action?.type === 'voucher' && action.voucher) {\n const { amount: _a, currency: _c, voucher_url, ...rest } = action.voucher\n return out('voucher', m['state.voucher'], {\n next_step: 'pay_cash',\n voucher: { ...rest, voucher_url: safeHttpsUrl(voucher_url), amount: voucherMoney(action.voucher) },\n })\n }\n if (action?.type === 'challenge' && action.challenge) {\n return out('challenge', m['state.challenge'], {\n challenge: { url: safeHttpsUrl(action.challenge.url), creq: typeof action.challenge.creq === 'string' ? action.challenge.creq : null },\n })\n }\n }\n return out('in_review', m['state.in_review'])\n}\n\n/** Failures of `POST /payment` the form maps to a specific text and next step. */\nexport type PaymentErrorKind =\n | 'network' // no answer: retry with the SAME attempt (idempotent)\n | 'price_mismatch' // total changed: show it, remount, pay again with a NEW attempt\n | 'payment_in_progress' // 409 payment_in_progress: another attempt is paid/pending: do not retry\n | 'expired' // 409: reservation expired\n | 'too_many_attempts' // 429\n | 'generic'\n\nexport type PaymentErrorView = { kind: PaymentErrorKind; message: string; retrySameAttempt: boolean; canRetry: boolean }\n\n/**\n * Maps a transport error (a `StorefrontError` or anything with `status`/`code`)\n * to a view. Network failures and 502/503/504 are safe to retry with the same\n * idempotency key; 409/422/429 are answers, not outages.\n */\nexport function paymentErrorView(err: unknown, locale?: string | null, overrides?: Partial<PaymentMessages> | null): PaymentErrorView {\n const m = paymentMessages(locale, overrides)\n const e = (err ?? {}) as Partial<StorefrontError> & { status?: number; code?: string }\n const status = typeof e.status === 'number' ? e.status : 0\n const code = typeof e.code === 'string' ? e.code : ''\n if (code === 'price_mismatch') {\n return { kind: 'price_mismatch', message: m['error.price_mismatch'], retrySameAttempt: false, canRetry: true }\n }\n if (status === 409 && code === 'expired') return { kind: 'expired', message: m['error.expired'], retrySameAttempt: false, canRetry: false }\n if (status === 409 && code === 'payment_in_progress') {\n return { kind: 'payment_in_progress', message: m['error.payment_in_progress'], retrySameAttempt: false, canRetry: false }\n }\n // 409 conflict: that Idempotency-Key was already used with a DIFFERENT payment (e.g. a new card after a reload).\n // Not an outage and not \"in progress\": start a new attempt.\n if (status === 409) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 429 || code === 'too_many_attempts') {\n return { kind: 'too_many_attempts', message: m['error.too_many_attempts'], retrySameAttempt: false, canRetry: false }\n }\n // What OPS declared wins over the status: `retryable:false` is an answer (generic), any other 5xx (also a 500 with no readable body) is an outage whose charge may have happened: same key.\n const declared = (e as { retryable?: unknown }).retryable\n if (status >= 500 && declared === false) return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n if (status === 0 || status === 502 || status === 503 || status === 504 || code === 'network' || code === 'timeout' || status >= 500) {\n return { kind: 'network', message: m['error.network'], retrySameAttempt: true, canRetry: true }\n }\n return { kind: 'generic', message: m['error.generic'], retrySameAttempt: false, canRetry: true }\n}\n\n/** `Vence el 5 de noviembre de 2026, 18:00` style text for a voucher deadline; `null` when absent or invalid. */\nexport function formatVoucherExpiry(expiresAt: string | null | undefined, locale?: string | null, overrides?: Partial<PaymentMessages> | null): string | null {\n if (!expiresAt) return null\n const d = new Date(expiresAt)\n if (Number.isNaN(d.getTime())) return null\n let date: string\n try {\n date = new Intl.DateTimeFormat(locale ?? undefined, { dateStyle: 'long', timeStyle: 'short' }).format(d)\n } catch {\n date = d.toISOString()\n }\n return formatAvailabilityMessage(paymentMessages(locale, overrides)['voucher.expires'], { date })\n}\n\n/** Builds an idempotency key for a payment attempt: the same attempt always yields the same key. */\nexport function paymentIdempotencyKey(checkoutId: string, attempt: string): string {\n return `pay-${checkoutId}-${attempt}`\n}\n","/**\n * Pure helpers over an `Order` (contract 1.8): the unified progress, the one next action, shipment ordering and the\n * \"test\" rules. They READ what the server sent and only derive what an older server (no `progress` / `next_action`)\n * did not. Every enum is open: an unknown stage, step state or shipment status never throws, it is kept as is and the\n * UI shows its safe fallback.\n */\nimport { safeHttpsUrl } from './payments.js'\nimport type {\n InvoiceDoc,\n NextAction,\n Order,\n OrderProblem,\n OrderProgress,\n OrderProgressStep,\n OrderStage,\n OrderStepKey,\n Shipment,\n ShipmentEvent,\n ShipmentStatus,\n} from './types.js'\n\n/** Steps of an order that ships, in order. */\nexport const SHIPPING_STEPS = ['paid', 'preparing', 'shipped', 'in_transit', 'delivered'] as const\n/** Steps of an order the buyer picks up. */\nexport const PICKUP_STEPS = ['paid', 'preparing', 'ready_for_pickup', 'delivered'] as const\n\n/** Shipment statuses that mean the package is not where it should be. */\nconst SHIPMENT_PROBLEMS: Record<string, string> = { exception: 'delivery_exception', returned: 'returned', lost: 'lost' }\n\nconst RANK: Record<string, number> = { pending: 0, label_created: 1, in_transit: 2, out_for_delivery: 3, delivered: 4 }\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/** A shipment the buyer can be told about as real: not a sandbox one. */\nexport function isTestShipment(s: Pick<Shipment, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!s && (s.test_mode === true || s.environment === 'sandbox')\n}\n\n/** An invoice or credit note from a sandbox PAC. */\nexport function isTestInvoice(d: Pick<InvoiceDoc, 'test_mode' | 'environment'> | null | undefined): boolean {\n return !!d && (d.test_mode === true || d.environment === 'sandbox')\n}\n\n/** `https` URL with no credentials, or `null`. The only kind of link a tracking or voucher button may carry. */\nexport function safeTrackingUrl(value: unknown): string | null {\n return safeHttpsUrl(value)\n}\n\nfunction time(iso: string | null | undefined): number {\n const t = iso ? Date.parse(iso) : NaN\n return Number.isNaN(t) ? -Infinity : t\n}\n\n/** Newest first, invalid dates last, ties keep the server's order; at most `limit` (default 50, the contract's cap). */\nexport function sortTrackingEvents(events: readonly ShipmentEvent[] | null | undefined, limit = 50): ShipmentEvent[] {\n if (!Array.isArray(events)) return []\n return events\n .filter(isRecord as (e: unknown) => e is ShipmentEvent)\n .map((e, i) => ({ e, i }))\n .sort((a, b) => time(b.e.occurred_at) - time(a.e.occurred_at) || a.i - b.i)\n .slice(0, Math.max(0, limit))\n .map((x) => x.e)\n}\n\n/** The shipments of the order that count: outbound/pickup/local first, returns after; stable otherwise. */\nexport function orderShipments(order: Pick<Order, 'shipments'> | null | undefined): Shipment[] {\n const list = Array.isArray(order?.shipments) ? order!.shipments!.filter(isRecord as (s: unknown) => s is Shipment) : []\n return [...list.filter((s) => s.kind !== 'return'), ...list.filter((s) => s.kind === 'return')]\n}\n\nfunction validProgress(p: unknown): p is OrderProgress {\n return isRecord(p) && typeof p.stage === 'string' && Array.isArray(p.steps)\n}\n\nconst validStep = (s: unknown): s is OrderProgressStep => isRecord(s) && typeof s.key === 'string' && typeof s.state === 'string'\n\n/** The server's progress with anything malformed dropped: a bad step or problem never reaches the UI. */\nfunction cleanProgress(p: OrderProgress): OrderProgress {\n if (p.steps.every(validStep) && (p.problem === undefined || p.problem === null || (isRecord(p.problem) && typeof p.problem.code === 'string'))) return p\n const problem = isRecord(p.problem) && typeof p.problem.code === 'string' ? p.problem : null\n return { stage: p.stage, problem, steps: p.steps.filter(validStep) }\n}\n\n/** Shipments that tell the buyer something real about delivery: not returns, not sandbox. */\nconst liveShipments = (shipments: Shipment[]) => shipments.filter((s) => s.kind !== 'return' && !isTestShipment(s))\n\n/** The stage of an order from its legacy `status` / `payment_status` and its shipments (servers before contract 1.8). */\nfunction legacyStage(order: Order, shipments: Shipment[]): OrderStage {\n const status = typeof order.status === 'string' ? order.status.toLowerCase() : ''\n const pickup = order.delivery_method === 'pickup'\n if (status === 'cancelled' || status === 'canceled') return 'cancelled'\n if (status === 'refunded') return 'refunded'\n if (status === 'pending_payment' || order.payment_status === 'pending') return 'pending_payment'\n if (status === 'delivered' || status === 'fulfilled') return 'delivered'\n // The order is as far as its LEAST advanced live shipment (a partial delivery is not a delivered order); cancelled\n // legs and legs with a problem (flagged apart) do not hold it back. Same rule as the server.\n const live = liveShipments(shipments)\n const ranked = live.filter((s) => RANK[s.status] !== undefined)\n const least = ranked.reduce<string | null>((acc, s) => (acc === null || RANK[s.status]! < RANK[acc]! ? s.status : acc), null)\n if (least === 'delivered') return 'delivered'\n if (least === 'out_for_delivery') return 'out_for_delivery'\n if (least === 'in_transit') return 'in_transit'\n if (status === 'ready_for_pickup' || (status === 'ready' && pickup)) return 'ready_for_pickup'\n // A `shipped` status whose every shipment is a sandbox one: the package is not really on its way.\n const onlySandbox = shipments.some((s) => s.kind !== 'return') && live.length === 0\n if ((status === 'shipped' && !onlySandbox) || least === 'label_created') return 'shipped'\n if (status === 'fulfilling' || status === 'accepted' || status === 'ready' || status === 'shipped') return 'preparing'\n return 'paid'\n}\n\nconst STAGE_TO_STEP: Record<string, OrderStepKey> = {\n paid: 'paid',\n preparing: 'preparing',\n ready_for_pickup: 'ready_for_pickup',\n shipped: 'shipped',\n in_transit: 'in_transit',\n out_for_delivery: 'in_transit',\n delivered: 'delivered',\n}\n\n/** When the payment was confirmed (not when the order was placed: a cash voucher is paid days later), or `null`. */\nfunction paidAt(order: Order): string | null {\n const paid = Array.isArray(order.payments) ? order.payments.find((p) => isRecord(p) && typeof p.paid_at === 'string' && p.paid_at) : undefined\n return paid?.paid_at ?? null\n}\n\n/**\n * The unified progress. The server's `order.progress` wins when it is well formed; otherwise it is derived, so a store\n * on an older OPS still gets a timeline. Pending payment, cancelled and refunded orders have no steps to walk: `steps`\n * lists them as `pending` (or `[]` when cancelled/refunded) and the stage says why.\n */\nexport function orderProgress(order: Order): OrderProgress {\n if (validProgress(order.progress)) return cleanProgress(order.progress)\n const shipments = orderShipments(order)\n const stage = legacyStage(order, shipments)\n const keys: readonly string[] = order.delivery_method === 'pickup' ? PICKUP_STEPS : SHIPPING_STEPS\n const dead = stage === 'cancelled' || stage === 'refunded'\n const awaiting = stage === 'pending_payment'\n const current = STAGE_TO_STEP[stage] ?? 'paid'\n const at = keys.indexOf(current)\n const failed = liveShipments(shipments).find((s) => SHIPMENT_PROBLEMS[s.status])\n const problem: OrderProblem | null = failed\n ? { code: SHIPMENT_PROBLEMS[failed.status]!, at: sortTrackingEvents(failed.events)[0]?.occurred_at ?? null }\n : order.payment_status === 'failed'\n ? { code: 'payment_failed' }\n : null\n const steps: OrderProgressStep[] = dead\n ? []\n : keys.map((key, i) => {\n if (awaiting) return { key, state: 'pending', at: null }\n const state = i < at || stage === 'delivered' ? 'done' : i === at ? (problem && i >= keys.indexOf('shipped') ? 'problem' : 'current') : 'pending'\n return { key, state, at: key === 'paid' && state === 'done' ? paidAt(order) : null }\n })\n return { stage, problem, steps }\n}\n\n/**\n * The action to put first. The server's `next_action` wins (its `href` is re-checked: only `https`); an older server\n * gets one derived from the order and its invoice. Never `null`: `{ kind: 'none' }` means \"nothing to offer\".\n */\nexport function nextAction(order: Order): NextAction {\n // A 1.8 server that sends `next_action: null` means \"nothing to offer\"; only an older server (no key) is derived.\n if (order.next_action === null) return { kind: 'none', href: null, ref: null }\n if (isRecord(order.next_action) && typeof order.next_action.kind === 'string') {\n const href = safeTrackingUrl(order.next_action.href)\n return { kind: order.next_action.kind, href, ref: typeof order.next_action.ref === 'string' ? order.next_action.ref : null }\n }\n const progress = orderProgress(order)\n if (progress.stage === 'pending_payment') return { kind: 'pay', href: null, ref: null }\n if (progress.stage === 'cancelled' || progress.stage === 'refunded') return { kind: 'none', href: null, ref: null }\n const live = orderShipments(order).find((s) => s.kind !== 'return' && !isTestShipment(s) && s.status !== 'delivered' && s.status !== 'cancelled')\n const trackUrl = safeTrackingUrl(live?.tracking_url)\n if (live && trackUrl) return { kind: 'track', href: trackUrl, ref: live.id }\n if (progress.stage === 'ready_for_pickup') return { kind: 'pickup', href: null, ref: null }\n const inv = isRecord(order.invoice) ? order.invoice : undefined\n // The server's `action` wins over the stage: an issued invoice it does not offer (no file yet) is not a button.\n if (inv?.action === 'download' || (inv?.action === undefined && inv?.stage === 'issued')) {\n const docs = Array.isArray(order.invoices) ? order.invoices.filter((d) => isRecord(d) && d.kind === 'invoice' && d.status !== 'cancelled') : []\n const real = docs.find((d) => !isTestInvoice(d))\n // Detail with only sandbox invoices: never offer one as the buyer's invoice.\n if (docs.length === 0 || real) return { kind: 'download_invoice', href: null, ref: real?.id ?? null }\n }\n if (inv?.action === 'correct_data') return { kind: 'correct_invoice_data', href: null, ref: null }\n if (inv?.action === 'contact_store') return { kind: 'contact_store', href: null, ref: null }\n if (inv?.can_request === true && inv.stage !== 'requested') return { kind: 'request_invoice', href: null, ref: null }\n return { kind: 'none', href: null, ref: null }\n}\n\n/** Latest known status among the live (non-sandbox, non-return) shipments, or `null`. */\nexport function shipmentsStatus(order: Order): ShipmentStatus | null {\n if (order.shipments_summary && typeof order.shipments_summary.status === 'string') return order.shipments_summary.status\n const live = orderShipments(order).filter((s) => s.kind !== 'return' && !isTestShipment(s))\n return live.length ? live[0]!.status : null\n}\n","/**\n * Geo helpers: pure TypeScript, no network and no DOM. Works in Node 20, edge\n * runtimes and browsers. Behaviour is pinned by `geo-vectors.json`, which the\n * Go side copies verbatim, so keep both implementations in sync.\n */\n\nexport type GeoPoint = { lat: number; lng: number }\n\n/** `(0, 0)` means \"unset\" on this platform, so it is never a valid point. */\ntype MaybePoint = { lat?: number | null; lng?: number | null } | null | undefined\n\nexport type OpeningHours = {\n /** `day`: 1 = Monday ... 7 = Sunday. Several entries per day are allowed. A `close` at or before `open` crosses midnight. */\n weekly: { day: number; open: string; close: string }[]\n /** Dated overrides of the weekly rule. `closed`, or both `open` and `close`. */\n exceptions?: { date: string; closed?: true; open?: string; close?: string; note?: string }[]\n}\n\nexport type OpenStatus = {\n open: boolean\n /** ISO instant (UTC) when the current interval ends; `null` when closed. */\n closesAt: string | null\n /** ISO instant (UTC) of the next opening; `null` when open or none within 8 days. */\n nextOpenAt: string | null\n}\n\nconst RAD = Math.PI / 180\n\n/** Great-circle distance in km (haversine, earth radius 6371.0088 km). */\nexport function distanceKm(a: GeoPoint, b: GeoPoint): number {\n const dLat = (b.lat - a.lat) * RAD\n const dLng = (b.lng - a.lng) * RAD\n const h = Math.sin(dLat / 2) ** 2 + Math.cos(a.lat * RAD) * Math.cos(b.lat * RAD) * Math.sin(dLng / 2) ** 2\n return 2 * 6371.0088 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h))\n}\n\n/** Finite, in range and not the `(0, 0)` \"unset\" pair. */\nexport function isValidPoint(p: MaybePoint): p is GeoPoint {\n const { lat, lng } = p ?? {}\n // Number.isFinite is false for null, undefined and non-numbers.\n return Number.isFinite(lat) && Number.isFinite(lng) && Math.abs(lat!) <= 90 && Math.abs(lng!) <= 180 && !(lat === 0 && lng === 0)\n}\n\n/** `'19.43,-99.13'` (spaces allowed) to a point; `null` when malformed or invalid. */\nexport function parseLatLng(s: string | null | undefined): GeoPoint | null {\n const [a, b, ...rest] = (s ?? '').split(',')\n const p = !rest.length && a?.trim() && b?.trim() ? { lat: Number(a), lng: Number(b) } : null\n return isValidPoint(p) ? p : null\n}\n\nexport type RankOptions<T> = {\n /** Keep items at most this far away (inclusive). */\n radiusKm?: number\n /** Keep the first N after sorting. */\n limit?: number\n /** Defaults to reading `lat` / `lng` from the item. */\n getPoint?: (item: T) => MaybePoint\n}\n\n/**\n * Sorts by distance from `origin` (stable: ties keep input order). Items without\n * a valid point are EXCLUDED, not placed last, because they have no distance.\n */\nexport function rankByDistance<T>(\n items: readonly T[],\n origin: GeoPoint,\n { radiusKm, limit, getPoint = (i) => i as MaybePoint }: RankOptions<T> = {},\n): { item: T; distanceKm: number }[] {\n const out: { item: T; distanceKm: number }[] = []\n for (const item of items) {\n const p = getPoint(item)\n if (!isValidPoint(p)) continue\n const d = distanceKm(origin, p)\n if (radiusKm === undefined || d <= radiusKm) out.push({ item, distanceKm: d })\n }\n // Array.prototype.sort is stable (ES2019), so ties keep input order.\n out.sort((x, y) => x.distanceKm - y.distanceKm)\n return limit === undefined ? out : out.slice(0, Math.max(0, limit))\n}\n\n/** Under 1 km: meters rounded to 50 m. Otherwise km with one decimal. */\nexport function formatDistance(km: number, locale = 'es-MX'): string {\n const m = Math.round((km * 1000) / 50) * 50\n const [value, unit, digits] = m < 1000 ? [m, 'meter', 0] : [km, 'kilometer', 1]\n return new Intl.NumberFormat(locale, {\n style: 'unit', unit, minimumFractionDigits: digits, maximumFractionDigits: digits,\n }).format(value)\n}\n\n/** Destination for directions: coordinates when valid, else the address text. */\nexport function directionsUrl(\n location: { lat?: number | null; lng?: number | null; address?: string | null; city?: string | null },\n { provider = 'google' }: { provider?: 'google' | 'apple' | 'geo' } = {},\n): string | null {\n const ll = isValidPoint(location) ? `${location.lat},${location.lng}` : null\n const text = [location.address, location.city].filter(Boolean).join(', ')\n const dest = ll ?? text\n if (!dest) return null\n const q = encodeURIComponent(dest)\n if (provider === 'apple') return `https://maps.apple.com/?daddr=${q}`\n if (provider === 'geo') return ll ? `geo:${ll}?q=${ll}` : `geo:0,0?q=${q}`\n return `https://www.google.com/maps/dir/?api=1&destination=${q}`\n}\n\n// --- opening hours -------------------------------------------------------\n\nconst toMin = (t: string | undefined): number => {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(t ?? '')\n return m ? Number(m[1]) * 60 + Number(m[2]) : NaN\n}\n\ntype Iv = [number, number]\n\n/** Intervals in minutes; an end at or before the start crosses midnight. */\nconst interval = (open: string | undefined, close: string | undefined): Iv[] => {\n const s = toMin(open)\n let e = toMin(close)\n if (Number.isNaN(s) || Number.isNaN(e)) return []\n if (e <= s) e += 1440\n return [[s, e]]\n}\n\nconst dayIntervals = (h: OpeningHours, day: number, date: string): Iv[] => {\n const x = h.exceptions?.find((e) => e.date === date)\n if (x?.closed) return []\n if (x && x.open && x.close) return interval(x.open, x.close)\n return h.weekly.filter((w) => w.day === day).flatMap((w) => interval(w.open, w.close))\n}\n\n/**\n * Whether the place is open at `now` in the IANA `timeZone` (throws RangeError\n * for an unknown zone). Looks 8 days ahead for the next opening. Handles\n * intervals crossing midnight, several per day, dated exceptions and DST.\n */\nexport function openStatus(hours: OpeningHours, timeZone: string, now: Date = new Date()): OpenStatus {\n const fmt = new Intl.DateTimeFormat('en-US', {\n timeZone, hourCycle: 'h23', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric',\n })\n // Wall-clock minutes since the epoch as seen in `timeZone`.\n const wall = (ms: number): number => {\n const p: Record<string, number> = {}\n for (const { type, value } of fmt.formatToParts(ms)) p[type] = Number(value)\n return Date.UTC(p.year!, p.month! - 1, p.day!, (p.hour ?? 0) % 24, p.minute!) / 60000\n }\n const nowMs = now.getTime()\n const w = wall(nowMs)\n const day0 = Math.floor(w / 1440) * 1440\n // Offset from UTC, in minutes, at an instant.\n const offset = (ms: number): number => wall(ms) - Math.floor(ms / 60000)\n const toInstant = (t: number): string => {\n const guess = (t - offset(nowMs)) * 60000\n return new Date((t - offset(guess)) * 60000).toISOString()\n }\n\n const all: Iv[] = []\n for (let d = -1; d <= 8; d++) {\n const at = new Date((day0 + d * 1440) * 60000)\n const day = at.getUTCDay() || 7\n for (const [s, e] of dayIntervals(hours, day, at.toISOString().slice(0, 10))) all.push([day0 + d * 1440 + s, day0 + d * 1440 + e])\n }\n all.sort((a, b) => a[0] - b[0])\n const merged: Iv[] = []\n for (const iv of all) {\n const last = merged[merged.length - 1]\n if (last && iv[0] <= last[1]) last[1] = Math.max(last[1], iv[1])\n else merged.push([iv[0], iv[1]])\n }\n const current = merged.find(([s, e]) => s <= w && w < e)\n if (current) return { open: true, closesAt: toInstant(current[1]), nextOpenAt: null }\n const next = merged.find(([s]) => s > w)\n return { open: false, closesAt: null, nextOpenAt: next ? toInstant(next[0]) : null }\n}\n\ntype Run = { from: number; to: number; iv: Iv[] }\n\n/** Consecutive days (1..7) with identical intervals, in week order. */\nconst runs = (h: OpeningHours): Run[] => {\n const out: Run[] = []\n for (let day = 1; day <= 7; day++) {\n const iv = h.weekly.filter((x) => x.day === day).flatMap((x) => interval(x.open, x.close)).sort((a, b) => a[0] - b[0])\n if (!iv.length) continue\n const last = out[out.length - 1]\n if (last && last.to === day - 1 && JSON.stringify(last.iv) === JSON.stringify(iv)) last.to = day\n else out.push({ from: day, to: day, iv })\n }\n return out\n}\n\n/** Hour (24 for an end at midnight) and padded minutes of a minute-of-day value. */\nconst hm = (min: number): [number, string] => [min && min % 1440 === 0 ? 24 : Math.floor(min / 60) % 24, String(min % 60).padStart(2, '0')]\n\n/** Compact text, e.g. `Lun–Vie 9:00–19:00 · Sáb 9:00–14:00` (24 h) or `Mon–Fri 9:00 AM–7:00 PM` (en). */\nexport function formatOpeningHours(hours: OpeningHours, locale = 'es-MX'): string {\n const en = /^en/i.test(locale)\n const name = (d: number): string => {\n const s = new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }).format(Date.UTC(2024, 0, d)).replace(/\\.$/, '')\n return s.charAt(0).toUpperCase() + s.slice(1)\n }\n const time = (min: number): string => {\n const [h, m] = hm(min)\n return en ? `${h % 12 || 12}:${m} ${h % 24 < 12 ? 'AM' : 'PM'}` : `${h}:${m}`\n }\n return runs(hours)\n .map((r) => `${name(r.from)}${r.from === r.to ? '' : '–' + name(r.to)} ${r.iv.map(([s, e]) => `${time(s)}–${time(e)}`).join(', ')}`)\n .join(' · ')\n}\n\n/** schema.org `openingHours` strings, one per interval, e.g. `Mo-Fr 09:00-19:00`. */\nexport function toSchemaOpeningHours(hours: OpeningHours): string[] {\n const code = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']\n const t = (min: number): string => { const [h, m] = hm(min); return `${String(h).padStart(2, '0')}:${m}` }\n return runs(hours).flatMap((r) =>\n r.iv.map(([s, e]) => `${code[r.from - 1]}${r.from === r.to ? '' : '-' + code[r.to - 1]} ${t(s)}-${t(e)}`),\n )\n}\n","/**\n * Orders of the demo buyer (`cus_1`) that rehearse every state of the account screen (contract 1.8): shipped with\n * events, an issued invoice with its credit note and a refund, a sandbox shipment (never shown as real), a pickup that\n * is ready with a section the server could not read, and a cash voucher waiting for payment. Numbers are below 1000 and\n * dates older than the original seed order, so the order list still starts at `1000` and the first checkout is `1001`.\n */\nimport type { InvoiceDoc, Money, Order, PendingPayment, Shipment } from '../types.js'\n\ntype Seeded = Order & { customer_id: string | null }\n\nconst money = (cents: number, currency: string): Money => ({ amount: (cents / 100).toFixed(2), currency_code: currency })\n\nconst line = (title: string, variant: string | null, quantity: number, unitCents: number, currency: string) => ({\n title,\n variant_title: variant,\n sku: null,\n quantity,\n unit: money(unitCents, currency),\n total: money(unitCents * quantity, currency),\n image: null,\n})\n\nconst address = { first_name: 'Ana', last_name: 'Prueba', city: 'Querétaro', province: 'Qro.', zip: '76000', country_code: 'MX' }\n\nexport function buildAccountOrders(currency: string): Seeded[] {\n const inTransit: Shipment = {\n id: 'shp_seed_1',\n number: 'ENV-00001',\n kind: 'outbound',\n status: 'in_transit',\n environment: 'production',\n test_mode: false,\n carrier: 'Estafeta',\n carrier_logo_key: 'estafeta',\n service: 'Terrestre',\n tracking_number: '8012345678',\n tracking_url: 'https://rastreo.example.com/estafeta/8012345678',\n shipped_at: '2026-08-12T15:00:00.000Z',\n delivered_at: null,\n promised_by: '2026-08-16',\n label_url: null,\n events: [\n { id: 'evt_3', status: 'in_transit', description: 'En tránsito hacia tu ciudad', location: 'Querétaro, Qro.', occurred_at: '2026-08-14T09:30:00.000Z', source: 'carrier' },\n { id: 'evt_2', status: 'in_transit', description: 'Salió del centro de distribución', location: 'Ciudad de México, CDMX', occurred_at: '2026-08-13T07:10:00.000Z', source: 'carrier' },\n { id: 'evt_1', status: 'label_created', description: 'Guía generada', location: null, occurred_at: '2026-08-12T15:00:00.000Z', source: 'store' },\n ],\n map: {\n origin: { label: 'Ciudad de México, CDMX', lat: 19.43, lng: -99.13, precision: 'city' },\n destination: { label: 'Querétaro, Qro.', lat: 20.6, lng: -100.4, precision: 'city' },\n path: [{ label: 'Querétaro, Qro.', lat: 20.59, lng: -100.39, precision: 'city' }],\n },\n }\n const invoice: InvoiceDoc = {\n id: 'inv_seed_1',\n status: 'issued',\n kind: 'invoice',\n stage: 'issued',\n action: 'download',\n can_request: false,\n folio: '8F3C1A52-6E0B-4B58-9C0D-2B7D6B4D7A11',\n series: 'A',\n folio_number: '1042',\n total: money(129900, currency),\n issued_at: '2026-08-13T10:00:00.000Z',\n payment_method: 'PUE',\n payment_form: '04',\n receiver: { rfc: 'XAXX010101000', name: 'Público en general', tax_regime: '616', cfdi_use: 'S01', postal_code: '76000' },\n test_mode: false,\n environment: 'production',\n }\n const creditNote: InvoiceDoc = {\n id: 'inv_seed_1_nc',\n status: 'issued',\n kind: 'credit_note',\n stage: 'issued',\n action: 'download',\n can_request: false,\n folio: '1D9B7E20-4A5C-4C4B-8F11-6A0E3C9D5B02',\n series: 'NC',\n folio_number: '7',\n total: money(20000, currency),\n issued_at: '2026-08-15T10:00:00.000Z',\n related_to: 'inv_seed_1',\n test_mode: false,\n environment: 'production',\n }\n return [\n {\n id: 'ord_seed_shipped',\n number: '0999',\n status: 'shipped',\n created_at: '2026-08-12T12:00:00.000Z',\n total: money(129900, currency),\n customer_id: 'cus_1',\n lines: [line('Kit de frenos', 'Delantero', 1, 109900, currency), line('Líquido de frenos', '500 ml', 1, 20000, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n subtotal: money(111983, currency),\n tax: money(17917, currency),\n shipping: money(0, currency),\n discount: money(0, currency),\n tax_included: true,\n shipping_method: 'Estándar',\n shipping_address: address,\n returns: [],\n shipments: [inTransit],\n invoices: [invoice, creditNote],\n payments: [{ method_label: 'Tarjeta Visa terminada en 4242', family: 'card', status: 'partially_refunded', amount: money(129900, currency), paid_at: '2026-08-12T12:01:00.000Z' }],\n refunds: [{ id: 'rfd_seed_1', amount: money(20000, currency), status: 'completed', method_label: 'Tarjeta Visa terminada en 4242', created_at: '2026-08-15T09:00:00.000Z', completed_at: '2026-08-15T10:00:00.000Z', return_id: null }],\n },\n {\n id: 'ord_seed_preparing',\n number: '0998',\n status: 'fulfilling',\n created_at: '2026-08-11T12:00:00.000Z',\n total: money(54900, currency),\n customer_id: 'cus_1',\n lines: [line('Filtro de aceite', null, 3, 18300, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n shipping_method: 'shipping:Envío Estafeta',\n shipping_service: { title: 'Envío Estafeta', carrier: 'estafeta', carrier_logo_key: 'estafeta', eta_days_min: 1, eta_days_max: 3 },\n shipping_address: address,\n shipments: [],\n invoices: [],\n payments: [{ method_label: 'OXXO', family: 'cash_voucher', status: 'paid', amount: money(54900, currency), paid_at: '2026-08-11T18:00:00.000Z' }],\n refunds: [],\n },\n {\n id: 'ord_seed_sandbox',\n number: '0997',\n status: 'shipped',\n created_at: '2026-08-10T12:00:00.000Z',\n total: money(31000, currency),\n customer_id: 'cus_1',\n lines: [line('Bujía iridio', null, 4, 7750, currency)],\n delivery_method: 'shipping',\n payment_status: 'paid',\n shipments: [\n {\n id: 'shp_seed_test',\n kind: 'outbound',\n status: 'label_created',\n environment: 'sandbox',\n test_mode: true,\n carrier: 'Estafeta',\n carrier_logo_key: 'estafeta',\n tracking_number: null,\n tracking_url: null,\n events: [],\n map: null,\n },\n ],\n invoices: [\n { id: 'inv_seed_test', status: 'issued', kind: 'invoice', stage: 'issued', action: 'download', can_request: false, folio: '00000000-0000-4000-8000-000000000000', test_mode: true, environment: 'sandbox' },\n ],\n payments: [],\n refunds: [],\n },\n {\n id: 'ord_seed_pickup',\n number: '0996',\n status: 'ready_for_pickup',\n created_at: '2026-08-09T12:00:00.000Z',\n total: money(88000, currency),\n customer_id: 'cus_1',\n lines: [line('Batería 12V', null, 1, 88000, currency)],\n delivery_method: 'pickup',\n pickup: { location_id: null, name: 'Sucursal Centro', address: 'Av. Reforma 100', city: 'Ciudad de México', phone: null, ready_at: '2026-08-10T10:00:00.000Z', delivered_at: null },\n payment_status: 'paid',\n shipments: [],\n invoices: [],\n payments: [],\n refunds: [],\n degraded: ['invoices'],\n },\n ]\n}\n\n/** A voucher still valid (OXXO, with barcode) and one that already expired (SPEI). */\nexport function buildPendingPayments(currency: string, nowMs: number): PendingPayment[] {\n return [\n {\n id: 'chk_seed_oxxo',\n number: null,\n status: 'pending_payment',\n created_at: new Date(nowMs - 3_600_000).toISOString(),\n total: money(45000, currency),\n expires_at: new Date(nowMs + 47 * 3_600_000).toISOString(),\n payment: {\n provider: 'mercadopago',\n method: 'oxxo',\n reference: '12345678901234',\n barcode: '12345678901234',\n clabe: null,\n voucher_url: 'https://pagos.example.com/ficha/abc',\n instructions: 'Paga en cualquier OXXO antes de la fecha de vencimiento.',\n expires_at: new Date(nowMs + 47 * 3_600_000).toISOString(),\n amount: money(45000, currency),\n },\n },\n {\n id: 'chk_seed_spei',\n number: null,\n status: 'expired',\n created_at: new Date(nowMs - 9 * 86_400_000).toISOString(),\n total: money(120000, currency),\n expires_at: new Date(nowMs - 2 * 86_400_000).toISOString(),\n payment: {\n provider: 'mercadopago',\n method: 'spei',\n reference: null,\n barcode: null,\n clabe: '646180000000000001',\n voucher_url: null,\n instructions: null,\n expires_at: new Date(nowMs - 2 * 86_400_000).toISOString(),\n amount: money(120000, currency),\n },\n },\n ]\n}\n","/**\n * The Mexican region pack as `GET /storefront/region` publishes it: the MX seed of the region_mx addon\n * (manifest.json, models region_identity_documents, region_fiscal_catalogs and region_payment_methods; payload\n * shape of regionspec.BuildPublicDocuments / PublicFiscalID). Test and mock data only: the SDK engine knows no\n * country. Regenerate it from the addon when the seed changes.\n */\nimport type { IdentityDocumentSpec, RegionFiscalEntry, RegionPaymentMethod } from '../types.js'\n\nexport const SEED_MX_CSF: IdentityDocumentSpec = {\n \"kind\": \"MX:csf\",\n \"country_code\": \"MX\",\n \"label\": \"Constancia de situación fiscal\",\n \"help\": \"Es el PDF que te da el SAT con tu RFC, tu nombre o razón social, tu régimen y tu código postal fiscal. Lo leemos en tu dispositivo para llenar tus datos de facturación.\",\n \"obtain_url\": \"https://www.sat.gob.mx/portal/public/tramites/constancia-de-situacion-fiscal\",\n \"accept\": [\n \"application/pdf\"\n ],\n \"max_bytes\": 5242880,\n \"max_pages\": 6,\n \"engine\": \"rules@1\",\n \"rules\": {\n \"version\": 1,\n \"normalize\": [\n \"nbsp\",\n \"collapse_ws\"\n ],\n \"labels\": [\n \"RFC\",\n \"CURP\",\n \"Nombre \\\\(s\\\\)\",\n \"Nombre\",\n \"Primer Apellido\",\n \"Segundo Apellido\",\n \"Denominaci[óo]n\\\\s*/\\\\s*Raz[óo]n Social\",\n \"R[ée]gimen de capital\",\n \"Nombre Comercial\",\n \"Fecha (?:de )?inicio de operaciones\",\n \"Fecha de constituci[óo]n\",\n \"Estatus en el padr[óo]n\",\n \"Fecha de [úu]ltimo cambio de estado\",\n \"Datos del domicilio registrado\",\n \"C[óo]digo Postal\",\n \"Tipo de Vialidad\",\n \"Nombre de Vialidad\",\n \"N[úu]mero Exterior\",\n \"N[úu]mero Interior\",\n \"Nombre de la Colonia\",\n \"Nombre de la Localidad\",\n \"Nombre del Municipio o Demarcaci[óo]n Territorial\",\n \"Nombre de la Entidad Federativa\",\n \"Entre Calle\",\n \"Y Calle\",\n \"Actividades Econ[óo]micas\",\n \"Reg[íi]menes\",\n \"Obligaciones\",\n \"Correo Electr[óo]nico\"\n ],\n \"qr_canonical\": \"https://siat.sat.gob.mx/app/qr/faces/pages/mobile/validadorqr.jsf?D1=10&D2=1&D3={document_id}_{tax_id}\",\n \"fields\": [\n {\n \"key\": \"tax_id\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"RFC\",\n \"upper\": true,\n \"capture\": {\n \"pattern\": \"(?:^|[^A-Z0-9Ñ&])([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9Ñ&]|$)\",\n \"flags\": \"i\",\n \"group\": 1\n }\n },\n {\n \"strategy\": \"regex\",\n \"pattern\": \"(?:^|[^A-Z0-9Ñ&])([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9Ñ&]|$)\",\n \"flags\": \"i\",\n \"group\": 1,\n \"upper\": true\n },\n {\n \"strategy\": \"qr_param\",\n \"param\": \"D3\",\n \"split\": \"_\",\n \"parts\": 2,\n \"match\": \"^[A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3}$\"\n },\n {\n \"strategy\": \"qr_param\",\n \"scan\": \"(?:D3)?([0-9]{11})[^A-Z0-9Ñ&]{0,3}([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9]|$)\",\n \"flags\": \"i\",\n \"group\": 2\n }\n ]\n },\n {\n \"key\": \"legal_name\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"Denominaci[óo]n\\\\s*/\\\\s*Raz[óo]n Social\"\n },\n {\n \"strategy\": \"concat_labeled\",\n \"labels\": [\n \"Nombre \\\\(s\\\\)\",\n \"Primer Apellido\",\n \"Segundo Apellido\"\n ],\n \"separator\": \" \"\n }\n ]\n },\n {\n \"key\": \"postal_code\",\n \"required\": true,\n \"strategies\": [\n {\n \"strategy\": \"labeled_lines\",\n \"label\": \"C[óo]digo Postal\",\n \"capture\": {\n \"pattern\": \"\\\\b([0-9]{5})\\\\b\",\n \"group\": 1\n }\n }\n ]\n },\n {\n \"key\": \"tax_regime\",\n \"required\": true,\n \"multiple\": true,\n \"strategies\": [\n {\n \"strategy\": \"catalog_phrases\",\n \"catalog\": \"fiscal_regime\",\n \"start\": \"Reg[íi]menes\\\\s*:?\",\n \"end\": \"Obligaciones\\\\s*:\"\n }\n ]\n },\n {\n \"key\": \"document_id\",\n \"strategies\": [\n {\n \"strategy\": \"regex\",\n \"pattern\": \"id\\\\s*CIF\\\\s*:?\\\\s*([0-9]{6,})\",\n \"flags\": \"i\",\n \"group\": 1\n },\n {\n \"strategy\": \"qr_param\",\n \"param\": \"D3\",\n \"split\": \"_\",\n \"parts\": 2,\n \"match\": \"^[0-9]+$\"\n },\n {\n \"strategy\": \"qr_param\",\n \"scan\": \"(?:D3)?([0-9]{11})[^A-Z0-9Ñ&]{0,3}([A-ZÑ&]{3,4}[0-9]{6}[A-Z0-9]{3})(?:[^A-Z0-9]|$)\",\n \"flags\": \"i\",\n \"group\": 1\n }\n ]\n },\n {\n \"key\": \"issued_on\",\n \"strategies\": [\n {\n \"strategy\": \"date\",\n \"order\": \"dmy\",\n \"pattern\": \"Fecha\\\\s+de\\\\s+Emisi[óo]n\\\\s*:?[^0-9]*?([0-9]{1,2})\\\\s+DE\\\\s+([A-Za-zÁÉÍÓÚÑáéíóúñ]+)\\\\s+DE\\\\s+([0-9]{4})\",\n \"flags\": \"i\",\n \"months\": [\n \"enero\",\n \"febrero\",\n \"marzo\",\n \"abril\",\n \"mayo\",\n \"junio\",\n \"julio\",\n \"agosto\",\n \"septiembre\",\n \"octubre\",\n \"noviembre\",\n \"diciembre\"\n ]\n }\n ]\n }\n ]\n },\n \"verify_kind\": \"qr_validator\",\n \"freshness_days\": 90,\n \"image_mode\": \"qr_only\",\n \"discard_fields\": [\n \"curp\",\n \"street\",\n \"exterior_number\",\n \"neighborhood\",\n \"activities\"\n ]\n} as IdentityDocumentSpec\n\nexport const SEED_MX_REGIMES: RegionFiscalEntry[] = [\n {\n \"code\": \"601\",\n \"label\": \"General de Ley Personas Morales\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"general de ley personas morales\"\n ]\n },\n {\n \"code\": \"603\",\n \"label\": \"Personas Morales con Fines no Lucrativos\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"fines no lucrativos\"\n ]\n },\n {\n \"code\": \"605\",\n \"label\": \"Sueldos y Salarios e Ingresos Asimilados a Salarios\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"sueldos y salarios\"\n ]\n },\n {\n \"code\": \"606\",\n \"label\": \"Arrendamiento\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"arrendamiento\"\n ]\n },\n {\n \"code\": \"607\",\n \"label\": \"Régimen de Enajenación o Adquisición de Bienes\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"enajenacion o adquisicion de bienes\"\n ]\n },\n {\n \"code\": \"608\",\n \"label\": \"Demás ingresos\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"demas ingresos\"\n ]\n },\n {\n \"code\": \"610\",\n \"label\": \"Residentes en el Extranjero sin Establecimiento Permanente en México\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"match_phrases\": [\n \"residentes en el extranjero\"\n ]\n },\n {\n \"code\": \"611\",\n \"label\": \"Ingresos por Dividendos (socios y accionistas)\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"dividendos\"\n ]\n },\n {\n \"code\": \"612\",\n \"label\": \"Personas Físicas con Actividades Empresariales y Profesionales\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"actividades empresariales y profesionales\"\n ]\n },\n {\n \"code\": \"614\",\n \"label\": \"Ingresos por intereses\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"ingresos por intereses\"\n ]\n },\n {\n \"code\": \"615\",\n \"label\": \"Régimen de los ingresos por obtención de premios\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"premios\"\n ]\n },\n {\n \"code\": \"616\",\n \"label\": \"Sin obligaciones fiscales\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"sin obligaciones fiscales\"\n ]\n },\n {\n \"code\": \"620\",\n \"label\": \"Sociedades Cooperativas de Producción que optan por diferir sus ingresos\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"sociedades cooperativas de produccion\"\n ]\n },\n {\n \"code\": \"621\",\n \"label\": \"Incorporación Fiscal\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"incorporacion fiscal\"\n ]\n },\n {\n \"code\": \"622\",\n \"label\": \"Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"actividades agricolas\"\n ]\n },\n {\n \"code\": \"623\",\n \"label\": \"Opcional para Grupos de Sociedades\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"opcional para grupos de sociedades\"\n ]\n },\n {\n \"code\": \"624\",\n \"label\": \"Coordinados\",\n \"person_types\": [\n \"company\"\n ],\n \"match_phrases\": [\n \"coordinados\"\n ]\n },\n {\n \"code\": \"625\",\n \"label\": \"Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas\",\n \"person_types\": [\n \"individual\"\n ],\n \"match_phrases\": [\n \"plataformas tecnologicas\"\n ]\n },\n {\n \"code\": \"626\",\n \"label\": \"Régimen Simplificado de Confianza\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"match_phrases\": [\n \"simplificado de confianza\"\n ]\n }\n]\n\nexport const SEED_MX_INVOICE_USES: RegionFiscalEntry[] = [\n {\n \"code\": \"G01\",\n \"label\": \"Adquisición de mercancías\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"G03\",\n \"label\": \"Gastos en general\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ],\n \"suggested_for_regimes\": [\n \"601\",\n \"612\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I01\",\n \"label\": \"Construcciones\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I02\",\n \"label\": \"Mobiliario y equipo de oficina por inversiones\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I03\",\n \"label\": \"Equipo de transporte\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I04\",\n \"label\": \"Equipo de cómputo y accesorios\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I05\",\n \"label\": \"Dados, troqueles, moldes, matrices y herramental\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I06\",\n \"label\": \"Comunicaciones telefónicas\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I07\",\n \"label\": \"Comunicaciones satelitales\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"I08\",\n \"label\": \"Otra maquinaria y equipo\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"606\",\n \"612\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ]\n },\n {\n \"code\": \"D01\",\n \"label\": \"Honorarios médicos, dentales y gastos hospitalarios\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D02\",\n \"label\": \"Gastos médicos por incapacidad o discapacidad\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D03\",\n \"label\": \"Gastos funerales\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D04\",\n \"label\": \"Donativos\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D05\",\n \"label\": \"Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación)\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D06\",\n \"label\": \"Aportaciones voluntarias al SAR\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D07\",\n \"label\": \"Primas por seguros de gastos médicos\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D08\",\n \"label\": \"Gastos de transportación escolar obligatoria\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D09\",\n \"label\": \"Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"D10\",\n \"label\": \"Pagos por servicios educativos (colegiaturas)\",\n \"person_types\": [\n \"individual\"\n ],\n \"allowed_regimes\": [\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"625\"\n ]\n },\n {\n \"code\": \"S01\",\n \"label\": \"Sin efectos fiscales\",\n \"person_types\": [\n \"individual\",\n \"company\"\n ],\n \"allowed_regimes\": [\n \"601\",\n \"603\",\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"610\",\n \"611\",\n \"612\",\n \"614\",\n \"615\",\n \"616\",\n \"620\",\n \"621\",\n \"622\",\n \"623\",\n \"624\",\n \"625\",\n \"626\"\n ],\n \"suggested_for_regimes\": [\n \"603\",\n \"605\",\n \"606\",\n \"607\",\n \"608\",\n \"610\",\n \"611\",\n \"614\",\n \"615\",\n \"616\",\n \"620\"\n ]\n }\n]\n\nexport const SEED_MX_PAYMENT_METHODS: RegionPaymentMethod[] = [\n {\n \"code\": \"card\",\n \"label\": \"Tarjeta de crédito o débito\",\n \"description\": \"Visa, Mastercard y American Express. Pago seguro procesado por tu pasarela.\",\n \"kind\": \"card\",\n \"flow\": \"inline\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"icon\": \"CreditCard\",\n \"fiscal_payment_form\": \"04,28\"\n },\n {\n \"code\": \"mercadopago\",\n \"label\": \"Mercado Pago\",\n \"description\": \"Paga con tu cuenta de Mercado Pago: saldo, tarjetas guardadas o meses.\",\n \"kind\": \"wallet\",\n \"flow\": \"redirect\",\n \"providers\": [\n \"mercadopago\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"icon\": \"Wallet\",\n \"fiscal_payment_form\": \"06,04,28\"\n },\n {\n \"code\": \"oxxo\",\n \"label\": \"Efectivo en OXXO\",\n \"description\": \"Recibe una referencia y paga en cualquier tienda OXXO. Confirmamos tu pedido cuando se acredita el pago.\",\n \"kind\": \"cash_voucher\",\n \"flow\": \"voucher\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"expires_hours\": 72,\n \"icon\": \"Store\",\n \"fiscal_payment_form\": \"01\"\n },\n {\n \"code\": \"spei\",\n \"label\": \"Transferencia SPEI\",\n \"description\": \"Paga desde la app de tu banco con una CLABE única para tu pedido; se confirma en minutos.\",\n \"kind\": \"bank_transfer\",\n \"flow\": \"instructions\",\n \"providers\": [\n \"mercadopago\",\n \"stripe\"\n ],\n \"installments\": null,\n \"min_amount\": null,\n \"max_amount\": null,\n \"expires_hours\": 24,\n \"icon\": \"Landmark\",\n \"fiscal_payment_form\": \"03\"\n }\n] as RegionPaymentMethod[]\n\nexport const SEED_MX_FISCAL_ID_PATTERN = \"^[A-ZÑ&]{3,4}[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]$\"\nexport const SEED_MX_GENERIC_IDS: string[] = [\"XAXX010101000\", \"XEXX010101000\"]\n","/**\n * Region fixture of the mock: Mexico exactly as `GET /storefront/region` publishes it (see `region-mx.seed.ts`),\n * identity document `MX:csf` included, so a storefront can be built and tested without a server. It lives here,\n * and only here: the real data belongs to the region package, and the engine in `fiscal-document` knows no country.\n */\nimport type { IdentityDocumentSpec, IdentityRulesV1, InvoiceRequest, Region, RegionFiscalId } from '../types.js'\nimport { SEED_MX_CSF, SEED_MX_FISCAL_ID_PATTERN, SEED_MX_GENERIC_IDS, SEED_MX_INVOICE_USES, SEED_MX_PAYMENT_METHODS, SEED_MX_REGIMES } from './region-mx.seed.js'\n\nexport const MOCK_IDENTITY_DOCUMENT_MX_CSF: IdentityDocumentSpec = SEED_MX_CSF\nexport const MOCK_CSF_RULES = SEED_MX_CSF.rules as IdentityRulesV1\n\nexport const MOCK_FISCAL_ID_MX: RegionFiscalId = {\n kind: 'mx_rfc',\n label: 'RFC',\n pattern: SEED_MX_FISCAL_ID_PATTERN,\n generic_ids: SEED_MX_GENERIC_IDS,\n regimes: SEED_MX_REGIMES,\n invoice_uses: SEED_MX_INVOICE_USES,\n documents: [SEED_MX_CSF],\n // The pack's person-type patterns and check algorithm (region_settings.fiscal_id_person_patterns / _checksum).\n person_patterns: { individual: '^[A-ZÑ&]{4}[0-9]{6}[A-Z0-9]{3}$', company: '^[A-ZÑ&]{3}[0-9]{6}[A-Z0-9]{3}$' },\n checksum: 'mx_rfc',\n}\n\nexport const MOCK_REGION_MX: Region = {\n country_code: 'MX',\n name: 'México',\n locale: { default: 'es-MX', available: ['es-MX', 'en-US'], current: 'es-MX' },\n timezone: 'America/Mexico_City',\n currency: { code: 'MXN', symbol: '$', symbol_position: 'before', minor_units: 2 },\n formats: { date: 'dd/MM/yyyy', measurement: 'metric' },\n tax: { prices_include_tax: true, label: 'IVA', price_label: 'IVA incluido', show_breakdown: true, default_category: 'standard', categories: ['standard'] },\n address: { postal_code: { pattern: '^[0-9]{5}$', example: '06600' } },\n fiscal_id: MOCK_FISCAL_ID_MX,\n payment_methods: SEED_MX_PAYMENT_METHODS,\n}\n\nexport type InvoiceFieldError = { field: string; message: string }\n\n/** `individual` for a 13-character tax id, `company` for 12 (the mock's rule; a real region decides this server-side). */\nexport function mockPersonType(taxId: string): string | null {\n if (taxId.length === 13) return 'individual'\n if (taxId.length === 12) return 'company'\n return null\n}\n\n/** The first thing wrong with an invoice request against a region, as the API reports it (`field: invoice.<field>`), or `null`. */\nexport function validateInvoiceRequest(region: Region | null, input: InvoiceRequest, prefix = 'invoice'): InvoiceFieldError | null {\n const text = (...v: unknown[]) => v.map((x) => (typeof x === 'string' ? x.trim() : '')).find(Boolean) ?? ''\n const fid = region?.fiscal_id\n const taxId = text(input.tax_id, input.rfc).toUpperCase()\n const name = text(input.legal_name, input.razon_social)\n const regime = text(input.tax_regime, input.regimen)\n const use = text(input.use, input.uso_cfdi, input.invoice_use, input.cfdi_use)\n const postal = text(input.postal_code, input.cp, input.zip)\n const bad = (field: string, message: string): InvoiceFieldError => ({ field: `${prefix}.${field}`, message })\n\n if (!taxId) return bad('tax_id', 'The tax id is required')\n if (fid?.pattern && !fid.generic_ids.includes(taxId) && !new RegExp(fid.pattern).test(taxId)) return bad('tax_id', `Not a valid ${fid.kind}`)\n if (!name) return bad('legal_name', 'The legal name is required')\n if (!regime) return bad('tax_regime', 'The tax regime is required')\n const entry = fid?.regimes.find((r) => r.code === regime)\n if (fid && !entry) return bad('tax_regime', `Unknown tax regime ${regime}`)\n const person = fid?.generic_ids.includes(taxId) ? null : mockPersonType(taxId)\n if (entry && person && entry.person_types.length > 0 && !entry.person_types.includes(person)) {\n return bad('tax_regime', `The regime ${regime} does not apply to this ${fid!.kind}`)\n }\n const postalPattern = region?.address?.postal_code?.pattern\n if (!postal || (postalPattern && !new RegExp(postalPattern).test(postal))) return bad('postal_code', 'Not a valid postal code')\n if (!use) return bad('use', 'The invoice use is required')\n const useEntry = fid?.invoice_uses.find((u) => u.code === use)\n if (fid && !useEntry) return bad('use', `Unknown invoice use ${use}`)\n if (useEntry?.allowed_regimes && useEntry.allowed_regimes.length > 0 && !useEntry.allowed_regimes.includes(regime)) {\n return bad('use', `The regime ${regime} does not admit the use ${use}`)\n }\n return null\n}\n\nexport function maskTaxId(taxId: string): string {\n const v = taxId.trim()\n return v.length <= 4 ? '*'.repeat(v.length) : `${v.slice(0, 2)}${'*'.repeat(v.length - 5)}${v.slice(-3)}`\n}\n","// «My items» (contract 1.9): the pure side. The cascade of options a form shows, the same validation the server runs\n// (the server is the authority; this gives the buyer the answer without a round trip), the compatibility key and the\n// product tags it filters with. No UI, no storage, no copy, and no kind is named here: a kind is data the organization\n// publishes (`content.subjectKinds()`), and what a field \"means\" (make, size, breed) is only its label.\n//\n// Privacy: a `private` field (a licence plate) is kept apart. It is never part of `label`, `fit_key` or any tag, and\n// `maskedValue` / `isMasked` are how the server's mask is recognized so it is never sent back as if it were a value.\n\nimport type { SubjectCatalogNode, SubjectField, SubjectKind } from './types.js'\n\nexport const MIN_SUBJECT_YEAR = 1900\nexport const MAX_SUBJECT_YEAR = 2100\nconst MAX_VALUE_LENGTH = 80\nconst MAX_LABEL_LENGTH = 120\nconst MAX_FIT_KEY_LENGTH = 100\n\nexport type SubjectOption = { value: string; label: string }\nexport type SubjectValues = Record<string, string | number | null | undefined>\n\n/** Why a value was refused (the server answers `422` with the field `attributes.<key>` and never the value). */\nexport type SubjectProblemCode = 'required' | 'unknown' | 'invalid' | 'not_in_catalog' | 'year_range' | 'catalog_unavailable'\nexport type SubjectProblems = Record<string, SubjectProblemCode>\n\nexport type ResolvedSubject = {\n /** Built from the labels of the catalog and the public values, in field order. */\n label: string\n /** `''` when a placeholder of the template has no value (the item then never matches a product). */\n fit_key: string\n /** Public values, as the server stores them in `attributes`. */\n attributes: Record<string, string | number>\n /** Private values: never in the label, the key or a tag. */\n private: Record<string, string>\n}\n\nconst isPresent = (v: unknown): boolean => v !== null && v !== undefined && v !== ''\n\nconst asYear = (v: unknown): number | null => {\n const n = typeof v === 'number' ? v : typeof v === 'string' && /^\\s*\\d+\\s*$/.test(v) ? Number(v) : NaN\n return Number.isInteger(n) && n >= MIN_SUBJECT_YEAR && n <= MAX_SUBJECT_YEAR ? n : null\n}\n\n/** Collapses whitespace; `null` for a non-string, a control character or a value over `max` characters. */\nconst cleanText = (v: unknown, max: number): string | null => {\n if (typeof v !== 'string') return null\n const s = v.split(/\\s+/).filter(Boolean).join(' ')\n // eslint-disable-next-line no-control-regex\n return [...s].length > max || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(s) ? null : s\n}\n\nconst slug = (s: string): string => s.toLowerCase().replace(/[^a-z0-9._+-]+/g, '-').replace(/^-+|-+$/g, '')\n\n/** Does the option cover the model year? Declared `ranges` win; else `from`/`to`; an option with none covers any year. */\nexport function coversYear(node: Pick<SubjectCatalogNode, 'from' | 'to' | 'ranges'>, year: number): boolean {\n if (node.ranges && node.ranges.length > 0) return node.ranges.some(([a, b]) => year >= a && year <= b)\n if (node.from !== undefined && year < node.from) return false\n if (node.to !== undefined && year > node.to) return false\n return true\n}\n\nconst declaresYears = (n: SubjectCatalogNode): boolean => n.from !== undefined || n.to !== undefined || (n.ranges?.length ?? 0) > 0\n\n/** The catalog fields that make the tree's levels, in order: `source: catalog` and not a year. */\nexport function subjectLevels(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields.filter((f) => f.source === 'catalog' && f.type !== 'year')\n}\n\n/** The visible fields of a form: everything the buyer fills in, in the order of the kind. */\nexport function subjectFields(kind: Pick<SubjectKind, 'fields'>): SubjectField[] {\n return kind.fields\n}\n\n/** Walks the chosen values down the tree; stops at the first level without a (valid) choice. */\nfunction walk(kind: SubjectKind, values: SubjectValues): { path: SubjectCatalogNode[]; ids: Record<string, string>; next: Record<string, SubjectCatalogNode> | undefined } {\n const path: SubjectCatalogNode[] = []\n const ids: Record<string, string> = {}\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n for (const f of subjectLevels(kind)) {\n const raw = values[f.key]\n const s = isPresent(raw) ? cleanText(raw, MAX_VALUE_LENGTH) : null\n const node: SubjectCatalogNode | undefined = s && tree ? (tree[s] ?? tree[s.toLowerCase()]) : undefined\n if (!s || !node) return { path, ids, next: tree }\n ids[f.key] = tree && tree[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n if (!tree) return { path, ids, next: undefined }\n }\n return { path, ids, next: tree }\n}\n\nconst byLabel = (a: SubjectOption, b: SubjectOption) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true })\n\n/**\n * The options a catalog field offers given what is already chosen (a cascade: a level shows nothing until the previous\n * one is chosen). A level narrows by the chosen year when the option declares years; a year field offers the model\n * years the chosen options cover (newest first), or nothing when no option declares years (a free number then).\n */\nexport function subjectOptions(kind: SubjectKind, fieldKey: string, values: SubjectValues): SubjectOption[] {\n const field = kind.fields.find((f) => f.key === fieldKey)\n if (!field || field.source !== 'catalog' || !kind.catalog) return []\n if (field.type === 'year') {\n // Only the options chosen BEFORE the year constrain it (a stale choice after it is reconciled against the year).\n const upto = kind.fields.slice(0, kind.fields.indexOf(field))\n const { path } = walk({ ...kind, fields: upto }, values)\n const declared = path.filter(declaresYears)\n if (declared.length === 0) return []\n let lo = Infinity\n let hi = -Infinity\n for (const n of declared) {\n for (const [a, b] of n.ranges?.length ? n.ranges : [[n.from ?? MIN_SUBJECT_YEAR, n.to ?? MAX_SUBJECT_YEAR] as [number, number]]) {\n lo = Math.min(lo, a)\n hi = Math.max(hi, b)\n }\n }\n const out: SubjectOption[] = []\n for (let y = Math.min(hi, MAX_SUBJECT_YEAR); y >= Math.max(lo, MIN_SUBJECT_YEAR); y--) if (declared.every((n) => coversYear(n, y))) out.push({ value: String(y), label: String(y) })\n return out\n }\n const levels = subjectLevels(kind)\n const at = levels.findIndex((f) => f.key === fieldKey)\n if (at < 0) return []\n // Only the levels before this one must be chosen.\n const before = Object.fromEntries(levels.slice(0, at).map((f) => [f.key, values[f.key]]))\n const { path, next } = walk({ ...kind, fields: kind.fields.filter((f) => levels.slice(0, at).includes(f) || f.type === 'year') }, before)\n if (path.length < at || !next) return []\n const year = asYear(values[kind.fields.find((f) => f.type === 'year' && f.source === 'catalog')?.key ?? ''])\n return Object.entries(next)\n .filter(([, n]) => year === null || coversYear(n, year))\n .map(([value, n]) => ({ value, label: n.label }))\n .sort(byLabel)\n}\n\n/**\n * Drops what was chosen and is no longer valid after a change (a new make clears the model; a year the model does not\n * cover is cleared), in field order. Free values are never touched.\n */\nexport function reconcileSubjectValues(kind: SubjectKind, values: SubjectValues): SubjectValues {\n const out: SubjectValues = { ...values }\n for (const f of kind.fields) {\n if (f.source !== 'catalog' || !isPresent(out[f.key])) continue\n const options = subjectOptions(kind, f.key, out)\n const v = String(out[f.key])\n const ok = f.type === 'year' ? options.length === 0 || options.some((o) => o.value === v) : options.some((o) => o.value === v || o.value === v.toLowerCase())\n if (!ok) out[f.key] = ''\n }\n return out\n}\n\n/**\n * Validates and resolves the values the way the server does: unknown field, wrong type, a value missing from the\n * catalog and a year outside the chosen options' years are refused, naming the field only.\n */\nexport function resolveSubject(kind: SubjectKind, values: SubjectValues): { ok: true; subject: ResolvedSubject } | { ok: false; problems: SubjectProblems } {\n const problems: SubjectProblems = {}\n const known = new Set(kind.fields.map((f) => f.key))\n for (const key of Object.keys(values)) if (isPresent(values[key]) && !known.has(key)) problems[key] = 'unknown'\n\n const attributes: Record<string, string | number> = {}\n const priv: Record<string, string> = {}\n const display: Record<string, string> = {}\n const ids: Record<string, string> = {}\n const path: SubjectCatalogNode[] = []\n let tree: Record<string, SubjectCatalogNode> | undefined = kind.catalog?.tree\n const years: string[] = []\n const put = (f: SubjectField, v: string | number) => {\n if (f.private) priv[f.key] = String(v)\n else attributes[f.key] = v\n }\n for (const f of kind.fields) {\n const raw = values[f.key]\n if (!isPresent(raw)) {\n if (f.required) problems[f.key] = 'required'\n if (f.source === 'catalog' && f.type !== 'year') tree = undefined // a skipped level ends the walk\n continue\n }\n const max = f.max ?? MAX_VALUE_LENGTH\n if (f.type === 'year') {\n const y = asYear(raw)\n if (y === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, y)\n display[f.key] = ids[f.key] = String(y)\n if (f.source === 'catalog') years.push(f.key)\n } else if (f.source === 'catalog') {\n if (!kind.catalog) {\n problems[f.key] = 'catalog_unavailable'\n continue\n }\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n const node: SubjectCatalogNode | undefined = tree?.[s] ?? tree?.[s.toLowerCase()]\n if (!node) {\n problems[f.key] = 'not_in_catalog'\n continue\n }\n const id = tree?.[s] ? s : s.toLowerCase()\n path.push(node)\n tree = node.children\n put(f, id)\n display[f.key] = node.label\n ids[f.key] = id\n } else {\n const s = cleanText(raw, max)\n if (s === null) {\n problems[f.key] = 'invalid'\n continue\n }\n put(f, s)\n display[f.key] = s\n ids[f.key] = slug(s)\n }\n }\n for (const key of years) {\n const y = attributes[key] as number | undefined\n if (y !== undefined && !problems[key] && !path.every((n) => coversYear(n, y))) problems[key] = 'year_range'\n }\n if (Object.keys(problems).length > 0) return { ok: false, problems }\n\n const label = [...kind.fields.filter((f) => !f.private).map((f) => display[f.key]).filter(Boolean).join(' ')].slice(0, MAX_LABEL_LENGTH).join('').trim()\n if (!label) return { ok: false, problems: { _: 'required' } }\n let complete = true\n const key = kind.fit_key_template.replace(/\\{([a-z][a-z0-9_]*)\\}/g, (_m, name: string) => {\n const id = ids[name]\n if (!id) complete = false\n return id ?? ''\n })\n return { ok: true, subject: { label, fit_key: complete && key.length <= MAX_FIT_KEY_LENGTH ? key.toLowerCase() : '', attributes, private: priv } }\n}\n\n/** The mask the server puts in place of a private value («••34»). */\nexport const PRIVATE_MASK = '••'\nexport const isMasked = (v: unknown): boolean => typeof v === 'string' && v.startsWith(PRIVATE_MASK)\n\n/** Prefix of the tag that publishes compatibility (`<prefix><fit_key>`), as in `FitmentConfig.tagPrefix`. */\nexport const DEFAULT_FIT_TAG_PREFIX = 'fit:'\n\n/** The product tag that marks a part as fitting the item with this key. */\nexport const fitTag = (fitKey: string, prefix: string = DEFAULT_FIT_TAG_PREFIX): string => `${prefix}${fitKey}`\n\n/**\n * The `tags_any` of a listing \"only what fits my item\": its own tag plus the universal one (`<prefix>universal`).\n * `[]` when the item has no key (it does not resolve completely): ask for nothing rather than for the wrong thing.\n */\nexport function fitTagsAny(fitKey: string | null | undefined, opts: { prefix?: string; universal?: boolean } = {}): string[] {\n if (!fitKey) return []\n const prefix = opts.prefix ?? DEFAULT_FIT_TAG_PREFIX\n return opts.universal === false ? [fitTag(fitKey, prefix)] : [fitTag(fitKey, prefix), `${prefix}universal`]\n}\n\n/**\n * Budget of one catalog page, in bytes of the `tree` prop as OPS stores it (text, so every quote is escaped). Publishing\n * a page is ONE write of at most 64 KiB that carries the draft and the published copy: ~28 KB of tree per page.\n */\nexport const SUBJECT_CATALOG_PAGE_BYTES = 28 * 1024\n\nconst utf8Bytes = (s: string): number => new TextEncoder().encode(s).length\n\n/**\n * Splits a catalog tree by its first level into parts that each fit one page (`subject_catalog` section, prop `tree`).\n * Publish part `i` on its own page and name them all in the kind's `catalog_ref` (`[\"page:x-1\", \"page:x-2\", …]`); the\n * server joins them back. A real parts catalog (make → model → engine) does not fit in one page. Throws `RangeError`\n * when a single first-level option is larger than the budget on its own (split that level by hand, or trim labels).\n */\nexport function splitSubjectTree(\n tree: Record<string, SubjectCatalogNode>,\n maxBytes: number = SUBJECT_CATALOG_PAGE_BYTES,\n): Record<string, SubjectCatalogNode>[] {\n const size = (part: Record<string, SubjectCatalogNode>) => utf8Bytes(JSON.stringify(JSON.stringify(part)))\n const parts: Record<string, SubjectCatalogNode>[] = []\n let current: Record<string, SubjectCatalogNode> = {}\n for (const [id, node] of Object.entries(tree)) {\n if (size({ [id]: node }) > maxBytes) throw new RangeError(`splitSubjectTree: option ${id} alone exceeds ${maxBytes} bytes`)\n const next = { ...current, [id]: node }\n if (Object.keys(current).length > 0 && size(next) > maxBytes) {\n parts.push(current)\n current = { [id]: node }\n } else current = next\n }\n if (Object.keys(current).length > 0) parts.push(current)\n return parts\n}\n","import type {\n Article,\n Collection,\n Customer,\n Image,\n Location,\n Menu,\n Page,\n Product,\n ProductOption,\n ProductVariant,\n Shop,\n Theme,\n} from '../types.js'\n\n/**\n * Placeholder image source for all seed data. Swap it (or pass `imageUrl` to\n * `createMockStorefront`) to use your own assets.\n */\nexport const MOCK_IMAGE_URL = (seed: string, width = 800, height = 800): string =>\n `https://picsum.photos/seed/${encodeURIComponent(seed)}/${width}/${height}`\n\nexport type MockImageUrl = typeof MOCK_IMAGE_URL\n\nexport const MOCK_CURRENCY = 'MXN'\n\n/** Seed customer that already exists (log in with OTP `000000`). */\nexport const MOCK_CUSTOMER_EMAIL = 'cliente@example.com'\n\ntype ProductSpec = {\n handle: string\n title: string\n collection: string\n type: string\n vendor: string\n price: number\n compareAt?: number\n options?: ProductOption[]\n tags?: string[]\n attributes?: Product['attributes']\n /** Stock per variant index (default 12). */\n stock?: number | ((index: number, opts: Record<string, string>) => number)\n /** Extra price per option value, e.g. `{ XL: 50 }`. */\n priceDelta?: Record<string, number>\n description: string\n}\n\nconst OPT = {\n size: (values = ['S', 'M', 'L']): ProductOption => ({ name: 'Talla', values }),\n color: (values: string[]): ProductOption => ({ name: 'Color', values }),\n}\n\nexport const COLLECTION_SPECS: { handle: string; title: string; description: string; parent?: string }[] = [\n { handle: 'ropa', title: 'Ropa', description: 'Prendas básicas para todos los días.' },\n { handle: 'hogar', title: 'Hogar', description: 'Objetos útiles y bonitos para tu casa.' },\n { handle: 'accesorios', title: 'Accesorios', description: 'Complementos para llevar contigo.' },\n { handle: 'llantas', title: 'Llantas', description: 'Llantas para auto por medida.' },\n]\n\nconst tire = (width: number, aspect: number, rim: number) => ({\n width,\n aspect,\n rim,\n size_key: `${width}/${aspect}R${rim}`,\n})\n\nexport const PRODUCT_SPECS: ProductSpec[] = [\n // Ropa\n { handle: 'playera-basica', title: 'Playera básica', collection: 'ropa', type: 'Playera', vendor: 'Casa Textil', price: 249, compareAt: 299, options: [OPT.size(), OPT.color(['Blanco', 'Negro'])], tags: ['algodón', 'nuevo'], stock: (i) => (i === 5 ? 0 : 15), description: 'Playera de algodón peinado, corte recto.' },\n { handle: 'sudadera-capucha', title: 'Sudadera con capucha', collection: 'ropa', type: 'Sudadera', vendor: 'Casa Textil', price: 699, options: [OPT.size(['S', 'M', 'L', 'XL']), OPT.color(['Gris', 'Azul'])], priceDelta: { XL: 50 }, tags: ['invierno'], description: 'Sudadera afelpada con bolsa canguro.' },\n { handle: 'pantalon-chino', title: 'Pantalón chino', collection: 'ropa', type: 'Pantalón', vendor: 'Taller Urbano', price: 899, options: [OPT.size(['28', '30', '32', '34'])], stock: (i) => (i === 0 ? 0 : 6), description: 'Pantalón de gabardina con un toque de elasticidad.' },\n { handle: 'chamarra-ligera', title: 'Chamarra ligera', collection: 'ropa', type: 'Chamarra', vendor: 'Taller Urbano', price: 1299, compareAt: 1599, options: [OPT.size()], tags: ['oferta'], description: 'Chamarra rompevientos plegable.' },\n { handle: 'gorra-clasica', title: 'Gorra clásica', collection: 'ropa', type: 'Gorra', vendor: 'Casa Textil', price: 199, options: [OPT.color(['Negro', 'Beige', 'Verde'])], description: 'Gorra de seis paneles con ajuste trasero.' },\n { handle: 'calcetines-paquete', title: 'Calcetines (paquete de 3)', collection: 'ropa', type: 'Calcetines', vendor: 'Casa Textil', price: 149, stock: 0, description: 'Tres pares de calcetines de algodón.' },\n // Hogar\n { handle: 'taza-ceramica', title: 'Taza de cerámica', collection: 'hogar', type: 'Cocina', vendor: 'Barro Vivo', price: 129, options: [OPT.color(['Blanco', 'Terracota'])], tags: ['regalo'], description: 'Taza de 350 ml hecha a mano.' },\n { handle: 'lampara-mesa', title: 'Lámpara de mesa', collection: 'hogar', type: 'Iluminación', vendor: 'Luz Serena', price: 1199, description: 'Lámpara con pantalla de lino y base de madera.' },\n { handle: 'cojin-decorativo', title: 'Cojín decorativo', collection: 'hogar', type: 'Textil', vendor: 'Casa Textil', price: 349, compareAt: 399, options: [OPT.color(['Mostaza', 'Verde', 'Gris'])], description: 'Cojín de 45 × 45 cm con funda removible.' },\n { handle: 'set-sartenes', title: 'Set de sartenes', collection: 'hogar', type: 'Cocina', vendor: 'Cocina Diaria', price: 1899, compareAt: 2299, tags: ['oferta'], description: 'Tres sartenes antiadherentes de 20, 24 y 28 cm.' },\n { handle: 'manta-tejida', title: 'Manta tejida', collection: 'hogar', type: 'Textil', vendor: 'Casa Textil', price: 799, description: 'Manta de punto grueso, 130 × 170 cm.' },\n { handle: 'maceta-barro', title: 'Maceta de barro', collection: 'hogar', type: 'Jardín', vendor: 'Barro Vivo', price: 189, options: [{ name: 'Tamaño', values: ['Chica', 'Mediana', 'Grande'] }], priceDelta: { Mediana: 60, Grande: 140 }, description: 'Maceta de barro natural con plato.' },\n // Accesorios\n { handle: 'mochila-diaria', title: 'Mochila diaria', collection: 'accesorios', type: 'Mochila', vendor: 'Ruta Libre', price: 999, options: [OPT.color(['Negro', 'Azul'])], tags: ['nuevo'], description: 'Mochila de 20 L con compartimento para laptop.' },\n { handle: 'botella-termica', title: 'Botella térmica', collection: 'accesorios', type: 'Botella', vendor: 'Ruta Libre', price: 399, options: [{ name: 'Capacidad', values: ['500 ml', '750 ml'] }], priceDelta: { '750 ml': 80 }, description: 'Mantiene frío 24 h y caliente 12 h.' },\n { handle: 'lentes-sol', title: 'Lentes de sol', collection: 'accesorios', type: 'Lentes', vendor: 'Vista Clara', price: 599, compareAt: 749, description: 'Lentes polarizados con protección UV400.' },\n { handle: 'reloj-analogico', title: 'Reloj analógico', collection: 'accesorios', type: 'Reloj', vendor: 'Vista Clara', price: 1499, description: 'Reloj con correa de piel y cristal mineral.' },\n { handle: 'cartera-piel', title: 'Cartera de piel', collection: 'accesorios', type: 'Cartera', vendor: 'Taller Urbano', price: 549, options: [OPT.color(['Café', 'Negro'])], description: 'Cartera delgada con seis ranuras.' },\n { handle: 'paraguas-compacto', title: 'Paraguas compacto', collection: 'accesorios', type: 'Paraguas', vendor: 'Ruta Libre', price: 299, stock: 3, description: 'Paraguas plegable resistente al viento.' },\n // Llantas (exercise attribute facets)\n { handle: 'llanta-205-55-r16-touring', title: 'Llanta 205/55 R16 Touring', collection: 'llantas', type: 'Llanta', vendor: 'Marca Norte', price: 1899, compareAt: 2099, attributes: { ...tire(205, 55, 16), load_index: 91, speed_rating: 'V', runflat: false }, tags: ['auto'], description: 'Llanta de turismo silenciosa y de bajo consumo.' },\n { handle: 'llanta-205-55-r16-sport', title: 'Llanta 205/55 R16 Sport', collection: 'llantas', type: 'Llanta', vendor: 'Marca Sur', price: 2199, attributes: { ...tire(205, 55, 16), load_index: 94, speed_rating: 'W', runflat: false }, tags: ['auto'], description: 'Agarre deportivo en seco y mojado.' },\n { handle: 'llanta-195-65-r15-eco', title: 'Llanta 195/65 R15 Eco', collection: 'llantas', type: 'Llanta', vendor: 'Marca Norte', price: 1499, attributes: { ...tire(195, 65, 15), load_index: 91, speed_rating: 'H', runflat: false }, tags: ['auto'], description: 'Baja resistencia al rodamiento.' },\n { handle: 'llanta-225-45-r17-runflat', title: 'Llanta 225/45 R17 Run Flat', collection: 'llantas', type: 'Llanta', vendor: 'Marca Centro', price: 3299, attributes: { ...tire(225, 45, 17), load_index: 91, speed_rating: 'W', runflat: true }, tags: ['auto'], stock: 2, description: 'Permite rodar hasta 80 km sin presión.' },\n { handle: 'llanta-265-70-r16-at', title: 'Llanta 265/70 R16 All Terrain', collection: 'llantas', type: 'Llanta', vendor: 'Marca Sur', price: 3599, attributes: { ...tire(265, 70, 16), load_index: 112, speed_rating: 'T', runflat: false }, tags: ['camioneta'], description: 'Para camioneta, asfalto y terracería.' },\n { handle: 'llanta-175-70-r13-city', title: 'Llanta 175/70 R13 City', collection: 'llantas', type: 'Llanta', vendor: 'Marca Centro', price: 999, attributes: { ...tire(175, 70, 13), load_index: 82, speed_rating: 'T', runflat: false }, tags: ['auto'], stock: 0, description: 'Económica y durable para ciudad.' },\n]\n\nconst money = (n: number, currency: string) => ({ amount: n.toFixed(2), currency_code: currency })\n\nfunction cartesian(options: ProductOption[]): Record<string, string>[] {\n let combos: Record<string, string>[] = [{}]\n for (const opt of options) {\n const next: Record<string, string>[] = []\n for (const c of combos) for (const v of opt.values) next.push({ ...c, [opt.name]: v })\n combos = next\n }\n return combos\n}\n\nconst BASE_DATE = Date.UTC(2026, 8, 30, 12, 0, 0)\n\nfunction image(url: MockImageUrl, seed: string, alt: string): Image {\n return { url: url(seed), alt, width: 800, height: 800 }\n}\n\nexport function buildProducts(currency: string, imageUrl: MockImageUrl = MOCK_IMAGE_URL): Product[] {\n return PRODUCT_SPECS.map((spec, pi) => {\n const options = spec.options ?? []\n const combos = options.length ? cartesian(options) : [{}]\n const images = [image(imageUrl, spec.handle, spec.title), image(imageUrl, `${spec.handle}-2`, `${spec.title}, detalle`)]\n const variants: ProductVariant[] = combos.map((opts, vi) => {\n const delta = Object.values(opts).reduce((sum, v) => sum + (spec.priceDelta?.[v] ?? 0), 0)\n const price = spec.price + delta\n const stock = typeof spec.stock === 'function' ? spec.stock(vi, opts) : (spec.stock ?? 12)\n const title = Object.values(opts).join(' / ') || 'Predeterminado'\n const firstValue = Object.values(opts)[0]\n return {\n id: `var_${pi + 1}_${vi + 1}`,\n sku: `${spec.handle.toUpperCase().replace(/-/g, '')}-${vi + 1}`.slice(0, 32),\n title,\n selected_options: Object.entries(opts).map(([name, value]) => ({ name, value })),\n price: money(price, currency),\n compare_at_price: spec.compareAt ? money(spec.compareAt + delta, currency) : null,\n available_for_sale: stock > 0,\n quantity_available: stock,\n image: firstValue ? image(imageUrl, `${spec.handle}-${firstValue}`, `${spec.title} ${firstValue}`) : null,\n barcode: `75000000${String(pi * 100 + vi).padStart(5, '0')}`,\n }\n })\n const prices = variants.map((v) => Number(v.price.amount))\n const compares = variants.map((v) => (v.compare_at_price ? Number(v.compare_at_price.amount) : null)).filter((n): n is number => n !== null)\n const collection = COLLECTION_SPECS.find((c) => c.handle === spec.collection)!\n return {\n id: `prod_${pi + 1}`,\n handle: spec.handle,\n title: spec.title,\n description: spec.description,\n description_html: `<p>${spec.description}</p>`,\n vendor: spec.vendor,\n product_type: spec.type,\n category: { id: `cat_${spec.collection}`, handle: collection.handle, title: collection.title },\n tags: spec.tags ?? [],\n attributes: spec.attributes ?? {},\n featured_image: images[0] ?? null,\n images,\n options,\n variants,\n price_range: { min: money(Math.min(...prices), currency), max: money(Math.max(...prices), currency) },\n compare_at_price_range: compares.length\n ? { min: money(Math.min(...compares), currency), max: money(Math.max(...compares), currency) }\n : null,\n available_for_sale: variants.some((v) => v.available_for_sale),\n seo: { title: `${spec.title} | Mi tienda`, description: spec.description },\n updated_at: new Date(BASE_DATE - pi * 86_400_000).toISOString(),\n }\n })\n}\n\n/** Product handle → collection handles. */\nexport function buildMemberships(): Record<string, string[]> {\n const out: Record<string, string[]> = {}\n for (const p of PRODUCT_SPECS) out[p.handle] = [p.collection]\n return out\n}\n\nexport function buildCollections(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Collection[] {\n return COLLECTION_SPECS.map((c) => ({\n id: `col_${c.handle}`,\n handle: c.handle,\n title: c.title,\n description: c.description,\n image: image(imageUrl, `col-${c.handle}`, c.title),\n seo: { title: `${c.title} | Mi tienda`, description: c.description },\n parent_handle: c.parent ?? null,\n }))\n}\n\nconst MX_TZ = 'America/Mexico_City'\nconst weekdays = (open: string, close: string, days = [1, 2, 3, 4, 5]) => days.map((day) => ({ day, open, close }))\n\n/** Three example branches (CDMX, Monterrey, Guadalajara) with structured hours. */\nexport function buildLocations(currency: string): Location[] {\n const contacts = (phone: string | null) => ({ phone, email: null, whatsapp: null })\n return [\n {\n id: 'br_centro', name: 'Sucursal Centro', kind: 'store', address: 'Av. Principal 100, Col. Centro', city: 'Ciudad de México', postal_code: '06000',\n phone: '+52 55 0000 0001', lat: 19.4326, lng: -99.1332, timezone: MX_TZ,\n hours: 'Mo-Fr 09:00-19:00, Sa 09:00-14:00', opening_hours_text: 'Lun–Vie 9:00–19:00 · Sáb 9:00–14:00',\n opening_hours: { weekly: [...weekdays('09:00', '19:00'), { day: 6, open: '09:00', close: '14:00' }] },\n services: ['pickup', 'returns'], contacts: contacts('+52 55 0000 0001'),\n pickup: { enabled: true, fee: null, prep_days: 0 },\n },\n {\n id: 'br_norte', name: 'Sucursal Norte', kind: 'store', address: 'Calle Secundaria 25, Col. Norte', city: 'Monterrey', postal_code: '64000',\n phone: null, lat: 25.6866, lng: -100.3161, timezone: MX_TZ,\n hours: 'Mo-Sa 10:00-18:00', opening_hours_text: 'Lun–Sáb 10:00–18:00',\n opening_hours: { weekly: weekdays('10:00', '18:00', [1, 2, 3, 4, 5, 6]) },\n services: ['pickup'], contacts: contacts(null),\n pickup: { enabled: true, fee: money(30, currency), prep_days: 1 },\n },\n {\n id: 'br_occidente', name: 'Punto de recolección Occidente', kind: 'pickup_point', address: 'Av. Vallarta 1500, Col. Americana', city: 'Guadalajara', postal_code: '44100',\n phone: '+52 33 0000 0003', lat: 20.6736, lng: -103.3897, timezone: MX_TZ,\n hours: 'Mo-Fr 11:00-20:00', opening_hours_text: 'Lun–Vie 11:00–20:00',\n opening_hours: { weekly: weekdays('11:00', '20:00') },\n services: ['pickup'], contacts: contacts('+52 33 0000 0003'),\n pickup: { enabled: false, fee: null, prep_days: 2 },\n },\n ]\n}\n\n/** Postal-code centroids the mock can resolve (the real API resolves any Mexican CP). */\nexport const MOCK_POSTAL_CENTROIDS: Record<string, { lat: number; lng: number }> = {\n '06000': { lat: 19.4326, lng: -99.1332 },\n '64000': { lat: 25.6714, lng: -100.309 },\n '44100': { lat: 20.6767, lng: -103.3475 },\n '03100': { lat: 19.3885, lng: -99.1719 },\n}\n\nexport function buildShop(currency: string, imageUrl: MockImageUrl = MOCK_IMAGE_URL): Shop {\n return {\n name: 'Mi tienda',\n description: 'Tienda de ejemplo para desarrollar sin backend.',\n domain: 'mi-tienda.example',\n currency_code: currency,\n locale: 'es-MX',\n locales: ['es-MX', 'en-US'],\n country_code: 'MX',\n logo: { url: imageUrl('logo', 256, 256), alt: 'Mi tienda', width: 256, height: 256 },\n contact: { email: 'hola@mi-tienda.example', phone: '+52 55 0000 0000', whatsapp: '+5215500000000' },\n branches: buildLocations(currency),\n policies: { free_shipping_min: money(999, currency), returns_days: 30 },\n }\n}\n\nexport function buildTheme(): Theme {\n return {\n tokens: {\n background: '#ffffff',\n foreground: '#111827',\n primary: '#0f766e',\n 'primary-foreground': '#ffffff',\n secondary: '#f1f5f9',\n 'secondary-foreground': '#0f172a',\n muted: '#f8fafc',\n 'muted-foreground': '#64748b',\n accent: '#f59e0b',\n 'accent-foreground': '#111827',\n border: '#e2e8f0',\n destructive: '#dc2626',\n },\n fonts: { heading: 'Inter', body: 'Inter' },\n radius: '0.5rem',\n }\n}\n\nexport function buildPages(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Page[] {\n return [\n {\n handle: 'home',\n title: 'Inicio',\n seo: { title: 'Mi tienda', description: 'Ropa, hogar, accesorios y llantas con envío a todo el país.' },\n sections: [\n { id: 'hero-1', type: 'hero', props: { title: 'Todo lo que necesitas, en un solo lugar', subtitle: 'Envío gratis desde $999', cta_label: 'Ver productos', cta_url: '/collections/ropa', image: imageUrl('hero', 1600, 700) } },\n { id: 'grid-1', type: 'product_grid', props: { title: 'Lo más nuevo', collection: 'ropa', limit: 8 } },\n { id: 'collections-1', type: 'collection_list', props: { title: 'Compra por categoría', handles: ['ropa', 'hogar', 'accesorios', 'llantas'] } },\n { id: 'text-1', type: 'rich_text', props: { title: 'Sobre nosotros', html: '<p>Somos una tienda de ejemplo. Edita este texto desde el panel.</p>' } },\n {\n id: 'faq-1',\n type: 'faq',\n props: {\n title: 'Preguntas frecuentes',\n items: [\n { question: '¿Cuánto tarda el envío?', answer: 'De 2 a 5 días hábiles.' },\n { question: '¿Puedo recoger en tienda?', answer: 'Sí, elige recoger en sucursal al pagar.' },\n { question: '¿Cómo pido factura?', answer: 'Desde tu cuenta, en el detalle del pedido.' },\n ],\n },\n },\n ],\n },\n legal('terminos', 'Términos y condiciones', 'Al comprar en Mi tienda aceptas estos términos.'),\n legal('privacidad', 'Aviso de privacidad', 'Tratamos tus datos solo para procesar tus pedidos.'),\n legal('devoluciones', 'Política de devoluciones', 'Tienes 30 días para devolver tu compra.'),\n ]\n}\n\nfunction legal(handle: string, title: string, body: string): Page {\n return {\n handle,\n title,\n seo: { title: `${title} | Mi tienda`, description: body },\n sections: [{ id: `${handle}-text`, type: 'rich_text', props: { title, html: `<p>${body}</p>` } }],\n }\n}\n\nexport function buildMenus(): Menu[] {\n return [\n {\n handle: 'main',\n items: [\n { title: 'Inicio', url: '/' },\n {\n title: 'Tienda',\n url: '/search',\n items: COLLECTION_SPECS.map((c) => ({ title: c.title, url: `/collections/${c.handle}` })),\n },\n { title: 'Blog', url: '/blogs/noticias' },\n ],\n },\n {\n handle: 'footer',\n items: [\n { title: 'Términos y condiciones', url: '/pages/terminos' },\n { title: 'Aviso de privacidad', url: '/pages/privacidad' },\n { title: 'Devoluciones', url: '/pages/devoluciones' },\n ],\n },\n ]\n}\n\nexport function buildArticles(imageUrl: MockImageUrl = MOCK_IMAGE_URL): Article[] {\n return [\n {\n id: 'art_1',\n handle: 'como-elegir-llantas',\n title: 'Cómo elegir las llantas correctas',\n excerpt: 'Lee la medida en el costado de tu llanta: ancho, perfil y rin.',\n content_html: '<p>La medida 205/55 R16 indica 205 mm de ancho, perfil del 55 % y rin de 16 pulgadas.</p>',\n image: image(imageUrl, 'blog-llantas', 'Llantas'),\n author: 'Equipo Mi tienda',\n tags: ['llantas', 'guías'],\n published_at: '2026-09-15T15:00:00.000Z',\n seo: { title: 'Cómo elegir llantas | Mi tienda', description: 'Guía rápida para leer la medida de tus llantas.' },\n },\n {\n id: 'art_2',\n handle: 'cuidado-prendas-algodon',\n title: 'Cuida tus prendas de algodón',\n excerpt: 'Tres consejos para que tus playeras duren más.',\n content_html: '<p>Lava en frío, seca a la sombra y plancha al revés.</p>',\n image: image(imageUrl, 'blog-algodon', 'Prendas de algodón'),\n author: 'Equipo Mi tienda',\n tags: ['ropa', 'guías'],\n published_at: '2026-09-01T15:00:00.000Z',\n seo: { title: 'Cuida tus prendas | Mi tienda', description: 'Consejos de lavado para prendas de algodón.' },\n },\n ]\n}\n\nexport function buildCustomers(): Customer[] {\n return [\n {\n id: 'cus_1',\n email: MOCK_CUSTOMER_EMAIL,\n phone: '+525500000002',\n first_name: 'Cliente',\n last_name: 'Demo',\n default_address_id: null,\n created_at: '2026-01-10T12:00:00.000Z',\n },\n ]\n}\n","// Subject kinds for the mock («My items», contract 1.9). A store that declares none (the default) has no such section;\n// pass `subjectKinds: MOCK_SUBJECT_KINDS` to rehearse one that declares a «garage» (a cascade catalog with model years\n// and a private field) and a catalog-less «size».\nimport type { SubjectKind } from '../types.js'\n\nexport const MOCK_SUBJECT_KINDS: SubjectKind[] = [\n {\n key: 'vehicle',\n label: 'Vehículo',\n label_plural: 'Mi garage',\n max_per_account: 3,\n attach_to_order: true,\n fit_key_template: '{make}/{model}/{year}/{engine}',\n fields: [\n { key: 'make', label: 'Marca', type: 'select', source: 'catalog', required: true },\n { key: 'model', label: 'Modelo', type: 'select', source: 'catalog', depends_on: 'make', required: true },\n { key: 'year', label: 'Año', type: 'year', source: 'catalog', depends_on: 'model', required: true },\n { key: 'engine', label: 'Versión / motor', type: 'select', source: 'catalog', depends_on: 'year' },\n { key: 'plate', label: 'Placas (opcional)', type: 'text', max: 12, private: true },\n ],\n catalog: {\n version: 'mock-1',\n tree: {\n nissan: {\n label: 'Nissan',\n children: {\n np300: {\n label: 'NP300 Frontier',\n from: 2008,\n to: 2022,\n children: { '2.5': { label: '2.5 L', ranges: [[2010, 2015]] }, '2.4': { label: '2.4 L' } },\n },\n versa: { label: 'Versa', from: 2012, to: 2024, children: { '1.6': { label: '1.6 L' } } },\n },\n },\n ford: { label: 'Ford', children: { f150: { label: 'F-150', from: 2000, to: 2020, children: { '5.0': { label: '5.0 L' } } } } },\n },\n },\n },\n {\n key: 'size',\n label: 'Talla',\n label_plural: 'Mis tallas',\n max_per_account: 5,\n fit_key_template: '{garment}/{value}',\n fields: [\n { key: 'garment', label: 'Prenda', type: 'text', required: true },\n { key: 'value', label: 'Talla', type: 'text', required: true, max: 8 },\n ],\n catalog: null,\n },\n]\n","/**\n * In-memory implementation of the whole Storefront API v1 contract, exposed\n * as a `fetch` function. Use it to develop and test storefronts without OPS:\n *\n * const mock = createMockStorefront()\n * const sf = createStorefrontClient({ baseUrl: 'https://mock.local/api/gw', token: 'sk_mock', fetch: mock.fetch })\n */\nimport type {\n Address,\n Availability,\n InsufficientStockLine,\n Article,\n Cart,\n CartLine,\n CartRecommendation,\n Collection,\n Customer,\n CustomerCapabilities,\n CustomerSession,\n FiscalIdentity,\n FiscalProfile,\n FiscalProfileInput,\n InvoiceRequest,\n InvoiceDoc,\n InvoiceFile,\n InvoiceStage,\n InvoiceSummary,\n Facet,\n Location,\n Menu,\n Order,\n PendingPayment,\n Page,\n PaymentAttemptResult,\n PaymentConfig,\n PaymentMethod,\n Product,\n ProductVariant,\n PromotionAnnouncement,\n Region,\n ShippingRate,\n Shop,\n StorefrontErrorCode,\n Subject,\n SubjectKind,\n Theme,\n} from '../types.js'\nimport { nextAction, orderProgress, orderShipments, shipmentsStatus, sortTrackingEvents, isTestShipment } from '../order-progress.js'\nimport { isValidPoint, rankByDistance } from '../geo.js'\nimport { resolveAvailability } from '../availability.js'\nimport { buildAccountOrders, buildPendingPayments } from './account-seed.js'\nimport { MOCK_REGION_MX, maskTaxId, validateInvoiceRequest } from './region.js'\nimport { isMasked, PRIVATE_MASK, resolveSubject, type SubjectValues } from '../subjects.js'\nimport {\n MOCK_CURRENCY,\n MOCK_IMAGE_URL,\n buildArticles,\n buildCollections,\n MOCK_POSTAL_CENTROIDS,\n buildCustomers,\n buildMemberships,\n buildMenus,\n buildPages,\n buildProducts,\n buildShop,\n buildTheme,\n type MockImageUrl,\n} from './seed.js'\n\nexport { MOCK_CURRENCY, MOCK_CUSTOMER_EMAIL, MOCK_IMAGE_URL, MOCK_POSTAL_CENTROIDS } from './seed.js'\nexport { MOCK_SUBJECT_KINDS } from './subjects.js'\nexport { MOCK_CSF_RULES, MOCK_FISCAL_ID_MX, MOCK_IDENTITY_DOCUMENT_MX_CSF, MOCK_REGION_MX } from './region.js'\nexport type { MockImageUrl } from './seed.js'\n\nexport type MockStorefrontOptions = {\n /** Currency for all prices (default `MXN`). */\n currency?: string\n /** Image URL builder for seed data (default: picsum.photos placeholders). */\n imageUrl?: MockImageUrl\n /** OTP code accepted by `/customer/session` (default `000000`). */\n otpCode?: string\n /**\n * What `GET /customer/capabilities` reports (default `{ password: true, email_verification: true, otp_channels: ['email'] }`).\n * `password: false` makes register / login / password routes answer `403`; `email_verification: false` makes `register`\n * create the account straight away (`201`).\n */\n customerCapabilities?: Partial<CustomerCapabilities>\n /**\n * Scopes the mock's `sk_`/`pk_` tokens do NOT have (e.g. `['customer:write']`), to rehearse an under-provisioned\n * store. Routes needing one answer `403 insufficient_scope` with `required_scopes`; `GET /_token` lists them in\n * `missing_scopes`; and `customer/capabilities` reports `password: false`, `unavailable_reason: 'missing_scope'`\n * when `customer:write` is among them. Implies scope enforcement.\n */\n missingScopes?: string[]\n /** Failed password logins per email before `429 rate_limited` (default 5; a success or a reset clears the count). */\n maxLoginAttempts?: number\n /** Discount codes → percentage off the subtotal (default `{ BIENVENIDA10: 10 }`). */\n discountCodes?: Record<string, number>\n /** Flat shipping rate (default 149). Free from `shop.policies.free_shipping_min`. */\n flatShipping?: number\n /** Enforce token scopes (`pk_` cannot checkout or use customer routes). Default true. */\n enforceScopes?: boolean\n /**\n * Mock `show_stock`: `low_stock_threshold:N` semantics. At or below this quantity a variant is `low_stock`\n * and only then `availability.quantity` is published (default 5; `0` disables `low_stock`).\n */\n lowStockThreshold?: number\n /** Artificial latency per request, in ms (default 0). */\n latencyMs?: number\n /** Override seed data. */\n shop?: Partial<Shop>\n products?: Product[]\n collections?: Collection[]\n /** Product handle → collection handles (required when overriding `products`). */\n memberships?: Record<string, string[]>\n theme?: Theme\n pages?: Page[]\n menus?: Menu[]\n articles?: Article[]\n /** Entry pop-up announcements served by `GET /storefront/promotions` (default none). */\n announcements?: PromotionAnnouncement[]\n /** Payment attempts allowed per checkout before `429 too_many_attempts` (default 5). */\n maxPaymentAttempts?: number\n /**\n * Carrier-style rates served by `delivery-options` instead of the flat / express pair (to design a checkout with\n * carriers, ETAs and quote deadlines). `expires_at` missing: 24 h from the request. Free shipping still applies.\n */\n shippingRates?: ShippingRate[]\n /**\n * `fixed_when_free`: past `policies.free_shipping_min` `delivery-options` serves ONLY the shop's free rate and flags\n * `free` / `fixed` (what the `storefront_cart` addon does with the setting of the same name). Default: the usual list.\n */\n shippingQuoteMode?: 'carriers' | 'fixed_when_free'\n /** Methods served by `payment-methods` (default one builtin `mock`). */\n paymentMethods?: PaymentMethod[]\n /**\n * What `GET /storefront/region` serves (default `MOCK_REGION_MX`, with its `MX:csf` identity document). `null`: the\n * organization has no region, the route answers `404` and invoice requests are not validated against a region.\n */\n region?: Region | null\n /**\n * The kinds of buyer item («My items») the store declares, served by `GET /subject-kinds` and enforced by\n * `customer.subjects`. Default none: no such section, as in a store that declares nothing (`MOCK_SUBJECT_KINDS` has two).\n */\n subjectKinds?: SubjectKind[]\n}\n\ntype CartRecord = {\n id: string\n lines: { id: string; variant_id: string; quantity: number }[]\n codes: string[]\n buyer: Cart['buyer']\n shipping_address: Address | null\n delivery: Cart['delivery']\n note: string | null\n /** Invoice asked for (`PUT /carts/:id/invoice`). */\n invoice: InvoiceRequest | null\n checkedOut: boolean\n updated_at: string\n}\n\nexport type MockState = {\n shop: Shop\n products: Product[]\n collections: Collection[]\n memberships: Record<string, string[]>\n theme: Theme\n pages: Page[]\n menus: Menu[]\n articles: Article[]\n carts: Map<string, CartRecord>\n customers: Customer[]\n addresses: Map<string, Address[]>\n /** Saved fiscal profiles by customer id (contract 1.9). */\n fiscalProfiles: Map<string, FiscalProfile[]>\n /** Saved items by customer id (contract 1.9); `private` holds the values the API only returns masked. */\n subjects: Map<string, (Subject & { private: Record<string, string> })[]>\n orders: (Order & { customer_id: string | null })[]\n otps: Map<string, string>\n /** Email → password (plain text: it is a mock). The seed customer starts without one. */\n passwords: Map<string, string>\n /** Registrations waiting for their code, by email. */\n pendingRegistrations: Map<string, { password: string; first_name: string | null; last_name: string | null }>\n /** Consecutive failed password logins by email. */\n loginFailures: Map<string, number>\n sessions: Map<string, string>\n /** What «Devices» shows for each session token (contract 1.9). */\n sessionInfo: Map<string, { id: string; customer_id: string; created_at: string; last_used_at: string; login_method: string; reauth_at: number | null }>\n /** Wrong re-authentications per customer (5 and the mock answers 429). */\n reauthFailures: Map<string, number>\n /** Data exports served per customer (3 a day). */\n exportsServed: Map<string, number>\n /** Tokens of accounts that were deleted: deleting again answers 204, as the server does. */\n deletedTokens: Set<string>\n idempotency: Map<string, { status: number; body: unknown }>\n checkouts: Map<string, unknown>\n /** Payment attempts per checkout (`n`, last result). */\n payments: Map<string, { attempts: number; last: PaymentAttemptResult | null }>\n /** `contact|sku` of accepted \"notify me\" subscriptions. */\n restock: Set<string>\n /** Cash vouchers waiting for payment (`GET /customer/pending-payments`); `cus_1` only. */\n pendingPayments: PendingPayment[]\n /** Invoice requested per order id. */\n invoices: Map<string, { stage: InvoiceStage; request: InvoiceRequest }>\n seq: number\n}\n\nclass HttpError extends Error {\n constructor(\n readonly status: number,\n readonly code: StorefrontErrorCode,\n message: string,\n readonly field?: string,\n readonly details?: unknown,\n readonly requiredScopes?: string[],\n ) {\n super(message)\n }\n}\n\nconst PUBLIC_CACHE = 'public, max-age=60, stale-while-revalidate=600'\nconst PRIVATE_CACHE = 'private, no-store'\n\nconst toCents = (amount: string) => Math.round(Number.parseFloat(amount) * 100)\nconst fromCents = (cents: number, currency: string) => ({ amount: (cents / 100).toFixed(2), currency_code: currency })\n\nfunction fnv1a(input: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(16)\n}\n\nfunction encodeCursor(offset: number): string {\n return btoa(`o:${offset}`)\n}\n\nfunction decodeCursor(cursor: string | null): number {\n if (!cursor) return 0\n try {\n const raw = atob(cursor)\n if (!raw.startsWith('o:')) throw new Error('bad cursor')\n const n = Number(raw.slice(2))\n if (!Number.isInteger(n) || n < 0) throw new Error('bad cursor')\n return n\n } catch {\n throw new HttpError(400, 'validation', 'Invalid cursor', 'after')\n }\n}\n\nfunction paginate<T>(items: T[], search: URLSearchParams, defaultFirst = 24, maxFirst = 100) {\n const first = search.has('first') ? Number(search.get('first')) : defaultFirst\n if (!Number.isInteger(first) || first < 1 || first > maxFirst) throw new HttpError(400, 'validation', `\\`first\\` must be between 1 and ${maxFirst}`, 'first')\n const start = decodeCursor(search.get('after'))\n const nodes = items.slice(start, start + first)\n const end = start + nodes.length\n return {\n nodes,\n page_info: { has_next_page: end < items.length, end_cursor: nodes.length ? encodeCursor(end) : null },\n total_count: items.length,\n }\n}\n\nconst now = () => new Date().toISOString()\n\nexport function createMockStorefront(options: MockStorefrontOptions = {}) {\n const currency = options.currency ?? MOCK_CURRENCY\n const imageUrl = options.imageUrl ?? MOCK_IMAGE_URL\n const otpCode = options.otpCode ?? '000000'\n const capabilities: CustomerCapabilities = {\n password: true,\n email_verification: true,\n otp_channels: ['email'],\n invoicing: {\n available: true,\n countries: ['MX'],\n checkout: 'optional',\n post_purchase: true,\n window_days: 30,\n identity_documents: ['MX:csf'],\n online_verify: false,\n },\n fiscal_profiles: { max: 10 },\n notifications: { channels: ['email'] },\n data_export: true,\n account_delete: true,\n ...((options.subjectKinds?.length ?? 0) > 0 ? { subjects: { kinds: options.subjectKinds!.map((k) => k.key), share_with_workshop: false } } : {}),\n ...options.customerCapabilities,\n }\n const missingScopes = options.missingScopes ?? []\n if (missingScopes.includes('customer:write')) {\n capabilities.password = false\n capabilities.unavailable_reason = 'missing_scope'\n capabilities.missing_scopes = ['customer:write']\n }\n const region = options.region === undefined ? MOCK_REGION_MX : options.region\n const maxLoginAttempts = options.maxLoginAttempts ?? 5\n const MIN_PASSWORD = 10\n const MAX_PASSWORD = 128\n const discountCodes = Object.fromEntries(\n Object.entries(options.discountCodes ?? { BIENVENIDA10: 10 }).map(([k, v]) => [k.toUpperCase(), v]),\n )\n const flatShippingCents = Math.round((options.flatShipping ?? 149) * 100)\n const enforceScopes = options.enforceScopes ?? true\n\n function seed(): MockState {\n return {\n shop: { ...buildShop(currency, imageUrl), ...options.shop },\n products: structuredClone(options.products ?? buildProducts(currency, imageUrl)),\n collections: structuredClone(options.collections ?? buildCollections(imageUrl)),\n memberships: structuredClone(options.memberships ?? buildMemberships()),\n theme: structuredClone(options.theme ?? buildTheme()),\n pages: structuredClone(options.pages ?? buildPages(imageUrl)),\n menus: structuredClone(options.menus ?? buildMenus()),\n articles: structuredClone(options.articles ?? buildArticles(imageUrl)),\n carts: new Map(),\n customers: buildCustomers(),\n addresses: new Map(),\n fiscalProfiles: new Map(),\n subjects: new Map(),\n orders: [\n {\n id: 'ord_seed_1',\n number: '1000',\n status: 'fulfilled',\n created_at: '2026-08-20T18:00:00.000Z',\n total: fromCents(24900, currency),\n customer_id: 'cus_1',\n lines: [\n { title: 'Playera básica', variant_title: 'M / Blanco', sku: null, quantity: 1, unit: fromCents(24900, currency), total: fromCents(24900, currency), image: null },\n ],\n },\n ...buildAccountOrders(currency),\n ],\n pendingPayments: buildPendingPayments(currency, Date.now()),\n otps: new Map(),\n passwords: new Map(),\n pendingRegistrations: new Map(),\n loginFailures: new Map(),\n sessions: new Map(),\n sessionInfo: new Map(),\n reauthFailures: new Map(),\n exportsServed: new Map(),\n deletedTokens: new Set(),\n idempotency: new Map(),\n checkouts: new Map(),\n payments: new Map(),\n restock: new Set(),\n invoices: new Map(),\n seq: 0,\n }\n }\n\n const lowStockThreshold = options.lowStockThreshold ?? 5\n\n /** Recomputes `availability` (and the legacy fields) of every variant/product from `quantity_available`. */\n function syncAvailability(products: Product[]) {\n for (const p of products) {\n for (const v of p.variants) {\n const qty = v.quantity_available\n const sellable = v.available_for_sale && (qty === null || qty > 0)\n v.available_for_sale = sellable\n const low = sellable && qty !== null && lowStockThreshold > 0 && qty <= lowStockThreshold\n v.availability = {\n status: !sellable ? 'out_of_stock' : low ? 'low_stock' : 'in_stock',\n quantity: low ? qty : null,\n max_per_order: sellable ? (qty === null ? null : Math.min(qty, 10)) : null,\n restock_eta: null,\n preorder_release_at: null,\n notify_available: !sellable,\n }\n }\n p.available_for_sale = p.variants.some((v) => v.available_for_sale)\n const rank = ['in_stock', 'low_stock', 'backorder', 'preorder', 'out_of_stock']\n const best = p.variants.map((v) => v.availability as Availability).sort((a, b) => rank.indexOf(a.status) - rank.indexOf(b.status))[0]\n p.availability = best ?? resolveAvailability(p)\n }\n }\n\n let state = seed()\n syncAvailability(state.products)\n const nextId = (prefix: string) => `${prefix}_${(++state.seq).toString(36)}${Math.random().toString(36).slice(2, 8)}`\n\n // -------------------------------------------------------------------------\n // Catalog helpers\n // -------------------------------------------------------------------------\n\n function findVariant(variantId: string): { product: Product; variant: ProductVariant } | null {\n for (const product of state.products) {\n const variant = product.variants.find((v) => v.id === variantId)\n if (variant) return { product, variant }\n }\n return null\n }\n\n const minPriceCents = (p: Product) => toCents(p.price_range.min.amount)\n\n function attrValue(p: Product, key: string): string | null {\n if (key === 'vendor') return p.vendor\n if (key === 'product_type') return p.product_type\n if (key === 'tag') return null\n const v = p.attributes[key]\n return v === undefined ? null : String(v)\n }\n\n function matchesText(p: Product, q: string): number {\n const terms = q.toLowerCase().split(/\\s+/).filter(Boolean)\n const hay = [p.title, p.description, p.vendor ?? '', p.product_type ?? '', ...p.tags, ...Object.values(p.attributes).map(String)]\n .join(' ')\n .toLowerCase()\n let score = 0\n for (const t of terms) {\n if (!hay.includes(t)) return 0\n score += p.title.toLowerCase().includes(t) ? 2 : 1\n }\n return score\n }\n\n function listProducts(search: URLSearchParams) {\n let items = state.products.slice()\n const q = search.get('q')?.trim()\n const scores = new Map<string, number>()\n if (q) {\n items = items.filter((p) => {\n const s = matchesText(p, q)\n scores.set(p.id, s)\n return s > 0\n })\n }\n const collection = search.get('collection')\n if (collection) {\n if (!state.collections.some((c) => c.handle === collection)) throw new HttpError(404, 'not_found', `Collection ${collection} not found`, 'collection')\n items = items.filter((p) => state.memberships[p.handle]?.includes(collection))\n }\n const handles = search.get('handles')\n if (handles) {\n const list = handles.split(',').map((h) => h.trim()).filter(Boolean)\n if (list.length > 100) throw new HttpError(400, 'validation', 'At most 100 handles', 'handles')\n items = items.filter((p) => list.includes(p.handle))\n }\n\n // `tags_any` (contract 1.9) is a hard filter of the base set: facets count inside it, nothing relaxes it.\n const tagsAny = (search.get('tags_any') ?? '').split(',').map((t) => t.trim().toLowerCase()).filter(Boolean)\n if (tagsAny.length > 5 || tagsAny.some((t) => t.length > 120)) throw new HttpError(400, 'validation', 'tags_any takes at most 5 tags of 120 characters', 'tags_any')\n if (tagsAny.length > 0) items = items.filter((p) => p.tags.some((t) => tagsAny.includes(t.toLowerCase())))\n\n // Facets are computed over the base set (text/collection/handles), before refinement.\n const base = items\n\n if (search.get('available') === 'true') items = items.filter((p) => p.available_for_sale)\n const priceMin = search.get('price_min')\n const priceMax = search.get('price_max')\n if (priceMin) items = items.filter((p) => minPriceCents(p) >= Math.round(Number(priceMin) * 100))\n if (priceMax) items = items.filter((p) => minPriceCents(p) <= Math.round(Number(priceMax) * 100))\n\n const filters = new Map<string, string[]>()\n for (const [key, value] of search) {\n if (!key.startsWith('filter.')) continue\n const name = key.slice(7)\n filters.set(name, [...(filters.get(name) ?? []), value])\n }\n for (const [key, values] of filters) {\n if (key === 'tag') items = items.filter((p) => values.some((v) => p.tags.includes(v)))\n else items = items.filter((p) => values.includes(attrValue(p, key) ?? '\\u0000'))\n }\n\n const sort = search.get('sort') ?? 'relevance'\n const sorters: Record<string, (a: Product, b: Product) => number> = {\n relevance: (a, b) => (scores.get(b.id) ?? 0) - (scores.get(a.id) ?? 0),\n price_asc: (a, b) => minPriceCents(a) - minPriceCents(b),\n price_desc: (a, b) => minPriceCents(b) - minPriceCents(a),\n newest: (a, b) => b.updated_at.localeCompare(a.updated_at),\n title_asc: (a, b) => a.title.localeCompare(b.title, 'es'),\n }\n const sorter = sorters[sort]\n if (!sorter) throw new HttpError(400, 'validation', `Unknown sort ${sort}`, 'sort')\n items = items.slice().sort(sorter)\n\n return { ...paginate(items, search), facets: buildFacets(base) }\n }\n\n function buildFacets(products: Product[]): Facet[] {\n const facets: Facet[] = []\n const listFacet = (key: string, label: string, pick: (p: Product) => string | null) => {\n const counts = new Map<string, number>()\n for (const p of products) {\n const v = pick(p)\n if (v !== null && v !== '') counts.set(v, (counts.get(v) ?? 0) + 1)\n }\n if (counts.size === 0) return\n const values = [...counts.entries()]\n .sort(([a], [b]) => a.localeCompare(b, 'es', { numeric: true }))\n .map(([value, count]) => ({ value, label: value, count }))\n facets.push({ key, label, type: 'list', values })\n }\n listFacet('vendor', 'Marca', (p) => p.vendor)\n listFacet('product_type', 'Tipo', (p) => p.product_type)\n const attrKeys = new Set<string>()\n for (const p of products) for (const k of Object.keys(p.attributes)) attrKeys.add(k)\n const labels: Record<string, string> = { width: 'Ancho', aspect: 'Perfil', rim: 'Rin', size_key: 'Medida', load_index: 'Índice de carga', speed_rating: 'Índice de velocidad', runflat: 'Run flat' }\n for (const k of [...attrKeys].sort()) listFacet(k, labels[k] ?? k, (p) => (p.attributes[k] === undefined ? null : String(p.attributes[k])))\n if (products.length) {\n const prices = products.map(minPriceCents)\n const min = Math.min(...prices)\n const max = Math.max(...prices)\n facets.push({\n key: 'price',\n label: 'Precio',\n type: 'price_range',\n values: [\n { value: (min / 100).toFixed(2), label: 'min', count: products.length },\n { value: (max / 100).toFixed(2), label: 'max', count: products.length },\n ],\n })\n }\n return facets\n }\n\n // -------------------------------------------------------------------------\n // Cart helpers\n // -------------------------------------------------------------------------\n\n function getCartRecord(id: string): CartRecord {\n const cart = state.carts.get(id)\n if (!cart) throw new HttpError(404, 'not_found', `Cart ${id} not found`, 'id')\n return cart\n }\n\n function validateLines(lines: unknown, cart?: CartRecord): { variant_id: string; quantity: number }[] {\n if (!Array.isArray(lines)) throw new HttpError(400, 'validation', '`lines` must be an array', 'lines')\n const toCheck: Parameters<typeof checkStock>[0] = []\n const out = lines.map((raw, i) => {\n const l = raw as { variant_id?: unknown; quantity?: unknown }\n if (typeof l.variant_id !== 'string') throw new HttpError(400, 'validation', 'variant_id is required', `lines[${i}].variant_id`)\n const quantity = l.quantity === undefined ? 1 : l.quantity\n if (typeof quantity !== 'number' || !Number.isInteger(quantity) || quantity < 1) {\n throw new HttpError(400, 'validation', 'quantity must be a positive integer', `lines[${i}].quantity`)\n }\n const found = findVariant(l.variant_id)\n if (!found) throw new HttpError(400, 'validation', `Unknown variant ${l.variant_id}`, `lines[${i}].variant_id`)\n const existing = cart?.lines.find((x) => x.variant_id === l.variant_id)\n toCheck.push({ variant: found.variant, quantity: (existing?.quantity ?? 0) + quantity, lineId: existing?.id ?? null, field: `lines[${i}].quantity` })\n return { variant_id: l.variant_id, quantity }\n })\n checkStock(toCheck)\n return out\n }\n\n /** Visible cap for a variant: only published when the mock's show_stock lets the buyer see it. */\n function visibleMax(variant: ProductVariant): number | null {\n const a = variant.availability\n if (!a || a.status === 'out_of_stock') return 0\n return a.status === 'low_stock' ? a.quantity : null\n }\n\n function lineProblem(variant: ProductVariant, quantity: number): CartLine['problem'] {\n if (!variant.available_for_sale) return { code: 'out_of_stock', max_quantity: 0 }\n if (variant.quantity_available !== null && quantity > variant.quantity_available) {\n return { code: 'insufficient_stock', max_quantity: visibleMax(variant) }\n }\n return null\n }\n\n /** Throws one `409 insufficient_stock` listing every affected line; the message never carries quantities. */\n function checkStock(items: { variant: ProductVariant; quantity: number; lineId: string | null; field: string }[]) {\n const bad = items.filter((i) => lineProblem(i.variant, i.quantity))\n if (bad.length === 0) return\n const lines: InsufficientStockLine[] = bad.map((i) => ({\n line_id: i.lineId,\n variant_id: i.variant.id,\n sku: i.variant.sku,\n status: i.variant.availability?.status ?? 'out_of_stock',\n max_quantity: visibleMax(i.variant),\n }))\n throw new HttpError(409, 'insufficient_stock', 'Algunos productos ya no tienen existencias suficientes', bad[0]!.field, { lines })\n }\n\n function addLines(cart: CartRecord, lines: { variant_id: string; quantity: number }[]) {\n for (const l of lines) {\n const existing = cart.lines.find((x) => x.variant_id === l.variant_id)\n if (existing) existing.quantity += l.quantity\n else cart.lines.push({ id: nextId('line'), variant_id: l.variant_id, quantity: l.quantity })\n }\n }\n\n const isKnownCode = (code: string) => code.toUpperCase() in discountCodes\n const percentFor = (code: string) => discountCodes[code.toUpperCase()] ?? 0\n\n function shippingRates(subtotalCents: number): ShippingRate[] {\n const freeMin = state.shop.policies.free_shipping_min\n const free = freeMin !== null && subtotalCents >= toCents(freeMin.amount)\n if (options.shippingRates?.length) {\n const expires = new Date(Date.now() + 24 * 3_600_000).toISOString()\n return options.shippingRates.map((r) => ({ ...r, expires_at: r.expires_at ?? expires, cost: free ? fromCents(0, r.cost.currency_code) : r.cost }))\n }\n // Like the server with `shipping_quote_mode: fixed_when_free`: past the free-shipping minimum the shop's own price is\n // the only rate (no carrier is asked, there is nothing to choose).\n if (free && options.shippingQuoteMode === 'fixed_when_free') return [{ id: 'flat', title: 'Envío gratis', cost: fromCents(0, currency), eta: '2 a 5 días hábiles' }]\n return [\n { id: 'flat', title: free ? 'Envío estándar (gratis)' : 'Envío estándar', cost: fromCents(free ? 0 : flatShippingCents, currency), eta: '2 a 5 días hábiles' },\n { id: 'express', title: 'Envío exprés', cost: fromCents(flatShippingCents + 10000, currency), eta: '1 a 2 días hábiles' },\n ]\n }\n\n function renderCart(cart: CartRecord): Cart {\n const lines: CartLine[] = []\n let subtotal = 0\n let quantity = 0\n for (const l of cart.lines) {\n const found = findVariant(l.variant_id)\n if (!found) continue\n const { product, variant } = found\n const unit = toCents(variant.price.amount)\n subtotal += unit * l.quantity\n quantity += l.quantity\n lines.push({\n id: l.id,\n quantity: l.quantity,\n problem: lineProblem(variant, l.quantity),\n merchandise: {\n ...variant,\n product: { handle: product.handle, title: product.title, featured_image: product.featured_image },\n },\n cost: {\n unit: variant.price,\n total: fromCents(unit * l.quantity, currency),\n compare_at_unit: variant.compare_at_price,\n },\n })\n }\n const codes = cart.codes.map((code) => ({ code, applicable: isKnownCode(code) && subtotal > 0 }))\n const percent = codes.filter((d) => d.applicable).reduce((max, d) => Math.max(max, percentFor(d.code)), 0)\n const discount = Math.round((subtotal * percent) / 100)\n let shipping: number | null = null\n if (cart.delivery.method === 'pickup') shipping = toCents(state.shop.branches.find((b) => b.id === cart.delivery.branch_id)?.pickup?.fee?.amount ?? '0')\n else if (cart.delivery.method === 'shipping' && cart.delivery.rate_id) {\n const rate = shippingRates(subtotal - discount).find((r) => r.id === cart.delivery.rate_id)\n shipping = rate ? toCents(rate.cost.amount) : null\n }\n const total = subtotal - discount + (shipping ?? 0)\n // IVA 16 % included in prices.\n const tax = Math.round(total - total / 1.16)\n return {\n id: cart.id,\n lines,\n total_quantity: quantity,\n discount_codes: codes,\n buyer: { ...cart.buyer },\n shipping_address: cart.shipping_address ? { ...cart.shipping_address } : null,\n delivery: { ...cart.delivery },\n cost: {\n subtotal: fromCents(subtotal, currency),\n discount: fromCents(discount, currency),\n shipping: shipping === null ? null : fromCents(shipping, currency),\n tax: fromCents(tax, currency),\n total: fromCents(total, currency),\n tax_included: true,\n },\n note: cart.note,\n invoice: cart.invoice ? cartInvoiceOf(cart.invoice) : null,\n updated_at: cart.updated_at,\n }\n }\n\n function cartInvoiceOf(inv: InvoiceRequest): NonNullable<Cart['invoice']> {\n const taxId = typeof inv.tax_id === 'string' ? inv.tax_id : typeof inv.rfc === 'string' ? inv.rfc : ''\n const name = typeof inv.legal_name === 'string' ? inv.legal_name : typeof inv.razon_social === 'string' ? inv.razon_social : null\n return {\n requested: true,\n tax_id_masked: taxId ? maskTaxId(taxId) : null,\n legal_name: name,\n country_code: inv.country_code ?? region?.country_code ?? null,\n document_kind: inv.document?.kind ?? null,\n }\n }\n\n /** `null` for \"no invoice\" (absent, `requested: false`), the request when it is valid, a 422 `invoice.<field>` otherwise. */\n function parseInvoice(raw: unknown, prefix = 'invoice'): InvoiceRequest | null {\n if (raw === null || raw === undefined) return null\n if (typeof raw !== 'object' || Array.isArray(raw)) throw new HttpError(400, 'validation', 'invoice must be an object', prefix)\n const inv = raw as InvoiceRequest\n if (inv.requested === false) return null\n const problem = validateInvoiceRequest(region, inv, prefix)\n if (problem) throw new HttpError(422, 'invalid_state', problem.message, problem.field)\n return inv\n }\n\n const orderInvoice = (order: MockState['orders'][number]): InvoiceSummary => {\n const doc = order.invoices?.find((d) => d.kind === 'invoice')\n if (doc) {\n // Seeded document: the summary says what the document says, with no link (the file comes from `invoiceFile`).\n const { id: _id, kind: _k, total: _t, issued_at: _i, cancelled_at: _c, series: _s, folio_number: _f, related_to: _r, links_expire_at: _l, test_mode: _tm, environment: _e, ...summary } = doc\n return { ...summary, url: null, xml_url: null }\n }\n const entry = state.invoices.get(order.id)\n const paid = order.status !== 'pending_payment'\n if (entry) {\n const stage: InvoiceStage = entry.stage === 'awaiting_payment' && paid ? 'queued' : entry.stage\n return { stage, requested: true, status: stage === 'issued' ? 'issued' : 'requested', action: stage === 'awaiting_payment' ? 'wait' : 'none', can_request: false, url: null, xml_url: null }\n }\n return paid\n ? { status: 'not_requested', stage: 'not_requested', requested: false, action: 'request', can_request: true, blocked_reason: null }\n : { status: 'not_requested', stage: 'not_requested', requested: false, action: 'none', can_request: false, blocked_reason: 'awaiting_payment' }\n }\n\n // -------------------------------------------------------------------------\n // Customer helpers\n // -------------------------------------------------------------------------\n\n function requireCustomer(headers: Headers): Customer {\n const token = headers.get('x-customer-token')\n const id = token ? state.sessions.get(token) : undefined\n const customer = id ? state.customers.find((c) => c.id === id) : undefined\n if (!customer) throw new HttpError(401, 'unauthorized', 'Missing or invalid customer session')\n return customer\n }\n\n function identifierOf(body: Record<string, unknown>): string {\n const email = typeof body.email === 'string' ? body.email.trim().toLowerCase() : ''\n const phone = typeof body.phone === 'string' ? body.phone.replace(/\\s+/g, '') : ''\n if (!email && !phone) throw new HttpError(400, 'validation', 'email or phone is required', 'email')\n if (email && !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n return email ? `email:${email}` : `phone:${phone}`\n }\n\n function emailOf(body: Record<string, unknown>): string {\n const email = typeof body.email === 'string' ? body.email.trim().toLowerCase() : ''\n if (!email || !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n return email\n }\n\n function passwordOf(body: Record<string, unknown>, field = 'password'): string {\n const value = body[field]\n if (typeof value !== 'string' || value.length < MIN_PASSWORD || value.length > MAX_PASSWORD) {\n throw new HttpError(400, 'validation', `${field} must be ${MIN_PASSWORD}-${MAX_PASSWORD} characters`, field)\n }\n return value\n }\n\n function requirePasswordEnabled() {\n if (!capabilities.password) throw new HttpError(403, 'forbidden', 'Password accounts are disabled for this store')\n }\n\n function sessionFor(email: string, extra: { first_name?: string | null; last_name?: string | null } = {}): CustomerSession {\n let customer = state.customers.find((c) => c.email === email)\n if (!customer) {\n customer = {\n id: nextId('cus'),\n email,\n phone: null,\n first_name: extra.first_name ?? null,\n last_name: extra.last_name ?? null,\n default_address_id: null,\n created_at: now(),\n }\n state.customers.push(customer)\n }\n const token = `ct_${customer.id}_${Math.random().toString(36).slice(2)}`\n state.sessions.set(token, customer.id)\n trackSession(token, 'password')\n return { token, expires_at: new Date(Date.now() + 30 * 86_400_000).toISOString(), customer }\n }\n\n function trackSession(token: string, loginMethod: string) {\n const at = now()\n state.sessionInfo.set(token, { id: nextId('ses'), customer_id: state.sessions.get(token) ?? '', created_at: at, last_used_at: at, login_method: loginMethod, reauth_at: null })\n }\n\n function validateAddress(body: Record<string, unknown>, partial = false): Partial<Address> {\n const required = ['address1', 'city', 'zip', 'country_code'] as const\n if (!partial) {\n for (const f of required) {\n if (typeof body[f] !== 'string' || !(body[f] as string).trim()) throw new HttpError(400, 'validation', `${f} is required`, f)\n }\n }\n const fields = ['first_name', 'last_name', 'company', 'address1', 'address2', 'city', 'province', 'zip', 'country_code', 'phone'] as const\n const out: Partial<Address> = {}\n for (const f of fields) {\n if (f in body) (out as Record<string, unknown>)[f] = body[f] ?? null\n else if (!partial) (out as Record<string, unknown>)[f] = null\n }\n return out\n }\n\n // -------------------------------------------------------------------------\n // Router\n // -------------------------------------------------------------------------\n\n type Ctx = {\n method: string\n params: string[]\n search: URLSearchParams\n headers: Headers\n body: Record<string, unknown>\n scopes: Set<string>\n }\n type Result = { status?: number; body?: unknown; cache?: 'public' | 'private'; headers?: Record<string, string> }\n type Route = { method: string; pattern: RegExp; scope: string; handler: (ctx: Ctx) => Result | Promise<Result> }\n\n const routes: Route[] = []\n const route = (method: string, path: string, scope: string, handler: Route['handler']) => {\n const pattern = new RegExp('^' + path.replace(/:[a-z_]+/g, '([^/]+)') + '$')\n routes.push({ method, pattern, scope, handler })\n }\n\n const requireNode = <T>(value: T | undefined, what: string, field = 'handle'): T => {\n if (value === undefined) throw new HttpError(404, 'not_found', `${what} not found`, field)\n return value\n }\n\n // Catalog\n route('GET', '/shop', 'catalog:read', () => ({ body: state.shop, cache: 'public' }))\n route('GET', '/region', 'catalog:read', () => {\n if (!region) throw new HttpError(404, 'not_found', 'No region configured')\n return { body: region, cache: 'public' }\n })\n route('GET', '/products', 'catalog:read', ({ search }) => ({ body: listProducts(search), cache: 'public' }))\n route('GET', '/products/:handle', 'catalog:read', ({ params }) => ({\n body: requireNode(state.products.find((p) => p.handle === params[0]), `Product ${params[0]}`),\n cache: 'public',\n }))\n route('GET', '/products/:handle/recommendations', 'catalog:read', ({ params }) => {\n const product = requireNode(state.products.find((p) => p.handle === params[0]), `Product ${params[0]}`)\n const cols = state.memberships[product.handle] ?? []\n const nodes = state.products\n .filter((p) => p.id !== product.id && p.available_for_sale && (state.memberships[p.handle] ?? []).some((c) => cols.includes(c)))\n .slice(0, 4)\n return { body: { nodes }, cache: 'public' }\n })\n route('GET', '/collections', 'catalog:read', ({ search }) => ({ body: paginate(state.collections, search), cache: 'public' }))\n route('GET', '/collections/:handle', 'catalog:read', ({ params }) => ({\n body: requireNode(state.collections.find((c) => c.handle === params[0]), `Collection ${params[0]}`),\n cache: 'public',\n }))\n // Locations. `nearest` must be registered before `:id`. Like the real API it rounds the point to 0.01° and keeps nothing.\n const visibleLocations = () => state.shop.branches as Location[]\n const round2 = (n: number) => Math.round(n * 100) / 100\n const withDistance = (origin: { lat: number; lng: number }) =>\n rankByDistance(visibleLocations(), origin).map(({ item, distanceKm }) => ({ ...item, distance_km: Math.round(distanceKm * 10) / 10 }))\n route('GET', '/locations', 'catalog:read', ({ search }) => {\n const cp = search.get('postal_code')\n const origin = cp ? MOCK_POSTAL_CENTROIDS[cp] : undefined\n return { body: { nodes: origin ? withDistance(origin) : visibleLocations() }, cache: 'public' }\n })\n route('GET', '/locations/nearest', 'catalog:read', ({ search }) => {\n const origin = { lat: Number(search.get('lat') ?? NaN), lng: Number(search.get('lng') ?? NaN) }\n if (search.get('lat') === null || search.get('lng') === null || !isValidPoint(origin)) {\n throw new HttpError(400, 'validation', 'lat and lng must be a valid point', 'lat')\n }\n return { body: { nodes: withDistance({ lat: round2(origin.lat), lng: round2(origin.lng) }) }, cache: 'private' }\n })\n route('GET', '/locations/:id', 'catalog:read', ({ params }) => ({\n body: requireNode(visibleLocations().find((b) => b.id === params[0]), `Location ${params[0]}`, 'id'),\n cache: 'public',\n }))\n route('GET', '/stock', 'catalog:read', ({ search }) => {\n const skus = search.getAll('sku')\n if (skus.length > 250) throw new HttpError(400, 'validation', 'At most 250 SKUs', 'sku')\n const nodes = skus.flatMap((sku) => {\n for (const p of state.products) {\n const v = p.variants.find((x) => x.sku === sku)\n if (v) return [{ sku, quantity_available: v.quantity_available, ...(v.availability ? { availability: v.availability } : {}) }]\n }\n return []\n })\n return { body: { nodes }, cache: 'public' }\n })\n\n // Cart\n route('POST', '/carts', 'cart:write', ({ body }) => {\n const cart: CartRecord = {\n id: nextId('cart'),\n lines: [],\n codes: [],\n buyer: { email: null, phone: null, customer_id: null },\n shipping_address: null,\n delivery: { method: null, rate_id: null, branch_id: null },\n note: null,\n invoice: null,\n checkedOut: false,\n updated_at: now(),\n }\n if (body.lines !== undefined) addLines(cart, validateLines(body.lines))\n state.carts.set(cart.id, cart)\n return { status: 201, body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id', 'cart:write', ({ params }) => ({ body: renderCart(getCartRecord(params[0]!)), cache: 'private' }))\n route('POST', '/carts/:id/lines', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n addLines(cart, validateLines(body.lines, cart))\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PATCH', '/carts/:id/lines', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (!Array.isArray(body.lines)) throw new HttpError(400, 'validation', '`lines` must be an array', 'lines')\n const updates = body.lines as { id?: unknown; quantity?: unknown }[]\n updates.forEach((u, i) => {\n const line = cart.lines.find((l) => l.id === u.id)\n if (!line) throw new HttpError(400, 'validation', `Unknown line ${String(u.id)}`, `lines[${i}].id`)\n if (typeof u.quantity !== 'number' || !Number.isInteger(u.quantity) || u.quantity < 0) {\n throw new HttpError(400, 'validation', 'quantity must be a non-negative integer', `lines[${i}].quantity`)\n }\n })\n checkStock(\n updates.flatMap((u, i) => {\n const line = cart.lines.find((l) => l.id === u.id)!\n return (u.quantity as number) > 0\n ? [{ variant: findVariant(line.variant_id)!.variant, quantity: u.quantity as number, lineId: line.id, field: `lines[${i}].quantity` }]\n : []\n }),\n )\n for (const u of updates) {\n const line = cart.lines.find((l) => l.id === u.id)!\n line.quantity = u.quantity as number\n }\n cart.lines = cart.lines.filter((l) => l.quantity > 0)\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/discount-codes', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (!Array.isArray(body.codes) || body.codes.some((c) => typeof c !== 'string')) {\n throw new HttpError(400, 'validation', '`codes` must be an array of strings', 'codes')\n }\n cart.codes = [...new Set((body.codes as string[]).map((c) => c.trim().toUpperCase()).filter(Boolean))]\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/buyer', 'cart:write', ({ params, body, headers }) => {\n const cart = getCartRecord(params[0]!)\n const email = typeof body.email === 'string' ? body.email.trim() : null\n const phone = typeof body.phone === 'string' ? body.phone.trim() : null\n if (email && !/^[^@\\s]+@[^@\\s]+$/.test(email)) throw new HttpError(400, 'validation', 'Invalid email', 'email')\n const token = headers.get('x-customer-token')\n const customerId = token ? (state.sessions.get(token) ?? null) : null\n cart.buyer = { email: email || null, phone: phone || null, customer_id: customerId }\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/shipping-address', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n cart.shipping_address = validateAddress(body) as Address\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id/delivery-options', 'cart:write', ({ params }) => {\n const cart = renderCart(getCartRecord(params[0]!))\n const net = toCents(cart.cost.subtotal.amount) - toCents(cart.cost.discount.amount)\n const rates = shippingRates(net)\n const free = options.shippingQuoteMode === 'fixed_when_free' && rates.length > 0 && rates.every((r) => toCents(r.cost.amount) === 0)\n return {\n body: { rates, free, fixed: free, pickup: state.shop.branches.filter((b) => b.pickup?.enabled !== false).map((b) => ({ branch_id: b.id, name: b.name, address: b.address, city: b.city })), partial: false, unavailable: [] },\n cache: 'private',\n }\n })\n route('GET', '/carts/:id/payment-methods', 'cart:write', ({ params }) => {\n getCartRecord(params[0]!)\n return { body: { methods: options.paymentMethods ?? [{ key: 'mock', kind: 'builtin', default: true }], market: null }, cache: 'private' }\n })\n route('PUT', '/carts/:id/delivery', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (body.method === 'shipping') {\n const rateId = body.rate_id\n if (typeof rateId !== 'string' || !shippingRates(0).some((r) => r.id === rateId)) {\n throw new HttpError(400, 'validation', 'Unknown rate_id', 'rate_id')\n }\n cart.delivery = { method: 'shipping', rate_id: rateId, branch_id: null }\n } else if (body.method === 'pickup') {\n const branchId = body.branch_id\n if (typeof branchId !== 'string' || !state.shop.branches.some((b) => b.id === branchId && b.pickup?.enabled !== false)) {\n throw new HttpError(400, 'validation', 'Unknown branch_id', 'branch_id')\n }\n cart.delivery = { method: 'pickup', rate_id: null, branch_id: branchId }\n } else {\n throw new HttpError(400, 'validation', 'method must be shipping or pickup', 'method')\n }\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('PUT', '/carts/:id/invoice', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n if (cart.checkedOut) throw new HttpError(409, 'already_checked_out', 'The cart is already an order')\n cart.invoice = parseInvoice(body)\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n // Order note, cross-sell and promotions (contract 1.2)\n route('PUT', '/carts/:id/note', 'cart:write', ({ params, body }) => {\n const cart = getCartRecord(params[0]!)\n const raw = body.note\n if (raw !== null && raw !== undefined && typeof raw !== 'string') throw new HttpError(400, 'validation', 'note must be a string or null', 'note')\n const text = typeof raw === 'string' ? raw.trim() : ''\n if (text.length > 1000) throw new HttpError(400, 'validation', 'note must be at most 1000 characters', 'note')\n cart.note = text || null\n cart.updated_at = now()\n return { body: renderCart(cart), cache: 'private' }\n })\n route('GET', '/carts/:id/recommendations', 'cart:write', ({ params, search }) => {\n const cart = getCartRecord(params[0]!)\n const first = Math.min(8, Math.max(1, Number.parseInt(search.get('first') ?? '4', 10) || 4))\n const inCart = new Set(cart.lines.map((l) => findVariant(l.variant_id)?.product.id))\n const nodes: CartRecommendation[] = []\n for (const p of state.products) {\n if (inCart.has(p.id)) continue\n const variants = p.variants.filter((v) => v.available_for_sale)\n if (variants.length === 0) continue\n nodes.push({\n product: { id: p.id, handle: p.handle, title: p.title, featured_image: p.featured_image, options: p.options, vendor: p.vendor },\n variants,\n default_variant_id: variants[0]!.id,\n source: 'similar',\n unlocks: null,\n })\n if (nodes.length >= first) break\n }\n return { body: { nodes, promotions: null }, cache: 'private' }\n })\n route('GET', '/promotions', 'catalog:read', () => ({\n body: { nodes: [], announcements: options.announcements ?? [] },\n cache: 'public',\n }))\n\n route('POST', '/carts/:id/checkout', 'checkout:write', ({ params, body, headers }) => {\n const key = headers.get('idempotency-key')\n if (key) {\n const prev = state.idempotency.get(`${params[0]}:${key}`)\n if (prev) return { status: prev.status, body: prev.body, cache: 'private' }\n }\n const record = getCartRecord(params[0]!)\n const cart = renderCart(record)\n if (cart.lines.length === 0) throw new HttpError(422, 'invalid_state', 'Cart is empty', 'lines')\n if (!cart.buyer.email && !cart.buyer.phone) throw new HttpError(422, 'invalid_state', 'Buyer email or phone is required', 'buyer')\n if (!cart.delivery.method) throw new HttpError(422, 'invalid_state', 'Delivery method is required', 'delivery')\n if (cart.delivery.method === 'shipping' && !cart.shipping_address) {\n throw new HttpError(422, 'invalid_state', 'Shipping address is required', 'shipping_address')\n }\n if (typeof body.payment_method !== 'string' || !body.payment_method) throw new HttpError(400, 'validation', 'payment_method is required', 'payment_method')\n if (typeof body.return_url !== 'string' || !body.return_url) throw new HttpError(400, 'validation', 'return_url is required', 'return_url')\n // The invoice is checked against the region BEFORE anything is reserved or charged.\n const invoice = body.invoice !== undefined ? parseInvoice(body.invoice) : record.invoice\n // Reserve stock.\n checkStock(record.lines.map((l, i) => ({ variant: findVariant(l.variant_id)!.variant, quantity: l.quantity, lineId: l.id, field: `lines[${i}].quantity` })))\n for (const l of record.lines) {\n const v = findVariant(l.variant_id)!.variant\n if (v.quantity_available !== null) {\n v.quantity_available -= l.quantity\n v.available_for_sale = v.quantity_available > 0\n }\n }\n syncAvailability(state.products)\n\n const orderId = nextId('ord')\n const number = String(Math.max(1000, ...state.orders.map((o) => Number(o.number) || 0)) + 1)\n const customerId = cart.buyer.customer_id ?? state.customers.find((c) => c.email && c.email === cart.buyer.email)?.id ?? null\n state.orders.push({\n id: orderId,\n number,\n status: 'pending_payment',\n created_at: now(),\n total: cart.cost.total,\n customer_id: customerId,\n lines: cart.lines.map((l) => ({\n title: l.merchandise.product.title,\n variant_title: l.merchandise.title,\n sku: l.merchandise.sku,\n quantity: l.quantity,\n unit: l.cost.unit,\n total: l.cost.total,\n image: l.merchandise.image ?? l.merchandise.product.featured_image,\n })),\n })\n const redirect = new URL(`https://mock.local/pay/${orderId}`)\n redirect.searchParams.set('return_url', body.return_url)\n const checkoutId = nextId('chk')\n const result = {\n order: { id: orderId, number },\n payment: { provider: 'mock', status: 'pending', redirect_url: redirect.toString(), client_secret: null, instructions: null },\n checkout: {\n id: checkoutId,\n status: 'pending',\n external_order_id: orderId,\n total: cart.cost.total,\n stock_hold_expires_at: new Date(Date.now() + 30 * 60_000).toISOString(),\n },\n }\n state.checkouts.set(checkoutId, result)\n record.checkedOut = true\n if (invoice) state.invoices.set(orderId, { stage: 'awaiting_payment', request: invoice })\n if (key) state.idempotency.set(`${params[0]}:${key}`, { status: 201, body: result })\n return { status: 201, body: result, cache: 'private' }\n })\n route('GET', '/checkouts/:id', 'checkout:write', ({ params }) => {\n const found = state.checkouts.get(params[0]!)\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n return { body: found, cache: 'private' }\n })\n\n // Embedded payment (contract 1.2). The result depends on the provider token, like the sandbox cardholder names.\n const DECLINES: Record<string, NonNullable<PaymentAttemptResult['payment']['decline_code']>> = {\n tok_OTHE: 'declined',\n tok_CALL: 'call_issuer',\n tok_FUND: 'insufficient_funds',\n tok_SECU: 'invalid_cvc',\n tok_EXPI: 'invalid_expiry',\n tok_FORM: 'invalid_card_data',\n }\n const maxPaymentAttempts = options.maxPaymentAttempts ?? 5\n route('GET', '/checkouts/:id/payment-config', 'checkout:write', ({ params }) => {\n const found = state.checkouts.get(params[0]!) as { checkout: PaymentConfig['checkout'] } | undefined\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n const st = state.payments.get(params[0]!)\n const config: PaymentConfig = {\n provider: 'mock',\n flow: 'embedded',\n option: 'card',\n payable: found.checkout.status === 'pending' && (st?.attempts ?? 0) < maxPaymentAttempts,\n reason: null,\n amount: found.checkout.total,\n currency: found.checkout.total.currency_code,\n public_key: 'TEST-mock-public-key',\n methods: ['card', 'cash'],\n options: [{ key: 'card', redirect: false, max_installments: 12 }, { key: 'cash', redirect: false }],\n client: { kind: 'mock', sdk_url: 'https://mock.local/sdk.js', public_key: 'TEST-mock-public-key' },\n checkout: found.checkout,\n action: st?.last?.payment.action ?? null,\n attempts_left: maxPaymentAttempts - (st?.attempts ?? 0),\n }\n return { body: config, cache: 'private' }\n })\n route('POST', '/checkouts/:id/payment', 'checkout:write', ({ params, body, headers }) => {\n const key = headers.get('idempotency-key')\n if (!key) throw new HttpError(400, 'validation', 'Idempotency-Key header is required', 'Idempotency-Key')\n const id = params[0]!\n const prev = state.idempotency.get(`pay:${id}:${key}`)\n if (prev) return { status: prev.status, body: prev.body, cache: 'private' }\n const found = state.checkouts.get(id) as { checkout: { status: string; external_order_id: string; total: { amount: string; currency_code: string }; stock_hold_expires_at: string | null } } | undefined\n if (!found) throw new HttpError(404, 'not_found', 'Checkout not found')\n const method = body.method\n if (method !== 'card' && method !== 'cash' && method !== 'bank_transfer') throw new HttpError(400, 'validation', 'method must be card, cash or bank_transfer', 'method')\n const data = body.provider_data\n if (typeof data !== 'object' || data === null || Array.isArray(data)) throw new HttpError(400, 'validation', 'provider_data is required', 'provider_data')\n const exp = body.expected_total as { amount?: string } | undefined\n if (exp && exp.amount !== undefined && toCents(exp.amount) !== toCents(found.checkout.total.amount)) {\n throw new HttpError(422, 'price_mismatch', 'The total changed', 'expected_total', { cost: found.checkout.total })\n }\n const st = state.payments.get(id) ?? { attempts: 0, last: null }\n if (found.checkout.status === 'paid' || st.last?.payment.status === 'pending' || st.last?.payment.status === 'requires_action') {\n throw new HttpError(409, 'conflict', 'A payment is already in progress', 'payment_in_progress')\n }\n if (found.checkout.stock_hold_expires_at && Date.parse(found.checkout.stock_hold_expires_at) < Date.now()) {\n throw new HttpError(409, 'expired', 'The reservation expired')\n }\n if (st.attempts >= maxPaymentAttempts) throw new HttpError(429, 'rate_limited', 'too_many_attempts')\n st.attempts += 1\n const token = typeof (data as Record<string, unknown>).token === 'string' ? ((data as Record<string, unknown>).token as string) : ''\n const attemptsLeft = maxPaymentAttempts - st.attempts\n let payment: PaymentAttemptResult['payment']\n if (method !== 'card') {\n const pointId = String((data as Record<string, unknown>).payment_method_id ?? 'oxxo')\n payment = {\n provider: 'mock',\n status: 'requires_action',\n action: {\n type: 'voucher',\n voucher: {\n payment_point: pointId,\n reference: `${pointId.toUpperCase()}-${id.slice(-6).toUpperCase()}`,\n voucher_url: `https://mock.local/voucher/${id}`,\n amount: found.checkout.total.amount,\n currency: found.checkout.total.currency_code,\n expires_at: new Date(Date.now() + 48 * 3_600_000).toISOString(),\n },\n },\n }\n } else if (token in DECLINES) {\n payment = { provider: 'mock', status: 'failed', decline_code: DECLINES[token]!, retryable: true }\n } else if (token === 'tok_CONT') {\n payment = { provider: 'mock', status: 'pending', action: { type: 'none' } }\n } else if (token === 'tok_3DS') {\n payment = { provider: 'mock', status: 'requires_action', action: { type: 'challenge', challenge: { url: 'https://mock.local/3ds', creq: 'creq' } } }\n } else {\n payment = { provider: 'mock', status: 'paid' }\n found.checkout.status = 'paid'\n const order = state.orders.find((o) => o.id === found.checkout.external_order_id)\n if (order) order.status = 'paid'\n }\n payment.outcome =\n payment.status === 'paid' ? 'approved' : payment.status === 'failed' ? 'rejected' : payment.action?.type === 'challenge' ? 'challenge' : 'pending'\n const result: PaymentAttemptResult = { attempt: { n: st.attempts }, payment, checkout: found.checkout as PaymentAttemptResult['checkout'], attempts_left: attemptsLeft }\n st.last = result\n state.payments.set(id, st)\n state.idempotency.set(`pay:${id}:${key}`, { status: 200, body: result })\n return { body: result, cache: 'private' }\n })\n\n // Restock subscriptions (\"notify me when it is back\")\n route('POST', '/restock-subscriptions', 'customer:write', ({ body }) => {\n if (typeof body.sku !== 'string' || !body.sku) throw new HttpError(400, 'validation', 'sku is required', 'sku')\n if (typeof body.locale !== 'string' || !body.locale) throw new HttpError(400, 'validation', 'locale is required', 'locale')\n if (body.consent !== true) throw new HttpError(422, 'invalid_state', 'consent must be true', 'consent')\n const contact = typeof body.email === 'string' && body.email ? body.email.toLowerCase() : typeof body.phone === 'string' ? body.phone : ''\n if (!contact) throw new HttpError(400, 'validation', 'email or phone is required', 'email')\n const known = state.products.some((p) => p.variants.some((v) => v.sku === body.sku))\n if (!known) throw new HttpError(404, 'not_found', `SKU ${body.sku} not found`, 'sku')\n state.restock.add(`${contact}|${body.sku}`)\n return { status: 202, body: { status: 'pending' }, cache: 'private' }\n })\n\n // Customer\n route('POST', '/customer/otp', 'customer:write', ({ body }) => {\n state.otps.set(identifierOf(body), otpCode)\n return { status: 204 }\n })\n route('POST', '/customer/session', 'customer:write', ({ body }) => {\n const id = identifierOf(body)\n if (typeof body.code !== 'string' || state.otps.get(id) !== body.code) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.otps.delete(id)\n const [kind, value] = id.split(/:(.*)/s) as [string, string]\n let customer = state.customers.find((c) => (kind === 'email' ? c.email === value : c.phone === value))\n if (!customer) {\n customer = {\n id: nextId('cus'),\n email: kind === 'email' ? value : null,\n phone: kind === 'phone' ? value : null,\n first_name: null,\n last_name: null,\n default_address_id: null,\n created_at: now(),\n }\n state.customers.push(customer)\n }\n const token = `ct_${customer.id}_${Math.random().toString(36).slice(2)}`\n state.sessions.set(token, customer.id)\n trackSession(token, kind)\n return {\n status: 201,\n body: { token, expires_at: new Date(Date.now() + 30 * 86_400_000).toISOString(), customer },\n cache: 'private',\n }\n })\n route('GET', '/customer/capabilities', 'customer:read', () => ({ body: capabilities, cache: 'private' }))\n route('POST', '/customer/register', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const password = passwordOf(body)\n const text = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : null)\n const first_name = text(body.first_name)\n const last_name = text(body.last_name)\n if (capabilities.email_verification) {\n // Like OPS: with verification the answer is the same whether or not the email already has an account (no\n // enumeration). Proving the mailbox then sets this password on the existing account.\n state.pendingRegistrations.set(email, { password, first_name, last_name })\n state.otps.set(`email:${email}`, otpCode)\n return { status: 202, body: { status: 'verification_required' }, cache: 'private' }\n }\n // Without verification the only way to avoid handing out someone else's session is a 409 (the one residual oracle).\n if (state.passwords.has(email)) throw new HttpError(409, 'conflict', 'An account with this email already exists', 'email')\n state.passwords.set(email, password)\n return { status: 201, body: sessionFor(email, { first_name, last_name }), cache: 'private' }\n })\n route('POST', '/customer/register/verify', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const pending = state.pendingRegistrations.get(email)\n if (!pending || typeof body.code !== 'string' || state.otps.get(`email:${email}`) !== body.code) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.pendingRegistrations.delete(email)\n state.otps.delete(`email:${email}`)\n state.passwords.set(email, pending.password)\n return { status: 201, body: sessionFor(email, pending), cache: 'private' }\n })\n route('POST', '/customer/login', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n if ((state.loginFailures.get(email) ?? 0) >= maxLoginAttempts) {\n throw new HttpError(429, 'rate_limited', 'Too many failed attempts, try again later')\n }\n const stored = state.passwords.get(email)\n if (stored === undefined || typeof body.password !== 'string' || body.password !== stored) {\n state.loginFailures.set(email, (state.loginFailures.get(email) ?? 0) + 1)\n throw new HttpError(401, 'unauthorized', 'Invalid email or password')\n }\n state.loginFailures.delete(email)\n return { status: 201, body: sessionFor(email), cache: 'private' }\n })\n route('PUT', '/customer/password', 'customer:write', ({ headers, body }) => {\n requirePasswordEnabled()\n const customer = requireCustomer(headers)\n const password = passwordOf(body)\n const email = customer.email\n if (!email) throw new HttpError(422, 'invalid_state', 'The account has no email', 'email')\n const current = state.passwords.get(email)\n if (current !== undefined && body.current_password !== current) {\n throw new HttpError(401, 'unauthorized', 'current_password is missing or wrong', 'current_password')\n }\n state.passwords.set(email, password)\n return { status: 204 }\n })\n route('POST', '/customer/password/reset', 'customer:write', ({ body }) => {\n requirePasswordEnabled()\n const email = emailOf(body)\n const password = passwordOf(body)\n if (typeof body.code !== 'string' || state.otps.get(`email:${email}`) !== body.code || !state.customers.some((c) => c.email === email)) {\n throw new HttpError(401, 'unauthorized', 'Invalid or expired code', 'code')\n }\n state.otps.delete(`email:${email}`)\n state.passwords.set(email, password)\n state.loginFailures.delete(email)\n return { status: 204 }\n })\n /** The customer as the API serves it: the fiscal evidence keeps no file hash. */\n const publicCustomer = (c0: Customer): Customer => {\n const c: Customer = { ...c0, locale: c0.locale ?? null, preferences: c0.preferences ?? { notifications: {} } }\n if (!c.fiscal?.document) return c\n const { sha256: _sha, ...document } = c.fiscal.document\n return { ...c, fiscal: { ...c.fiscal, document } }\n }\n route('GET', '/customer', 'customer:read', ({ headers }) => ({ body: publicCustomer(requireCustomer(headers)), cache: 'private' }))\n route('PATCH', '/customer', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const text = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : null)\n if ('first_name' in body) c.first_name = text(body.first_name)\n if ('last_name' in body) c.last_name = text(body.last_name)\n if ('phone' in body) c.phone = text(body.phone)\n if ('locale' in body) c.locale = parseLocale(body.locale)\n if ('preferences' in body) c.preferences = parsePreferences(c.preferences, body.preferences)\n if ('fiscal' in body) {\n if (body.fiscal === null) c.fiscal = null\n else {\n const fiscal = parseInvoice({ ...(body.fiscal as object), requested: true }, 'fiscal') as InvoiceRequest\n const fid: FiscalIdentity = {\n country_code: String(fiscal.country_code ?? region?.country_code ?? ''),\n tax_id: String(fiscal.tax_id ?? fiscal.rfc).toUpperCase(),\n legal_name: String(fiscal.legal_name ?? fiscal.razon_social),\n tax_regime: String(fiscal.tax_regime ?? fiscal.regimen),\n postal_code: String(fiscal.postal_code ?? fiscal.cp),\n invoice_use: String(fiscal.use ?? fiscal.uso_cfdi ?? fiscal.invoice_use ?? '') || null,\n document: fiscal.document ?? null,\n verification: { status: 'reviewed', checked_at: now() },\n }\n c.fiscal = fid\n }\n }\n return { body: publicCustomer(c), cache: 'private' }\n })\n // Account settings (contract 1.9): language, notification preferences, sessions, re-authentication, export, delete.\n const OPTIONAL_EVENTS = new Set(['order_updates', 'shipping', 'restock'])\n const MANDATORY_EVENTS = new Set(['order_confirmation', 'payment', 'invoice', 'security'])\n const CHANNELS = new Set(['email', 'whatsapp'])\n const REAUTH_WINDOW_MS = 5 * 60_000\n const supportedLocales = () => [state.shop.locale, ...state.shop.locales].filter((l, i, a) => l && a.indexOf(l) === i)\n\n function parseLocale(raw: unknown): string | null {\n if (raw === null || (typeof raw === 'string' && !raw.trim())) return null\n if (typeof raw !== 'string') throw new HttpError(400, 'validation', 'locale must be a string', 'locale')\n const tag = raw.trim().replace('_', '-')\n const [lang = '', ...rest] = tag.split('-')\n const canonical = [lang.toLowerCase(), ...rest.map((p) => p.toUpperCase())].join('-')\n const supported = supportedLocales()\n const hit = supported.find((l) => l.toLowerCase() === canonical.toLowerCase()) ?? (rest.length === 0 ? supported.find((l) => l.split('-')[0]!.toLowerCase() === canonical) : undefined)\n if (!hit) throw new HttpError(400, 'validation', 'this store is not available in that language', 'locale')\n return hit\n }\n\n function parsePreferences(current: Customer['preferences'], raw: unknown): Customer['preferences'] {\n if (raw === null) return { notifications: {} }\n if (typeof raw !== 'object' || Array.isArray(raw)) throw new HttpError(400, 'validation', 'preferences must be an object', 'preferences')\n const merged: Record<string, Record<string, boolean>> = structuredClone(current?.notifications ?? {})\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (key !== 'notifications') throw new HttpError(400, 'validation', 'unknown preference', `preferences.${key}`)\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new HttpError(400, 'validation', 'notifications must map each event to its channels', 'preferences.notifications')\n for (const [event, channels] of Object.entries(value as Record<string, unknown>)) {\n const field = `preferences.notifications.${event}`\n if (MANDATORY_EVENTS.has(event)) throw new HttpError(400, 'validation', 'this notification is required and cannot be turned off', field)\n if (!OPTIONAL_EVENTS.has(event)) throw new HttpError(400, 'validation', 'unknown notification', field)\n if (!channels || typeof channels !== 'object' || Array.isArray(channels)) throw new HttpError(400, 'validation', 'each event maps its channels to true or false', field)\n for (const [channel, on] of Object.entries(channels as Record<string, unknown>)) {\n if (!CHANNELS.has(channel)) throw new HttpError(400, 'validation', 'unknown channel', `${field}.${channel}`)\n if (typeof on !== 'boolean') throw new HttpError(400, 'validation', 'each channel must be true or false', `${field}.${channel}`)\n ;(merged[event] ??= {})[channel] = on\n }\n }\n }\n return { notifications: merged }\n }\n\n /** The session of the request (its token); the customer must have one. */\n function sessionOf(headers: Headers) {\n const c = requireCustomer(headers)\n const token = headers.get('x-customer-token')!\n if (!state.sessionInfo.has(token)) trackSession(token, 'email')\n return { c, token, info: state.sessionInfo.get(token)! }\n }\n function requireRecentReauth(info: { reauth_at: number | null }) {\n if (info.reauth_at === null || Date.now() - info.reauth_at > REAUTH_WINDOW_MS) {\n throw new HttpError(403, 'reauth_required', 'confirm your password or a code first (customer.reauth)')\n }\n }\n\n route('GET', '/customer/sessions', 'customer:read', ({ headers }) => {\n const { c, token } = sessionOf(headers)\n const nodes = [...state.sessions.entries()]\n .filter(([, id]) => id === c.id)\n .map(([t]) => ({ t, info: state.sessionInfo.get(t)! }))\n .sort((a, b) => b.info.last_used_at.localeCompare(a.info.last_used_at))\n .map(({ t, info }) => ({\n id: info.id,\n current: t === token,\n device_label: 'Mock browser · Test',\n login_method: info.login_method,\n last_used_at: info.last_used_at,\n created_at: info.created_at,\n }))\n return { body: { nodes }, cache: 'private' }\n })\n route('DELETE', '/customer/sessions/:id', 'customer:write', ({ headers, params }) => {\n const { c, token } = sessionOf(headers)\n const mine = [...state.sessions.entries()].filter(([, id]) => id === c.id).map(([t]) => t)\n if (params[0] === 'others') {\n for (const t of mine) if (t !== token) state.sessions.delete(t)\n return { status: 204 }\n }\n const entry = [...state.sessionInfo.entries()].find(([, i]) => i.id === params[0])\n // A session of someone else and one that never existed are the same 404; a closed one of mine is fine to close again.\n if (!entry || entry[1].customer_id !== c.id) throw new HttpError(404, 'not_found', 'Session not found', 'id')\n state.sessions.delete(entry[0])\n return { status: 204 }\n })\n route('POST', '/customer/reauth', 'customer:write', ({ headers, body }) => {\n const { c, info } = sessionOf(headers)\n const hasPassword = typeof body.password === 'string' && body.password !== ''\n const hasCode = typeof body.otp_code === 'string' && body.otp_code !== ''\n if (hasPassword === hasCode) throw new HttpError(400, 'validation', 'send either password or otp_code', 'password')\n if ((state.reauthFailures.get(c.id) ?? 0) >= 5) throw new HttpError(429, 'rate_limited', 'Too many attempts, try again later')\n const field = hasPassword ? 'password' : 'otp_code'\n const ok = hasPassword\n ? c.email !== null && state.passwords.get(c.email) === body.password\n : [c.email && `email:${c.email}`, c.phone && `phone:${c.phone}`].some((id) => !!id && state.otps.get(id) === body.otp_code)\n if (!ok) {\n state.reauthFailures.set(c.id, (state.reauthFailures.get(c.id) ?? 0) + 1)\n throw new HttpError(400, 'validation', 'could not verify; check the credential and try again', field)\n }\n state.reauthFailures.delete(c.id)\n info.reauth_at = Date.now()\n return { body: { reauth_at: new Date(info.reauth_at).toISOString(), valid_for_seconds: REAUTH_WINDOW_MS / 1000 }, cache: 'private' }\n })\n route('POST', '/customer/data-export', 'customer:write', ({ headers }) => {\n const { c, info } = sessionOf(headers)\n requireRecentReauth(info)\n if ((state.exportsServed.get(c.id) ?? 0) >= 3) throw new HttpError(429, 'rate_limited', 'Three exports a day; try again tomorrow')\n state.exportsServed.set(c.id, (state.exportsServed.get(c.id) ?? 0) + 1)\n const doc = {\n format: 'storefront-customer-data/1',\n exported_at: now(),\n account: { id: c.id, email: c.email, phone: c.phone, first_name: c.first_name, last_name: c.last_name, locale: c.locale ?? null, created_at: c.created_at },\n preferences: c.preferences ?? { notifications: {} },\n addresses: state.addresses.get(c.id) ?? [],\n fiscal_profiles: state.fiscalProfiles.get(c.id) ?? [],\n orders: state.orders.filter((o) => o.customer_id === c.id).map((o) => ({ id: o.id, number: o.number, created_at: o.created_at, status: o.status, total: o.total })),\n }\n return {\n body: {\n filename: `account-data-${now().slice(0, 10)}.json`,\n content_type: 'application/json',\n content_base64: btoa(unescape(encodeURIComponent(JSON.stringify(doc, null, 2)))),\n },\n cache: 'private',\n }\n })\n route('DELETE', '/customer', 'customer:write', ({ headers, body }) => {\n const token = headers.get('x-customer-token')\n if (token && state.deletedTokens.has(token)) return { status: 204 }\n const { c, info } = sessionOf(headers)\n requireRecentReauth(info)\n if (typeof body.confirm !== 'string' || !body.confirm.trim() || body.confirm.length > 100) {\n throw new HttpError(400, 'validation', 'confirm is required: the text the buyer typed', 'confirm')\n }\n const closed = new Set(['fulfilled', 'delivered', 'cancelled'])\n if (state.orders.some((o) => o.customer_id === c.id && !closed.has(o.status))) {\n throw new HttpError(409, 'conflict', 'you have an order in progress; you can delete the account once it is delivered', 'orders')\n }\n if (c.id === 'cus_1' && state.pendingPayments.some((p) => p.status === 'pending_payment')) {\n throw new HttpError(409, 'conflict', 'you have a payment waiting to be completed', 'pending_payments')\n }\n // Personal data goes; orders stay (they keep the customer id) and a new sign-up starts from nothing.\n for (const [t, id] of [...state.sessions.entries()]) {\n if (id === c.id) {\n state.sessions.delete(t)\n state.deletedTokens.add(t)\n }\n }\n if (c.email) state.passwords.delete(c.email)\n state.addresses.delete(c.id)\n state.fiscalProfiles.delete(c.id)\n state.customers = state.customers.filter((x) => x.id !== c.id)\n return { status: 204 }\n })\n\n /**\n * The order as the API serves it. The list is a summary (`shipments_summary`); the detail carries the shipments, invoices,\n * payments, refunds and the address. A sandbox shipment loses its guide, as the real server does in production.\n */\n const orderView = ({ customer_id: _c, ...o }: MockState['orders'][number], detail: boolean): Order => {\n const order: Order = { ...o, invoice: orderInvoice(o as MockState['orders'][number]) }\n if (order.shipments) order.shipments = order.shipments.map((s) => (isTestShipment(s) ? { ...s, tracking_number: null, tracking_url: null } : { ...s, events: sortTrackingEvents(s.events) }))\n order.progress = orderProgress(order)\n order.next_action = nextAction(order)\n const live = orderShipments(order).filter((s) => !isTestShipment(s))\n if (order.shipments?.length) {\n order.shipments_summary = { count: order.shipments.length, status: shipmentsStatus(order) ?? 'pending', carrier: live[0]?.carrier ?? null, ...(live[0]?.tracking_url ? { tracking_url: live[0].tracking_url } : {}) }\n }\n if (!detail) {\n delete order.shipments\n delete order.invoices\n delete order.payments\n delete order.refunds\n delete order.shipping_address\n }\n return order\n }\n route('GET', '/customer/orders', 'orders:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const orders = state.orders.filter((o) => o.customer_id === c.id).sort((a, b) => b.created_at.localeCompare(a.created_at)).map((o) => orderView(o, false))\n return { body: paginate(orders, search, 20), cache: 'private' }\n })\n const findOrder = (headers: Headers, id: string) => {\n const c = requireCustomer(headers)\n return requireNode(state.orders.find((o) => o.id === id && o.customer_id === c.id), `Order ${id}`, 'id')\n }\n route('GET', '/customer/orders/:id', 'orders:read', ({ headers, params }) => ({ body: orderView(findOrder(headers, params[0]!), true), cache: 'private' }))\n route('POST', '/customer/orders/:id/returns', 'customer:write', ({ headers, params, body }) => {\n const order = findOrder(headers, params[0]!)\n if (!Array.isArray(body.lines) || body.lines.length === 0) throw new HttpError(400, 'validation', 'lines are required', 'lines')\n return { status: 201, body: { id: nextId('ret'), order_id: order.id, status: 'requested' }, cache: 'private' }\n })\n route('POST', '/customer/orders/:id/invoice', 'customer:write', ({ headers, params, body }) => {\n const order = findOrder(headers, params[0]!)\n const existing = state.invoices.get(order.id)\n if (existing && existing.stage !== 'awaiting_payment') {\n return { status: existing.stage === 'issued' ? 200 : 202, body: { status: existing.stage === 'issued' ? 'issued' : 'requested', url: null, stage: existing.stage, invoice: orderInvoice(order) }, cache: 'private' }\n }\n const request = parseInvoice({ ...body, requested: true }, 'invoice') as InvoiceRequest\n if (order.status === 'pending_payment') throw new HttpError(409, 'awaiting_payment', 'The order is not paid yet')\n state.invoices.set(order.id, { stage: 'queued', request })\n return { status: 202, body: { status: 'requested', url: null, stage: 'queued', invoice: orderInvoice(order) }, cache: 'private' }\n })\n route('GET', '/customer/pending-payments', 'orders:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const nodes = c.id === 'cus_1' ? state.pendingPayments : []\n return { body: paginate(nodes, search, 20), cache: 'private' }\n })\n route('GET', '/customer/orders/:id/invoices/:invoice_id/:kind', 'orders:read', ({ headers, params }) => {\n const order = findOrder(headers, params[0]!)\n const doc = order.invoices?.find((d: InvoiceDoc) => d.id === params[1])\n if (!doc || (params[2] !== 'pdf' && params[2] !== 'xml')) throw new HttpError(404, 'not_found', 'Invoice file not found', 'invoice_id')\n const pdf = params[2] === 'pdf'\n const text = pdf ? `%PDF-1.4\\n% mock invoice ${doc.id}\\n%%EOF\\n` : `<?xml version=\"1.0\"?><cfdi:Comprobante mock=\"true\" id=\"${doc.id}\"/>`\n const file: InvoiceFile = {\n filename: `${doc.kind === 'credit_note' ? 'nota-de-credito' : 'factura'}-${doc.id}.${params[2]}`,\n content_type: pdf ? 'application/pdf' : 'application/xml',\n content_base64: btoa(text),\n }\n return { body: file, headers: { 'Cache-Control': 'no-store' } }\n })\n // Saved fiscal profiles (contract 1.9): up to MAX_FISCAL_PROFILES per buyer, one default, physical delete.\n const MAX_FISCAL_PROFILES = 10\n const profilesOf = (c: Customer) => state.fiscalProfiles.get(c.id) ?? []\n /** What the API serves: the evidence keeps no file hash. */\n const publicProfile = (p: FiscalProfile): FiscalProfile => {\n if (!p.document) return p\n const { sha256: _sha, ...document } = p.document\n return { ...p, document }\n }\n const personTypeOf = (taxId: string): string | null => {\n for (const [type, pattern] of Object.entries(region?.fiscal_id?.person_patterns ?? {})) if (new RegExp(pattern).test(taxId)) return type\n return null\n }\n /** `Customer.fiscal` mirrors the default profile, as the real server does. */\n const mirrorDefaultProfile = (c: Customer) => {\n const d = profilesOf(c).find((p) => p.is_default)\n c.fiscal = d\n ? { country_code: d.country_code, tax_id: d.tax_id, legal_name: d.legal_name, tax_regime: d.tax_regime, postal_code: d.postal_code, invoice_use: d.invoice_use ?? null, document: d.document ?? null, verification: d.verification ?? null }\n : null\n }\n const profileFields = (body: Record<string, unknown>, base?: FiscalProfile): FiscalIdentity => {\n const merged: Record<string, unknown> = {\n ...(base ? { tax_id: base.tax_id, legal_name: base.legal_name, tax_regime: base.tax_regime, postal_code: base.postal_code, country_code: base.country_code, ...(base.invoice_use ? { use: base.invoice_use } : {}) } : {}),\n ...body,\n requested: true,\n }\n delete merged.label\n delete merged.is_default\n delete merged.verification\n const fiscal = parseInvoice(merged, 'fiscal') as InvoiceRequest\n return {\n country_code: String(fiscal.country_code ?? region?.country_code ?? ''),\n tax_id: String(fiscal.tax_id ?? fiscal.rfc).toUpperCase(),\n legal_name: String(fiscal.legal_name ?? fiscal.razon_social),\n tax_regime: String(fiscal.tax_regime ?? fiscal.regimen),\n postal_code: String(fiscal.postal_code ?? fiscal.cp),\n invoice_use: String(fiscal.use ?? fiscal.uso_cfdi ?? fiscal.invoice_use ?? '') || null,\n document: fiscal.document ?? base?.document ?? null,\n }\n }\n const ownProfile = (c: Customer, id: string | undefined) => {\n const p = profilesOf(c).find((x) => x.id === id)\n if (!p) throw new HttpError(404, 'not_found', 'Fiscal profile not found', 'id')\n return p\n }\n const makeDefault = (c: Customer, id: string) => state.fiscalProfiles.set(c.id, profilesOf(c).map((p) => ({ ...p, is_default: p.id === id })))\n route('GET', '/customer/fiscal-profiles', 'customer:read', ({ headers }) => {\n const c = requireCustomer(headers)\n const nodes = [...profilesOf(c)].sort((a, b) => Number(b.is_default) - Number(a.is_default) || (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))\n return { body: { nodes: nodes.map(publicProfile) }, cache: 'private' }\n })\n route('POST', '/customer/fiscal-profiles', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const list = profilesOf(c)\n const fid = profileFields(body)\n if (list.length >= MAX_FISCAL_PROFILES) throw new HttpError(409, 'conflict', 'Fiscal profile limit reached; delete one first')\n if (list.some((p) => p.country_code === fid.country_code && p.tax_id === fid.tax_id)) throw new HttpError(409, 'conflict', 'A profile with this tax id already exists', 'tax_id')\n const at = now()\n const label = typeof body.label === 'string' && body.label.trim() ? body.label.trim().slice(0, 40) : fid.legal_name.slice(0, 40)\n const profile: FiscalProfile = { ...fid, id: nextId('fisc'), label, person_type: personTypeOf(fid.tax_id), is_default: false, last_used_at: null, created_at: at, updated_at: at, verification: { status: 'unverified', checked_at: null } }\n state.fiscalProfiles.set(c.id, [...list, profile])\n if (list.length === 0 || body.is_default === true) makeDefault(c, profile.id)\n mirrorDefaultProfile(c)\n return { status: 201, body: publicProfile(profilesOf(c).find((p) => p.id === profile.id)!), cache: 'private' }\n })\n route('PATCH', '/customer/fiscal-profiles/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const cur = ownProfile(c, params[0])\n if ('verification' in body) throw new HttpError(400, 'validation', 'verification is set by the server', 'verification')\n if (body.is_default === false && cur.is_default) throw new HttpError(400, 'validation', 'Make another profile the default instead', 'is_default')\n const fid = profileFields(body as FiscalProfileInput as Record<string, unknown>, cur)\n if (profilesOf(c).some((p) => p.id !== cur.id && p.country_code === fid.country_code && p.tax_id === fid.tax_id)) throw new HttpError(409, 'conflict', 'A profile with this tax id already exists', 'tax_id')\n const identityChanged = fid.tax_id !== cur.tax_id || fid.country_code !== cur.country_code\n const updated: FiscalProfile = {\n ...cur,\n ...fid,\n document: 'document' in body ? fid.document : identityChanged ? null : cur.document,\n label: typeof body.label === 'string' && body.label.trim() ? body.label.trim().slice(0, 40) : cur.label,\n person_type: personTypeOf(fid.tax_id),\n verification: identityChanged ? { status: 'unverified', checked_at: null } : cur.verification,\n updated_at: now(),\n }\n state.fiscalProfiles.set(c.id, profilesOf(c).map((p) => (p.id === cur.id ? updated : p)))\n if (body.is_default === true) makeDefault(c, cur.id)\n mirrorDefaultProfile(c)\n return { body: publicProfile(profilesOf(c).find((p) => p.id === cur.id)!), cache: 'private' }\n })\n route('DELETE', '/customer/fiscal-profiles/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const cur = ownProfile(c, params[0])\n const rest = profilesOf(c).filter((p) => p.id !== cur.id)\n state.fiscalProfiles.set(c.id, rest)\n if (cur.is_default && rest[0]) makeDefault(c, rest[0].id)\n mirrorDefaultProfile(c)\n return { status: 204 }\n })\n // Buyer items, «My items» (contract 1.9): kinds are data the store declares; the server validates against them,\n // builds `label` / `fit_key` and keeps private fields apart (returned only masked). Physical delete.\n const MAX_SUBJECTS = 50\n const subjectsOf = (c: Customer) => state.subjects.get(c.id) ?? []\n const kinds = () => options.subjectKinds ?? []\n const publicSubject = (s: Subject & { private: Record<string, string> }): Subject => {\n const { private: priv, ...rest } = s\n return { ...rest, attributes: { ...s.attributes, ...Object.fromEntries(Object.keys(priv).map((k) => [k, PRIVATE_MASK + (priv[k]!.length > 3 ? priv[k]!.slice(-2) : '')])) } }\n }\n const ownSubject = (c: Customer, id: string | undefined) => {\n const s = subjectsOf(c).find((x) => x.id === id)\n if (!s) throw new HttpError(404, 'not_found', 'Item not found', 'id')\n return s\n }\n const setDefaultSubject = (c: Customer, id: string) => {\n const kind = ownSubject(c, id).kind\n state.subjects.set(c.id, subjectsOf(c).map((s) => (s.kind !== kind ? s : s.id === id ? { ...s, is_default: true, last_used_at: now() } : { ...s, is_default: false })))\n }\n const resolveOrThrow = (kind: SubjectKind, values: SubjectValues) => {\n const r = resolveSubject(kind, values)\n if (!r.ok) {\n const [field, code] = Object.entries(r.problems)[0]!\n throw new HttpError(422, 'validation', `${field}: ${code}`, field === '_' ? 'attributes' : `attributes.${field}`)\n }\n return r.subject\n }\n const cleanNickname = (v: unknown): string | null => {\n if (v === undefined || v === null || v === '') return null\n if (typeof v !== 'string' || [...v.trim()].length > 40) throw new HttpError(422, 'validation', 'nickname is too long (max 40)', 'nickname')\n return v.trim().split(/\\s+/).join(' ')\n }\n route('GET', '/subject-kinds', 'content:read', () => ({ body: { nodes: kinds() }, cache: 'public' }))\n route('GET', '/customer/subjects', 'customer:read', ({ headers, search }) => {\n const c = requireCustomer(headers)\n const kind = search.get('kind')\n const nodes = subjectsOf(c)\n .filter((s) => !kind || s.kind === kind)\n .sort((a, b) => a.kind.localeCompare(b.kind) || Number(b.is_default) - Number(a.is_default) || (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))\n return { body: { nodes: nodes.map(publicSubject) }, cache: 'private' }\n })\n route('POST', '/customer/subjects', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const kind = kinds().find((k) => k.key === body.kind)\n if (!kind) throw new HttpError(422, 'validation', 'This store has no such kind', 'kind')\n const attrs = body.attributes\n if (!attrs || typeof attrs !== 'object' || Array.isArray(attrs)) throw new HttpError(422, 'validation', 'attributes must be an object', 'attributes')\n const r = resolveOrThrow(kind, attrs as SubjectValues)\n const list = subjectsOf(c)\n if (list.length >= MAX_SUBJECTS || list.filter((s) => s.kind === kind.key).length >= kind.max_per_account) throw new HttpError(409, 'conflict', 'Limit reached; delete one first', 'kind')\n if (r.fit_key && list.some((s) => s.kind === kind.key && s.fit_key === r.fit_key)) throw new HttpError(409, 'conflict', 'You already saved this item', 'attributes')\n const subject = { id: nextId('subj'), kind: kind.key, label: r.label, nickname: cleanNickname(body.nickname), fit_key: r.fit_key, attributes: r.attributes, private: r.private, is_default: false, last_used_at: null, created_at: now() }\n state.subjects.set(c.id, [...list, subject])\n if (!list.some((s) => s.kind === kind.key) || body.is_default === true) setDefaultSubject(c, subject.id)\n return { status: 201, body: publicSubject(ownSubject(c, subject.id)), cache: 'private' }\n })\n route('PATCH', '/customer/subjects/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const cur = ownSubject(c, params[0])\n if (body.is_default === false && cur.is_default) throw new HttpError(422, 'validation', 'Make another item the default instead', 'is_default')\n let next = { ...cur }\n if ('nickname' in body) next.nickname = cleanNickname(body.nickname)\n if ('attributes' in body) {\n const kind = kinds().find((k) => k.key === cur.kind)\n if (!kind) throw new HttpError(422, 'validation', 'This store no longer offers this kind', 'kind')\n const sent = (body.attributes ?? {}) as Record<string, unknown>\n const merged: Record<string, unknown> = { ...cur.attributes, ...cur.private }\n for (const [k, v] of Object.entries(sent)) {\n if (k in cur.private && isMasked(v)) continue // the mask the client was shown: keep the stored value\n if (v === null) delete merged[k]\n else merged[k] = v\n }\n const r = resolveOrThrow(kind, merged as SubjectValues)\n if (r.fit_key && subjectsOf(c).some((s) => s.id !== cur.id && s.kind === cur.kind && s.fit_key === r.fit_key)) throw new HttpError(409, 'conflict', 'You already saved this item', 'attributes')\n next = { ...next, label: r.label, fit_key: r.fit_key, attributes: r.attributes, private: r.private }\n }\n state.subjects.set(c.id, subjectsOf(c).map((s) => (s.id === cur.id ? next : s)))\n if (body.is_default === true && !cur.is_default) setDefaultSubject(c, cur.id)\n return { body: publicSubject(ownSubject(c, cur.id)), cache: 'private' }\n })\n route('DELETE', '/customer/subjects/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const cur = ownSubject(c, params[0])\n state.subjects.set(c.id, subjectsOf(c).filter((s) => s.id !== cur.id))\n const heir = subjectsOf(c).filter((s) => s.kind === cur.kind).sort((a, b) => (b.last_used_at ?? '').localeCompare(a.last_used_at ?? ''))[0]\n if (cur.is_default && heir) setDefaultSubject(c, heir.id)\n return { status: 204 }\n })\n route('GET', '/customer/addresses', 'customer:read', ({ headers }) => {\n const c = requireCustomer(headers)\n return { body: { nodes: state.addresses.get(c.id) ?? [] }, cache: 'private' }\n })\n route('POST', '/customer/addresses', 'customer:write', ({ headers, body }) => {\n const c = requireCustomer(headers)\n const address = { ...(validateAddress(body) as Address), id: nextId('addr') }\n state.addresses.set(c.id, [...(state.addresses.get(c.id) ?? []), address])\n if (!c.default_address_id) c.default_address_id = address.id\n return { status: 201, body: address, cache: 'private' }\n })\n route('PATCH', '/customer/addresses/:id', 'customer:write', ({ headers, params, body }) => {\n const c = requireCustomer(headers)\n const list = state.addresses.get(c.id) ?? []\n const idx = list.findIndex((a) => a.id === params[0])\n if (idx < 0) throw new HttpError(404, 'not_found', 'Address not found', 'id')\n const updated = { ...list[idx]!, ...validateAddress(body, true), id: list[idx]!.id }\n list[idx] = updated\n return { body: updated, cache: 'private' }\n })\n route('DELETE', '/customer/addresses/:id', 'customer:write', ({ headers, params }) => {\n const c = requireCustomer(headers)\n const list = state.addresses.get(c.id) ?? []\n if (!list.some((a) => a.id === params[0])) throw new HttpError(404, 'not_found', 'Address not found', 'id')\n state.addresses.set(c.id, list.filter((a) => a.id !== params[0]))\n if (c.default_address_id === params[0]) c.default_address_id = null\n return { status: 204 }\n })\n\n // Content\n const previewCache = (search: URLSearchParams): 'public' | 'private' => (search.has('preview') ? 'private' : 'public')\n route('GET', '/content/theme', 'content:read', () => ({ body: state.theme, cache: 'public' }))\n route('GET', '/content/pages/:handle', 'content:read', ({ params, search }) => {\n const page = requireNode(state.pages.find((p) => p.handle === params[0]), `Page ${params[0]}`)\n const body = search.has('preview') ? { ...page, title: `${page.title} (borrador)` } : page\n return { body, cache: previewCache(search) }\n })\n route('GET', '/content/menus/:handle', 'content:read', ({ params }) => ({\n body: requireNode(state.menus.find((m) => m.handle === params[0]), `Menu ${params[0]}`),\n cache: 'public',\n }))\n route('GET', '/content/articles', 'content:read', ({ search }) => {\n let items = state.articles.slice().sort((a, b) => b.published_at.localeCompare(a.published_at))\n const tag = search.get('tag')\n if (tag) items = items.filter((a) => a.tags.includes(tag))\n const q = search.get('q')?.toLowerCase()\n if (q) items = items.filter((a) => `${a.title} ${a.excerpt ?? ''}`.toLowerCase().includes(q))\n return { body: paginate(items, search, 10, 50), cache: 'public' }\n })\n route('GET', '/content/articles/:handle', 'content:read', ({ params, search }) => ({\n body: requireNode(state.articles.find((a) => a.handle === params[0]), `Article ${params[0]}`),\n cache: previewCache(search),\n }))\n\n // -------------------------------------------------------------------------\n // fetch\n // -------------------------------------------------------------------------\n\n function scopesFor(token: string | null): Set<string> | null {\n if (!token) return null\n let all: string[]\n if (token.startsWith('pk_')) all = ['catalog:read', 'content:read', 'cart:write']\n else if (token.startsWith('sk_')) all = ['catalog:read', 'content:read', 'cart:write', 'checkout:write', 'customer:read', 'customer:write', 'orders:read']\n else return null\n return new Set(all.filter((sc) => !missingScopes.includes(sc)))\n }\n\n function json(status: number, body: unknown, headers: Record<string, string> = {}): Response {\n return new Response(status === 204 || body === undefined ? null : JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json; charset=utf-8', ...headers },\n })\n }\n\n function errorResponse(err: HttpError): Response {\n return json(\n err.status,\n { error: { code: err.code, message: err.message, ...(err.field ? { field: err.field } : {}), ...(err.details !== undefined ? { details: err.details } : {}), ...(err.requiredScopes ? { required_scopes: err.requiredScopes } : {}) } },\n { 'Cache-Control': PRIVATE_CACHE },\n )\n }\n\n async function handle(request: Request): Promise<Response> {\n const url = new URL(request.url)\n if (/\\/_token\\/?$/.test(url.pathname)) {\n const tok = request.headers.get('authorization')?.match(/^Bearer\\s+(.+)$/i)?.[1] ?? null\n const granted = scopesFor(tok)\n if (!tok || !granted) return errorResponse(new HttpError(401, 'unauthorized', 'Missing or invalid storefront token'))\n return json(200, { success: true, data: { kind: tok.startsWith('pk_') ? 'publishable' : 'secret', environment: 'sandbox', scopes: [...granted], missing_scopes: missingScopes, connection_id: 'conn_mock', expires_at: null } }, { 'Cache-Control': PRIVATE_CACHE })\n }\n const idx = url.pathname.indexOf('/storefront/')\n if (idx < 0) return errorResponse(new HttpError(404, 'not_found', `No route for ${url.pathname}`))\n const path = url.pathname.slice(idx + '/storefront'.length).replace(/\\/+$/, '') || '/'\n const method = request.method.toUpperCase()\n\n const matching = routes.filter((r) => r.pattern.test(path))\n if (matching.length === 0) return errorResponse(new HttpError(404, 'not_found', `No route for ${method} ${path}`))\n const r = matching.find((x) => x.method === method)\n if (!r) return json(405, { error: { code: 'method_not_allowed', message: `${method} not allowed on ${path}` } }, { Allow: matching.map((x) => x.method).join(', ') })\n\n const auth = request.headers.get('authorization')\n const token = auth?.match(/^Bearer\\s+(.+)$/i)?.[1] ?? null\n const scopes = scopesFor(token)\n if (!scopes) return errorResponse(new HttpError(401, 'unauthorized', 'Missing or invalid storefront token'))\n if ((enforceScopes || missingScopes.length > 0) && !scopes.has(r.scope)) {\n return errorResponse(new HttpError(403, 'insufficient_scope', `Token lacks scope ${r.scope}`, undefined, undefined, [r.scope]))\n }\n\n let body: Record<string, unknown> = {}\n if (method !== 'GET') {\n const text = await request.text()\n if (text) {\n try {\n const parsed: unknown = JSON.parse(text)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) throw new Error('not an object')\n body = parsed as Record<string, unknown>\n } catch {\n return errorResponse(new HttpError(400, 'validation', 'Body must be a JSON object'))\n }\n }\n }\n\n const params = (r.pattern.exec(path) ?? []).slice(1).map((p) => decodeURIComponent(p))\n try {\n const result = await r.handler({ method, params, search: url.searchParams, headers: request.headers, body, scopes })\n const status = result.status ?? 200\n const headers: Record<string, string> = { ...result.headers }\n if (result.cache === 'public') headers['Cache-Control'] = PUBLIC_CACHE\n if (result.cache === 'private') headers['Cache-Control'] = PRIVATE_CACHE\n if (method === 'GET' && result.cache === 'public' && status === 200) {\n const etag = `W/\"${fnv1a(JSON.stringify(result.body))}\"`\n headers.ETag = etag\n if (request.headers.get('if-none-match') === etag) return new Response(null, { status: 304, headers })\n }\n return json(status, result.body, headers)\n } catch (err) {\n if (err instanceof HttpError) return errorResponse(err)\n return json(500, { error: { code: 'server_error', message: err instanceof Error ? err.message : 'Internal error' } })\n }\n }\n\n const mockFetch = async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n if (options.latencyMs) await new Promise((r) => setTimeout(r, options.latencyMs))\n const request = input instanceof Request && !init ? input : new Request(input instanceof Request ? input.url : String(input), init)\n if (request.signal?.aborted) throw request.signal.reason ?? new DOMException('Aborted', 'AbortError')\n return handle(request)\n }\n\n return {\n /** Drop-in `fetch` serving `/storefront/*` from memory. */\n fetch: mockFetch,\n /** Live in-memory state (mutable; useful in tests). */\n get state(): Readonly<MockState> {\n return state\n },\n /** Restores the seed data and clears carts, sessions and orders. */\n reset() {\n state = seed()\n syncAvailability(state.products)\n },\n /** OTP code accepted by `/customer/session`. */\n otpCode,\n }\n}\n\nexport type MockStorefront = ReturnType<typeof createMockStorefront>\n"]}