@asteby/storefront 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mock/seed.ts","../src/mock/index.ts"],"names":["r"],"mappings":"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","file":"mock.cjs","sourcesContent":["import type {\n Article,\n Collection,\n Customer,\n Image,\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\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: [\n { id: 'br_centro', name: 'Sucursal Centro', address: 'Av. Principal 100, Col. Centro', city: 'Ciudad de México', phone: '+52 55 0000 0001', lat: 19.4326, lng: -99.1332, hours: 'Mo-Fr 09:00-19:00, Sa 09:00-14:00' },\n { id: 'br_norte', name: 'Sucursal Norte', address: 'Calle Secundaria 25, Col. Norte', city: 'Monterrey', phone: null, lat: 25.6866, lng: -100.3161, hours: 'Mo-Sa 10:00-18:00' },\n ],\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","/**\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 Article,\n Cart,\n CartLine,\n Collection,\n Customer,\n Facet,\n Menu,\n Order,\n Page,\n Product,\n ProductVariant,\n Shop,\n StorefrontErrorCode,\n Theme,\n} from '../types.js'\nimport {\n MOCK_CURRENCY,\n MOCK_IMAGE_URL,\n buildArticles,\n buildCollections,\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 } from './seed.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 /** 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 /** 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}\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 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 orders: (Order & { customer_id: string | null })[]\n otps: Map<string, string>\n sessions: Map<string, string>\n idempotency: Map<string, { status: number; body: unknown }>\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 ) {\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 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 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 ],\n otps: new Map(),\n sessions: new Map(),\n idempotency: new Map(),\n seq: 0,\n }\n }\n\n let state = seed()\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 // 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 return 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 already = cart?.lines.find((x) => x.variant_id === l.variant_id)?.quantity ?? 0\n checkStock(found.variant, already + quantity, `lines[${i}].quantity`)\n return { variant_id: l.variant_id, quantity }\n })\n }\n\n function checkStock(variant: ProductVariant, quantity: number, field: string) {\n if (!variant.available_for_sale || (variant.quantity_available !== null && quantity > variant.quantity_available)) {\n throw new HttpError(409, 'insufficient_stock', `Only ${variant.quantity_available ?? 0} available for ${variant.sku}`, field)\n }\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) {\n const freeMin = state.shop.policies.free_shipping_min\n const free = freeMin !== null && subtotalCents >= toCents(freeMin.amount)\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 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 = 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 updated_at: cart.updated_at,\n }\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 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', '/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 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 }]\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 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 if (u.quantity > 0) checkStock(findVariant(line.variant_id)!.variant, u.quantity, `lines[${i}].quantity`)\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 return {\n body: { rates: shippingRates(net), pickup: state.shop.branches.map((b) => ({ branch_id: b.id, name: b.name })), 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: [{ 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)) {\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('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 // Reserve stock.\n record.lines.forEach((l, i) => checkStock(findVariant(l.variant_id)!.variant, l.quantity, `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 for (const p of state.products) p.available_for_sale = p.variants.some((v) => v.available_for_sale)\n\n const orderId = nextId('ord')\n const number = String(1001 + state.orders.length - 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 if (key) state.idempotency.set(`${params[0]}:${key}`, { status: 201, body: result })\n return { status: 201, body: result, 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 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', 'customer:read', ({ headers }) => ({ body: requireCustomer(headers), cache: 'private' }))\n const stripOrder = ({ customer_id: _c, ...o }: MockState['orders'][number]): Order => o\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(stripOrder)\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: stripOrder(findOrder(headers, params[0]!)), 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 }) => {\n findOrder(headers, params[0]!)\n return { status: 202, body: { status: 'requested', url: null }, cache: 'private' }\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 if (token.startsWith('pk_')) return new Set(['catalog:read', 'content:read', 'cart:write'])\n if (token.startsWith('sk_')) return new Set(['catalog:read', 'content:read', 'cart:write', 'checkout:write', 'customer:read', 'customer:write', 'orders:read'])\n return null\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(err.status, { error: { code: err.code, message: err.message, ...(err.field ? { field: err.field } : {}) } }, { 'Cache-Control': PRIVATE_CACHE })\n }\n\n async function handle(request: Request): Promise<Response> {\n const url = new URL(request.url)\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 && !scopes.has(r.scope)) return errorResponse(new HttpError(403, 'forbidden', `Token lacks scope ${r.scope}`))\n\n let body: Record<string, unknown> = {}\n if (method !== 'GET' && method !== 'DELETE') {\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 },\n /** OTP code accepted by `/customer/session`. */\n otpCode,\n }\n}\n\nexport type MockStorefront = ReturnType<typeof createMockStorefront>\n"]}
@@ -0,0 +1,95 @@
1
+ import { a1 as Shop, Q as Product, p as Collection, a8 as Theme, P as Page, M as Menu, b as Article, C as Cart, A as Address, r as Customer, O as Order } from './types-CTXB8Dnl.cjs';
2
+
3
+ /**
4
+ * Placeholder image source for all seed data. Swap it (or pass `imageUrl` to
5
+ * `createMockStorefront`) to use your own assets.
6
+ */
7
+ declare const MOCK_IMAGE_URL: (seed: string, width?: number, height?: number) => string;
8
+ type MockImageUrl = typeof MOCK_IMAGE_URL;
9
+ declare const MOCK_CURRENCY = "MXN";
10
+ /** Seed customer that already exists (log in with OTP `000000`). */
11
+ declare const MOCK_CUSTOMER_EMAIL = "cliente@example.com";
12
+
13
+ /**
14
+ * In-memory implementation of the whole Storefront API v1 contract, exposed
15
+ * as a `fetch` function. Use it to develop and test storefronts without OPS:
16
+ *
17
+ * const mock = createMockStorefront()
18
+ * const sf = createStorefrontClient({ baseUrl: 'https://mock.local/api/gw', token: 'sk_mock', fetch: mock.fetch })
19
+ */
20
+
21
+ type MockStorefrontOptions = {
22
+ /** Currency for all prices (default `MXN`). */
23
+ currency?: string;
24
+ /** Image URL builder for seed data (default: picsum.photos placeholders). */
25
+ imageUrl?: MockImageUrl;
26
+ /** OTP code accepted by `/customer/session` (default `000000`). */
27
+ otpCode?: string;
28
+ /** Discount codes → percentage off the subtotal (default `{ BIENVENIDA10: 10 }`). */
29
+ discountCodes?: Record<string, number>;
30
+ /** Flat shipping rate (default 149). Free from `shop.policies.free_shipping_min`. */
31
+ flatShipping?: number;
32
+ /** Enforce token scopes (`pk_` cannot checkout or use customer routes). Default true. */
33
+ enforceScopes?: boolean;
34
+ /** Artificial latency per request, in ms (default 0). */
35
+ latencyMs?: number;
36
+ /** Override seed data. */
37
+ shop?: Partial<Shop>;
38
+ products?: Product[];
39
+ collections?: Collection[];
40
+ /** Product handle → collection handles (required when overriding `products`). */
41
+ memberships?: Record<string, string[]>;
42
+ theme?: Theme;
43
+ pages?: Page[];
44
+ menus?: Menu[];
45
+ articles?: Article[];
46
+ };
47
+ type CartRecord = {
48
+ id: string;
49
+ lines: {
50
+ id: string;
51
+ variant_id: string;
52
+ quantity: number;
53
+ }[];
54
+ codes: string[];
55
+ buyer: Cart['buyer'];
56
+ shipping_address: Address | null;
57
+ delivery: Cart['delivery'];
58
+ updated_at: string;
59
+ };
60
+ type MockState = {
61
+ shop: Shop;
62
+ products: Product[];
63
+ collections: Collection[];
64
+ memberships: Record<string, string[]>;
65
+ theme: Theme;
66
+ pages: Page[];
67
+ menus: Menu[];
68
+ articles: Article[];
69
+ carts: Map<string, CartRecord>;
70
+ customers: Customer[];
71
+ addresses: Map<string, Address[]>;
72
+ orders: (Order & {
73
+ customer_id: string | null;
74
+ })[];
75
+ otps: Map<string, string>;
76
+ sessions: Map<string, string>;
77
+ idempotency: Map<string, {
78
+ status: number;
79
+ body: unknown;
80
+ }>;
81
+ seq: number;
82
+ };
83
+ declare function createMockStorefront(options?: MockStorefrontOptions): {
84
+ /** Drop-in `fetch` serving `/storefront/*` from memory. */
85
+ fetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
86
+ /** Live in-memory state (mutable; useful in tests). */
87
+ readonly state: Readonly<MockState>;
88
+ /** Restores the seed data and clears carts, sessions and orders. */
89
+ reset(): void;
90
+ /** OTP code accepted by `/customer/session`. */
91
+ otpCode: string;
92
+ };
93
+ type MockStorefront = ReturnType<typeof createMockStorefront>;
94
+
95
+ export { MOCK_CURRENCY, MOCK_CUSTOMER_EMAIL, MOCK_IMAGE_URL, type MockImageUrl, type MockState, type MockStorefront, type MockStorefrontOptions, createMockStorefront };
package/dist/mock.d.ts ADDED
@@ -0,0 +1,95 @@
1
+ import { a1 as Shop, Q as Product, p as Collection, a8 as Theme, P as Page, M as Menu, b as Article, C as Cart, A as Address, r as Customer, O as Order } from './types-CTXB8Dnl.js';
2
+
3
+ /**
4
+ * Placeholder image source for all seed data. Swap it (or pass `imageUrl` to
5
+ * `createMockStorefront`) to use your own assets.
6
+ */
7
+ declare const MOCK_IMAGE_URL: (seed: string, width?: number, height?: number) => string;
8
+ type MockImageUrl = typeof MOCK_IMAGE_URL;
9
+ declare const MOCK_CURRENCY = "MXN";
10
+ /** Seed customer that already exists (log in with OTP `000000`). */
11
+ declare const MOCK_CUSTOMER_EMAIL = "cliente@example.com";
12
+
13
+ /**
14
+ * In-memory implementation of the whole Storefront API v1 contract, exposed
15
+ * as a `fetch` function. Use it to develop and test storefronts without OPS:
16
+ *
17
+ * const mock = createMockStorefront()
18
+ * const sf = createStorefrontClient({ baseUrl: 'https://mock.local/api/gw', token: 'sk_mock', fetch: mock.fetch })
19
+ */
20
+
21
+ type MockStorefrontOptions = {
22
+ /** Currency for all prices (default `MXN`). */
23
+ currency?: string;
24
+ /** Image URL builder for seed data (default: picsum.photos placeholders). */
25
+ imageUrl?: MockImageUrl;
26
+ /** OTP code accepted by `/customer/session` (default `000000`). */
27
+ otpCode?: string;
28
+ /** Discount codes → percentage off the subtotal (default `{ BIENVENIDA10: 10 }`). */
29
+ discountCodes?: Record<string, number>;
30
+ /** Flat shipping rate (default 149). Free from `shop.policies.free_shipping_min`. */
31
+ flatShipping?: number;
32
+ /** Enforce token scopes (`pk_` cannot checkout or use customer routes). Default true. */
33
+ enforceScopes?: boolean;
34
+ /** Artificial latency per request, in ms (default 0). */
35
+ latencyMs?: number;
36
+ /** Override seed data. */
37
+ shop?: Partial<Shop>;
38
+ products?: Product[];
39
+ collections?: Collection[];
40
+ /** Product handle → collection handles (required when overriding `products`). */
41
+ memberships?: Record<string, string[]>;
42
+ theme?: Theme;
43
+ pages?: Page[];
44
+ menus?: Menu[];
45
+ articles?: Article[];
46
+ };
47
+ type CartRecord = {
48
+ id: string;
49
+ lines: {
50
+ id: string;
51
+ variant_id: string;
52
+ quantity: number;
53
+ }[];
54
+ codes: string[];
55
+ buyer: Cart['buyer'];
56
+ shipping_address: Address | null;
57
+ delivery: Cart['delivery'];
58
+ updated_at: string;
59
+ };
60
+ type MockState = {
61
+ shop: Shop;
62
+ products: Product[];
63
+ collections: Collection[];
64
+ memberships: Record<string, string[]>;
65
+ theme: Theme;
66
+ pages: Page[];
67
+ menus: Menu[];
68
+ articles: Article[];
69
+ carts: Map<string, CartRecord>;
70
+ customers: Customer[];
71
+ addresses: Map<string, Address[]>;
72
+ orders: (Order & {
73
+ customer_id: string | null;
74
+ })[];
75
+ otps: Map<string, string>;
76
+ sessions: Map<string, string>;
77
+ idempotency: Map<string, {
78
+ status: number;
79
+ body: unknown;
80
+ }>;
81
+ seq: number;
82
+ };
83
+ declare function createMockStorefront(options?: MockStorefrontOptions): {
84
+ /** Drop-in `fetch` serving `/storefront/*` from memory. */
85
+ fetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
86
+ /** Live in-memory state (mutable; useful in tests). */
87
+ readonly state: Readonly<MockState>;
88
+ /** Restores the seed data and clears carts, sessions and orders. */
89
+ reset(): void;
90
+ /** OTP code accepted by `/customer/session`. */
91
+ otpCode: string;
92
+ };
93
+ type MockStorefront = ReturnType<typeof createMockStorefront>;
94
+
95
+ export { MOCK_CURRENCY, MOCK_CUSTOMER_EMAIL, MOCK_IMAGE_URL, type MockImageUrl, type MockState, type MockStorefront, type MockStorefrontOptions, createMockStorefront };