@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.
package/dist/core.js ADDED
@@ -0,0 +1,1127 @@
1
+ import axios from 'axios';
2
+ import { z } from 'zod';
3
+
4
+ // src/core/constants/api-paths.ts
5
+ var STOREFRONT_API_PATH_PREFIX = "v1";
6
+
7
+ // src/core/constants/storefront-ecomiq-oauth-cookie.ts
8
+ var STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME = "ecomiq_sf_oauth_at";
9
+ var STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH = "/api/store";
10
+
11
+ // src/core/constants/currency.ts
12
+ var countryCurrency = {
13
+ "PEN": "es-PE",
14
+ "USD": "en-US",
15
+ "COP": "es-CO",
16
+ "MXN": "es-MX"
17
+ };
18
+
19
+ // src/core/utils/format-currency.ts
20
+ function formatCurrency(amount, currency = "USD") {
21
+ const locale = countryCurrency[currency] ?? "en-US";
22
+ return new Intl.NumberFormat(locale, {
23
+ style: "currency",
24
+ currency
25
+ }).format(amount);
26
+ }
27
+
28
+ // src/core/lib/customer-order-labels.ts
29
+ var ORDER_STATUS_LABELS = {
30
+ New: "Pedido realizado",
31
+ Confirmed: "Confirmado",
32
+ Processing: "En preparaci\xF3n",
33
+ InTransit: "En camino",
34
+ Delivered: "Entregado",
35
+ Cancelled: "Cancelado",
36
+ Canceled: "Cancelado",
37
+ Refunded: "Reembolsado",
38
+ Pending: "Pendiente",
39
+ Paid: "Pagado",
40
+ Captured: "Pago confirmado"
41
+ };
42
+ function formatCustomerOrderStatus(status) {
43
+ const trimmed = status.trim();
44
+ if (!trimmed) return "Desconocido";
45
+ return ORDER_STATUS_LABELS[trimmed] ?? trimmed.replace(/([A-Z])/g, " $1").trim();
46
+ }
47
+ function customerOrderStatusTone(status) {
48
+ const s = status.toLowerCase();
49
+ if (s.includes("cancel") || s.includes("refund")) return "danger";
50
+ if (s.includes("deliver")) return "success";
51
+ if (s.includes("transit") || s.includes("ship")) return "info";
52
+ if (s.includes("confirm") || s.includes("paid") || s.includes("capture")) return "success";
53
+ if (s.includes("pending") || s.includes("new") || s.includes("process")) return "warning";
54
+ return "default";
55
+ }
56
+ function formatOrderDate(iso, locale = "es-PE") {
57
+ const d = new Date(iso);
58
+ if (Number.isNaN(d.getTime())) return iso;
59
+ return new Intl.DateTimeFormat(locale, {
60
+ day: "numeric",
61
+ month: "long",
62
+ year: "numeric"
63
+ }).format(d);
64
+ }
65
+ function formatOrderDateTime(iso, locale = "es-PE") {
66
+ const d = new Date(iso);
67
+ if (Number.isNaN(d.getTime())) return iso;
68
+ return new Intl.DateTimeFormat(locale, {
69
+ day: "numeric",
70
+ month: "short",
71
+ year: "numeric",
72
+ hour: "2-digit",
73
+ minute: "2-digit"
74
+ }).format(d);
75
+ }
76
+
77
+ // src/core/lib/storefront-geo-inei.ts
78
+ function toGeoItems(data) {
79
+ if (!Array.isArray(data)) return [];
80
+ return data.map((raw) => {
81
+ if (!raw || typeof raw !== "object") return null;
82
+ const item = raw;
83
+ return {
84
+ code: String(item.code ?? ""),
85
+ name: String(item.name ?? "")
86
+ };
87
+ }).filter((x) => !!x && !!x.code && !!x.name);
88
+ }
89
+ var departmentsCache = null;
90
+ var departmentsRequest = null;
91
+ function loadStorefrontGeoDepartments(headers) {
92
+ if (departmentsCache) return Promise.resolve(departmentsCache);
93
+ if (departmentsRequest) return departmentsRequest;
94
+ departmentsRequest = fetch(
95
+ `/api/store/geo/departments?countryCode=PE&source=inei&limit=200`,
96
+ { cache: "no-store", headers }
97
+ ).then((r) => r.json()).then((data) => {
98
+ const items = toGeoItems(data);
99
+ departmentsCache = items;
100
+ return items;
101
+ }).catch(() => {
102
+ departmentsCache = [];
103
+ return [];
104
+ }).finally(() => {
105
+ departmentsRequest = null;
106
+ });
107
+ return departmentsRequest;
108
+ }
109
+ async function fetchStorefrontGeoProvinces(headers, countryCode, departmentCode) {
110
+ const res = await fetch(
111
+ `/api/store/geo/provinces?countryCode=${encodeURIComponent(
112
+ countryCode
113
+ )}&departmentCode=${encodeURIComponent(departmentCode)}&source=inei&limit=200`,
114
+ { headers }
115
+ );
116
+ const data = await res.json();
117
+ return toGeoItems(data);
118
+ }
119
+ async function fetchStorefrontGeoDistricts(headers, countryCode, provinceCode) {
120
+ const res = await fetch(
121
+ `/api/store/geo/districts?countryCode=${encodeURIComponent(
122
+ countryCode
123
+ )}&provinceCode=${encodeURIComponent(provinceCode)}&source=inei`,
124
+ { headers }
125
+ );
126
+ const data = await res.json();
127
+ return toGeoItems(data);
128
+ }
129
+ async function resolveIneiCodesFromLabels(storeId, labels, countryCode = "PE") {
130
+ const id = storeId.trim();
131
+ if (!id) return null;
132
+ const headers = { "X-Store-Id": id };
133
+ const departments = await loadStorefrontGeoDepartments(headers);
134
+ const dept = departments.find((d) => d.name.trim() === labels.department.trim());
135
+ if (!dept) return null;
136
+ const provinces = await fetchStorefrontGeoProvinces(headers, countryCode, dept.code);
137
+ const prov = provinces.find((p) => p.name.trim() === labels.province.trim());
138
+ if (!prov) {
139
+ return { departmentCode: dept.code, provinceCode: "", districtCode: "" };
140
+ }
141
+ const districts = await fetchStorefrontGeoDistricts(headers, countryCode, prov.code);
142
+ const dist = districts.find((d) => d.name.trim() === labels.district.trim());
143
+ return {
144
+ departmentCode: dept.code,
145
+ provinceCode: prov.code,
146
+ districtCode: dist?.code ?? ""
147
+ };
148
+ }
149
+ var ApiClient = class {
150
+ client;
151
+ storeId;
152
+ storeDomain;
153
+ constructor(baseURL = "https://storefront.ecomiq.pe") {
154
+ this.client = axios.create({
155
+ baseURL,
156
+ timeout: 1e4,
157
+ headers: {
158
+ "Content-Type": "application/json"
159
+ }
160
+ });
161
+ this.client.interceptors.request.use(
162
+ (config) => {
163
+ if (config.headers) {
164
+ if (this.storeId) config.headers["X-Store-Id"] = this.storeId;
165
+ if (this.storeDomain) config.headers["X-Store-Domain"] = this.storeDomain;
166
+ }
167
+ return config;
168
+ }
169
+ );
170
+ this.client.interceptors.response.use(
171
+ (response) => response,
172
+ (error) => {
173
+ console.error("API Error:", error);
174
+ return Promise.reject(error);
175
+ }
176
+ );
177
+ }
178
+ setStoreId(storeId) {
179
+ this.storeId = storeId;
180
+ }
181
+ /** Subdominio para endpoints que usan X-Store-Domain (ej. GET /v1/storefront/settings) */
182
+ setStoreDomain(domain) {
183
+ this.storeDomain = domain;
184
+ }
185
+ get(url, config) {
186
+ return this.client.get(url, config).then((response) => response.data);
187
+ }
188
+ post(url, data, config) {
189
+ return this.client.post(url, data, config).then((response) => response.data);
190
+ }
191
+ put(url, data, config) {
192
+ return this.client.put(url, data, config).then((response) => response.data);
193
+ }
194
+ patch(url, data, config) {
195
+ return this.client.patch(url, data, config).then((response) => response.data);
196
+ }
197
+ delete(url, config) {
198
+ return this.client.delete(url, config).then((response) => response.data);
199
+ }
200
+ };
201
+ var apiClient = new ApiClient();
202
+ var ProductVariantSchema = z.object({
203
+ id: z.coerce.string(),
204
+ name: z.string(),
205
+ storeId: z.string(),
206
+ productId: z.coerce.string(),
207
+ basePrice: z.number().positive().optional().nullable(),
208
+ comparePrice: z.number().positive().optional().nullable(),
209
+ //TODO: remove this field
210
+ originalPrice: z.number().positive().optional().nullable(),
211
+ costPrice: z.number().positive().optional().nullable(),
212
+ isDefault: z.boolean().optional().nullable(),
213
+ reserveStock: z.number().nonnegative().optional().nullable(),
214
+ weight: z.number().nonnegative().optional().nullable().default(0),
215
+ width: z.number().nonnegative().optional().nullable(),
216
+ height: z.number().nonnegative().optional().nullable(),
217
+ unitOfMeasure: z.string().optional().nullable(),
218
+ order: z.number().nonnegative().optional().nullable().default(0),
219
+ sku: z.string().optional().nullable(),
220
+ stock: z.number().nonnegative().optional().nullable(),
221
+ leadTime: z.string().optional().nullable(),
222
+ barCode: z.string().optional().nullable(),
223
+ shippingWeight: z.number().nonnegative().optional().nullable(),
224
+ images: z.array(z.string()).optional().nullable(),
225
+ attributes: z.array(z.string()).optional().nullable(),
226
+ variantStatus: z.string().optional().nullable(),
227
+ status: z.string().optional().nullable(),
228
+ createdOn: z.string().optional().nullable(),
229
+ updatedOn: z.string().optional().nullable(),
230
+ deletedOn: z.string().optional().nullable()
231
+ });
232
+ var ProductSchema = z.object({
233
+ id: z.coerce.string(),
234
+ name: z.string(),
235
+ images: z.array(z.object({
236
+ url: z.string().url(),
237
+ name: z.string().optional(),
238
+ isPrimary: z.boolean().optional()
239
+ })),
240
+ basePrice: z.number().positive().optional(),
241
+ salePrice: z.number().positive().optional(),
242
+ slug: z.string(),
243
+ description: z.string().optional(),
244
+ categories: z.array(z.object({
245
+ id: z.coerce.string(),
246
+ name: z.string(),
247
+ slug: z.string(),
248
+ logo: z.string().optional(),
249
+ icon: z.string().optional()
250
+ })).optional(),
251
+ tags: z.array(z.string()).optional(),
252
+ inStock: z.boolean().optional(),
253
+ variants: z.array(ProductVariantSchema).optional()
254
+ });
255
+ var ProductsResponseSchema = z.object({
256
+ items: z.array(ProductSchema),
257
+ meta: z.object({
258
+ total: z.number().int().positive(),
259
+ page: z.number().int().positive(),
260
+ pageSize: z.number().int().positive(),
261
+ hasNextPage: z.boolean()
262
+ })
263
+ });
264
+ var ProductsFiltersSchema = z.object({
265
+ category: z.string().optional(),
266
+ search: z.string().optional(),
267
+ minPrice: z.number().positive().optional(),
268
+ maxPrice: z.number().positive().optional(),
269
+ inStock: z.boolean().optional(),
270
+ sortBy: z.enum(["name", "price", "createdAt"]).optional(),
271
+ sortOrder: z.enum(["asc", "desc"]).optional(),
272
+ page: z.number().int().positive().optional(),
273
+ limit: z.number().int().positive().optional()
274
+ });
275
+ var StorefrontProductSchema = z.object({
276
+ id: z.coerce.string(),
277
+ name: z.string(),
278
+ slug: z.string(),
279
+ productType: z.string().optional().nullable(),
280
+ imageUrl: z.string().optional().nullable(),
281
+ price: z.number().nonnegative(),
282
+ compareAtPrice: z.number().nonnegative().optional().nullable(),
283
+ variantCount: z.number().int().nonnegative().optional().default(0),
284
+ isAvailable: z.boolean(),
285
+ totalInventory: z.number().int().nonnegative(),
286
+ bundleItemsCount: z.number().int().nonnegative().optional().default(0),
287
+ brand: z.string().optional().nullable(),
288
+ category: z.string().optional().nullable(),
289
+ status: z.string().optional().nullable(),
290
+ tags: z.array(z.string()).optional().nullable()
291
+ });
292
+ var StorefrontFacetSchema = z.object({
293
+ value: z.string(),
294
+ count: z.number().int().nonnegative()
295
+ });
296
+ var StorefrontProductsResponseSchema = z.object({
297
+ pageIndex: z.number().int().positive(),
298
+ pageSize: z.number().int().positive(),
299
+ totalCount: z.number().int().nonnegative(),
300
+ totalPages: z.number().int().nonnegative(),
301
+ products: z.array(StorefrontProductSchema),
302
+ categories: z.array(StorefrontFacetSchema).optional().default([]),
303
+ brands: z.array(StorefrontFacetSchema).optional().default([]),
304
+ minPrice: z.number().nonnegative().optional().nullable(),
305
+ maxPrice: z.number().nonnegative().optional().nullable()
306
+ });
307
+ var StorefrontProductsParamsSchema = z.object({
308
+ page: z.number().int().positive().optional().default(1),
309
+ pageSize: z.number().int().positive().optional().default(20),
310
+ sort: z.enum(["price_asc", "price_desc", "name_asc", "name_desc", "newest"]).optional().default("price_asc"),
311
+ sellerId: z.string().optional(),
312
+ search: z.string().optional(),
313
+ collection: z.string().optional(),
314
+ category: z.string().optional(),
315
+ brand: z.string().optional(),
316
+ productType: z.string().optional(),
317
+ inStock: z.boolean().optional(),
318
+ minPrice: z.number().nonnegative().optional(),
319
+ maxPrice: z.number().nonnegative().optional()
320
+ });
321
+ var StorefrontVariantOptionSchema = z.object({
322
+ key: z.string(),
323
+ name: z.string(),
324
+ value: z.string()
325
+ });
326
+ var StorefrontProductImageSchema = z.object({
327
+ url: z.string(),
328
+ name: z.string().optional().nullable(),
329
+ order: z.number().int().nonnegative().optional()
330
+ });
331
+ var StorefrontVariantSchema = z.object({
332
+ id: z.coerce.string().optional().default(""),
333
+ sku: z.string(),
334
+ status: z.string().optional().nullable(),
335
+ price: z.number().nonnegative(),
336
+ compareAtPrice: z.number().nonnegative().optional().nullable(),
337
+ quantity: z.number().int().nonnegative(),
338
+ options: z.array(StorefrontVariantOptionSchema).optional().default([]),
339
+ images: z.array(StorefrontProductImageSchema).optional().default([])
340
+ });
341
+ var StorefrontPriceTierSchema = z.object({
342
+ variantId: z.coerce.string(),
343
+ minQuantity: z.number().int().positive(),
344
+ maxQuantity: z.number().int().positive().optional().nullable(),
345
+ unitPrice: z.number().nonnegative()
346
+ });
347
+ var StorefrontBundleItemSchema = z.object({
348
+ productId: z.coerce.string(),
349
+ variantId: z.coerce.string(),
350
+ productName: z.string(),
351
+ variantName: z.string().optional().nullable(),
352
+ sku: z.string().optional().nullable(),
353
+ brand: z.string().optional().nullable(),
354
+ imageUrl: z.string().optional().nullable(),
355
+ quantity: z.number().int(),
356
+ availableStock: z.number().int().optional().default(0),
357
+ allowBackorders: z.boolean().optional().default(false),
358
+ requiresShipping: z.boolean().optional().default(true)
359
+ });
360
+ var StorefrontProductDetailSchema = z.object({
361
+ id: z.coerce.string(),
362
+ name: z.string(),
363
+ slug: z.string(),
364
+ description: z.string().optional().nullable(),
365
+ productType: z.string().optional().nullable(),
366
+ status: z.string().optional().nullable(),
367
+ imageUrl: z.string().optional().nullable(),
368
+ price: z.number().nonnegative(),
369
+ compareAtPrice: z.number().nonnegative().optional().nullable(),
370
+ isAvailable: z.boolean(),
371
+ totalInventory: z.number().int().nonnegative(),
372
+ brand: z.string().optional().nullable(),
373
+ category: z.string().optional().nullable(),
374
+ categoryId: z.coerce.string().optional().nullable(),
375
+ tags: z.array(z.string()).optional().nullable(),
376
+ specifications: z.array(z.record(z.string(), z.unknown())).optional().default([]),
377
+ variants: z.array(StorefrontVariantSchema).optional().default([]),
378
+ images: z.array(StorefrontProductImageSchema).optional().default([]),
379
+ bundleItems: z.array(StorefrontBundleItemSchema).optional().default([]),
380
+ priceTiers: z.array(StorefrontPriceTierSchema).optional().default([]),
381
+ createdAt: z.string().optional().nullable(),
382
+ updatedAt: z.string().optional().nullable()
383
+ });
384
+
385
+ // src/core/services/product.service.ts
386
+ var ProductService = class _ProductService {
387
+ static instance;
388
+ constructor() {
389
+ }
390
+ static getInstance() {
391
+ if (!_ProductService.instance) {
392
+ _ProductService.instance = new _ProductService();
393
+ }
394
+ return _ProductService.instance;
395
+ }
396
+ /**
397
+ * Obtiene todos los productos del store
398
+ */
399
+ async getProducts(filters) {
400
+ if (filters) {
401
+ ProductsFiltersSchema.parse(filters);
402
+ }
403
+ const params = new URLSearchParams();
404
+ if (filters) {
405
+ if (filters.category) params.append("category", filters.category);
406
+ if (filters.search) params.append("search", filters.search);
407
+ if (filters.minPrice) params.append("minPrice", filters.minPrice.toString());
408
+ if (filters.maxPrice) params.append("maxPrice", filters.maxPrice.toString());
409
+ if (filters.sortBy) params.append("sortBy", filters.sortBy);
410
+ if (filters.sortOrder) params.append("sortOrder", filters.sortOrder);
411
+ if (filters.page) params.append("page", filters.page.toString());
412
+ if (filters.limit) params.append("limit", filters.limit.toString());
413
+ }
414
+ const queryString = params.toString();
415
+ const url = `/${STOREFRONT_API_PATH_PREFIX}/products${queryString ? `?${queryString}` : ""}`;
416
+ const response = await apiClient.get(url);
417
+ return ProductsResponseSchema.parse(response);
418
+ }
419
+ /**
420
+ * Obtiene un producto específico por ID
421
+ */
422
+ async getProduct(id) {
423
+ const response = await apiClient.get(`/${STOREFRONT_API_PATH_PREFIX}/products/${id}`);
424
+ return ProductSchema.parse(response);
425
+ }
426
+ /**
427
+ * Obtiene un producto específico por slug
428
+ */
429
+ async getProductBySlug(slug) {
430
+ const response = await apiClient.get(`/${STOREFRONT_API_PATH_PREFIX}/products/${encodeURIComponent(slug)}`);
431
+ return ProductSchema.parse(response);
432
+ }
433
+ /**
434
+ * Busca productos por término de búsqueda
435
+ */
436
+ async searchProducts(query, filters) {
437
+ return this.getProducts({ ...filters, search: query });
438
+ }
439
+ /**
440
+ * Obtiene productos por categoría
441
+ */
442
+ async getProductsByCategory(category, filters) {
443
+ return this.getProducts({ ...filters, category });
444
+ }
445
+ /**
446
+ * Obtiene productos en oferta (con descuento)
447
+ */
448
+ async getProductsOnSale(filters) {
449
+ return this.getProducts({ ...filters, minPrice: 0 });
450
+ }
451
+ /**
452
+ * Obtiene productos en stock
453
+ */
454
+ async getProductsInStock(filters) {
455
+ return this.getProducts({ ...filters, inStock: true });
456
+ }
457
+ /**
458
+ * Lista de productos del storefront (API v1/storefront/products).
459
+ * Soporta paginación, orden y filtros por categoría, marca y precio.
460
+ */
461
+ async getStorefrontProducts(params) {
462
+ const parsed = StorefrontProductsParamsSchema.parse(params ?? {});
463
+ const searchParams = new URLSearchParams();
464
+ searchParams.set("page", String(parsed.page));
465
+ searchParams.set("pageSize", String(parsed.pageSize));
466
+ if (parsed.sort) searchParams.set("sort", parsed.sort);
467
+ if (parsed.sellerId) searchParams.set("sellerId", parsed.sellerId);
468
+ if (parsed.collection) searchParams.set("collection", parsed.collection);
469
+ if (parsed.category) searchParams.set("category", parsed.category);
470
+ if (parsed.brand) searchParams.set("brand", parsed.brand);
471
+ if (parsed.productType) searchParams.set("productType", parsed.productType);
472
+ if (parsed.inStock != null) searchParams.set("inStock", String(parsed.inStock));
473
+ if (parsed.minPrice != null) searchParams.set("minPrice", String(parsed.minPrice));
474
+ if (parsed.maxPrice != null) searchParams.set("maxPrice", String(parsed.maxPrice));
475
+ if (parsed.search) searchParams.set("search", parsed.search);
476
+ const url = `/${STOREFRONT_API_PATH_PREFIX}/products?${searchParams.toString()}`;
477
+ const response = await apiClient.get(url);
478
+ return StorefrontProductsResponseSchema.parse(response);
479
+ }
480
+ /**
481
+ * Obtiene un producto del storefront por slug (API v1/storefront/products/by-slug/:slug).
482
+ */
483
+ async getStorefrontProductBySlug(slug) {
484
+ const response = await apiClient.get(`/${STOREFRONT_API_PATH_PREFIX}/products/by-slug/${encodeURIComponent(slug)}`);
485
+ return StorefrontProductDetailSchema.parse(response);
486
+ }
487
+ };
488
+ var productService = ProductService.getInstance();
489
+ var StorefrontCollectionSchema = z.object({
490
+ id: z.coerce.string(),
491
+ slug: z.string(),
492
+ name: z.string(),
493
+ description: z.string().nullable().optional(),
494
+ imageUrl: z.string().nullable().optional(),
495
+ type: z.string(),
496
+ productCount: z.number().int().nonnegative()
497
+ });
498
+ var StorefrontCollectionsResponseSchema = z.array(StorefrontCollectionSchema);
499
+ var StorefrontCollectionDetailSchema = StorefrontCollectionSchema;
500
+
501
+ // src/core/services/collection.service.ts
502
+ var CollectionService = class _CollectionService {
503
+ static instance;
504
+ constructor() {
505
+ }
506
+ static getInstance() {
507
+ if (!_CollectionService.instance) {
508
+ _CollectionService.instance = new _CollectionService();
509
+ }
510
+ return _CollectionService.instance;
511
+ }
512
+ /**
513
+ * Lista de colecciones del storefront (GET /v1/collections).
514
+ */
515
+ async getStorefrontCollections() {
516
+ const response = await apiClient.get(
517
+ `/${STOREFRONT_API_PATH_PREFIX}/collections`
518
+ );
519
+ return StorefrontCollectionsResponseSchema.parse(response);
520
+ }
521
+ /**
522
+ * Obtiene una colección del storefront por slug (GET /v1/collections/by-slug/:slug).
523
+ */
524
+ async getStorefrontCollectionBySlug(slug) {
525
+ const response = await apiClient.get(
526
+ `/${STOREFRONT_API_PATH_PREFIX}/collections/by-slug/${encodeURIComponent(slug)}`
527
+ );
528
+ return StorefrontCollectionDetailSchema.parse(response);
529
+ }
530
+ };
531
+ var collectionService = CollectionService.getInstance();
532
+ var StorefrontPageListItemSchema = z.object({
533
+ id: z.string(),
534
+ name: z.string(),
535
+ slug: z.string(),
536
+ layout: z.string()
537
+ });
538
+ var StorefrontPageSeoSchema = z.object({
539
+ title: z.string().optional(),
540
+ description: z.string().optional()
541
+ }).optional();
542
+ var StorefrontPageSettingsSchema = z.object({
543
+ seo: StorefrontPageSeoSchema,
544
+ html: z.string().optional(),
545
+ title: z.string().optional()
546
+ }).catchall(z.unknown());
547
+ var StorefrontPageBlockSchema = z.object({
548
+ id: z.string(),
549
+ type: z.string(),
550
+ order: z.number(),
551
+ settings: z.record(z.unknown()).optional()
552
+ });
553
+ var StorefrontPageSectionSchema = z.object({
554
+ id: z.string(),
555
+ type: z.string(),
556
+ order: z.number(),
557
+ settings: z.record(z.unknown()).optional(),
558
+ blocks: z.array(StorefrontPageBlockSchema).optional().default([])
559
+ });
560
+ var StorefrontPageDetailSchema = z.object({
561
+ id: z.string(),
562
+ name: z.string(),
563
+ slug: z.string(),
564
+ layout: z.string(),
565
+ settings: StorefrontPageSettingsSchema.optional(),
566
+ sections: z.array(StorefrontPageSectionSchema).optional()
567
+ });
568
+
569
+ // src/core/services/page.service.ts
570
+ var PageService = class _PageService {
571
+ static instance;
572
+ constructor() {
573
+ }
574
+ static getInstance() {
575
+ if (!_PageService.instance) {
576
+ _PageService.instance = new _PageService();
577
+ }
578
+ return _PageService.instance;
579
+ }
580
+ /**
581
+ * Lista de páginas del storefront (GET /v1/pages).
582
+ */
583
+ async getPages() {
584
+ const response = await apiClient.get(
585
+ `/${STOREFRONT_API_PATH_PREFIX}/pages`
586
+ );
587
+ return z.array(StorefrontPageListItemSchema).parse(response);
588
+ }
589
+ /**
590
+ * Obtiene una página por slug (GET /v1/pages/{slug}).
591
+ * sections puede no venir en la respuesta.
592
+ */
593
+ async getPageBySlug(slug) {
594
+ const response = await apiClient.get(
595
+ `/${STOREFRONT_API_PATH_PREFIX}/pages/${encodeURIComponent(slug)}`
596
+ );
597
+ return StorefrontPageDetailSchema.parse(response);
598
+ }
599
+ };
600
+ var pageService = PageService.getInstance();
601
+ var StorefrontCheckoutSettingsSchema = z.object({
602
+ allowGuestCheckout: z.boolean().optional(),
603
+ identityScope: z.enum(["store", "tenant", "global"]).optional(),
604
+ signInMethods: z.array(z.string()).optional()
605
+ });
606
+ var looseRecord = z.record(z.string(), z.unknown());
607
+ var StorefrontThemeConfigSchema = z.object({
608
+ name: z.string().nullable().optional(),
609
+ mode: z.string().nullable().optional(),
610
+ colors: looseRecord.optional(),
611
+ fonts: looseRecord.optional(),
612
+ assets: looseRecord.optional()
613
+ }).passthrough();
614
+ var StorefrontFeaturesEnabledSchema = z.object({
615
+ flags: looseRecord.optional()
616
+ }).passthrough();
617
+ var StorefrontCmsBrandingSchema = z.object({
618
+ logoUrl: z.string().nullable().optional(),
619
+ logoDarkUrl: z.string().nullable().optional(),
620
+ faviconUrl: z.string().nullable().optional(),
621
+ socialImageUrl: z.string().nullable().optional()
622
+ });
623
+ var StorefrontCmsSeoSchema = z.object({
624
+ siteName: z.string().nullable().optional(),
625
+ metaTitle: z.string().nullable().optional(),
626
+ metaDescription: z.string().nullable().optional(),
627
+ titleTemplate: z.string().nullable().optional(),
628
+ robotsIndex: z.boolean().optional()
629
+ });
630
+ var StorefrontCmsSocialLinksSchema = z.object({
631
+ instagram: z.string().nullable().optional(),
632
+ facebook: z.string().nullable().optional(),
633
+ tiktok: z.string().nullable().optional(),
634
+ youtube: z.string().nullable().optional(),
635
+ x: z.string().nullable().optional()
636
+ });
637
+ var StorefrontCmsContactSchema = z.object({
638
+ supportEmail: z.string().nullable().optional(),
639
+ phone: z.string().nullable().optional(),
640
+ whatsapp: z.string().nullable().optional(),
641
+ address: z.string().nullable().optional(),
642
+ socialLinks: StorefrontCmsSocialLinksSchema.optional()
643
+ });
644
+ var StorefrontCmsTrackingSchema = z.object({
645
+ googleAnalyticsMeasurementId: z.string().nullable().optional(),
646
+ metaPixelId: z.string().nullable().optional(),
647
+ googleTagManagerContainerId: z.string().nullable().optional()
648
+ });
649
+ var StorefrontCmsCustomScriptsSchema = z.object({
650
+ enabled: z.boolean().optional(),
651
+ head: z.string().nullable().optional(),
652
+ bodyEnd: z.string().nullable().optional()
653
+ });
654
+ var StorefrontCmsSettingsSchema = z.object({
655
+ themeKey: z.string().optional(),
656
+ branding: StorefrontCmsBrandingSchema.optional(),
657
+ seo: StorefrontCmsSeoSchema.optional(),
658
+ contact: StorefrontCmsContactSchema.optional(),
659
+ tracking: StorefrontCmsTrackingSchema.optional(),
660
+ customScripts: StorefrontCmsCustomScriptsSchema.optional(),
661
+ updatedOn: z.string().nullable().optional()
662
+ });
663
+ var StorefrontCmsPageSchema = z.object({
664
+ id: z.string(),
665
+ name: z.string(),
666
+ slug: z.string(),
667
+ layout: z.string().optional(),
668
+ version: z.number().optional(),
669
+ settings: z.record(z.string(), z.unknown()).optional().nullable(),
670
+ sections: z.array(z.unknown()).optional(),
671
+ status: z.string().optional(),
672
+ hasPublishedVersion: z.boolean().optional(),
673
+ publishedOn: z.string().nullable().optional(),
674
+ publishedBy: z.string().nullable().optional(),
675
+ createdOn: z.string().nullable().optional(),
676
+ updatedOn: z.string().nullable().optional(),
677
+ createdBy: z.string().nullable().optional(),
678
+ updatedBy: z.string().nullable().optional(),
679
+ lastModifiedBy: z.string().nullable().optional()
680
+ }).passthrough();
681
+ var StorefrontSettingsLegacyFlatSchema = z.object({
682
+ id: z.coerce.string(),
683
+ tenantId: z.string().nullable().optional(),
684
+ name: z.string(),
685
+ slug: z.coerce.string().optional(),
686
+ description: z.string().nullable().optional(),
687
+ visibility: z.string().nullable().optional(),
688
+ logo: z.string().nullable().optional(),
689
+ favicon: z.string().nullable().optional(),
690
+ icon: z.string().nullable().optional(),
691
+ currency: z.string().nullable().optional(),
692
+ language: z.string().nullable().optional(),
693
+ themeConfig: z.unknown().optional().nullable(),
694
+ featuresEnabled: z.unknown().optional().nullable(),
695
+ checkoutSettings: StorefrontCheckoutSettingsSchema.optional().nullable()
696
+ }).passthrough();
697
+ function unwrapSettingsResponseBody(v) {
698
+ if (!v || typeof v !== "object" || Array.isArray(v)) return v;
699
+ const o = v;
700
+ if ("data" in o && o.data != null && typeof o.data === "object" && !Array.isArray(o.data)) {
701
+ return o.data;
702
+ }
703
+ return v;
704
+ }
705
+ function isLegacyFlatSettingsPayload(v) {
706
+ if (!v || typeof v !== "object" || Array.isArray(v)) return false;
707
+ const o = v;
708
+ if ("store" in o || "schemaVersion" in o || "cms" in o) return false;
709
+ return (typeof o.id === "string" || typeof o.id === "number") && typeof o.name === "string";
710
+ }
711
+ function normalizeStorefrontSettingsPayload(v) {
712
+ const body = unwrapSettingsResponseBody(v);
713
+ if (!isLegacyFlatSettingsPayload(body)) return body;
714
+ const raw = body;
715
+ const parsed = StorefrontSettingsLegacyFlatSchema.safeParse(raw);
716
+ if (!parsed.success) return body;
717
+ const l = parsed.data;
718
+ const currency = l.currency?.trim() ? l.currency : "PEN";
719
+ const language = l.language?.trim() ? l.language : "es";
720
+ const slug = l.slug?.trim() ? l.slug : l.id;
721
+ return {
722
+ schemaVersion: 0,
723
+ generatedAt: (/* @__PURE__ */ new Date(0)).toISOString(),
724
+ store: {
725
+ id: l.id,
726
+ tenantId: l.tenantId ?? void 0,
727
+ name: l.name,
728
+ slug,
729
+ description: l.description ?? null,
730
+ logo: l.logo ?? null,
731
+ icon: l.icon ?? null,
732
+ visibility: l.visibility ?? void 0,
733
+ currency,
734
+ language,
735
+ themeConfig: l.themeConfig ?? void 0,
736
+ featuresEnabled: l.featuresEnabled ?? void 0,
737
+ checkoutSettings: l.checkoutSettings ?? void 0
738
+ },
739
+ cms: {
740
+ settings: {
741
+ branding: {
742
+ faviconUrl: l.favicon ?? null,
743
+ logoUrl: l.logo ?? null,
744
+ logoDarkUrl: null,
745
+ socialImageUrl: null
746
+ }
747
+ },
748
+ pages: []
749
+ }
750
+ };
751
+ }
752
+ var StorefrontStoreSchema = z.object({
753
+ id: z.string(),
754
+ tenantId: z.string().optional(),
755
+ sellerId: z.string().optional(),
756
+ plan: z.string().optional(),
757
+ storageLimitBytes: z.number().optional(),
758
+ monthlyTransferLimitBytes: z.number().optional(),
759
+ maxUploadSizeBytes: z.number().optional(),
760
+ maxStores: z.number().optional(),
761
+ maxMembers: z.number().optional(),
762
+ maxProducts: z.number().optional(),
763
+ maxCategories: z.number().optional(),
764
+ maxBrands: z.number().optional(),
765
+ maxAttributes: z.number().optional(),
766
+ maxCollections: z.number().optional(),
767
+ enableApi: z.boolean().optional(),
768
+ isActive: z.boolean().optional(),
769
+ name: z.string(),
770
+ description: z.string().nullable().optional(),
771
+ avatarUrl: z.string().nullable().optional(),
772
+ logo: z.string().nullable().optional(),
773
+ icon: z.string().nullable().optional(),
774
+ slug: z.string(),
775
+ domain: z.string().nullable().optional(),
776
+ domains: z.array(z.string()).optional(),
777
+ timeZone: z.string().nullable().optional(),
778
+ currency: z.string(),
779
+ language: z.string(),
780
+ visibility: z.string().optional(),
781
+ privateAccessHash: z.string().nullable().optional(),
782
+ privateAccessVersion: z.number().optional(),
783
+ themeConfig: StorefrontThemeConfigSchema.optional(),
784
+ featuresEnabled: StorefrontFeaturesEnabledSchema.optional(),
785
+ checkoutSettings: StorefrontCheckoutSettingsSchema.optional().nullable()
786
+ }).passthrough();
787
+ var StorefrontSettingsEnvelopeSchema = z.object({
788
+ schemaVersion: z.number(),
789
+ generatedAt: z.string(),
790
+ store: StorefrontStoreSchema,
791
+ cms: z.object({
792
+ settings: StorefrontCmsSettingsSchema,
793
+ pages: z.array(StorefrontCmsPageSchema)
794
+ })
795
+ }).passthrough();
796
+ var StorefrontSettingsSchema = z.preprocess(
797
+ normalizeStorefrontSettingsPayload,
798
+ StorefrontSettingsEnvelopeSchema
799
+ );
800
+ function storefrontStoreRecord(settings) {
801
+ return settings?.store ?? null;
802
+ }
803
+ function storefrontFaviconUrl(settings) {
804
+ const b = settings?.cms?.settings?.branding;
805
+ return b?.faviconUrl ?? settings?.store?.logo ?? settings?.store?.icon ?? null;
806
+ }
807
+ function storefrontOgImageUrl(settings) {
808
+ const b = settings?.cms?.settings?.branding;
809
+ return b?.socialImageUrl ?? settings?.store?.logo ?? null;
810
+ }
811
+
812
+ // src/core/services/store.service.ts
813
+ var StoreService = class _StoreService {
814
+ static instance;
815
+ constructor() {
816
+ }
817
+ static getInstance() {
818
+ if (!_StoreService.instance) {
819
+ _StoreService.instance = new _StoreService();
820
+ }
821
+ return _StoreService.instance;
822
+ }
823
+ /**
824
+ * Obtiene la configuración de la tienda por subdominio (GET /v1/settings).
825
+ * Usa el header X-Store-Domain. Si se pasa domain, se configura antes de la petición.
826
+ */
827
+ async getStorefrontSettings(domain) {
828
+ if (domain) {
829
+ apiClient.setStoreDomain(domain);
830
+ }
831
+ const response = await apiClient.get(`/${STOREFRONT_API_PATH_PREFIX}/settings`);
832
+ return StorefrontSettingsSchema.parse(response);
833
+ }
834
+ };
835
+ var storeService = StoreService.getInstance();
836
+ var CartBuyerRequestSchema = z.object({
837
+ email: z.string().email(),
838
+ firstName: z.string().min(1),
839
+ lastName: z.string().min(1),
840
+ phone: z.string().min(1)
841
+ });
842
+ var CartCreateRequestSchema = z.object({
843
+ currencyCode: z.string(),
844
+ salesChannelId: z.string(),
845
+ email: z.string().email()
846
+ });
847
+ var CartAddressSchema = z.object({
848
+ name: z.string().min(1),
849
+ address1: z.string().min(1),
850
+ city: z.string().min(1),
851
+ countryCode: z.string().min(2),
852
+ company: z.string().nullable().optional(),
853
+ address2: z.string().nullable().optional(),
854
+ province: z.string().nullable().optional(),
855
+ postalCode: z.string().nullable().optional(),
856
+ district: z.string().nullable().optional(),
857
+ phone: z.string().nullable().optional(),
858
+ latitude: z.number().nullable().optional(),
859
+ longitude: z.number().nullable().optional(),
860
+ geo: z.object({
861
+ departmentCode: z.string().nullable().optional(),
862
+ provinceCode: z.string().nullable().optional(),
863
+ districtCode: z.string().nullable().optional()
864
+ }).nullable().optional()
865
+ });
866
+ var CartAddressesRequestSchema = z.object({
867
+ shippingAddress: CartAddressSchema,
868
+ billingAddress: CartAddressSchema
869
+ });
870
+ var CartItemModifierRequestSchema = z.object({
871
+ modifierGroupId: z.coerce.string().min(1),
872
+ optionIds: z.array(z.coerce.string().min(1)).optional().default([])
873
+ });
874
+ var CartItemRequestSchema = z.object({
875
+ variantId: z.coerce.string().min(1),
876
+ quantity: z.number().int().positive(),
877
+ modifiers: z.array(CartItemModifierRequestSchema).optional()
878
+ });
879
+ var CartCouponRequestSchema = z.object({
880
+ code: z.string().min(1)
881
+ });
882
+ z.object({
883
+ subtotal: z.number(),
884
+ discount: z.number(),
885
+ tax: z.number(),
886
+ warranty: z.number().optional().default(0),
887
+ total: z.number()
888
+ });
889
+ z.object({
890
+ name: z.string().nullable().optional(),
891
+ address1: z.string(),
892
+ city: z.string(),
893
+ countryCode: z.string(),
894
+ company: z.string().nullable().optional(),
895
+ address2: z.string().nullable().optional(),
896
+ province: z.string().nullable().optional(),
897
+ postalCode: z.string().nullable().optional(),
898
+ district: z.string().nullable().optional(),
899
+ phone: z.string().nullable().optional(),
900
+ latitude: z.number().nullable().optional(),
901
+ longitude: z.number().nullable().optional(),
902
+ geo: z.object({
903
+ departmentCode: z.string().nullable().optional(),
904
+ provinceCode: z.string().nullable().optional(),
905
+ districtCode: z.string().nullable().optional()
906
+ }).nullable().optional()
907
+ });
908
+ var CartResponseBundleItemSchema = z.object({
909
+ productId: z.coerce.string(),
910
+ variantId: z.coerce.string(),
911
+ productName: z.string(),
912
+ variantName: z.string().nullable().optional(),
913
+ sku: z.string().nullable().optional(),
914
+ brand: z.string().nullable().optional(),
915
+ imageUrl: z.string().nullable().optional(),
916
+ quantity: z.number().int()
917
+ });
918
+ var CartResponseItemSchema = z.object({
919
+ id: z.string(),
920
+ title: z.string(),
921
+ variantLabel: z.string().nullable().optional(),
922
+ thumbnail: z.string().nullable().optional(),
923
+ quantity: z.number().int(),
924
+ variantId: z.coerce.string(),
925
+ variantSku: z.string().nullable().optional(),
926
+ unitPrice: z.number(),
927
+ bundleItems: z.array(CartResponseBundleItemSchema).optional().default([])
928
+ });
929
+ z.object({
930
+ id: z.string(),
931
+ name: z.string(),
932
+ description: z.string().nullable().optional(),
933
+ total: z.number(),
934
+ estimatedDays: z.number().int().nullable().optional(),
935
+ pickupPointId: z.string().nullable().optional(),
936
+ scheduledDate: z.string().nullable().optional(),
937
+ scheduledTime: z.string().nullable().optional()
938
+ });
939
+ var CartResponseSchema = z.object({
940
+ id: z.string(),
941
+ regionId: z.string().nullable().optional(),
942
+ salesChannelId: z.string().nullable().optional(),
943
+ email: z.string().email().nullable().optional(),
944
+ phone: z.string().nullable().optional(),
945
+ firstName: z.string().nullable().optional(),
946
+ lastName: z.string().nullable().optional(),
947
+ currencyCode: z.string(),
948
+ completedAt: z.string().nullable().optional(),
949
+ shippingAddress: z.unknown().nullable().optional(),
950
+ billingAddress: z.unknown().nullable().optional(),
951
+ metadata: z.record(z.string(), z.unknown()).optional().default({}),
952
+ promotionCodes: z.array(z.string()).optional().default([]),
953
+ items: z.array(CartResponseItemSchema).optional().default([]),
954
+ shippingMethods: z.array(z.unknown()).optional().default([]),
955
+ totals: z.object({
956
+ discountTotal: z.number(),
957
+ shippingTotal: z.number(),
958
+ subtotal: z.number(),
959
+ taxTotal: z.number(),
960
+ total: z.number(),
961
+ warrantyTotal: z.number()
962
+ })
963
+ });
964
+ var CartCheckoutRequestSchema = z.object({
965
+ paymentMethodCode: z.string().min(1),
966
+ externalRef: z.string().min(1),
967
+ receiptUrl: z.string().min(1).optional()
968
+ });
969
+ var CartCheckoutPaymentActionSchema = z.object({
970
+ publicConfiguration: z.object({
971
+ publishableKey: z.string().nullable().optional(),
972
+ checkoutMode: z.string().nullable().optional(),
973
+ phoneNumber: z.string().nullable().optional(),
974
+ accountHolder: z.string().nullable().optional(),
975
+ qrImageUrl: z.string().nullable().optional()
976
+ }).passthrough().nullable().optional(),
977
+ url: z.string().nullable().optional(),
978
+ html: z.string().nullable().optional(),
979
+ clientSecret: z.string().nullable().optional(),
980
+ qrCode: z.string().nullable().optional(),
981
+ expiresAt: z.string().nullable().optional()
982
+ }).passthrough();
983
+ var CartCheckoutPaymentSchema = z.object({
984
+ transactionId: z.string(),
985
+ paymentMethodCode: z.string(),
986
+ providerId: z.string().nullable().optional(),
987
+ status: z.string(),
988
+ amount: z.number(),
989
+ reference: z.string(),
990
+ actionType: z.string(),
991
+ receiptUrl: z.string().nullable().optional(),
992
+ action: CartCheckoutPaymentActionSchema.nullable().optional()
993
+ }).passthrough();
994
+ var CartCheckoutResponseSchema = z.object({
995
+ publicKey: z.string().optional(),
996
+ publishableKey: z.string().optional(),
997
+ stripePublicKey: z.string().optional(),
998
+ clientSecret: z.string().optional(),
999
+ intentClientSecret: z.string().optional(),
1000
+ orderId: z.coerce.string().optional(),
1001
+ orderGroup: z.string().optional(),
1002
+ orderIds: z.array(z.coerce.string()).optional(),
1003
+ /** Payload de pago (embedded, redirect, etc.) */
1004
+ payment: CartCheckoutPaymentSchema.optional(),
1005
+ cart: z.unknown().optional()
1006
+ }).passthrough();
1007
+ var CartPaymentReceiptResponseSchema = z.object({
1008
+ id: z.string(),
1009
+ url: z.string()
1010
+ });
1011
+ var CartPaymentMethodSchema = z.object({
1012
+ code: z.string(),
1013
+ name: z.string(),
1014
+ description: z.string().nullable().optional(),
1015
+ kind: z.string(),
1016
+ isActive: z.boolean(),
1017
+ isDefault: z.boolean(),
1018
+ isManual: z.boolean(),
1019
+ sortOrder: z.number(),
1020
+ phoneNumber: z.string().nullable().optional(),
1021
+ accountHolder: z.string().nullable().optional(),
1022
+ qrImageUrl: z.string().nullable().optional()
1023
+ });
1024
+ var CartPaymentMethodsResponseSchema = z.object({
1025
+ methods: z.array(CartPaymentMethodSchema)
1026
+ });
1027
+ var CartCheckoutReadResponseSchema = z.object({
1028
+ cart: CartResponseSchema,
1029
+ paymentMethods: CartPaymentMethodsResponseSchema
1030
+ });
1031
+ var ShippingRateSchema = z.object({
1032
+ shippingMethodId: z.string(),
1033
+ name: z.string(),
1034
+ displayName: z.string().optional(),
1035
+ type: z.string().optional(),
1036
+ price: z.number(),
1037
+ currency: z.string().optional(),
1038
+ sortOrder: z.number().optional(),
1039
+ rateId: z.string(),
1040
+ description: z.string().nullable().optional(),
1041
+ deliveryLocationId: z.string().nullable().optional(),
1042
+ deliveryLocationName: z.string().nullable().optional(),
1043
+ estimatedDeliveryDays: z.number().nullable().optional(),
1044
+ serviceCode: z.string().nullable().optional(),
1045
+ metadata: z.record(z.string(), z.unknown()).optional()
1046
+ }).passthrough();
1047
+ var ShippingOptionGroupSchema = z.object({
1048
+ sellerId: z.string(),
1049
+ shippingProfileId: z.string().nullable().optional(),
1050
+ orderAmount: z.number().optional(),
1051
+ totalWeight: z.number().optional(),
1052
+ itemIds: z.array(z.string()).optional(),
1053
+ rates: z.array(ShippingRateSchema)
1054
+ }).passthrough();
1055
+ var ShippingOptionsResponseSchema = z.object({
1056
+ groups: z.array(ShippingOptionGroupSchema)
1057
+ });
1058
+ var CartShippingMethodPutRequestSchema = z.object({
1059
+ rateId: z.string().min(1),
1060
+ shippingMethodId: z.string().min(1),
1061
+ serviceCode: z.string().nullable().optional(),
1062
+ sellerId: z.string().nullable().optional(),
1063
+ shippingProfileId: z.string().nullable().optional(),
1064
+ locationId: z.string().nullable().optional(),
1065
+ pickupPointId: z.string().nullable().optional(),
1066
+ scheduledDate: z.string().nullable().optional(),
1067
+ scheduledTime: z.string().nullable().optional()
1068
+ });
1069
+
1070
+ // src/core/services/cart.service.ts
1071
+ var CartService = class _CartService {
1072
+ static instance;
1073
+ constructor() {
1074
+ }
1075
+ static getInstance() {
1076
+ if (!_CartService.instance) {
1077
+ _CartService.instance = new _CartService();
1078
+ }
1079
+ return _CartService.instance;
1080
+ }
1081
+ /**
1082
+ * Obtiene el carrito actual (GET /v1/carts).
1083
+ */
1084
+ async getCart() {
1085
+ const response = await apiClient.get(`/${STOREFRONT_API_PATH_PREFIX}/carts`);
1086
+ return CartResponseSchema.parse(response);
1087
+ }
1088
+ /**
1089
+ * Crea un carrito nuevo (POST /v1/carts).
1090
+ */
1091
+ async createCart(data) {
1092
+ const payload = CartCreateRequestSchema.parse(data);
1093
+ const response = await apiClient.post(`/${STOREFRONT_API_PATH_PREFIX}/carts`, payload);
1094
+ return CartResponseSchema.parse(response);
1095
+ }
1096
+ /**
1097
+ * Actualiza los datos del comprador del carrito actual (PATCH /v1/carts/buyer).
1098
+ * El carrito se resuelve en backend vía contexto (token/guest), por eso no requiere cartId.
1099
+ */
1100
+ async updateBuyer(data) {
1101
+ const payload = CartBuyerRequestSchema.parse(data);
1102
+ const response = await apiClient.patch(`/${STOREFRONT_API_PATH_PREFIX}/carts/buyer`, payload);
1103
+ return CartResponseSchema.parse(response);
1104
+ }
1105
+ /**
1106
+ * Actualiza direcciones de envío y facturación del carrito (PATCH /v1/carts/addresses).
1107
+ */
1108
+ async updateAddresses(data) {
1109
+ const payload = CartAddressesRequestSchema.parse(data);
1110
+ const response = await apiClient.patch(`/${STOREFRONT_API_PATH_PREFIX}/carts/addresses`, payload);
1111
+ return CartResponseSchema.parse(response);
1112
+ }
1113
+ /**
1114
+ * Inicializa/obtiene detalles del método de pago para el checkout (POST /v1/carts/checkout).
1115
+ * Usado para providers como Stripe (public key, client secret, etc).
1116
+ */
1117
+ async checkout(data) {
1118
+ const payload = CartCheckoutRequestSchema.parse(data);
1119
+ const response = await apiClient.post(`/${STOREFRONT_API_PATH_PREFIX}/carts/checkout`, payload);
1120
+ return CartCheckoutResponseSchema.parse(response);
1121
+ }
1122
+ };
1123
+ var cartService = CartService.getInstance();
1124
+
1125
+ export { CartAddressesRequestSchema, CartBuyerRequestSchema, CartCheckoutPaymentActionSchema, CartCheckoutPaymentSchema, CartCheckoutReadResponseSchema, CartCheckoutRequestSchema, CartCheckoutResponseSchema, CartCouponRequestSchema, CartCreateRequestSchema, CartItemModifierRequestSchema, CartItemRequestSchema, CartPaymentMethodSchema, CartPaymentMethodsResponseSchema, CartPaymentReceiptResponseSchema, CartResponseBundleItemSchema, CartResponseItemSchema, CartResponseSchema, CartShippingMethodPutRequestSchema, ProductSchema, ProductVariantSchema, ProductsFiltersSchema, ProductsResponseSchema, STOREFRONT_API_PATH_PREFIX, STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME, STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH, ShippingOptionGroupSchema, ShippingOptionsResponseSchema, ShippingRateSchema, StorefrontBundleItemSchema, StorefrontCheckoutSettingsSchema, StorefrontCollectionDetailSchema, StorefrontCollectionSchema, StorefrontCollectionsResponseSchema, StorefrontPageDetailSchema, StorefrontPageListItemSchema, StorefrontPriceTierSchema, StorefrontProductDetailSchema, StorefrontProductSchema, StorefrontProductsParamsSchema, StorefrontProductsResponseSchema, StorefrontSettingsLegacyFlatSchema, StorefrontSettingsSchema, StorefrontStoreSchema, apiClient, cartService, collectionService, countryCurrency, customerOrderStatusTone, fetchStorefrontGeoDistricts, fetchStorefrontGeoProvinces, formatCurrency, formatCustomerOrderStatus, formatOrderDate, formatOrderDateTime, loadStorefrontGeoDepartments, normalizeStorefrontSettingsPayload, pageService, productService, resolveIneiCodesFromLabels, storeService, storefrontFaviconUrl, storefrontOgImageUrl, storefrontStoreRecord, toGeoItems };
1126
+ //# sourceMappingURL=core.js.map
1127
+ //# sourceMappingURL=core.js.map