@ecomiq/storefront 0.1.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/core/constants/api-paths.ts","../src/core/constants/storefront-ecomiq-oauth-cookie.ts","../src/core/constants/currency.ts","../src/core/utils/format-currency.ts","../src/core/lib/customer-order-labels.ts","../src/core/lib/storefront-geo-inei.ts","../src/core/services/api-client.ts","../src/core/models/product.ts","../src/core/services/product.service.ts","../src/core/models/collection.ts","../src/core/services/collection.service.ts","../src/core/models/page.ts","../src/core/services/page.service.ts","../src/core/models/store.ts","../src/core/services/store.service.ts","../src/core/models/cart.ts","../src/core/services/cart.service.ts"],"names":["z"],"mappings":"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","file":"core.js","sourcesContent":["/** Prefijo base de la API storefront (ej. v1/storefront). */\nexport const STOREFRONT_API_PATH_PREFIX = \"v1\";\n","/** Cookie HttpOnly con el bearer OAuth storefront; solo path `/api/store` (no navega a todo el sitio). */\nexport const STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME = \"ecomiq_sf_oauth_at\";\n\n/** Debe coincidir con el prefijo de la ruta proxy en Next (`app/api/store/...`). */\nexport const STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH = \"/api/store\";\n","export const countryCurrency = {\n \"PEN\": \"es-PE\",\n \"USD\": \"en-US\",\n \"COP\": \"es-CO\",\n \"MXN\": \"es-MX\",\n}\n","import { countryCurrency } from \"../constants/currency\";\n\n/**\n * Formats a number as currency using the store's locale for the given currency code.\n * Uses countryCurrency to pick the right locale (e.g. PEN → es-PE, USD → en-US).\n */\nexport function formatCurrency(\n amount: number,\n currency: string = \"USD\"\n): string {\n const locale =\n countryCurrency[currency as keyof typeof countryCurrency] ?? \"en-US\";\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(amount);\n}\n","/** Etiquetas en español para estados de pedido (upstream suele enviar PascalCase). */\nconst ORDER_STATUS_LABELS: Record<string, string> = {\n New: \"Pedido realizado\",\n Confirmed: \"Confirmado\",\n Processing: \"En preparación\",\n InTransit: \"En camino\",\n Delivered: \"Entregado\",\n Cancelled: \"Cancelado\",\n Canceled: \"Cancelado\",\n Refunded: \"Reembolsado\",\n Pending: \"Pendiente\",\n Paid: \"Pagado\",\n Captured: \"Pago confirmado\",\n};\n\nexport function formatCustomerOrderStatus(status: string): string {\n const trimmed = status.trim();\n if (!trimmed) return \"Desconocido\";\n return ORDER_STATUS_LABELS[trimmed] ?? trimmed.replace(/([A-Z])/g, \" $1\").trim();\n}\n\nexport function customerOrderStatusTone(\n status: string\n): \"default\" | \"success\" | \"warning\" | \"danger\" | \"info\" {\n const s = status.toLowerCase();\n if (s.includes(\"cancel\") || s.includes(\"refund\")) return \"danger\";\n if (s.includes(\"deliver\")) return \"success\";\n if (s.includes(\"transit\") || s.includes(\"ship\")) return \"info\";\n if (s.includes(\"confirm\") || s.includes(\"paid\") || s.includes(\"capture\")) return \"success\";\n if (s.includes(\"pending\") || s.includes(\"new\") || s.includes(\"process\")) return \"warning\";\n return \"default\";\n}\n\nexport function formatOrderDate(iso: string, locale = \"es-PE\"): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return new Intl.DateTimeFormat(locale, {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n }).format(d);\n}\n\nexport function formatOrderDateTime(iso: string, locale = \"es-PE\"): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return new Intl.DateTimeFormat(locale, {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(d);\n}\n","/**\n * Catálogo geo INEI vía proxy `/api/store/geo/*` (requiere `X-Store-Id`).\n */\n\nexport type GeoItem = { code: string; name: string };\n\nexport function toGeoItems(data: unknown): GeoItem[] {\n if (!Array.isArray(data)) return [];\n return data\n .map((raw) => {\n if (!raw || typeof raw !== \"object\") return null;\n const item = raw as { code?: unknown; name?: unknown };\n return {\n code: String(item.code ?? \"\"),\n name: String(item.name ?? \"\"),\n };\n })\n .filter((x): x is GeoItem => !!x && !!x.code && !!x.name);\n}\n\nlet departmentsCache: GeoItem[] | null = null;\nlet departmentsRequest: Promise<GeoItem[]> | null = null;\n\nexport function loadStorefrontGeoDepartments(headers: Record<string, string>): Promise<GeoItem[]> {\n if (departmentsCache) return Promise.resolve(departmentsCache);\n if (departmentsRequest) return departmentsRequest;\n\n departmentsRequest = fetch(\n `/api/store/geo/departments?countryCode=PE&source=inei&limit=200`,\n { cache: \"no-store\", headers }\n )\n .then((r) => r.json())\n .then((data) => {\n const items = toGeoItems(data);\n departmentsCache = items;\n return items;\n })\n .catch(() => {\n departmentsCache = [];\n return [];\n })\n .finally(() => {\n departmentsRequest = null;\n });\n\n return departmentsRequest;\n}\n\nexport async function fetchStorefrontGeoProvinces(\n headers: Record<string, string>,\n countryCode: string,\n departmentCode: string\n): Promise<GeoItem[]> {\n const res = await fetch(\n `/api/store/geo/provinces?countryCode=${encodeURIComponent(\n countryCode\n )}&departmentCode=${encodeURIComponent(departmentCode)}&source=inei&limit=200`,\n { headers }\n );\n const data = await res.json();\n return toGeoItems(data);\n}\n\nexport async function fetchStorefrontGeoDistricts(\n headers: Record<string, string>,\n countryCode: string,\n provinceCode: string\n): Promise<GeoItem[]> {\n const res = await fetch(\n `/api/store/geo/districts?countryCode=${encodeURIComponent(\n countryCode\n )}&provinceCode=${encodeURIComponent(provinceCode)}&source=inei`,\n { headers }\n );\n const data = await res.json();\n return toGeoItems(data);\n}\n\n/**\n * Resuelve códigos INEI a partir de nombres guardados en una dirección (p. ej. al editar).\n */\nexport async function resolveIneiCodesFromLabels(\n storeId: string,\n labels: { department: string; province: string; district: string },\n countryCode = \"PE\"\n): Promise<{ departmentCode: string; provinceCode: string; districtCode: string } | null> {\n const id = storeId.trim();\n if (!id) return null;\n const headers = { \"X-Store-Id\": id };\n const departments = await loadStorefrontGeoDepartments(headers);\n const dept = departments.find((d) => d.name.trim() === labels.department.trim());\n if (!dept) return null;\n const provinces = await fetchStorefrontGeoProvinces(headers, countryCode, dept.code);\n const prov = provinces.find((p) => p.name.trim() === labels.province.trim());\n if (!prov) {\n return { departmentCode: dept.code, provinceCode: \"\", districtCode: \"\" };\n }\n const districts = await fetchStorefrontGeoDistricts(headers, countryCode, prov.code);\n const dist = districts.find((d) => d.name.trim() === labels.district.trim());\n return {\n departmentCode: dept.code,\n provinceCode: prov.code,\n districtCode: dist?.code ?? \"\",\n };\n}\n","import axios, {\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n AxiosError,\n InternalAxiosRequestConfig,\n} from \"axios\";\n\nexport class ApiClient {\n private client: AxiosInstance;\n private storeId?: string;\n private storeDomain?: string;\n\n constructor(baseURL: string = \"https://storefront.ecomiq.pe\") {\n this.client = axios.create({\n baseURL,\n timeout: 10000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Interceptor para agregar headers automáticamente\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n if (config.headers) {\n if (this.storeId) config.headers[\"X-Store-Id\"] = this.storeId;\n if (this.storeDomain) config.headers[\"X-Store-Domain\"] = this.storeDomain;\n }\n return config;\n },\n );\n\n // Interceptor para manejar errores\n this.client.interceptors.response.use(\n (response: AxiosResponse) => response,\n (error: AxiosError) => {\n console.error(\"API Error:\", error);\n return Promise.reject(error);\n },\n );\n }\n\n setStoreId(storeId: string) {\n this.storeId = storeId;\n }\n\n /** Subdominio para endpoints que usan X-Store-Domain (ej. GET /v1/storefront/settings) */\n setStoreDomain(domain: string) {\n this.storeDomain = domain;\n }\n\n get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return this.client\n .get(url, config)\n .then((response: AxiosResponse) => response.data);\n }\n\n post<T>(\n url: string,\n data?: unknown,\n config?: AxiosRequestConfig,\n ): Promise<T> {\n return this.client\n .post(url, data, config)\n .then((response: AxiosResponse) => response.data);\n }\n\n put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n return this.client\n .put(url, data, config)\n .then((response: AxiosResponse) => response.data);\n }\n\n patch<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n return this.client\n .patch(url, data, config)\n .then((response: AxiosResponse) => response.data);\n }\n\n delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return this.client\n .delete(url, config)\n .then((response: AxiosResponse) => response.data);\n }\n}\n\n// Instancia singleton del cliente API\nexport const apiClient = new ApiClient();\n","import { z } from 'zod';\n\nexport const ProductVariantSchema = z.object({\n id: z.coerce.string(),\n name: z.string(),\n storeId: z.string(),\n productId: z.coerce.string(),\n basePrice: z.number().positive().optional().nullable(),\n comparePrice: z.number().positive().optional().nullable(), //TODO: remove this field\n originalPrice: z.number().positive().optional().nullable(),\n costPrice: z.number().positive().optional().nullable(),\n isDefault: z.boolean().optional().nullable(),\n reserveStock: z.number().nonnegative().optional().nullable(),\n weight: z.number().nonnegative().optional().nullable().default(0),\n width: z.number().nonnegative().optional().nullable(),\n height: z.number().nonnegative().optional().nullable(),\n unitOfMeasure: z.string().optional().nullable(),\n order: z.number().nonnegative().optional().nullable().default(0),\n sku: z.string().optional().nullable(),\n stock: z.number().nonnegative().optional().nullable(),\n leadTime: z.string().optional().nullable(),\n barCode: z.string().optional().nullable(),\n shippingWeight: z.number().nonnegative().optional().nullable(),\n images: z.array(z.string()).optional().nullable(),\n attributes: z.array(z.string()).optional().nullable(),\n variantStatus: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n createdOn: z.string().optional().nullable(),\n updatedOn: z.string().optional().nullable(),\n deletedOn: z.string().optional().nullable(),\n});\n\nexport const ProductSchema = z.object({\n id: z.coerce.string(),\n name: z.string(),\n images: z.array(z.object({\n url: z.string().url(),\n name: z.string().optional(),\n isPrimary: z.boolean().optional(),\n })),\n basePrice: z.number().positive().optional(),\n salePrice: z.number().positive().optional(),\n slug: z.string(),\n description: z.string().optional(),\n categories: z.array(z.object({\n id: z.coerce.string(),\n name: z.string(),\n slug: z.string(),\n logo: z.string().optional(),\n icon: z.string().optional(),\n })).optional(),\n tags: z.array(z.string()).optional(),\n inStock: z.boolean().optional(),\n variants: z.array(ProductVariantSchema).optional(),\n});\n\nexport const ProductsResponseSchema = z.object({\n items: z.array(ProductSchema),\n meta: z.object({\n total: z.number().int().positive(),\n page: z.number().int().positive(),\n pageSize: z.number().int().positive(),\n hasNextPage: z.boolean(),\n }),\n});\n\nexport const ProductsFiltersSchema = z.object({\n category: z.string().optional(),\n search: z.string().optional(),\n minPrice: z.number().positive().optional(),\n maxPrice: z.number().positive().optional(),\n inStock: z.boolean().optional(),\n sortBy: z.enum(['name', 'price', 'createdAt']).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n page: z.number().int().positive().optional(),\n limit: z.number().int().positive().optional(),\n});\n\n// --- Storefront API (v1/storefront/products) ---\n\nexport const StorefrontProductSchema = z.object({\n id: z.coerce.string(),\n name: z.string(),\n slug: z.string(),\n productType: z.string().optional().nullable(),\n imageUrl: z.string().optional().nullable(),\n price: z.number().nonnegative(),\n compareAtPrice: z.number().nonnegative().optional().nullable(),\n variantCount: z.number().int().nonnegative().optional().default(0),\n isAvailable: z.boolean(),\n totalInventory: z.number().int().nonnegative(),\n bundleItemsCount: z.number().int().nonnegative().optional().default(0),\n brand: z.string().optional().nullable(),\n category: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n tags: z.array(z.string()).optional().nullable(),\n});\n\nexport const StorefrontFacetSchema = z.object({\n value: z.string(),\n count: z.number().int().nonnegative(),\n});\n\nexport const StorefrontProductsResponseSchema = z.object({\n pageIndex: z.number().int().positive(),\n pageSize: z.number().int().positive(),\n totalCount: z.number().int().nonnegative(),\n totalPages: z.number().int().nonnegative(),\n products: z.array(StorefrontProductSchema),\n categories: z.array(StorefrontFacetSchema).optional().default([]),\n brands: z.array(StorefrontFacetSchema).optional().default([]),\n minPrice: z.number().nonnegative().optional().nullable(),\n maxPrice: z.number().nonnegative().optional().nullable(),\n});\n\nexport const StorefrontProductsParamsSchema = z.object({\n page: z.number().int().positive().optional().default(1),\n pageSize: z.number().int().positive().optional().default(20),\n sort: z\n .enum(['price_asc', 'price_desc', 'name_asc', 'name_desc', 'newest'])\n .optional()\n .default('price_asc'),\n sellerId: z.string().optional(),\n search: z.string().optional(),\n collection: z.string().optional(),\n category: z.string().optional(),\n brand: z.string().optional(),\n productType: z.string().optional(),\n inStock: z.boolean().optional(),\n minPrice: z.number().nonnegative().optional(),\n maxPrice: z.number().nonnegative().optional(),\n});\n\n// --- Storefront product by slug (v1/storefront/products/by-slug/:slug) ---\n\nexport const StorefrontVariantOptionSchema = z.object({\n key: z.string(),\n name: z.string(),\n value: z.string(),\n});\n\nexport const StorefrontProductImageSchema = z.object({\n url: z.string(),\n name: z.string().optional().nullable(),\n order: z.number().int().nonnegative().optional(),\n});\n\nexport const StorefrontVariantSchema = z.object({\n id: z.coerce.string().optional().default(''),\n sku: z.string(),\n status: z.string().optional().nullable(),\n price: z.number().nonnegative(),\n compareAtPrice: z.number().nonnegative().optional().nullable(),\n quantity: z.number().int().nonnegative(),\n options: z.array(StorefrontVariantOptionSchema).optional().default([]),\n images: z.array(StorefrontProductImageSchema).optional().default([]),\n});\n\nexport const StorefrontPriceTierSchema = z.object({\n variantId: z.coerce.string(),\n minQuantity: z.number().int().positive(),\n maxQuantity: z.number().int().positive().optional().nullable(),\n unitPrice: z.number().nonnegative(),\n});\n\nexport const StorefrontBundleItemSchema = z.object({\n productId: z.coerce.string(),\n variantId: z.coerce.string(),\n productName: z.string(),\n variantName: z.string().optional().nullable(),\n sku: z.string().optional().nullable(),\n brand: z.string().optional().nullable(),\n imageUrl: z.string().optional().nullable(),\n quantity: z.number().int(),\n availableStock: z.number().int().optional().default(0),\n allowBackorders: z.boolean().optional().default(false),\n requiresShipping: z.boolean().optional().default(true),\n});\n\nexport const StorefrontProductDetailSchema = z.object({\n id: z.coerce.string(),\n name: z.string(),\n slug: z.string(),\n description: z.string().optional().nullable(),\n productType: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n imageUrl: z.string().optional().nullable(),\n price: z.number().nonnegative(),\n compareAtPrice: z.number().nonnegative().optional().nullable(),\n isAvailable: z.boolean(),\n totalInventory: z.number().int().nonnegative(),\n brand: z.string().optional().nullable(),\n category: z.string().optional().nullable(),\n categoryId: z.coerce.string().optional().nullable(),\n tags: z.array(z.string()).optional().nullable(),\n specifications: z.array(z.record(z.string(), z.unknown())).optional().default([]),\n variants: z.array(StorefrontVariantSchema).optional().default([]),\n images: z.array(StorefrontProductImageSchema).optional().default([]),\n bundleItems: z.array(StorefrontBundleItemSchema).optional().default([]),\n priceTiers: z.array(StorefrontPriceTierSchema).optional().default([]),\n createdAt: z.string().optional().nullable(),\n updatedAt: z.string().optional().nullable(),\n});\n\n// Tipos TypeScript inferidos de los esquemas Zod\nexport type Product = z.infer<typeof ProductSchema>;\nexport type ProductVariant = z.infer<typeof ProductVariantSchema>;\nexport type ProductsResponse = z.infer<typeof ProductsResponseSchema>;\nexport type ProductsFilters = z.infer<typeof ProductsFiltersSchema>;\n\nexport type StorefrontProduct = z.infer<typeof StorefrontProductSchema>;\nexport type StorefrontFacet = z.infer<typeof StorefrontFacetSchema>;\nexport type StorefrontProductsResponse = z.infer<typeof StorefrontProductsResponseSchema>;\nexport type StorefrontProductsParams = z.infer<typeof StorefrontProductsParamsSchema>;\n/** Params de entrada (sort/page/pageSize opcionales con defaults en el schema) */\nexport type StorefrontProductsParamsInput = z.input<typeof StorefrontProductsParamsSchema>;\n\nexport type StorefrontVariantOption = z.infer<typeof StorefrontVariantOptionSchema>;\nexport type StorefrontVariant = z.infer<typeof StorefrontVariantSchema>;\nexport type StorefrontProductImage = z.infer<typeof StorefrontProductImageSchema>;\nexport type StorefrontPriceTier = z.infer<typeof StorefrontPriceTierSchema>;\nexport type StorefrontBundleItem = z.infer<typeof StorefrontBundleItemSchema>;\nexport type StorefrontProductDetail = z.infer<typeof StorefrontProductDetailSchema>; \n","import { apiClient } from './api-client';\nimport { STOREFRONT_API_PATH_PREFIX } from '../constants/api-paths';\nimport type {\n Product,\n ProductsResponse,\n ProductsFilters,\n StorefrontProductsResponse,\n StorefrontProductsParamsInput,\n StorefrontProductDetail,\n} from '../models/product';\nimport {\n ProductSchema,\n ProductsResponseSchema,\n ProductsFiltersSchema,\n StorefrontProductsResponseSchema,\n StorefrontProductsParamsSchema,\n StorefrontProductDetailSchema,\n} from '../models/product';\n\nexport class ProductService {\n private static instance: ProductService;\n\n private constructor() {}\n\n static getInstance(): ProductService {\n if (!ProductService.instance) {\n ProductService.instance = new ProductService();\n }\n return ProductService.instance;\n }\n\n /**\n * Obtiene todos los productos del store\n */\n async getProducts(filters?: ProductsFilters): Promise<ProductsResponse> {\n // Validar filtros si se proporcionan\n if (filters) {\n ProductsFiltersSchema.parse(filters);\n }\n\n const params = new URLSearchParams();\n \n if (filters) {\n if (filters.category) params.append('category', filters.category);\n if (filters.search) params.append('search', filters.search);\n if (filters.minPrice) params.append('minPrice', filters.minPrice.toString());\n if (filters.maxPrice) params.append('maxPrice', filters.maxPrice.toString());\n if (filters.sortBy) params.append('sortBy', filters.sortBy);\n if (filters.sortOrder) params.append('sortOrder', filters.sortOrder);\n if (filters.page) params.append('page', filters.page.toString());\n if (filters.limit) params.append('limit', filters.limit.toString());\n }\n\n const queryString = params.toString();\n const url = `/${STOREFRONT_API_PATH_PREFIX}/products${queryString ? `?${queryString}` : ''}`;\n \n const response = await apiClient.get<unknown>(url);\n return ProductsResponseSchema.parse(response);\n }\n\n /**\n * Obtiene un producto específico por ID\n */\n async getProduct(id: string): Promise<Product> {\n const response = await apiClient.get<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/products/${id}`);\n return ProductSchema.parse(response);\n }\n\n /**\n * Obtiene un producto específico por slug\n */\n async getProductBySlug(slug: string): Promise<Product> {\n const response = await apiClient.get<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/products/${encodeURIComponent(slug)}`);\n return ProductSchema.parse(response);\n }\n\n /**\n * Busca productos por término de búsqueda\n */\n async searchProducts(query: string, filters?: Omit<ProductsFilters, 'search'>): Promise<ProductsResponse> {\n return this.getProducts({ ...filters, search: query });\n }\n\n /**\n * Obtiene productos por categoría\n */\n async getProductsByCategory(category: string, filters?: Omit<ProductsFilters, 'category'>): Promise<ProductsResponse> {\n return this.getProducts({ ...filters, category });\n }\n\n /**\n * Obtiene productos en oferta (con descuento)\n */\n async getProductsOnSale(filters?: Omit<ProductsFilters, 'minPrice' | 'maxPrice'>): Promise<ProductsResponse> {\n return this.getProducts({ ...filters, minPrice: 0 });\n }\n\n /**\n * Obtiene productos en stock\n */\n async getProductsInStock(filters?: Omit<ProductsFilters, 'inStock'>): Promise<ProductsResponse> {\n return this.getProducts({ ...filters, inStock: true });\n }\n\n /**\n * Lista de productos del storefront (API v1/storefront/products).\n * Soporta paginación, orden y filtros por categoría, marca y precio.\n */\n async getStorefrontProducts(\n params?: StorefrontProductsParamsInput\n ): Promise<StorefrontProductsResponse> {\n const parsed = StorefrontProductsParamsSchema.parse(params ?? {});\n\n const searchParams = new URLSearchParams();\n searchParams.set('page', String(parsed.page));\n searchParams.set('pageSize', String(parsed.pageSize));\n if (parsed.sort) searchParams.set('sort', parsed.sort);\n if (parsed.sellerId) searchParams.set('sellerId', parsed.sellerId);\n if (parsed.collection) searchParams.set('collection', parsed.collection);\n if (parsed.category) searchParams.set('category', parsed.category);\n if (parsed.brand) searchParams.set('brand', parsed.brand);\n if (parsed.productType) searchParams.set('productType', parsed.productType);\n if (parsed.inStock != null) searchParams.set('inStock', String(parsed.inStock));\n if (parsed.minPrice != null) searchParams.set('minPrice', String(parsed.minPrice));\n if (parsed.maxPrice != null) searchParams.set('maxPrice', String(parsed.maxPrice));\n if (parsed.search) searchParams.set('search', parsed.search);\n\n const url = `/${STOREFRONT_API_PATH_PREFIX}/products?${searchParams.toString()}`;\n const response = await apiClient.get<unknown>(url);\n return StorefrontProductsResponseSchema.parse(response);\n }\n\n /**\n * Obtiene un producto del storefront por slug (API v1/storefront/products/by-slug/:slug).\n */\n async getStorefrontProductBySlug(slug: string): Promise<StorefrontProductDetail> {\n const response = await apiClient.get<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/products/by-slug/${encodeURIComponent(slug)}`);\n return StorefrontProductDetailSchema.parse(response);\n }\n}\n\n// Exportar instancia singleton\nexport const productService = ProductService.getInstance(); \n","import { z } from \"zod\";\n\nexport const StorefrontCollectionSchema = z.object({\n id: z.coerce.string(),\n slug: z.string(),\n name: z.string(),\n description: z.string().nullable().optional(),\n imageUrl: z.string().nullable().optional(),\n type: z.string(),\n productCount: z.number().int().nonnegative(),\n});\n\nexport const StorefrontCollectionsResponseSchema = z.array(StorefrontCollectionSchema);\nexport const StorefrontCollectionDetailSchema = StorefrontCollectionSchema;\n\nexport type StorefrontCollection = z.infer<typeof StorefrontCollectionSchema>;\nexport type StorefrontCollectionsResponse = z.infer<\n typeof StorefrontCollectionsResponseSchema\n>;\nexport type StorefrontCollectionDetail = z.infer<typeof StorefrontCollectionDetailSchema>;\n","import { apiClient } from \"./api-client\";\nimport { STOREFRONT_API_PATH_PREFIX } from \"../constants/api-paths\";\nimport type { StorefrontCollection, StorefrontCollectionDetail } from \"../models/collection\";\nimport {\n StorefrontCollectionsResponseSchema,\n StorefrontCollectionDetailSchema,\n} from \"../models/collection\";\n\nexport class CollectionService {\n private static instance: CollectionService;\n\n private constructor() {}\n\n static getInstance(): CollectionService {\n if (!CollectionService.instance) {\n CollectionService.instance = new CollectionService();\n }\n return CollectionService.instance;\n }\n\n /**\n * Lista de colecciones del storefront (GET /v1/collections).\n */\n async getStorefrontCollections(): Promise<StorefrontCollection[]> {\n const response = await apiClient.get<unknown>(\n `/${STOREFRONT_API_PATH_PREFIX}/collections`\n );\n return StorefrontCollectionsResponseSchema.parse(response);\n }\n\n /**\n * Obtiene una colección del storefront por slug (GET /v1/collections/by-slug/:slug).\n */\n async getStorefrontCollectionBySlug(\n slug: string\n ): Promise<StorefrontCollectionDetail> {\n const response = await apiClient.get<unknown>(\n `/${STOREFRONT_API_PATH_PREFIX}/collections/by-slug/${encodeURIComponent(slug)}`\n );\n return StorefrontCollectionDetailSchema.parse(response);\n }\n}\n\nexport const collectionService = CollectionService.getInstance();\n\n","import { z } from \"zod\";\n\n/** Page list item from GET /v1/pages */\nexport const StorefrontPageListItemSchema = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n layout: z.string(),\n});\n\nexport type StorefrontPageListItem = z.infer<typeof StorefrontPageListItemSchema>;\n\n/** SEO settings within page settings */\nexport const StorefrontPageSeoSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n}).optional();\n\n/** Page settings (layout-specific; flexible) */\nexport const StorefrontPageSettingsSchema = z.object({\n seo: StorefrontPageSeoSchema,\n html: z.string().optional(),\n title: z.string().optional(),\n}).catchall(z.unknown());\n\n/** Section block (item, widget, etc.) */\nexport const StorefrontPageBlockSchema = z.object({\n id: z.string(),\n type: z.string(),\n order: z.number(),\n settings: z.record(z.unknown()).optional(),\n});\n\n/** Page section (page-hero, faq, widget-row, etc.) */\nexport const StorefrontPageSectionSchema = z.object({\n id: z.string(),\n type: z.string(),\n order: z.number(),\n settings: z.record(z.unknown()).optional(),\n blocks: z.array(StorefrontPageBlockSchema).optional().default([]),\n});\n\n/** Page detail from GET /v1/pages/{slug}; sections is optional */\nexport const StorefrontPageDetailSchema = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n layout: z.string(),\n settings: StorefrontPageSettingsSchema.optional(),\n sections: z.array(StorefrontPageSectionSchema).optional(),\n});\n\nexport type StorefrontPageDetail = z.infer<typeof StorefrontPageDetailSchema>;\nexport type StorefrontPageSection = z.infer<typeof StorefrontPageSectionSchema>;\nexport type StorefrontPageBlock = z.infer<typeof StorefrontPageBlockSchema>;\n","import { z } from \"zod\";\nimport { apiClient } from \"./api-client\";\nimport { STOREFRONT_API_PATH_PREFIX } from \"../constants/api-paths\";\nimport type { StorefrontPageListItem, StorefrontPageDetail } from \"../models/page\";\nimport {\n StorefrontPageListItemSchema,\n StorefrontPageDetailSchema,\n} from \"../models/page\";\n\nexport class PageService {\n private static instance: PageService;\n\n private constructor() {}\n\n static getInstance(): PageService {\n if (!PageService.instance) {\n PageService.instance = new PageService();\n }\n return PageService.instance;\n }\n\n /**\n * Lista de páginas del storefront (GET /v1/pages).\n */\n async getPages(): Promise<StorefrontPageListItem[]> {\n const response = await apiClient.get<unknown>(\n `/${STOREFRONT_API_PATH_PREFIX}/pages`\n );\n return z.array(StorefrontPageListItemSchema).parse(response);\n }\n\n /**\n * Obtiene una página por slug (GET /v1/pages/{slug}).\n * sections puede no venir en la respuesta.\n */\n async getPageBySlug(slug: string): Promise<StorefrontPageDetail> {\n const response = await apiClient.get<unknown>(\n `/${STOREFRONT_API_PATH_PREFIX}/pages/${encodeURIComponent(slug)}`\n );\n return StorefrontPageDetailSchema.parse(response);\n }\n}\n\n// Exportar instancia singleton\nexport const pageService = PageService.getInstance();\n","import { z } from \"zod\";\n\nexport const StorefrontCheckoutSettingsSchema = z.object({\n allowGuestCheckout: z.boolean().optional(),\n identityScope: z.enum([\"store\", \"tenant\", \"global\"]).optional(),\n signInMethods: z.array(z.string()).optional(),\n});\n\nexport type StorefrontCheckoutSettings = z.infer<typeof StorefrontCheckoutSettingsSchema>;\n\nconst looseRecord = z.record(z.string(), z.unknown());\n\nexport const StorefrontThemeConfigSchema = z\n .object({\n name: z.string().nullable().optional(),\n mode: z.string().nullable().optional(),\n colors: looseRecord.optional(),\n fonts: looseRecord.optional(),\n assets: looseRecord.optional(),\n })\n .passthrough();\n\nexport const StorefrontFeaturesEnabledSchema = z\n .object({\n flags: looseRecord.optional(),\n })\n .passthrough();\n\nexport const StorefrontCmsBrandingSchema = z.object({\n logoUrl: z.string().nullable().optional(),\n logoDarkUrl: z.string().nullable().optional(),\n faviconUrl: z.string().nullable().optional(),\n socialImageUrl: z.string().nullable().optional(),\n});\n\nexport const StorefrontCmsSeoSchema = z.object({\n siteName: z.string().nullable().optional(),\n metaTitle: z.string().nullable().optional(),\n metaDescription: z.string().nullable().optional(),\n titleTemplate: z.string().nullable().optional(),\n robotsIndex: z.boolean().optional(),\n});\n\nexport const StorefrontCmsSocialLinksSchema = z.object({\n instagram: z.string().nullable().optional(),\n facebook: z.string().nullable().optional(),\n tiktok: z.string().nullable().optional(),\n youtube: z.string().nullable().optional(),\n x: z.string().nullable().optional(),\n});\n\nexport const StorefrontCmsContactSchema = z.object({\n supportEmail: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n whatsapp: z.string().nullable().optional(),\n address: z.string().nullable().optional(),\n socialLinks: StorefrontCmsSocialLinksSchema.optional(),\n});\n\nexport const StorefrontCmsTrackingSchema = z.object({\n googleAnalyticsMeasurementId: z.string().nullable().optional(),\n metaPixelId: z.string().nullable().optional(),\n googleTagManagerContainerId: z.string().nullable().optional(),\n});\n\nexport const StorefrontCmsCustomScriptsSchema = z.object({\n enabled: z.boolean().optional(),\n head: z.string().nullable().optional(),\n bodyEnd: z.string().nullable().optional(),\n});\n\nexport const StorefrontCmsSettingsSchema = z.object({\n themeKey: z.string().optional(),\n branding: StorefrontCmsBrandingSchema.optional(),\n seo: StorefrontCmsSeoSchema.optional(),\n contact: StorefrontCmsContactSchema.optional(),\n tracking: StorefrontCmsTrackingSchema.optional(),\n customScripts: StorefrontCmsCustomScriptsSchema.optional(),\n updatedOn: z.string().nullable().optional(),\n});\n\nexport const StorefrontCmsPageSchema = z\n .object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n layout: z.string().optional(),\n version: z.number().optional(),\n settings: z.record(z.string(), z.unknown()).optional().nullable(),\n sections: z.array(z.unknown()).optional(),\n status: z.string().optional(),\n hasPublishedVersion: z.boolean().optional(),\n publishedOn: z.string().nullable().optional(),\n publishedBy: z.string().nullable().optional(),\n createdOn: z.string().nullable().optional(),\n updatedOn: z.string().nullable().optional(),\n createdBy: z.string().nullable().optional(),\n updatedBy: z.string().nullable().optional(),\n lastModifiedBy: z.string().nullable().optional(),\n })\n .passthrough();\n\n/** Respuesta antigua GET /settings (objeto plano sin `store` / `cms`). */\nexport const StorefrontSettingsLegacyFlatSchema = z\n .object({\n id: z.coerce.string(),\n tenantId: z.string().nullable().optional(),\n name: z.string(),\n slug: z.coerce.string().optional(),\n description: z.string().nullable().optional(),\n visibility: z.string().nullable().optional(),\n logo: z.string().nullable().optional(),\n favicon: z.string().nullable().optional(),\n icon: z.string().nullable().optional(),\n currency: z.string().nullable().optional(),\n language: z.string().nullable().optional(),\n themeConfig: z.unknown().optional().nullable(),\n featuresEnabled: z.unknown().optional().nullable(),\n checkoutSettings: StorefrontCheckoutSettingsSchema.optional().nullable(),\n })\n .passthrough();\n\nexport type StorefrontSettingsLegacyFlat = z.infer<typeof StorefrontSettingsLegacyFlatSchema>;\n\nfunction unwrapSettingsResponseBody(v: unknown): unknown {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return v;\n const o = v as Record<string, unknown>;\n if (\n \"data\" in o &&\n o.data != null &&\n typeof o.data === \"object\" &&\n !Array.isArray(o.data)\n ) {\n return o.data;\n }\n return v;\n}\n\nfunction isLegacyFlatSettingsPayload(v: unknown): v is Record<string, unknown> {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return false;\n const o = v as Record<string, unknown>;\n if (\"store\" in o || \"schemaVersion\" in o || \"cms\" in o) return false;\n return (\n (typeof o.id === \"string\" || typeof o.id === \"number\") &&\n typeof o.name === \"string\"\n );\n}\n\n/** Convierte el JSON plano legacy al sobre actual (misma forma que el API nuevo). */\nexport function normalizeStorefrontSettingsPayload(v: unknown): unknown {\n const body = unwrapSettingsResponseBody(v);\n if (!isLegacyFlatSettingsPayload(body)) return body;\n const raw = body;\n const parsed = StorefrontSettingsLegacyFlatSchema.safeParse(raw);\n if (!parsed.success) return body;\n\n const l = parsed.data;\n const currency = l.currency?.trim() ? l.currency : \"PEN\";\n const language = l.language?.trim() ? l.language : \"es\";\n const slug = l.slug?.trim() ? l.slug : l.id;\n\n return {\n schemaVersion: 0,\n generatedAt: new Date(0).toISOString(),\n store: {\n id: l.id,\n tenantId: l.tenantId ?? undefined,\n name: l.name,\n slug,\n description: l.description ?? null,\n logo: l.logo ?? null,\n icon: l.icon ?? null,\n visibility: l.visibility ?? undefined,\n currency,\n language,\n themeConfig: l.themeConfig ?? undefined,\n featuresEnabled: l.featuresEnabled ?? undefined,\n checkoutSettings: l.checkoutSettings ?? undefined,\n },\n cms: {\n settings: {\n branding: {\n faviconUrl: l.favicon ?? null,\n logoUrl: l.logo ?? null,\n logoDarkUrl: null,\n socialImageUrl: null,\n },\n },\n pages: [],\n },\n };\n}\n\nexport const StorefrontStoreSchema = z\n .object({\n id: z.string(),\n tenantId: z.string().optional(),\n sellerId: z.string().optional(),\n plan: z.string().optional(),\n storageLimitBytes: z.number().optional(),\n monthlyTransferLimitBytes: z.number().optional(),\n maxUploadSizeBytes: z.number().optional(),\n maxStores: z.number().optional(),\n maxMembers: z.number().optional(),\n maxProducts: z.number().optional(),\n maxCategories: z.number().optional(),\n maxBrands: z.number().optional(),\n maxAttributes: z.number().optional(),\n maxCollections: z.number().optional(),\n enableApi: z.boolean().optional(),\n isActive: z.boolean().optional(),\n name: z.string(),\n description: z.string().nullable().optional(),\n avatarUrl: z.string().nullable().optional(),\n logo: z.string().nullable().optional(),\n icon: z.string().nullable().optional(),\n slug: z.string(),\n domain: z.string().nullable().optional(),\n domains: z.array(z.string()).optional(),\n timeZone: z.string().nullable().optional(),\n currency: z.string(),\n language: z.string(),\n visibility: z.string().optional(),\n privateAccessHash: z.string().nullable().optional(),\n privateAccessVersion: z.number().optional(),\n themeConfig: StorefrontThemeConfigSchema.optional(),\n featuresEnabled: StorefrontFeaturesEnabledSchema.optional(),\n checkoutSettings: StorefrontCheckoutSettingsSchema.optional().nullable(),\n })\n .passthrough();\n\nconst StorefrontSettingsEnvelopeSchema = z\n .object({\n schemaVersion: z.number(),\n generatedAt: z.string(),\n store: StorefrontStoreSchema,\n cms: z.object({\n settings: StorefrontCmsSettingsSchema,\n pages: z.array(StorefrontCmsPageSchema),\n }),\n })\n .passthrough();\n\n/** Acepta sobre nuevo o JSON plano legacy; siempre valida contra el sobre normalizado. */\nexport const StorefrontSettingsSchema = z.preprocess(\n normalizeStorefrontSettingsPayload,\n StorefrontSettingsEnvelopeSchema\n);\n\nexport type StorefrontSettings = z.infer<typeof StorefrontSettingsSchema>;\nexport type StorefrontStore = z.infer<typeof StorefrontStoreSchema>;\nexport type StorefrontCmsSettings = z.infer<typeof StorefrontCmsSettingsSchema>;\nexport type StorefrontCmsPage = z.infer<typeof StorefrontCmsPageSchema>;\n\n/** Nodo `store` del payload público (cookies, auth, moneda). */\nexport function storefrontStoreRecord(\n settings: StorefrontSettings | null | undefined\n): StorefrontStore | null {\n return settings?.store ?? null;\n}\n\n/** Favicon: CMS branding, luego logo/icono de tienda. */\nexport function storefrontFaviconUrl(\n settings: StorefrontSettings | null | undefined\n): string | null {\n const b = settings?.cms?.settings?.branding;\n return (\n b?.faviconUrl ??\n settings?.store?.logo ??\n settings?.store?.icon ??\n null\n );\n}\n\n/** Imagen social / OG: branding, luego logo de tienda. */\nexport function storefrontOgImageUrl(\n settings: StorefrontSettings | null | undefined\n): string | null {\n const b = settings?.cms?.settings?.branding;\n return b?.socialImageUrl ?? settings?.store?.logo ?? null;\n}\n","import { apiClient } from './api-client';\nimport { STOREFRONT_API_PATH_PREFIX } from '../constants/api-paths';\nimport type { StorefrontSettings } from '../models/store';\nimport { StorefrontSettingsSchema } from '../models/store';\n\nexport class StoreService {\n private static instance: StoreService;\n\n private constructor() {}\n\n static getInstance(): StoreService {\n if (!StoreService.instance) {\n StoreService.instance = new StoreService();\n }\n return StoreService.instance;\n }\n\n /**\n * Obtiene la configuración de la tienda por subdominio (GET /v1/settings).\n * Usa el header X-Store-Domain. Si se pasa domain, se configura antes de la petición.\n */\n async getStorefrontSettings(domain?: string): Promise<StorefrontSettings> {\n if (domain) {\n apiClient.setStoreDomain(domain);\n }\n const response = await apiClient.get<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/settings`);\n return StorefrontSettingsSchema.parse(response);\n }\n}\n\nexport const storeService = StoreService.getInstance();\n","import { z } from \"zod\";\n\nexport const CartBuyerRequestSchema = z.object({\n email: z.string().email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n phone: z.string().min(1),\n});\n\nexport type CartBuyerRequest = z.input<typeof CartBuyerRequestSchema>;\n\nexport const CartCreateRequestSchema = z.object({\n currencyCode: z.string(),\n salesChannelId: z.string(),\n email: z.string().email(),\n});\n\nexport type CartCreateRequest = z.input<typeof CartCreateRequestSchema>;\n\nexport const CartAddressSchema = z.object({\n name: z.string().min(1),\n address1: z.string().min(1),\n city: z.string().min(1),\n countryCode: z.string().min(2),\n company: z.string().nullable().optional(),\n address2: z.string().nullable().optional(),\n province: z.string().nullable().optional(),\n postalCode: z.string().nullable().optional(),\n district: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n latitude: z.number().nullable().optional(),\n longitude: z.number().nullable().optional(),\n geo: z\n .object({\n departmentCode: z.string().nullable().optional(),\n provinceCode: z.string().nullable().optional(),\n districtCode: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n});\n\nexport const CartAddressesRequestSchema = z.object({\n shippingAddress: CartAddressSchema,\n billingAddress: CartAddressSchema,\n});\n\nexport type CartAddressesRequest = z.input<typeof CartAddressesRequestSchema>;\n\n// --- Cart items ---\n\nexport const CartItemModifierRequestSchema = z.object({\n modifierGroupId: z.coerce.string().min(1),\n optionIds: z.array(z.coerce.string().min(1)).optional().default([]),\n});\n\nexport type CartItemModifierRequest = {\n modifierGroupId: string;\n optionIds?: string[];\n};\n\nexport const CartItemRequestSchema = z.object({\n variantId: z.coerce.string().min(1),\n quantity: z.number().int().positive(),\n modifiers: z.array(CartItemModifierRequestSchema).optional(),\n});\n\nexport type CartItemRequest = {\n variantId: string;\n quantity: number;\n modifiers?: CartItemModifierRequest[];\n};\n\nexport const CartCouponRequestSchema = z.object({\n code: z.string().min(1),\n});\n\nexport type CartCouponRequest = z.input<typeof CartCouponRequestSchema>;\n\nexport const CartTotalsSchema = z.object({\n subtotal: z.number(),\n discount: z.number(),\n tax: z.number(),\n warranty: z.number().optional().default(0),\n total: z.number(),\n});\n\nexport const CartResponseAddressSchema = z.object({\n name: z.string().nullable().optional(),\n address1: z.string(),\n city: z.string(),\n countryCode: z.string(),\n company: z.string().nullable().optional(),\n address2: z.string().nullable().optional(),\n province: z.string().nullable().optional(),\n postalCode: z.string().nullable().optional(),\n district: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n latitude: z.number().nullable().optional(),\n longitude: z.number().nullable().optional(),\n geo: z\n .object({\n departmentCode: z.string().nullable().optional(),\n provinceCode: z.string().nullable().optional(),\n districtCode: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n});\n\nexport const CartResponseBundleItemSchema = z.object({\n productId: z.coerce.string(),\n variantId: z.coerce.string(),\n productName: z.string(),\n variantName: z.string().nullable().optional(),\n sku: z.string().nullable().optional(),\n brand: z.string().nullable().optional(),\n imageUrl: z.string().nullable().optional(),\n quantity: z.number().int(),\n});\n\nexport const CartResponseItemSchema = z.object({\n id: z.string(),\n title: z.string(),\n variantLabel: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n quantity: z.number().int(),\n variantId: z.coerce.string(),\n variantSku: z.string().nullable().optional(),\n unitPrice: z.number(),\n bundleItems: z.array(CartResponseBundleItemSchema).optional().default([]),\n});\n\nexport const CartResponseShippingMethodSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullable().optional(),\n total: z.number(),\n estimatedDays: z.number().int().nullable().optional(),\n pickupPointId: z.string().nullable().optional(),\n scheduledDate: z.string().nullable().optional(),\n scheduledTime: z.string().nullable().optional(),\n});\n\nexport const CartResponseSchema = z.object({\n id: z.string(),\n regionId: z.string().nullable().optional(),\n salesChannelId: z.string().nullable().optional(),\n email: z.string().email().nullable().optional(),\n phone: z.string().nullable().optional(),\n firstName: z.string().nullable().optional(),\n lastName: z.string().nullable().optional(),\n currencyCode: z.string(),\n completedAt: z.string().nullable().optional(),\n shippingAddress: z.unknown().nullable().optional(),\n billingAddress: z.unknown().nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\n promotionCodes: z.array(z.string()).optional().default([]),\n items: z.array(CartResponseItemSchema).optional().default([]),\n shippingMethods: z.array(z.unknown()).optional().default([]),\n totals: z.object({\n discountTotal: z.number(),\n shippingTotal: z.number(),\n subtotal: z.number(),\n taxTotal: z.number(),\n total: z.number(),\n warrantyTotal: z.number(),\n }),\n});\n\nexport type CartResponse = z.infer<typeof CartResponseSchema>;\n\nexport const CartCheckoutRequestSchema = z.object({\n paymentMethodCode: z.string().min(1),\n externalRef: z.string().min(1),\n receiptUrl: z.string().min(1).optional(),\n});\n\nexport type CartCheckoutRequest = z.input<typeof CartCheckoutRequestSchema>;\n\n/** Acción concreta del proveedor (redirect, embedded, QR, etc.) */\nexport const CartCheckoutPaymentActionSchema = z\n .object({\n publicConfiguration: z\n .object({\n publishableKey: z.string().nullable().optional(),\n checkoutMode: z.string().nullable().optional(),\n phoneNumber: z.string().nullable().optional(),\n accountHolder: z.string().nullable().optional(),\n qrImageUrl: z.string().nullable().optional(),\n })\n .passthrough()\n .nullable()\n .optional(),\n url: z.string().nullable().optional(),\n html: z.string().nullable().optional(),\n clientSecret: z.string().nullable().optional(),\n qrCode: z.string().nullable().optional(),\n expiresAt: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport type CartCheckoutPaymentAction = z.infer<\n typeof CartCheckoutPaymentActionSchema\n>;\n\n/** Objeto `payment` devuelto por POST checkout / flujo embedded */\nexport const CartCheckoutPaymentSchema = z\n .object({\n transactionId: z.string(),\n paymentMethodCode: z.string(),\n providerId: z.string().nullable().optional(),\n status: z.string(),\n amount: z.number(),\n reference: z.string(),\n actionType: z.string(),\n receiptUrl: z.string().nullable().optional(),\n action: CartCheckoutPaymentActionSchema.nullable().optional(),\n })\n .passthrough();\n\nexport type CartCheckoutPayment = z.infer<typeof CartCheckoutPaymentSchema>;\n\nexport const CartCheckoutResponseSchema = z\n .object({\n publicKey: z.string().optional(),\n publishableKey: z.string().optional(),\n stripePublicKey: z.string().optional(),\n clientSecret: z.string().optional(),\n intentClientSecret: z.string().optional(),\n orderId: z.coerce.string().optional(),\n orderGroup: z.string().optional(),\n orderIds: z.array(z.coerce.string()).optional(),\n /** Payload de pago (embedded, redirect, etc.) */\n payment: CartCheckoutPaymentSchema.optional(),\n cart: z.unknown().optional(),\n })\n .passthrough();\n\nexport type CartCheckoutResponse = z.infer<typeof CartCheckoutResponseSchema>;\n\nexport const CartPaymentReceiptResponseSchema = z.object({\n id: z.string(),\n url: z.string(),\n});\n\nexport type CartPaymentReceiptResponse = z.infer<\n typeof CartPaymentReceiptResponseSchema\n>;\n\nexport const CartPaymentMethodSchema = z.object({\n code: z.string(),\n name: z.string(),\n description: z.string().nullable().optional(),\n kind: z.string(),\n isActive: z.boolean(),\n isDefault: z.boolean(),\n isManual: z.boolean(),\n sortOrder: z.number(),\n phoneNumber: z.string().nullable().optional(),\n accountHolder: z.string().nullable().optional(),\n qrImageUrl: z.string().nullable().optional(),\n});\n\nexport type CartPaymentMethod = z.infer<typeof CartPaymentMethodSchema>;\n\nexport const CartPaymentMethodsResponseSchema = z.object({\n methods: z.array(CartPaymentMethodSchema),\n});\n\nexport type CartPaymentMethodsResponse = z.infer<\n typeof CartPaymentMethodsResponseSchema\n>;\n\n/**\n * GET /carts/{cartId}/checkout — devuelve carrito + métodos de pago en una sola respuesta.\n */\nexport const CartCheckoutReadResponseSchema = z.object({\n cart: CartResponseSchema,\n paymentMethods: CartPaymentMethodsResponseSchema,\n});\n\nexport type CartCheckoutReadResponse = z.infer<\n typeof CartCheckoutReadResponseSchema\n>;\n\n/** GET /carts/{cartId}/shipping-options?postalCode= */\nexport const ShippingRateSchema = z\n .object({\n shippingMethodId: z.string(),\n name: z.string(),\n displayName: z.string().optional(),\n type: z.string().optional(),\n price: z.number(),\n currency: z.string().optional(),\n sortOrder: z.number().optional(),\n rateId: z.string(),\n description: z.string().nullable().optional(),\n deliveryLocationId: z.string().nullable().optional(),\n deliveryLocationName: z.string().nullable().optional(),\n estimatedDeliveryDays: z.number().nullable().optional(),\n serviceCode: z.string().nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\nexport type ShippingRate = z.infer<typeof ShippingRateSchema>;\n\nexport const ShippingOptionGroupSchema = z\n .object({\n sellerId: z.string(),\n shippingProfileId: z.string().nullable().optional(),\n orderAmount: z.number().optional(),\n totalWeight: z.number().optional(),\n itemIds: z.array(z.string()).optional(),\n rates: z.array(ShippingRateSchema),\n })\n .passthrough();\n\nexport type ShippingOptionGroup = z.infer<typeof ShippingOptionGroupSchema>;\n\nexport const ShippingOptionsResponseSchema = z.object({\n groups: z.array(ShippingOptionGroupSchema),\n});\n\nexport type ShippingOptionsResponse = z.infer<\n typeof ShippingOptionsResponseSchema\n>;\n\n/** PUT /carts/{cartId}/shipping-method */\nexport const CartShippingMethodPutRequestSchema = z.object({\n rateId: z.string().min(1),\n shippingMethodId: z.string().min(1),\n serviceCode: z.string().nullable().optional(),\n sellerId: z.string().nullable().optional(),\n shippingProfileId: z.string().nullable().optional(),\n locationId: z.string().nullable().optional(),\n pickupPointId: z.string().nullable().optional(),\n scheduledDate: z.string().nullable().optional(),\n scheduledTime: z.string().nullable().optional(),\n});\n\nexport type CartShippingMethodPutRequest = z.input<\n typeof CartShippingMethodPutRequestSchema\n>;\n","import { apiClient } from './api-client';\nimport { STOREFRONT_API_PATH_PREFIX } from '../constants/api-paths';\nimport {\n CartBuyerRequestSchema,\n CartResponseSchema,\n CartAddressesRequestSchema,\n CartCreateRequestSchema,\n CartCheckoutRequestSchema,\n CartCheckoutResponseSchema,\n type CartBuyerRequest,\n type CartResponse,\n type CartAddressesRequest,\n type CartCreateRequest,\n type CartCheckoutRequest,\n type CartCheckoutResponse,\n} from '../models/cart';\n\nexport class CartService {\n private static instance: CartService;\n\n private constructor() {}\n\n static getInstance(): CartService {\n if (!CartService.instance) {\n CartService.instance = new CartService();\n }\n return CartService.instance;\n }\n\n /**\n * Obtiene el carrito actual (GET /v1/carts).\n */\n async getCart(): Promise<CartResponse> {\n const response = await apiClient.get<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/carts`);\n return CartResponseSchema.parse(response);\n }\n\n /**\n * Crea un carrito nuevo (POST /v1/carts).\n */\n async createCart(data: CartCreateRequest): Promise<CartResponse> {\n const payload = CartCreateRequestSchema.parse(data);\n const response = await apiClient.post<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/carts`, payload);\n return CartResponseSchema.parse(response);\n }\n\n /**\n * Actualiza los datos del comprador del carrito actual (PATCH /v1/carts/buyer).\n * El carrito se resuelve en backend vía contexto (token/guest), por eso no requiere cartId.\n */\n async updateBuyer(data: CartBuyerRequest): Promise<CartResponse> {\n const payload = CartBuyerRequestSchema.parse(data);\n const response = await apiClient.patch<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/carts/buyer`, payload);\n return CartResponseSchema.parse(response);\n }\n\n /**\n * Actualiza direcciones de envío y facturación del carrito (PATCH /v1/carts/addresses).\n */\n async updateAddresses(data: CartAddressesRequest): Promise<CartResponse> {\n const payload = CartAddressesRequestSchema.parse(data);\n const response = await apiClient.patch<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/carts/addresses`, payload);\n return CartResponseSchema.parse(response);\n }\n\n /**\n * Inicializa/obtiene detalles del método de pago para el checkout (POST /v1/carts/checkout).\n * Usado para providers como Stripe (public key, client secret, etc).\n */\n async checkout(data: CartCheckoutRequest): Promise<CartCheckoutResponse> {\n const payload = CartCheckoutRequestSchema.parse(data);\n const response = await apiClient.post<unknown>(`/${STOREFRONT_API_PATH_PREFIX}/carts/checkout`, payload);\n return CartCheckoutResponseSchema.parse(response);\n }\n}\n\nexport const cartService = CartService.getInstance();\n\n"]}
@@ -0,0 +1,119 @@
1
+ import * as zustand from 'zustand';
2
+ import { S as StorefrontSettings, a as StorefrontProduct, b as StorefrontProductDetail, c as StorefrontCollection } from './store-CYBCpY6v.js';
3
+ import * as react from 'react';
4
+ import { ReactNode, ComponentType, JSX } from 'react';
5
+ import { StorefrontProductDetail as StorefrontProductDetail$1, StorefrontVariant, StoreTheme, StorefrontSettings as StorefrontSettings$1, StorefrontPageDetail } from '@ecomiq/storefront/react';
6
+
7
+ type Drawers = {
8
+ cart: boolean;
9
+ search: boolean;
10
+ menu: boolean;
11
+ filter: boolean;
12
+ [key: string]: boolean;
13
+ };
14
+ type Modals = {
15
+ login: boolean;
16
+ signup: boolean;
17
+ [key: string]: boolean;
18
+ };
19
+ type StoreState = {
20
+ data: StorefrontSettings | null;
21
+ drawers: Drawers;
22
+ modals: Modals;
23
+ openDrawer: (drawer: keyof Drawers) => void;
24
+ closeDrawer: (drawer: keyof Drawers) => void;
25
+ toggleDrawer: (drawer: keyof Drawers) => void;
26
+ closeAllDrawers: () => void;
27
+ openModal: (modal: keyof Modals) => void;
28
+ closeModal: (modal: keyof Modals) => void;
29
+ toggleModal: (modal: keyof Modals) => void;
30
+ closeAllModals: () => void;
31
+ };
32
+ declare const useStore: zustand.UseBoundStore<zustand.StoreApi<StoreState>>;
33
+
34
+ type CmsRenderSettings = Record<string, unknown>;
35
+ type CmsRenderBlock = {
36
+ id?: string;
37
+ type: string;
38
+ order: number;
39
+ settings?: CmsRenderSettings;
40
+ };
41
+ type CmsRenderSection = {
42
+ id?: string;
43
+ type: string;
44
+ order: number;
45
+ settings?: CmsRenderSettings;
46
+ blocks?: CmsRenderBlock[];
47
+ };
48
+ type CmsProduct = StorefrontProduct | StorefrontProductDetail;
49
+ type CmsSectionData = {
50
+ products?: CmsProduct[];
51
+ collections?: StorefrontCollection[];
52
+ };
53
+ type CmsLinkProps = {
54
+ href: string;
55
+ className?: string;
56
+ children: ReactNode;
57
+ };
58
+ type CmsSectionsRendererProps = {
59
+ sections: CmsRenderSection[];
60
+ sectionData?: Record<string, CmsSectionData>;
61
+ linkComponent?: ComponentType<CmsLinkProps>;
62
+ currency?: string;
63
+ preview?: boolean;
64
+ wrap?: boolean;
65
+ };
66
+
67
+ declare function getCmsSectionKey(section: CmsRenderSection, index: number): string;
68
+ declare function canonicalSectionType(type: string): string;
69
+ declare function storefrontHref(value: string): string;
70
+ declare function productSortValue(value: string): string;
71
+ declare function sanitizeHtml(html: string): string;
72
+ declare const DEFAULT_CMS_IMAGE_URL: string;
73
+
74
+ /** Option group derived from variants (e.g. Color: [Black, White], Size: [6x8, 8x11]) */
75
+ type OptionGroup = {
76
+ key: string;
77
+ name: string;
78
+ values: string[];
79
+ };
80
+ /** Selected options per group (e.g. { Color: "Black", Size: "8 x 11 inch" }) */
81
+ type SelectedOptions = Record<string, string>;
82
+ type ProductVariantSelectorRenderProps = {
83
+ product: StorefrontProductDetail$1;
84
+ selectedVariant: StorefrontVariant | null;
85
+ displayPrice: number;
86
+ compareAtPrice: number | null | undefined;
87
+ isAvailable: boolean;
88
+ selectedOptions: SelectedOptions;
89
+ };
90
+
91
+ type ProductVariantSelectorProps = {
92
+ product: StorefrontProductDetail$1;
93
+ currency?: string;
94
+ features?: string[];
95
+ onVariantChange?: (variant: StorefrontVariant | null, price: number) => void;
96
+ children?: (props: {
97
+ product: StorefrontProductDetail$1;
98
+ selectedVariant: StorefrontVariant | null;
99
+ displayPrice: number;
100
+ compareAtPrice: number | null | undefined;
101
+ isAvailable: boolean;
102
+ selectedOptions: SelectedOptions;
103
+ }) => React.ReactNode;
104
+ };
105
+ declare function ProductVariantSelector({ product, currency, features, onVariantChange, children, }: ProductVariantSelectorProps): react.JSX.Element;
106
+
107
+ interface ThemeInjectorProps {
108
+ theme: StoreTheme;
109
+ className?: string;
110
+ }
111
+ declare function SafeThemeInjector({ theme, className }: ThemeInjectorProps): JSX.Element | null;
112
+
113
+ /**
114
+ * Busca una página CMS en `settings.cms.pages` (payload de `getPublicStore` / settings)
115
+ * y la valida como `StorefrontPageDetail` para `DynamicPage`.
116
+ */
117
+ declare function findStorefrontCmsPageBySlug(settings: StorefrontSettings$1 | null | undefined, slug: string): StorefrontPageDetail | null;
118
+
119
+ export { type CmsSectionsRendererProps as C, DEFAULT_CMS_IMAGE_URL as D, type OptionGroup as O, ProductVariantSelector as P, SafeThemeInjector as S, storefrontHref as a, type CmsLinkProps as b, canonicalSectionType as c, type CmsProduct as d, type CmsRenderBlock as e, findStorefrontCmsPageBySlug as f, getCmsSectionKey as g, type CmsRenderSection as h, type CmsRenderSettings as i, type CmsSectionData as j, type ProductVariantSelectorProps as k, type SelectedOptions as l, type ProductVariantSelectorRenderProps as m, productSortValue as p, sanitizeHtml as s, useStore as u };
@@ -0,0 +1,49 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ type StoreApiHandlerConfig = {
4
+ /**
5
+ * Base URL del API de storefront. Default: "https://storefront.ecomiq.pe"
6
+ */
7
+ apiBaseUrl?: string;
8
+ };
9
+ /**
10
+ * Crea los handlers de ruta para montar la API de store como proxy en Next.js App Router.
11
+ * La base /v1/storefront se maneja internamente: el usuario llama /api/store/products
12
+ * y se hace proxy a https://storefront.ecomiq.pe/v1/storefront/products.
13
+ *
14
+ * // app/api/store/[...path]/route.ts
15
+ * import { toNextJsStoreApiHandler } from "@ecomiq/storefront/nextjs/api";
16
+ *
17
+ * export const { GET, POST, PUT, PATCH, DELETE } = toNextJsStoreApiHandler({
18
+ * apiBaseUrl: "https://storefront.ecomiq.pe", // opcional, es el default
19
+ * });
20
+ */
21
+ declare function toNextJsStoreApiHandler(config: StoreApiHandlerConfig): {
22
+ GET: (request: NextRequest, context: {
23
+ params: Promise<{
24
+ path?: string[];
25
+ }>;
26
+ }) => Promise<NextResponse>;
27
+ POST: (request: NextRequest, context: {
28
+ params: Promise<{
29
+ path?: string[];
30
+ }>;
31
+ }) => Promise<NextResponse>;
32
+ PUT: (request: NextRequest, context: {
33
+ params: Promise<{
34
+ path?: string[];
35
+ }>;
36
+ }) => Promise<NextResponse>;
37
+ PATCH: (request: NextRequest, context: {
38
+ params: Promise<{
39
+ path?: string[];
40
+ }>;
41
+ }) => Promise<NextResponse>;
42
+ DELETE: (request: NextRequest, context: {
43
+ params: Promise<{
44
+ path?: string[];
45
+ }>;
46
+ }) => Promise<NextResponse>;
47
+ };
48
+
49
+ export { type StoreApiHandlerConfig, toNextJsStoreApiHandler };
@@ -0,0 +1,170 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME, STOREFRONT_API_PATH_PREFIX } from '@ecomiq/storefront/core';
3
+
4
+ // src/react/nextjs/api/store-handler.ts
5
+ var DEFAULT_API_BASE_URL = "https://storefront.ecomiq.pe";
6
+ async function ensureStoreContext(request) {
7
+ const xStoreId = request.headers.get("x-store-id")?.trim();
8
+ const xStoreDomain = request.headers.get("x-store-domain")?.trim();
9
+ if (xStoreDomain) {
10
+ return {
11
+ ok: true,
12
+ storeId: xStoreId || "",
13
+ storeDomain: xStoreDomain || null
14
+ };
15
+ }
16
+ if (!xStoreId) {
17
+ return {
18
+ ok: false,
19
+ response: NextResponse.json({ error: "Store context required", message: "X-Store-Id is required", status: 400 })
20
+ };
21
+ }
22
+ return {
23
+ ok: true,
24
+ storeId: xStoreId || "",
25
+ storeDomain: xStoreDomain || null
26
+ };
27
+ }
28
+ var SKIP_FORWARD_HEADERS = /* @__PURE__ */ new Set([
29
+ "host",
30
+ "connection",
31
+ "content-length",
32
+ "transfer-encoding",
33
+ "x-store-id",
34
+ "x-store-domain",
35
+ /** Se reconstruye abajo desde el header entrante al proxy. */
36
+ "authorization",
37
+ /** Nunca reenviar sesión/cookies del storefront al API Ecomiq (solo headers operativos). */
38
+ "cookie",
39
+ "cookie2",
40
+ "set-cookie",
41
+ /**
42
+ * Headers de proxy/origen de Cloudflare: se reconstruyen abajo (X-Forwarded-*)
43
+ * para no contaminar la cadena con valores que el upstream no debe leer directamente
44
+ * y para garantizar que la IP del cliente final llegue como X-Forwarded-For.
45
+ */
46
+ "x-forwarded-for",
47
+ "x-forwarded-proto",
48
+ "x-forwarded-host",
49
+ "x-real-ip",
50
+ "forwarded",
51
+ "cf-connecting-ip",
52
+ "cf-connecting-ipv6",
53
+ "true-client-ip",
54
+ "cf-ipcountry",
55
+ "cf-ray",
56
+ "cf-visitor"
57
+ ]);
58
+ function getClientIp(request) {
59
+ const candidates = [
60
+ request.headers.get("cf-connecting-ip"),
61
+ request.headers.get("true-client-ip"),
62
+ request.headers.get("x-real-ip")
63
+ ];
64
+ for (const value of candidates) {
65
+ const trimmed = value?.trim();
66
+ if (trimmed) return trimmed;
67
+ }
68
+ const xff = request.headers.get("x-forwarded-for");
69
+ if (xff?.trim()) {
70
+ const first = xff.split(",")[0]?.trim();
71
+ if (first) return first;
72
+ }
73
+ return null;
74
+ }
75
+ function buildUpstreamRequest(request, pathSegments, config, storeId, storeDomain) {
76
+ const base = (config.apiBaseUrl ?? DEFAULT_API_BASE_URL).replace(/\/$/, "");
77
+ const userPath = pathSegments.length ? pathSegments.join("/") : "";
78
+ const path = userPath ? `${STOREFRONT_API_PATH_PREFIX}/${userPath}` : STOREFRONT_API_PATH_PREFIX;
79
+ const search = request.nextUrl.searchParams.toString();
80
+ const url = search ? `${base}/${path}?${search}` : `${base}/${path}`;
81
+ const headers = new Headers();
82
+ request.headers.forEach((value, key) => {
83
+ const lower = key.toLowerCase();
84
+ if (!SKIP_FORWARD_HEADERS.has(lower)) {
85
+ headers.set(key, value);
86
+ }
87
+ });
88
+ headers.set("X-Store-Id", storeId);
89
+ if (storeDomain) {
90
+ headers.set("X-Store-domain", storeDomain);
91
+ }
92
+ const clientIp = getClientIp(request);
93
+ if (clientIp) {
94
+ headers.set("X-Forwarded-For", clientIp);
95
+ }
96
+ const forwardedProto = request.headers.get("cf-visitor")?.match(/"scheme":"(https?)"/)?.[1] ?? request.nextUrl.protocol.replace(":", "") ?? "https";
97
+ headers.set("X-Forwarded-Proto", forwardedProto);
98
+ const forwardedHost = request.headers.get("host") ?? request.nextUrl.host;
99
+ if (forwardedHost) {
100
+ headers.set("X-Forwarded-Host", forwardedHost);
101
+ }
102
+ const incomingAuth = request.headers.get("authorization")?.trim();
103
+ const storefrontOAuth = request.cookies.get(STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME)?.value?.trim();
104
+ if (incomingAuth && /^Bearer\s+\S+/i.test(incomingAuth)) {
105
+ headers.set("Authorization", incomingAuth);
106
+ } else if (storefrontOAuth) {
107
+ headers.set("Authorization", `Bearer ${storefrontOAuth}`);
108
+ }
109
+ headers.set("Accept-Encoding", "identity");
110
+ const init = {
111
+ method: request.method,
112
+ headers
113
+ };
114
+ const bodyMethods = ["POST", "PUT", "PATCH"];
115
+ if (bodyMethods.includes(request.method) && request.body) {
116
+ init.body = request.body;
117
+ init.duplex = "half";
118
+ }
119
+ return { url, init };
120
+ }
121
+ function isResponseBodyForbidden(status) {
122
+ return status === 204 || status === 205 || status === 304;
123
+ }
124
+ function toNextJsStoreApiHandler(config) {
125
+ const handler = async (request, context) => {
126
+ const params = await context.params;
127
+ const pathSegments = params.path ?? [];
128
+ const storeContext = await ensureStoreContext(request);
129
+ if (!storeContext.ok) {
130
+ return storeContext.response;
131
+ }
132
+ const { storeId, storeDomain } = storeContext;
133
+ const { url, init } = buildUpstreamRequest(
134
+ request,
135
+ pathSegments,
136
+ config,
137
+ storeId,
138
+ storeDomain
139
+ );
140
+ const upstream = await fetch(url, init);
141
+ const responseHeaders = new Headers(upstream.headers);
142
+ const status = upstream.status;
143
+ if (isResponseBodyForbidden(status)) {
144
+ responseHeaders.delete("content-length");
145
+ responseHeaders.delete("content-type");
146
+ return new NextResponse(null, {
147
+ status,
148
+ statusText: upstream.statusText,
149
+ headers: responseHeaders
150
+ });
151
+ }
152
+ const body = await upstream.text();
153
+ return new NextResponse(body, {
154
+ status,
155
+ statusText: upstream.statusText,
156
+ headers: responseHeaders
157
+ });
158
+ };
159
+ return {
160
+ GET: handler,
161
+ POST: handler,
162
+ PUT: handler,
163
+ PATCH: handler,
164
+ DELETE: handler
165
+ };
166
+ }
167
+
168
+ export { toNextJsStoreApiHandler };
169
+ //# sourceMappingURL=api.js.map
170
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/nextjs/api/store-handler.ts"],"names":[],"mappings":"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","file":"api.js","sourcesContent":["import type { NextRequest } from \"next/server\";\nimport { NextResponse } from \"next/server\";\nimport {\n STOREFRONT_API_PATH_PREFIX,\n STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME,\n} from \"@ecomiq/storefront/core\";\n\nconst DEFAULT_API_BASE_URL = \"https://storefront.ecomiq.pe\";\n\nexport type StoreApiHandlerConfig = {\n /**\n * Base URL del API de storefront. Default: \"https://storefront.ecomiq.pe\"\n */\n apiBaseUrl?: string;\n};\n\ntype StoreContextResult =\n | {\n ok: true;\n storeId: string;\n storeDomain: string | null;\n }\n | { ok: false; response: NextResponse };\n\nasync function ensureStoreContext(request: NextRequest): Promise<StoreContextResult> {\n const xStoreId = request.headers.get(\"x-store-id\")?.trim();\n const xStoreDomain = request.headers.get(\"x-store-domain\")?.trim();\n if (xStoreDomain) {\n return {\n ok: true,\n storeId: xStoreId || \"\",\n storeDomain: xStoreDomain || null,\n };\n }\n if (!xStoreId) {\n return {\n ok: false,\n response: NextResponse.json({ error: \"Store context required\", message: \"X-Store-Id is required\", status: 400 }),\n };\n }\n\n return {\n ok: true,\n storeId: xStoreId || \"\",\n storeDomain: xStoreDomain || null,\n };\n}\n\n/**\n * Headers que no se reenvían al upstream Ecomiq.\n * La API remota no usa cookies del navegador para el contexto de tienda: toda petición al proxy debe traer\n * `X-Store-Id`. `X-Store-Domain` es opcional para reenvío al upstream. El token sale de `Authorization` /\n * cookie OAuth leída en el proxy.\n */\nconst SKIP_FORWARD_HEADERS = new Set([\n \"host\",\n \"connection\",\n \"content-length\",\n \"transfer-encoding\",\n \"x-store-id\",\n \"x-store-domain\",\n /** Se reconstruye abajo desde el header entrante al proxy. */\n \"authorization\",\n /** Nunca reenviar sesión/cookies del storefront al API Ecomiq (solo headers operativos). */\n \"cookie\",\n \"cookie2\",\n \"set-cookie\",\n /**\n * Headers de proxy/origen de Cloudflare: se reconstruyen abajo (X-Forwarded-*)\n * para no contaminar la cadena con valores que el upstream no debe leer directamente\n * y para garantizar que la IP del cliente final llegue como X-Forwarded-For.\n */\n \"x-forwarded-for\",\n \"x-forwarded-proto\",\n \"x-forwarded-host\",\n \"x-real-ip\",\n \"forwarded\",\n \"cf-connecting-ip\",\n \"cf-connecting-ipv6\",\n \"true-client-ip\",\n \"cf-ipcountry\",\n \"cf-ray\",\n \"cf-visitor\",\n]);\n\n/**\n * Obtiene la IP real del cliente (no la IP del worker/edge de Cloudflare).\n * En Cloudflare Workers, `cf-connecting-ip` siempre es la IP del cliente final.\n */\nfunction getClientIp(request: NextRequest): string | null {\n const candidates = [\n request.headers.get(\"cf-connecting-ip\"),\n request.headers.get(\"true-client-ip\"),\n request.headers.get(\"x-real-ip\"),\n ];\n for (const value of candidates) {\n const trimmed = value?.trim();\n if (trimmed) return trimmed;\n }\n const xff = request.headers.get(\"x-forwarded-for\");\n if (xff?.trim()) {\n const first = xff.split(\",\")[0]?.trim();\n if (first) return first;\n }\n return null;\n}\n\nfunction buildUpstreamRequest(\n request: NextRequest,\n pathSegments: string[],\n config: StoreApiHandlerConfig,\n storeId: string,\n storeDomain: string | null\n): { url: string; init: RequestInit } {\n const base = (config.apiBaseUrl ?? DEFAULT_API_BASE_URL).replace(/\\/$/, \"\");\n const userPath = pathSegments.length ? pathSegments.join(\"/\") : \"\";\n const path = userPath\n ? `${STOREFRONT_API_PATH_PREFIX}/${userPath}`\n : STOREFRONT_API_PATH_PREFIX;\n const search = request.nextUrl.searchParams.toString();\n const url = search ? `${base}/${path}?${search}` : `${base}/${path}`;\n\n const headers = new Headers();\n request.headers.forEach((value, key) => {\n const lower = key.toLowerCase();\n if (!SKIP_FORWARD_HEADERS.has(lower)) {\n headers.set(key, value);\n }\n });\n headers.set(\"X-Store-Id\", storeId);\n if (storeDomain) {\n headers.set(\"X-Store-domain\", storeDomain);\n }\n\n // Reenvío de IP/origen del cliente final hacia apiecomiq.\n // Sin esto, todas las requests llegan con la IP del worker de Cloudflare\n // y caen en el rate limit del backend (.NET ForwardedHeaders middleware\n // lee X-Forwarded-For / -Proto / -Host).\n const clientIp = getClientIp(request);\n if (clientIp) {\n headers.set(\"X-Forwarded-For\", clientIp);\n }\n const forwardedProto =\n request.headers.get(\"cf-visitor\")?.match(/\"scheme\":\"(https?)\"/)?.[1] ??\n request.nextUrl.protocol.replace(\":\", \"\") ??\n \"https\";\n headers.set(\"X-Forwarded-Proto\", forwardedProto);\n const forwardedHost =\n request.headers.get(\"host\") ?? request.nextUrl.host;\n if (forwardedHost) {\n headers.set(\"X-Forwarded-Host\", forwardedHost);\n }\n\n const incomingAuth = request.headers.get(\"authorization\")?.trim();\n const storefrontOAuth =\n request.cookies.get(STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME)?.value?.trim();\n\n if (incomingAuth && /^Bearer\\s+\\S+/i.test(incomingAuth)) {\n headers.set(\"Authorization\", incomingAuth);\n } else if (storefrontOAuth) {\n headers.set(\"Authorization\", `Bearer ${storefrontOAuth}`);\n }\n headers.set(\"Accept-Encoding\", \"identity\");\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method: request.method,\n headers,\n };\n\n const bodyMethods = [\"POST\", \"PUT\", \"PATCH\"];\n if (bodyMethods.includes(request.method) && request.body) {\n init.body = request.body;\n init.duplex = \"half\";\n }\n\n return { url, init };\n}\n\n/** Códigos HTTP que no pueden llevar cuerpo (Fetch / NextResponse). */\nfunction isResponseBodyForbidden(status: number): boolean {\n return status === 204 || status === 205 || status === 304;\n}\n\n/**\n * Crea los handlers de ruta para montar la API de store como proxy en Next.js App Router.\n * La base /v1/storefront se maneja internamente: el usuario llama /api/store/products\n * y se hace proxy a https://storefront.ecomiq.pe/v1/storefront/products.\n *\n * // app/api/store/[...path]/route.ts\n * import { toNextJsStoreApiHandler } from \"@ecomiq/storefront/nextjs/api\";\n *\n * export const { GET, POST, PUT, PATCH, DELETE } = toNextJsStoreApiHandler({\n * apiBaseUrl: \"https://storefront.ecomiq.pe\", // opcional, es el default\n * });\n */\nexport function toNextJsStoreApiHandler(config: StoreApiHandlerConfig) {\n const handler = async (\n request: NextRequest,\n context: { params: Promise<{ path?: string[] }> }\n ): Promise<NextResponse> => {\n const params = await context.params;\n const pathSegments = params.path ?? [];\n\n const storeContext = await ensureStoreContext(request);\n if (!storeContext.ok) {\n return storeContext.response;\n }\n\n const { storeId, storeDomain } = storeContext;\n const { url, init } = buildUpstreamRequest(\n request,\n pathSegments,\n config,\n storeId,\n storeDomain\n );\n\n const upstream = await fetch(url, init);\n const responseHeaders = new Headers(upstream.headers);\n const status = upstream.status;\n\n if (isResponseBodyForbidden(status)) {\n responseHeaders.delete(\"content-length\");\n responseHeaders.delete(\"content-type\");\n return new NextResponse(null, {\n status,\n statusText: upstream.statusText,\n headers: responseHeaders,\n });\n }\n\n const body = await upstream.text();\n return new NextResponse(body, {\n status,\n statusText: upstream.statusText,\n headers: responseHeaders,\n });\n };\n\n return {\n GET: handler,\n POST: handler,\n PUT: handler,\n PATCH: handler,\n DELETE: handler,\n };\n}\n"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Estilos base del SDK para consumidores npm (sin @ecomiq/ui).
3
+ * La app debe aportar su propio sistema de diseño / primitivos UI.
4
+ */
5
+ @import "tailwindcss";
6
+
7
+ @source "../react/";
8
+ @source "../react/components/cms-sections-renderer.tsx";
9
+
10
+ @layer base {
11
+ * {
12
+ border-color: var(--border, currentColor);
13
+ }
14
+ }