@ecomiq/storefront 1.1.9 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +30 -415
  2. package/bin/ecomiq.mjs +165 -0
  3. package/package.json +72 -94
  4. package/src/api-proxy.ts +194 -0
  5. package/src/auth/create-storefront-auth.ts +35 -0
  6. package/src/auth/ecomiq-oauth-password-client.ts +26 -0
  7. package/src/auth/ecomiq-oauth-password-constants.ts +26 -0
  8. package/src/auth/ecomiq-oauth-password-plugin.ts +299 -0
  9. package/src/auth/ecomiq-oauth-password-types.ts +25 -0
  10. package/src/auth/ecomiq-storefront-sign-in.ts +47 -0
  11. package/src/auth/env.ts +7 -0
  12. package/src/cart-session.ts +241 -0
  13. package/src/client.ts +48 -0
  14. package/src/codegen.mjs +704 -0
  15. package/src/components/checkout/cart-sync.ts +143 -0
  16. package/src/components/checkout/checkout-external-update-banner.tsx +15 -0
  17. package/src/components/checkout/checkout-form-controls.tsx +139 -0
  18. package/src/components/checkout/checkout-line-items.tsx +43 -0
  19. package/src/components/checkout/checkout-order-summary.tsx +156 -0
  20. package/src/components/checkout/checkout-payment-section.tsx +215 -0
  21. package/src/components/checkout/checkout-session-view.tsx +240 -0
  22. package/src/components/checkout/checkout-shipping-address-section.tsx +266 -0
  23. package/src/components/checkout/checkout-shipping-section.tsx +90 -0
  24. package/src/components/checkout/checkout-states.tsx +73 -0
  25. package/src/components/checkout/form-schema.ts +229 -0
  26. package/src/components/checkout/format.ts +27 -0
  27. package/src/components/checkout/index.ts +51 -0
  28. package/src/components/checkout/types.ts +43 -0
  29. package/src/components/checkout/use-checkout-geo.ts +50 -0
  30. package/src/components/checkout/use-checkout-session.ts +583 -0
  31. package/src/components/hero.tsx +291 -0
  32. package/src/config.d.ts +69 -0
  33. package/src/config.mjs +165 -0
  34. package/src/index.ts +274 -0
  35. package/src/link.tsx +2 -0
  36. package/src/pages/checkout.$checkoutId.tsx +60 -0
  37. package/src/pages/checkout.tsx +31 -0
  38. package/src/pages/thank-you.tsx +53 -0
  39. package/src/providers/auth.tsx +69 -0
  40. package/src/providers/cart.tsx +275 -0
  41. package/src/providers/ecomiq.ts +137 -0
  42. package/src/providers/index.ts +26 -0
  43. package/src/public-config.ts +44 -0
  44. package/src/review-submission.ts +89 -0
  45. package/src/runtime/context.ts +1 -0
  46. package/src/runtime/default-layout.tsx +80 -0
  47. package/src/runtime/head.ts +126 -0
  48. package/src/runtime/page.tsx +82 -0
  49. package/src/runtime/postcss-browser-stub.mjs +5 -0
  50. package/src/server-config-store.ts +26 -0
  51. package/src/server.ts +279 -0
  52. package/src/styles.css +76 -0
  53. package/src/ui/badge.tsx +32 -0
  54. package/src/ui/button.tsx +31 -0
  55. package/src/ui/card.tsx +31 -0
  56. package/src/ui/carousel.tsx +218 -0
  57. package/src/ui/cn.ts +6 -0
  58. package/src/ui/index.ts +8 -0
  59. package/src/ui/separator.tsx +6 -0
  60. package/src/ui/skeleton.tsx +6 -0
  61. package/src/ui/storefront-error.tsx +49 -0
  62. package/src/utils.ts +36 -0
  63. package/src/vite-inline.mjs +135 -0
  64. package/templates/__root.tsx +77 -0
  65. package/templates/router.tsx +19 -0
  66. package/dist/chunk-64GLOWMJ.js +0 -216
  67. package/dist/chunk-64GLOWMJ.js.map +0 -1
  68. package/dist/chunk-AKD5IDEB.js +0 -177
  69. package/dist/chunk-AKD5IDEB.js.map +0 -1
  70. package/dist/chunk-EFEVJJWF.js +0 -1345
  71. package/dist/chunk-EFEVJJWF.js.map +0 -1
  72. package/dist/chunk-NAJQB5DN.js +0 -155
  73. package/dist/chunk-NAJQB5DN.js.map +0 -1
  74. package/dist/chunk-OABDGTBI.js +0 -253
  75. package/dist/chunk-OABDGTBI.js.map +0 -1
  76. package/dist/chunk-Q4U5OEUT.js +0 -21
  77. package/dist/chunk-Q4U5OEUT.js.map +0 -1
  78. package/dist/chunk-S7CPZ4UE.js +0 -6
  79. package/dist/chunk-S7CPZ4UE.js.map +0 -1
  80. package/dist/chunks/client.css +0 -984
  81. package/dist/chunks/client.css.map +0 -1
  82. package/dist/chunks/client.d.ts +0 -10759
  83. package/dist/chunks/client.js +0 -5398
  84. package/dist/chunks/client.js.map +0 -1
  85. package/dist/chunks/config.d.ts +0 -31
  86. package/dist/chunks/config.js +0 -5
  87. package/dist/chunks/config.js.map +0 -1
  88. package/dist/chunks/core-public.d.ts +0 -130
  89. package/dist/chunks/core-public.js +0 -92
  90. package/dist/chunks/core-public.js.map +0 -1
  91. package/dist/chunks/server-nextjs.d.ts +0 -33
  92. package/dist/chunks/server-nextjs.js +0 -59
  93. package/dist/chunks/server-nextjs.js.map +0 -1
  94. package/dist/chunks/server-tanstack.d.ts +0 -22
  95. package/dist/chunks/server-tanstack.js +0 -40
  96. package/dist/chunks/server-tanstack.js.map +0 -1
  97. package/dist/collection-DU7gREXS.d.ts +0 -4062
  98. package/dist/ecomiq-oauth-password-plugin-B_gMdGuc.d.ts +0 -3631
  99. package/dist/ecomiq-shell-ui-SWIFLQVM.js +0 -8
  100. package/dist/ecomiq-shell-ui-SWIFLQVM.js.map +0 -1
  101. package/dist/index.d.ts +0 -9
  102. package/dist/index.js +0 -1
  103. package/dist/index.js.map +0 -1
  104. package/dist/index.server.d.ts +0 -9
  105. package/dist/index.server.js +0 -8
  106. package/dist/index.server.js.map +0 -1
  107. package/dist/nextjs/api.d.ts +0 -45
  108. package/dist/nextjs/api.js +0 -32
  109. package/dist/nextjs/api.js.map +0 -1
  110. package/dist/nextjs/globals.css +0 -13
  111. package/dist/nextjs.d.ts +0 -2
  112. package/dist/nextjs.js +0 -2
  113. package/dist/nextjs.js.map +0 -1
  114. package/dist/nextjs.server.d.ts +0 -18
  115. package/dist/nextjs.server.js +0 -1
  116. package/dist/nextjs.server.js.map +0 -1
  117. package/dist/postcss.config.mjs +0 -6
  118. package/dist/react/checkout-page.css +0 -855
  119. package/dist/react/client.css +0 -984
  120. package/dist/react/payment-provider.css +0 -91
  121. package/dist/react/thank-you-page.css +0 -105
  122. package/dist/react.d.ts +0 -1
  123. package/dist/react.js +0 -2
  124. package/dist/react.js.map +0 -1
  125. package/dist/store-proxy-handler-CNzKlTFA.d.ts +0 -10
  126. package/dist/tanstack/api.d.ts +0 -41
  127. package/dist/tanstack/api.js +0 -30
  128. package/dist/tanstack/api.js.map +0 -1
  129. package/dist/tanstack.d.ts +0 -1
  130. package/dist/tanstack.js +0 -2
  131. package/dist/tanstack.js.map +0 -1
  132. package/dist/tanstack.server.d.ts +0 -18
  133. package/dist/tanstack.server.js +0 -1
  134. package/dist/tanstack.server.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/client/store-api-client.ts","../src/core/server/request-origin.ts","../src/core/client/store-api-store.service.ts","../src/react/shell/lib/public-store-settings-source.ts","../src/core/server/fetch-public-store.ts","../src/core/client/store-api-product.service.ts","../src/core/server/subdomain.ts","../src/core/client/store-api-errors.ts","../src/core/client/store-api-collection.service.ts","../src/core/client/store-api-pages.service.ts","../src/core/models/cart.ts","../src/core/client/store-api-cart.service.ts","../src/core/client/store-api-customer.service.ts","../src/core/client/store-api-customer-order.service.ts","../src/core/models/order-draft.ts","../src/core/client/store-api-order-draft.service.ts","../src/react/auth/ecomiq-oauth-password-constants.ts","../src/react/auth/ecomiq-oauth-password-types.ts","../src/react/auth/ecomiq-oauth-password-plugin.ts"],"names":["z"],"mappings":"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","file":"chunk-EFEVJJWF.js","sourcesContent":["/**\n * Cliente para el proxy Next.js (`/api/store/*`), que a su vez llama al API Ecomiq con headers\n * definidos allí (`Authorization`, `X-Store-Id`, etc.). Ecomiq upstream no recibe `Cookie` del navegador.\n *\n * - En browser: base = `/api/store` + `credentials: \"include\"`. Cada request debe llevar `X-Store-Id`\n * (`setClientStoreId` desde `EcomiqProvider`); el proxy no resuelve tienda sin ese header.\n * - En server: URL absoluta vía `setServerRequestOrigin()` y `X-Store-Id` vía `setServerStoreId()` tras\n * `getPublicStore` (settings vía upstream o KV, nunca el proxy sin id).\n */\n\nimport { STOREFRONT_HEADERS } from \"../constants/currency\";\n\nconst STORE_API_PATH = \"/api/store\";\n\n/** Getter inyectado por la app (usa next/headers). Solo se llama en server. */\nlet serverRequestOriginGetter: string | null = null;\n\n/** Store id inyectado en server tras resolver settings (misma idea que `setServerRequestOrigin`). */\nlet serverStoreIdGetter: string | null = null;\n\n/** Store id en browser; lo asigna `EcomiqProvider` al hidratar la tienda. */\nlet clientStoreIdGetter: string | null = null;\n\n/**\n * Inyectar en server para que las llamadas al proxy usen el mismo origen que la request.\n * Ejemplo en la app: setServerRequestOrigin(getRequestOrigin) con getRequestOrigin usando headers().\n */\nexport function setServerRequestOrigin(getter: string | null): void {\n serverRequestOriginGetter = getter;\n}\n\n/** Inyectar en server el id de tienda ya resuelto (p. ej. tras `getPublicStore`). */\nexport function setServerStoreId(storeId: string | null): void {\n serverStoreIdGetter = storeId?.trim() || null;\n}\n\n/** Inyectar en el cliente el id de tienda (p. ej. desde `EcomiqProvider` con el payload de layout). */\nexport function setClientStoreId(storeId: string | null): void {\n if (typeof window === \"undefined\") return;\n clientStoreIdGetter = storeId?.trim() || null;\n}\n\n/**\n * Resuelve la URL base del API de store.\n * En server usa el getter inyectado; en browser devuelve path relativo.\n */\nexport async function getStoreApiBaseUrl(): Promise<string> {\n if (typeof window !== \"undefined\") {\n return STORE_API_PATH;\n }\n if (serverRequestOriginGetter) {\n return `${serverRequestOriginGetter.replace(/\\/$/, \"\")}/${STORE_API_PATH.replace(/^\\//, \"\")}`;\n }\n return STORE_API_PATH;\n}\n\n/**\n * Crea una instancia del cliente con la base URL indicada.\n * Para obtener la base correcta (sobre todo en server) usar getStoreApiClient().\n */\nexport function createStoreApiClient(baseUrl: string): StoreApiClient {\n return new StoreApiClient(baseUrl);\n}\n\n/**\n * Devuelve una instancia del cliente con la base URL resuelta (misma origen en server).\n * Usar este en servicios en lugar del singleton.\n */\nexport async function getStoreApiClient(): Promise<StoreApiClient> {\n const baseUrl = await getStoreApiBaseUrl();\n return new StoreApiClient(baseUrl);\n}\n\n/** Opciones de request al proxy /api/store (se reenvían al upstream salvo las filtradas por el handler). */\nexport type StoreApiGetOptions = {\n /** Header `X-Store-Id` (prioridad sobre los setters de runtime). */\n xStoreId?: string;\n /** Header X-Store-Domain para que el proxy resuelva la tienda cuando aún no hay `X-Store-Id`. */\n xStoreDomain?: string;\n xCartId?: string;\n /**\n * Bearer hacia `/api/store`. El proxy reenvía ese `Authorization` a Ecomiq (API privada solo acepta Bearer).\n * Omitir cuando el navegador use solo la cookie HttpOnly acotada a `/api/store`.\n */\n bearerToken?: string;\n /**\n * Cache key para el cache incremental.\n */\n cacheKey?: string;\n /**\n * Fuerza lectura fresca en Next/server. Usar cuando el backend ya aplica cache-aside.\n */\n noStore?: boolean;\n};\n\nexport class StoreApiClient {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string = STORE_API_PATH) {\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n options?: StoreApiGetOptions\n ): Promise<T> {\n const pathNorm = path.replace(/^\\/+/, \"\");\n const url = path.startsWith(\"http\")\n ? path\n : `${this.baseUrl}/${pathNorm}`;\n\n const headers = new Headers(init.headers ?? {});\n const isFormData =\n typeof FormData !== \"undefined\" && init.body instanceof FormData;\n if (!isFormData) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const explicitStoreId = options?.xStoreId?.trim();\n const runtimeStoreId =\n explicitStoreId ||\n (typeof window === \"undefined\" ? serverStoreIdGetter : clientStoreIdGetter);\n if (runtimeStoreId && !headers.has(STOREFRONT_HEADERS.storeIdLower)) {\n headers.set(STOREFRONT_HEADERS.storeId, runtimeStoreId);\n }\n\n if (options?.xStoreDomain) {\n headers.set(STOREFRONT_HEADERS.storeDomain, options.xStoreDomain);\n }\n if (options?.xCartId) {\n headers.set(\"X-Cart-Token\", options.xCartId);\n }\n\n const bearer =\n typeof options?.bearerToken === \"string\" && options.bearerToken.trim().length > 0\n ? options.bearerToken.trim()\n : undefined;\n if (bearer) {\n headers.set(\n \"Authorization\",\n bearer.toLowerCase().startsWith(\"bearer \") ? bearer : `Bearer ${bearer}`\n );\n }\n\n const isServer = typeof window === \"undefined\";\n\n const res = await fetch(url, {\n ...init,\n headers,\n credentials: isServer ? \"same-origin\" : \"include\",\n ...(options?.noStore ? { cache: \"no-store\" as RequestCache } : {}),\n ...((options?.cacheKey && isServer && !options?.noStore) ? {\n next: {\n revalidate: 60,\n tags: [options.cacheKey],\n },\n } : {}),\n });\n if (!res.ok) {\n let body: unknown;\n try {\n const errorText = await res.text();\n body = errorText ? JSON.parse(errorText) : undefined;\n } catch {\n body = undefined;\n }\n const msg =\n typeof body === \"object\" &&\n body !== null &&\n \"title\" in body &&\n typeof (body as { title?: unknown }).title === \"string\"\n ? (body as { title: string }).title\n : res.statusText || \"Store API error\";\n const err = new Error(msg) as Error & {\n status?: number;\n body?: unknown;\n };\n err.status = res.status;\n err.body = body;\n throw err;\n }\n const text = await res.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n get<T>(path: string, options?: StoreApiGetOptions): Promise<T> {\n return this.request<T>(path, { method: \"GET\" }, options);\n }\n\n post<T>(path: string, data?: unknown, options?: StoreApiGetOptions): Promise<T> {\n return this.request<T>(\n path,\n {\n method: \"POST\",\n body: data != null ? JSON.stringify(data) : undefined,\n },\n options\n );\n }\n\n /** POST multipart (no fuerza `Content-Type`; el runtime añade el boundary). */\n postForm<T>(\n path: string,\n form: FormData,\n options?: StoreApiGetOptions,\n ): Promise<T> {\n return this.request<T>(path, { method: \"POST\", body: form }, options);\n }\n\n patch<T>(path: string, data?: unknown, options?: StoreApiGetOptions): Promise<T> {\n return this.request<T>(path, {\n method: \"PATCH\",\n body: data != null ? JSON.stringify(data) : undefined,\n }, options);\n }\n\n put<T>(path: string, data?: unknown, options?: StoreApiGetOptions): Promise<T> {\n return this.request<T>(\n path,\n {\n method: \"PUT\",\n body: data != null ? JSON.stringify(data) : undefined,\n },\n options\n );\n }\n\n delete<T>(path: string, options?: StoreApiGetOptions): Promise<T> {\n return this.request<T>(path, { method: \"DELETE\" }, options);\n }\n}\n\n/** Cliente por defecto (base relativa). En server preferir getStoreApiClient(). */\nexport const storeApiClient = new StoreApiClient(STORE_API_PATH);\n","import { setServerRequestOrigin } from \"../client/store-api-client\";\n\n/** Aplica `setServerRequestOrigin` a partir de headers HTTP (Web Standard o Next). */\nexport function applyServerRequestOriginFromHeaders(\n headerList: { get(name: string): string | null },\n): void {\n const host = headerList.get(\"host\")?.trim();\n if (!host) return;\n\n const proto =\n headerList.get(\"x-forwarded-proto\") ??\n headerList.get(\"x-forwarded-ssl\") ??\n \"http\";\n const secure =\n proto === \"https\" || (headerList.get(\"x-forwarded-ssl\") ?? \"\") === \"on\";\n setServerRequestOrigin(`${secure ? \"https\" : \"http\"}://${host}`);\n}\n\n/** Host sin prefijo `www.` (útil para KV/API). */\nexport function normalizeRequestHostname(\n headerList: { get(name: string): string | null },\n): string | null {\n const host = headerList.get(\"host\");\n return host?.replace(/^www\\./, \"\") ?? null;\n}\n","import { getStoreApiClient } from \"./store-api-client\";\nimport { StorefrontSettingsSchema } from \"../models/store\";\nimport type { StorefrontSettings } from \"../models/store\";\n\n/**\n * Obtiene la configuración de la tienda vía proxy /api/store.\n * Solo para esta API se envía X-Store-Domain con el subdomain cuando no hay cookie.\n */\nexport async function getStorefrontSettings(\n subdomain: string,\n cacheKey?: string\n): Promise<StorefrontSettings> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\"settings\", {\n xStoreDomain: subdomain?.trim() || undefined,\n cacheKey,\n noStore: !cacheKey,\n });\n return StorefrontSettingsSchema.parse(response);\n}\n","/** Origen de `StorefrontSettings`: API interna o Cloudflare KV (mismo contrato tras validar con Zod). */\nexport type PublicStoreSettingsSource = \"api\" | \"kv\";\n\nconst ENV_PUBLIC_STORE_SETTINGS_SOURCE = \"PUBLIC_STORE_SETTINGS_SOURCE\";\n\n/**\n * Resuelve el origen desde `process.env.PUBLIC_STORE_SETTINGS_SOURCE` (`api` | `kv`, por defecto `api`).\n * Úsalo en GitHub Actions / wrangler `--var` para elegir la fuente en runtime del Worker.\n *\n * Vive fuera de un archivo `\"use server\"`: Next.js exige que todas las exportaciones de función ahí sean async.\n */\nexport function resolvePublicStoreSettingsSource(\n envValue: string | undefined = process.env[ENV_PUBLIC_STORE_SETTINGS_SOURCE]\n): PublicStoreSettingsSource {\n const v = (envValue ?? \"api\").trim().toLowerCase();\n return v === \"kv\" ? \"kv\" : \"api\";\n}\n","import { getStorefrontSettings } from \"../client/store-api-store.service\";\nimport { getStorefrontSettingsFromKvByStoreKey } from \"../client/storefront-settings-kv.service\";\nimport { setServerStoreId } from \"../client/store-api-client\";\nimport { resolvePublicStoreKey } from \"../config/ecomiq-config.load\";\nimport type { StorefrontSettings } from \"../models/store\";\nimport {\n resolvePublicStoreSettingsSource,\n type PublicStoreSettingsSource,\n} from \"../../react/shell/lib/public-store-settings-source\";\n\n/** Tipo de retorno de `fetchPublicStoreSettings`. */\nexport type PublicStoreResult = {\n data: StorefrontSettings | null;\n error: {\n message: string;\n statusCode: number;\n isNotFound?: boolean;\n subdomain?: string;\n } | null;\n};\n\nexport type FetchPublicStoreSettingsOptions = {\n /** Header `Host` de la request (ej. `localhost:3000`, `mi-tienda.ecomiq.pe`). */\n host: string | null;\n /** Si se omite, se usa `resolvePublicStoreSettingsSource()` (variable de entorno). */\n source?: PublicStoreSettingsSource;\n};\n\n/**\n * Obtiene la tienda pública (API o KV). Agnóstico de framework: el adapter\n * lee `host` de `headers()` (Next), `getRequestHeaders()` (TanStack) o un `Request`.\n */\nexport async function fetchPublicStoreSettings(\n options: FetchPublicStoreSettingsOptions,\n): Promise<PublicStoreResult> {\n let storeKey: string;\n try {\n storeKey = resolvePublicStoreKey(options.host);\n } catch (error: unknown) {\n const err = error as { message?: string; status?: number };\n return {\n data: null,\n error: {\n message: err.message ?? \"Host is required\",\n statusCode: err.status ?? 400,\n isNotFound: true,\n subdomain: undefined,\n },\n };\n }\n\n const source = options.source ?? resolvePublicStoreSettingsSource();\n\n try {\n setServerStoreId(null);\n const fetchFromApi = () =>\n getStorefrontSettings(\n storeKey,\n `storefront-settings-${storeKey}`,\n );\n const data =\n source === \"kv\"\n ? await getStorefrontSettingsFromKvByStoreKey(storeKey).catch((error: unknown) => {\n console.warn(\n `[ecomiq] Store settings KV lookup failed for \"${storeKey}\". Falling back to API.`,\n error,\n );\n return fetchFromApi();\n })\n : await fetchFromApi();\n setServerStoreId(data.store.id);\n return { data, error: null };\n } catch (error: unknown) {\n const err = error as { status?: number; message?: string };\n const statusCode = err.status ?? 500;\n return {\n data: null,\n error: {\n message: err.message ?? \"Error fetching store settings\",\n statusCode,\n isNotFound: statusCode === 404,\n subdomain: storeKey,\n },\n };\n }\n}\n\nexport {\n resolvePublicStoreSettingsSource,\n type PublicStoreSettingsSource,\n} from \"../../react/shell/lib/public-store-settings-source\";\n","import { getStoreApiClient } from \"./store-api-client\";\nimport type {\n StorefrontProductsParamsInput,\n StorefrontProductsResponse,\n StorefrontProductDetail,\n} from \"../models/product\";\nimport {\n StorefrontProductsParamsSchema,\n StorefrontProductsResponseSchema,\n StorefrontProductDetailSchema,\n} from \"../models/product\";\n\n/**\n * Servicio de productos vía proxy /api/store.\n * El proxy resuelve la tienda por cookie.\n */\nexport async function getStorefrontProducts(\n params?: StorefrontProductsParamsInput,\n cacheKey?: string\n): Promise<StorefrontProductsResponse> {\n const parsed = StorefrontProductsParamsSchema.parse(params ?? {});\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.search) searchParams.set(\"search\", parsed.search);\n if (parsed.collection) searchParams.set(\"collection\", parsed.collection);\n appendValues(searchParams, \"collections\", parsed.collections);\n if (parsed.category) searchParams.set(\"category\", parsed.category);\n appendValues(searchParams, \"categories\", parsed.categories);\n if (parsed.brand) searchParams.set(\"brand\", parsed.brand);\n appendValues(searchParams, \"brands\", parsed.brands);\n if (parsed.productType) searchParams.set(\"productType\", parsed.productType);\n appendValues(searchParams, \"productTypes\", parsed.productTypes);\n if (parsed.tag) searchParams.set(\"tag\", parsed.tag);\n appendValues(searchParams, \"tags\", parsed.tags);\n appendValues(searchParams, \"filters\", parsed.filters);\n if (parsed.locationId) searchParams.set(\"locationId\", parsed.locationId);\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\n const path = `products?${searchParams.toString()}`;\n const client = await getStoreApiClient();\n // Con cacheKey (solo server-side) se activa ISR: revalidate 60s + tag para\n // invalidación selectiva. Sin cacheKey se mantiene no-store.\n const response = await client.get<unknown>(path, {\n cacheKey,\n noStore: !cacheKey,\n });\n return StorefrontProductsResponseSchema.parse(response);\n}\n\nexport async function getStorefrontProductBySlug(\n slug: string,\n options?: { cacheKey?: string }\n): Promise<StorefrontProductDetail> {\n const path = `products/${encodeURIComponent(slug)}`;\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(path, {\n cacheKey: options?.cacheKey,\n noStore: !options?.cacheKey,\n });\n return StorefrontProductDetailSchema.parse(response);\n}\n\nfunction appendValues(searchParams: URLSearchParams, key: string, values?: string[]) {\n for (const value of values ?? []) {\n if (value) searchParams.append(key, value);\n }\n}\n","export const reservedStoreSubdomains = [\n \"admin\",\n \"api\",\n \"blog\",\n \"dashboard\",\n \"dev\",\n \"dev-ops\",\n \"dev-ops-tools\",\n \"dev-tool\",\n \"dev-tools\",\n \"developer\",\n \"developers\",\n \"development\",\n \"develop\",\n \"devops\",\n \"devops-tools\",\n \"devopstools\",\n \"devtool\",\n \"devtools\",\n \"preview\",\n \"prod\",\n \"production\",\n \"qa\",\n \"quality\",\n \"quality-assurance\",\n \"qualityassurance\",\n \"root\",\n \"sandbox\",\n \"stage\",\n \"staging\",\n \"stg\",\n \"store\",\n \"test\",\n \"testing\",\n \"tool\",\n \"tools\",\n \"uat\",\n \"www\",\n] as const;\n\nconst reservedSet = new Set<string>(reservedStoreSubdomains);\n\nexport function getValidSubdomain(host?: string | null) {\n const value = host?.split(\":\")[0]?.trim().toLowerCase();\n if (!value || !value.includes(\".\")) return null;\n\n const candidate = value.split(\".\")[0];\n if (!candidate || candidate === \"localhost\") return null;\n\n return candidate;\n}\n\nexport function isReservedSubdomain(value?: string | null) {\n return value ? reservedSet.has(value.trim().toLowerCase()) : false;\n}\n","/**\n * Respuesta ProblemDetails / validation típica de la API cuando el carrito ya no existe o no está activo.\n */\nexport function isCartNotActiveApiError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const e = error as { status?: number; body?: unknown };\n if (e.status !== 400) return false;\n const body = e.body as { errors?: Record<string, string[]> } | undefined;\n const keys = body?.errors ? Object.keys(body.errors) : [];\n return keys.includes(\"Carts.NotActive\");\n}\n","import { getStoreApiClient } from \"./store-api-client\";\nimport type { StorefrontCollection, StorefrontCollectionDetail } from \"../models/collection\";\nimport {\n StorefrontCollectionsResponseSchema,\n StorefrontCollectionDetailSchema,\n} from \"../models/collection\";\n\n/**\n * Servicio de colecciones vía proxy /api/store.\n * GET /v1/collections.\n */\nexport async function getStorefrontCollections(): Promise<StorefrontCollection[]> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\"collections\");\n return StorefrontCollectionsResponseSchema.parse(response);\n}\n\nexport async function getStorefrontCollectionBySlug(\n slug: string\n): Promise<StorefrontCollectionDetail> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\n `collections/by-slug/${encodeURIComponent(slug)}`\n );\n return StorefrontCollectionDetailSchema.parse(response);\n}\n\n","import { getStoreApiClient } from \"./store-api-client\";\nimport type {\n StorefrontPageListItem,\n StorefrontPageDetail,\n} from \"../models/page\";\nimport {\n StorefrontPageListItemSchema,\n StorefrontPageDetailSchema,\n} from \"../models/page\";\nimport { z } from \"zod\";\n\n/**\n * Servicio de páginas vía proxy /api/store.\n * GET /v1/pages y GET /v1/pages/{slug}.\n */\nexport async function getStorefrontPages(): Promise<StorefrontPageListItem[]> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\"pages\");\n return z.array(StorefrontPageListItemSchema).parse(response);\n}\n\nexport async function getStorefrontPageBySlug(\n slug: string\n): Promise<StorefrontPageDetail> {\n const path = `pages/${encodeURIComponent(slug)}`;\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(path);\n return StorefrontPageDetailSchema.parse(response);\n}\n\nexport async function getStorefrontPagePreview(\n slug: string,\n token: string\n): Promise<StorefrontPageDetail> {\n const path = `pages/${encodeURIComponent(slug)}/preview?token=${encodeURIComponent(token)}`;\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(path);\n return StorefrontPageDetailSchema.parse(response);\n}\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).max(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 CartItemUpdateRequestSchema = z.object({\n quantity: z.number().int().positive(),\n});\n\nexport type CartItemUpdateRequest = z.input<typeof CartItemUpdateRequestSchema>;\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().min(2).max(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 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 /** Estado del carrito en backend (`inProgress`, `completed`, etc.). */\n status: z.string().nullable().optional(),\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 { getStoreApiClient } from \"./store-api-client\";\nimport type {\n CartBuyerRequest,\n CartAddressesRequest,\n CartCreateRequest,\n CartResponse,\n CartCheckoutRequest,\n CartCheckoutResponse,\n CartCheckoutReadResponse,\n CartPaymentReceiptResponse,\n CartPaymentMethodsResponse,\n CartShippingMethodPutRequest,\n CartCouponRequest,\n CartItemRequest,\n CartItemUpdateRequest,\n ShippingOptionsResponse,\n} from \"../models/cart\";\nimport {\n CartBuyerRequestSchema,\n CartAddressesRequestSchema,\n CartCreateRequestSchema,\n CartItemRequestSchema,\n CartItemUpdateRequestSchema,\n CartResponseSchema,\n CartCheckoutRequestSchema,\n CartCheckoutResponseSchema,\n CartCheckoutReadResponseSchema,\n CartPaymentReceiptResponseSchema,\n CartShippingMethodPutRequestSchema,\n CartCouponRequestSchema,\n ShippingOptionsResponseSchema,\n} from \"../models/cart\";\n\n/**\n * Servicio de carrito vía proxy /api/store.\n * El proxy resuelve el carrito/tienda por cookie o contexto.\n */\nexport async function createCart(\n data: CartCreateRequest,\n): Promise<CartResponse> {\n const payload = CartCreateRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.post<unknown>(\"carts\", payload);\n return CartResponseSchema.parse(response);\n}\n\nexport async function getCart(cartId?: string): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(`carts/${cartId}`);\n return CartResponseSchema.parse(response);\n}\n\nexport async function addCartItem(\n data: CartItemRequest,\n cartId?: string,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartItemRequestSchema.parse(data);\n const variantId = Number(payload.variantId);\n if (!Number.isSafeInteger(variantId) || variantId <= 0) {\n throw new Error(\"variantId must be a valid public id\");\n }\n const modifiers = payload.modifiers?.map((modifier) => {\n const modifierGroupId = Number(modifier.modifierGroupId);\n const optionIds = modifier.optionIds.map((optionId) => Number(optionId));\n if (\n !Number.isSafeInteger(modifierGroupId) ||\n modifierGroupId <= 0 ||\n optionIds.some((optionId) => !Number.isSafeInteger(optionId) || optionId <= 0)\n ) {\n throw new Error(\"modifiers must use valid public ids\");\n }\n\n return { modifierGroupId, optionIds };\n });\n const client = await getStoreApiClient();\n const response = await client.post<unknown>(`carts/${cartId}/items`, {\n ...payload,\n variantId,\n ...(modifiers ? { modifiers } : {}),\n });\n return CartResponseSchema.parse(response);\n}\n\nexport async function updateCartItem(\n cartId: string,\n itemId: string,\n data: CartItemUpdateRequest,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n if (!itemId.trim()) throw new Error(\"itemId is required\");\n const payload = CartItemUpdateRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.patch<unknown>(\n `carts/${cartId}/items/${encodeURIComponent(itemId.trim())}`,\n payload,\n );\n return CartResponseSchema.parse(response);\n}\n\nexport async function deleteCartItem(\n cartId: string,\n itemId: string,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n if (!itemId.trim()) throw new Error(\"itemId is required\");\n const client = await getStoreApiClient();\n const response = await client.delete<unknown>(\n `carts/${cartId}/items/${encodeURIComponent(itemId.trim())}`,\n );\n return CartResponseSchema.parse(response);\n}\n\nexport async function patchCartBuyer(\n data: CartBuyerRequest,\n cartId?: string,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartBuyerRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.patch<unknown>(\n `carts/${cartId}/buyer`,\n payload,\n );\n return CartResponseSchema.parse(response);\n}\n\nexport async function patchCartAddresses(\n data: CartAddressesRequest,\n cartId?: string,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartAddressesRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.patch<unknown>(\n `carts/${cartId}/addresses`,\n payload,\n );\n return CartResponseSchema.parse(response);\n}\n\nexport async function addCartCoupon(\n cartId: string,\n data: CartCouponRequest,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartCouponRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.post<unknown>(\n `carts/${cartId}/promotion-codes`,\n payload,\n );\n return CartResponseSchema.parse(response);\n}\n\nexport async function removeCartCoupon(\n cartId: string,\n code: string,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n if (!code.trim()) throw new Error(\"code is required\");\n const client = await getStoreApiClient();\n const response = await client.delete<unknown>(\n `carts/${cartId}/promotion-codes/${encodeURIComponent(code.trim())}`,\n );\n return CartResponseSchema.parse(response);\n}\n\n/**\n * Inicializa checkout de pago (POST /v1/carts/checkout).\n * Body: { paymentMethodCode, externalRef }\n */\nexport async function checkoutCart(\n data: CartCheckoutRequest,\n cartId?: string,\n): Promise<CartCheckoutResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartCheckoutRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.post<unknown>(\n `carts/${cartId}/checkout`,\n payload,\n );\n return CartCheckoutResponseSchema.parse(response);\n}\n\nexport async function uploadPaymentReceipt(\n cartId: string,\n file: File,\n): Promise<CartPaymentReceiptResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const client = await getStoreApiClient();\n const form = new FormData();\n form.set(\"file\", file);\n const response = await client.postForm<unknown>(\n `carts/${cartId}/payment-receipt`,\n form,\n typeof window === \"undefined\" ? { noStore: true } : undefined,\n );\n return CartPaymentReceiptResponseSchema.parse(response);\n}\n\n/**\n * GET /carts/{cartId}/checkout — carrito + métodos de pago (vista checkout).\n */\nexport async function getCartCheckout(\n cartId: string,\n): Promise<CartCheckoutReadResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(`carts/${cartId}/checkout`);\n return CartCheckoutReadResponseSchema.parse(response);\n}\n\nexport async function getShippingOptions(\n cartId: string,\n postalCode: string,\n): Promise<ShippingOptionsResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n if (!postalCode?.trim()) throw new Error(\"postalCode is required\");\n const client = await getStoreApiClient();\n const q = new URLSearchParams({ postalCode: postalCode.trim() });\n const response = await client.get<unknown>(\n `carts/${cartId}/shipping-options?${q.toString()}`,\n );\n return ShippingOptionsResponseSchema.parse(response);\n}\n\nexport async function putCartShippingMethod(\n cartId: string,\n data: CartShippingMethodPutRequest,\n): Promise<CartResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const payload = CartShippingMethodPutRequestSchema.parse(data);\n const client = await getStoreApiClient();\n const response = await client.put<unknown>(\n `carts/${cartId}/shipping-method`,\n payload,\n );\n return CartResponseSchema.parse(response);\n}\n\n/**\n * Solo métodos de pago (misma respuesta que {@link getCartCheckout}; evita duplicar llamadas si ya tienes el checkout).\n */\nexport async function getCartPaymentMethods(\n cartId?: string,\n): Promise<CartPaymentMethodsResponse> {\n if (!cartId) throw new Error(\"cartId is required\");\n const { paymentMethods } = await getCartCheckout(cartId);\n return paymentMethods;\n}\n","import { z } from \"zod\";\nimport { getStoreApiClient } from \"./store-api-client\";\nimport { DEFAULT_COUNTRY_CODE } from \"../constants/currency\";\n\nexport const CustomerRegisterRequestSchema = z.object({\n email: z.string().email(),\n firstName: z.string().trim().min(1),\n lastName: z.string().trim().min(1),\n countryIsoCode: z.string().trim().length(2),\n password: z.string(),\n phone: z.string().trim().optional(),\n});\n\nexport type CustomerRegisterRequest = z.infer<typeof CustomerRegisterRequestSchema>;\n\n/** GET/POST/PUT cuerpo de dirección (upstream `customer/me/addresses` vía proxy). */\nexport const CustomerAddressSchema = z.object({\n /** Presente en listados cuando el upstream expone el id para PUT/DELETE. */\n id: z.string().optional(),\n addressKey: z.string(),\n countryIsoCode: z.string(),\n addressLine: z.string(),\n addressNumber: z.string(),\n department: z.string(),\n province: z.string(),\n district: z.string(),\n phone: z.string(),\n cellPhone: z.string(),\n postalCode: z.string(),\n reference: z.string(),\n latitude: z.number().nullable(),\n longitude: z.number().nullable(),\n isDefault: z.boolean(),\n});\n\nexport type CustomerAddress = z.infer<typeof CustomerAddressSchema>;\n\nexport const CustomerAddressUpsertSchema = CustomerAddressSchema.omit({ id: true });\n\nexport type CustomerAddressUpsert = z.infer<typeof CustomerAddressUpsertSchema>;\n\n/** GET /v1/customer/me (upstream vía proxy `/api/store/customer/me`). */\nexport const CustomerMeSchema = z.object({\n id: z.string(),\n storeId: z.string(),\n email: z.string().email(),\n firstName: z.string(),\n lastName: z.string(),\n phone: z.string(),\n identificationNumber: z.string().nullable(),\n identificationType: z.string().nullable(),\n entityName: z.string().nullable(),\n dateOfBirth: z.string().nullable(),\n gender: z.string().nullable(),\n countryIsoCode: z.string(),\n role: z.string().nullable(),\n companyName: z.string().nullable(),\n consent: z.boolean(),\n userId: z.string(),\n customerType: z.string(),\n status: z.string(),\n entityIdentificationNumber: z.string().nullable(),\n defaultAddressId: z.string().nullable(),\n metadata: z.unknown().nullable(),\n totalOrders: z.number(),\n avgOrders: z.number(),\n lastOrderId: z.string().nullable(),\n lastOrderDate: z.string().nullable(),\n loyaltyPoints: z.number(),\n addresses: z.array(CustomerAddressSchema),\n createdOn: z.string(),\n updatedOn: z.string().nullable(),\n});\n\nexport type CustomerMe = z.infer<typeof CustomerMeSchema>;\n\n/** PATCH /v1/customer (upstream vía proxy `customer`, respuesta 204). */\nexport const CustomerProfilePatchSchema = z.object({\n firstName: z.string().trim().min(1),\n lastName: z.string().trim().min(1),\n phone: z.string().trim(),\n identificationNumber: z.string().nullable(),\n identificationType: z.string().nullable(),\n entityName: z.string().nullable(),\n entityIdentificationNumber: z.string().nullable(),\n gender: z.string().nullable(),\n role: z.string().nullable(),\n companyName: z.string().nullable(),\n dateOfBirth: z.string().nullable(),\n consent: z.boolean(),\n countryIsoCode: z.string().trim().length(2),\n});\n\nexport type CustomerProfilePatch = z.infer<typeof CustomerProfilePatchSchema>;\n\nexport function customerMeToProfilePatch(me: CustomerMe): CustomerProfilePatch {\n return {\n firstName: me.firstName,\n lastName: me.lastName,\n phone: me.phone ?? \"\",\n identificationNumber: me.identificationNumber,\n identificationType: me.identificationType,\n entityName: me.entityName,\n entityIdentificationNumber: me.entityIdentificationNumber,\n gender: me.gender,\n role: me.role,\n companyName: me.companyName,\n dateOfBirth: me.dateOfBirth,\n consent: me.consent,\n countryIsoCode: me.countryIsoCode || DEFAULT_COUNTRY_CODE,\n };\n}\n\nfunction customerAuthOptions(accessToken?: string) {\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0 ? accessToken.trim() : undefined;\n return token ? { bearerToken: token } : {};\n}\n\n/**\n * Registra un cliente vía proxy /api/store.\n * El proxy agrega X-Store-Id igual que en el resto de endpoints de storefront.\n */\nexport async function registerCustomer(data: CustomerRegisterRequest): Promise<unknown> {\n const payload = CustomerRegisterRequestSchema.parse(data);\n const client = await getStoreApiClient();\n return client.post<unknown>(\"customer/register\", payload);\n}\n\n/**\n * Direcciones del cliente autenticado (Ecomiq upstream: rutas privadas con `Authorization: Bearer` solamente).\n *\n * - Con `accessToken`, el cliente lo manda al proxy y este lo reenvía tal cual a upstream.\n * - Sin token, el proxy usa la cookie HttpOnly de storefront (mismo Bearer hacia Ecomiq).\n */\nexport async function getCustomerAddresses(accessToken?: string): Promise<CustomerAddress[]> {\n const client = await getStoreApiClient();\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0 ? accessToken.trim() : undefined;\n const response = await client.get<unknown>(\"customer/addresses\", {\n ...(token ? { bearerToken: token } : {}),\n });\n return z.array(CustomerAddressSchema).parse(response);\n}\n\nexport async function createCustomerAddress(\n data: CustomerAddressUpsert,\n accessToken?: string\n): Promise<unknown> {\n const client = await getStoreApiClient();\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0 ? accessToken.trim() : undefined;\n const payload = CustomerAddressUpsertSchema.parse(data);\n return client.post<unknown>(\"customer/addresses\", payload, {\n ...(token ? { bearerToken: token } : {}),\n });\n}\n\nexport async function updateCustomerAddress(\n addressId: string,\n data: CustomerAddressUpsert,\n accessToken?: string\n): Promise<unknown> {\n const client = await getStoreApiClient();\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0 ? accessToken.trim() : undefined;\n const payload = CustomerAddressUpsertSchema.parse(data);\n const id = addressId.trim();\n if (!id) throw new Error(\"addressId requerido\");\n return client.put<unknown>(`customer/addresses/${encodeURIComponent(id)}`, payload, {\n ...(token ? { bearerToken: token } : {}),\n });\n}\n\nexport async function deleteCustomerAddress(\n addressId: string,\n accessToken?: string\n): Promise<unknown> {\n const client = await getStoreApiClient();\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0 ? accessToken.trim() : undefined;\n const id = addressId.trim();\n if (!id) throw new Error(\"addressId requerido\");\n return client.delete<unknown>(`customer/addresses/${encodeURIComponent(id)}`, {\n ...(token ? { bearerToken: token } : {}),\n });\n}\n\n/**\n * Perfil del cliente autenticado (`GET /v1/customer/me`).\n * Autenticación igual que `getCustomerAddresses`: Bearer opcional o cookie HttpOnly en el proxy.\n */\nexport async function getCustomerMe(accessToken?: string): Promise<CustomerMe> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\"customer\", customerAuthOptions(accessToken));\n return CustomerMeSchema.parse(response);\n}\n\n/** Actualiza el perfil del cliente autenticado (`PATCH /v1/customer`). */\nexport async function patchCustomer(\n data: CustomerProfilePatch,\n accessToken?: string\n): Promise<void> {\n const client = await getStoreApiClient();\n const payload = CustomerProfilePatchSchema.parse(data);\n await client.patch<unknown>(\"customer\", payload, customerAuthOptions(accessToken));\n}\n","import { z } from \"zod\";\nimport { getStoreApiClient } from \"./store-api-client\";\n\nconst CustomerOrderShippingAddressSchema = z\n .object({\n name: z.string().nullable().optional(),\n company: z.string().nullable().optional(),\n address1: z.string(),\n address2: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n countryCode: z.string().min(2).max(2),\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 metadata: z.record(z.unknown()).nullable().optional(),\n })\n .passthrough();\n\nconst CustomerOrderLineItemSchema = z.object({\n id: z.string(),\n orderId: z.coerce.string(),\n productId: z.coerce.string().nullable(),\n variantId: z.coerce.string().nullable(),\n title: z.string(),\n subtitle: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n variantTitle: z.string().nullable().optional(),\n productHandle: z.string().nullable().optional(),\n quantity: z.number(),\n unitPrice: z.number(),\n total: z.number(),\n status: z.string(),\n});\n\n/** GET /v1/customer/orders (listado agrupado vía proxy `customer/orders`). */\nexport const CustomerOrderListItemSchema = z.object({\n orderId: z.coerce.string(),\n orderNumber: z.string(),\n orderGroup: z.string(),\n orderIds: z.array(z.coerce.string()),\n status: z.string(),\n total: z.number(),\n totalPaid: z.number(),\n currencyCode: z.string(),\n orderDate: z.string(),\n createdOn: z.string(),\n updatedOn: z.string().nullable().optional(),\n paymentAt: z.string().nullable().optional(),\n shippingAddress: CustomerOrderShippingAddressSchema.nullable().optional(),\n shippingAddressSummary: z.string().nullable().optional(),\n items: z.array(CustomerOrderLineItemSchema),\n});\n\nexport type CustomerOrderListItemDto = z.infer<typeof CustomerOrderListItemSchema>;\n\nconst CustomerOrderPaymentSchema = z.object({\n id: z.string(),\n paymentMethod: z.string(),\n paymentCode: z.string(),\n amount: z.number(),\n paymentStatus: z.string(),\n receiptUrl: z.string().nullable().optional(),\n createdOn: z.string(),\n});\n\nconst CustomerOrderStatusTimelineSchema = z.object({\n key: z.string(),\n label: z.string(),\n occurredAt: z.string(),\n description: z.string().nullable().optional(),\n status: z.string(),\n source: z.string(),\n});\n\n/** GET /v1/customer/orders/{orderId} (detalle vía proxy). */\nexport const CustomerOrderDetailSchema = z.object({\n id: z.coerce.string(),\n orderNumber: z.string(),\n orderGroup: z.string(),\n status: z.string(),\n total: z.number(),\n totalPaid: z.number(),\n currencyCode: z.string(),\n orderDate: z.string(),\n createdOn: z.string(),\n updatedOn: z.string().nullable().optional(),\n paymentAt: z.string().nullable().optional(),\n subTotal: z.number(),\n discount: z.number(),\n shipping: z.number(),\n tax: z.number(),\n email: z.string(),\n phone: z.string(),\n firstName: z.string(),\n lastName: z.string(),\n shippingAddress: CustomerOrderShippingAddressSchema.nullable().optional(),\n shippingAddressSummary: z.string().nullable().optional(),\n billingAddress: CustomerOrderShippingAddressSchema.nullable().optional(),\n items: z.array(CustomerOrderLineItemSchema),\n payments: z.array(CustomerOrderPaymentSchema),\n statusTimeline: z.array(CustomerOrderStatusTimelineSchema),\n});\n\nexport type CustomerOrderDetailDto = z.infer<typeof CustomerOrderDetailSchema>;\n\nfunction authOptions(accessToken?: string) {\n const token =\n typeof accessToken === \"string\" && accessToken.trim().length > 0\n ? accessToken.trim()\n : undefined;\n return token ? { bearerToken: token } : {};\n}\n\nexport async function getCustomerOrders(\n accessToken?: string\n): Promise<CustomerOrderListItemDto[]> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\"customer/orders\", authOptions(accessToken));\n return z.array(CustomerOrderListItemSchema).parse(response);\n}\n\nexport async function getCustomerOrder(\n orderId: string,\n accessToken?: string\n): Promise<CustomerOrderDetailDto> {\n const client = await getStoreApiClient();\n const id = orderId.trim();\n if (!id) throw new Error(\"orderId requerido\");\n const response = await client.get<unknown>(\n `customer/orders/${encodeURIComponent(id)}`,\n authOptions(accessToken)\n );\n return CustomerOrderDetailSchema.parse(response);\n}\n","import { z } from \"zod\";\nimport { DEFAULT_CURRENCY_CODE } from \"../constants/currency\";\n\n/** Dirección mínima para validar borradores de pedido en el storefront (sin depender de `@ecomiq/core`). */\nexport const StorefrontOrderAddressSchema = z\n .object({\n address1: z.string().optional(),\n address2: z.string().optional(),\n city: z.string().optional(),\n province: z.string().optional(),\n country: z.string().optional(),\n zip: z.string().optional(),\n phone: z.string().optional(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n })\n .passthrough();\n\nexport const OrderDraftItemSchema = z.object({\n id: z.string(),\n productId: z.coerce.string().nullable().optional(),\n sellerId: z.string().nullable().optional(),\n shippingProfileId: z.string().nullable().optional(),\n variantId: z.coerce.string().nullable().optional(),\n title: z.string(),\n subtitle: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n quantity: z.number().optional().default(1),\n unitPrice: z.number().optional().default(0),\n subTotal: z.number().optional().default(0),\n discount: z.number().optional().default(0),\n shipping: z.number().optional().default(0),\n tax: z.number().optional().default(0),\n warranty: z.number().optional().default(0),\n total: z.number().optional().default(0),\n requiresShipping: z.boolean().optional().default(true),\n isTaxInclusive: z.boolean().optional().default(true),\n metadata: z.record(z.unknown()).optional().default({}),\n});\n\nexport const OrderDraftShippingMethodSchema = z.object({\n id: z.string(),\n name: z.string().optional().default(\"\"),\n description: z.string().nullable().optional(),\n subtotal: z.number().optional().default(0),\n discountTotal: z.number().optional().default(0),\n taxTotal: z.number().optional().default(0),\n total: z.number().optional().default(0),\n isTaxInclusive: z.boolean().optional().default(true),\n sellerId: z.string().nullable().optional(),\n shippingProfileId: z.string().nullable().optional(),\n shippingMethodId: z.string().nullable().optional(),\n connectionId: z.string().nullable().optional(),\n providerName: z.string().nullable().optional(),\n trackingCode: z.string().nullable().optional(),\n estimatedDays: z.number().nullable().optional(),\n zoneCode: 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 data: z.record(z.unknown()).optional().default({}),\n});\n\nexport const OrderDraftSchema = z.object({\n id: z.string(),\n storeId: z.string().optional(),\n customerId: z.coerce.string().nullable().optional(),\n cartId: z.string().nullable().optional(),\n draftNumber: z.string(),\n currencyCode: z.string().optional().default(DEFAULT_CURRENCY_CODE),\n source: z.string().nullable().optional(),\n notes: z.string().nullable().optional(),\n email: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n firstName: z.string().nullable().optional(),\n lastName: z.string().nullable().optional(),\n identificationType: z.string().nullable().optional(),\n identificationNumber: z.string().nullable().optional(),\n entityTaxId: z.string().nullable().optional(),\n entityName: z.string().nullable().optional(),\n status: z.string(),\n draftDate: z.string().nullable().optional(),\n sentAt: z.string().nullable().optional(),\n viewedAt: z.string().nullable().optional(),\n acceptedAt: z.string().nullable().optional(),\n rejectedAt: z.string().nullable().optional(),\n expiredAt: z.string().nullable().optional(),\n cancelledAt: z.string().nullable().optional(),\n convertedAt: z.string().nullable().optional(),\n shareToken: z.string().nullable().optional(),\n shareExpiresAt: z.string().nullable().optional(),\n allowAnonymousShareAccess: z.boolean().optional().default(false),\n sharedAt: z.string().nullable().optional(),\n billingAddress: StorefrontOrderAddressSchema.optional().nullable(),\n shippingAddress: StorefrontOrderAddressSchema.optional().nullable(),\n metadata: z.record(z.unknown()).optional().default({}),\n subTotal: z.number().optional().default(0),\n discount: z.number().optional().default(0),\n shipping: z.number().optional().default(0),\n tax: z.number().optional().default(0),\n warranty: z.number().optional().default(0),\n total: z.number().optional().default(0),\n paymentMethod: z.string().optional().default(\"\"),\n paymentCode: z.string().optional().default(\"\"),\n items: z.array(OrderDraftItemSchema).optional().default([]),\n shippingMethods: z.array(OrderDraftShippingMethodSchema).optional().default([]),\n createdOn: z.string().optional(),\n updatedOn: z.string().nullable().optional(),\n});\n\nexport type OrderDraft = z.infer<typeof OrderDraftSchema>;\n","import { OrderDraftSchema, type OrderDraft } from \"../models/order-draft\";\nimport { getStoreApiClient } from \"./store-api-client\";\n\nexport async function getSharedOrderDraft(\n shareToken: string,\n): Promise<OrderDraft> {\n const client = await getStoreApiClient();\n const response = await client.get<unknown>(\n `order-drafts/share/${encodeURIComponent(shareToken)}`,\n { noStore: true },\n );\n return OrderDraftSchema.parse(response);\n}\n","/** Id del plugin servidor/cliente Better Auth (debe coincidir en ambos lados). */\nexport const PLUGIN_ID = \"ecomiq-oauth-password\";\nexport const ECOMIQ_OAUTH_TOKEN_URL = \"https://auth.ecomiq.pe/connect/token\";\nexport const ECOMIQ_OAUTH_USERINFO_URL = \"https://auth.ecomiq.pe/connect/userinfo\";\n","import { z } from \"zod\";\n\nexport const tokenResponseSchema = z.object({\n access_token: z.string().min(1),\n token_type: z.string().optional(),\n /** Segundos hasta expiración (Ecomiq envía ej. `86399`). Sincroniza la sesión Better Auth con el bearer. */\n expires_in: z.coerce.number().int().positive().optional(),\n});\n\n/** Respuesta típica de GET /connect/userinfo (OpenID). */\nexport const userInfoSchema = z.object({\n sub: z.string(),\n email: z.string().email().optional(),\n family_name: z.string().optional(),\n given_name: z.string().optional(),\n iss: z.string().optional(),\n aud: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\nexport const signInBody = z.object({\n email: z.string().email(),\n password: z.string().min(1),\n callbackURL: z.string().optional(),\n rememberMe: z.boolean().optional().default(true),\n});\n","import {\n createAuthEndpoint,\n createAuthMiddleware,\n formCsrfMiddleware,\n} from \"better-auth/api\";\nimport { APIError, type BetterAuthPlugin } from \"better-auth\";\nimport { z } from \"zod\";\nimport { setSessionCookie } from \"better-auth/cookies\";\nimport { parseUserOutput } from \"better-auth/db\";\n\nimport {\n STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME,\n STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH,\n} from \"../../core/constants/storefront-ecomiq-oauth-cookie\";\nimport { STOREFRONT_HEADERS } from \"../../core/constants/currency\";\nimport { PLUGIN_ID, ECOMIQ_OAUTH_USERINFO_URL, ECOMIQ_OAUTH_TOKEN_URL } from \"./ecomiq-oauth-password-constants\";\nimport { signInBody, userInfoSchema, tokenResponseSchema } from \"./ecomiq-oauth-password-types\";\n\ntype IdentityContext = {\n identityScope?: string | null;\n tenantId?: string | null;\n storeId?: string | null;\n};\n\n/**\n * Inicia sesión contra el OAuth (resource owner password), obtiene el perfil por userinfo\n * y crea/actualiza el usuario en Better Auth.\n * La caducidad de la sesión Better Auth sigue `expires_in` de Ecomiq (sin `refresh_token`).\n * El bearer OAuth solo va en cookie HttpOnly acotada a `/api/store` (no en JSON de sesión).\n */\nexport function ecomiqOAuthPassword(): BetterAuthPlugin {\n const secureCookie = true //Boolean(isProduction);\n const clearStorefrontOAuthCookieMiddleware = createAuthMiddleware(async (ctx) => {\n ctx.setCookie(STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME, \"\", {\n path: STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH,\n httpOnly: true,\n sameSite: \"lax\",\n secure: secureCookie,\n maxAge: 0,\n });\n });\n\n return {\n id: PLUGIN_ID,\n schema: {\n user: {\n fields: {\n firstName: { type: \"string\", required: false },\n lastName: { type: \"string\", required: false },\n phone: { type: \"string\", required: false },\n },\n },\n },\n hooks: {\n after: [\n {\n matcher: (hookCtx) => hookCtx.path === \"/sign-out\",\n handler: clearStorefrontOAuthCookieMiddleware,\n },\n ],\n },\n endpoints: {\n signIn: createAuthEndpoint(\n \"/ecomiq-oauth/sign-in\",\n {\n method: \"POST\",\n use: [formCsrfMiddleware],\n body: signInBody,\n },\n async (ctx) => {\n const { email: loginEmail, password, callbackURL, rememberMe } = ctx.body;\n\n const tokens = await exchangePasswordGrant(loginEmail, password, {\n identityScope: ctx.getHeader(STOREFRONT_HEADERS.identityScope),\n tenantId: ctx.getHeader(STOREFRONT_HEADERS.tenantId),\n storeId: ctx.getHeader(STOREFRONT_HEADERS.storeId),\n });\n const profile = await fetchUserInfo(tokens.access_token);\n\n const profileEmail = profile.email?.toLowerCase().trim();\n const canonicalEmail = profileEmail ?? loginEmail.toLowerCase().trim();\n\n if (profileEmail && profileEmail !== loginEmail.toLowerCase().trim()) {\n throw APIError.from(\"UNAUTHORIZED\", {\n code: \"ECOMIQ_EMAIL_MISMATCH\",\n message: \"El correo del perfil OAuth no coincide con el inicio de sesión\",\n });\n }\n\n const displayName = displayNameFromUserInfo(profile, canonicalEmail);\n\n const existing = await ctx.context.internalAdapter.findUserByEmail(canonicalEmail);\n let user = existing?.user;\n if (!user) {\n user = await ctx.context.internalAdapter.createUser({\n email: canonicalEmail,\n name: displayName,\n emailVerified: true,\n });\n } else if (user.name !== displayName) {\n await ctx.context.internalAdapter.updateUser(user.id, { name: displayName });\n user = { ...user, name: displayName };\n }\n\n /** Misma ventana que el bearer: `expiresAt` de la sesión coincide con OAuth (`overrideAll`). */\n const oauthSessionExpires =\n tokens.expires_in !== undefined && tokens.expires_in > 0\n ? new Date(Date.now() + tokens.expires_in * 1000)\n : undefined;\n\n const session = await ctx.context.internalAdapter.createSession(\n user.id,\n rememberMe === false,\n oauthSessionExpires ? { expiresAt: oauthSessionExpires } : {},\n Boolean(oauthSessionExpires)\n );\n\n if (!session) {\n throw APIError.from(\"INTERNAL_SERVER_ERROR\", {\n code: \"ECOMIQ_SESSION_FAILED\",\n message: \"No se pudo crear la sesión\",\n });\n }\n\n await setSessionCookie(ctx, { session, user }, rememberMe === false);\n\n const oauthMaxAgeSec =\n oauthSessionExpires !== undefined\n ? Math.max(60, Math.ceil((oauthSessionExpires.getTime() - Date.now()) / 1000))\n : tokens.expires_in !== undefined && tokens.expires_in > 0\n ? tokens.expires_in\n : 60 * 60 * 24;\n\n await ctx.setCookie(STOREFRONT_ECOMIQ_OAUTH_COOKIE_NAME, tokens.access_token, {\n path: STOREFRONT_ECOMIQ_OAUTH_COOKIE_PATH,\n httpOnly: true,\n sameSite: \"lax\",\n secure: secureCookie,\n maxAge: oauthMaxAgeSec,\n });\n\n if (callbackURL) ctx.setHeader(\"Location\", callbackURL);\n\n return ctx.json({\n redirect: !!callbackURL,\n token: session.token,\n url: callbackURL,\n user: parseUserOutput(ctx.context.options, user),\n });\n }\n ),\n },\n } satisfies BetterAuthPlugin;\n}\n\nfunction displayNameFromUserInfo(\n profile: z.infer<typeof userInfoSchema>,\n fallbackEmail: string\n): string {\n const parts = [profile.given_name?.trim(), profile.family_name?.trim()].filter(Boolean);\n const joined = parts.join(\" \").trim();\n if (joined) return joined;\n return fallbackEmail.split(\"@\")[0] || \"Cliente\";\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<z.infer<typeof userInfoSchema>> {\n const res = await fetch(ECOMIQ_OAUTH_USERINFO_URL, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n accept: \"application/json\",\n },\n });\n\n const text = await res.text();\n let json: unknown;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n throw APIError.from(\"UNAUTHORIZED\", {\n code: \"ECOMIQ_USERINFO_INVALID_BODY\",\n message: \"Respuesta inválida del endpoint userinfo\",\n });\n }\n\n if (!res.ok) {\n const err = json as { error?: string; error_description?: string };\n throw APIError.from(\"UNAUTHORIZED\", {\n code: \"ECOMIQ_USERINFO_REJECTED\",\n message: err.error_description ?? err.error ?? \"No se pudo obtener el perfil del usuario\",\n });\n }\n\n const parsed = userInfoSchema.safeParse(json);\n if (!parsed.success) {\n throw APIError.from(\"UNAUTHORIZED\", {\n code: \"ECOMIQ_USERINFO_SHAPE\",\n message: \"Perfil OAuth con formato inválido\",\n });\n }\n return parsed.data;\n}\n\ntype OAuthErrorBody = { error?: string; error_description?: string };\n\nasync function exchangePasswordGrant(\n username: string,\n password: string,\n context: IdentityContext\n): Promise<z.infer<typeof tokenResponseSchema>> {\n const clientId = process.env.ECOMIQ_AUTH_CLIENT_ID ?? \"\";\n const clientSecret = process.env.ECOMIQ_AUTH_CLIENT_SECRET ?? \"\";\n const scope = process.env.ECOMIQ_AUTH_SCOPE ?? \"\";\n if (!clientId || !clientSecret) {\n throw APIError.from(\"INTERNAL_SERVER_ERROR\", {\n code: \"ECOMIQ_AUTH_NOT_CONFIGURED\",\n message:\n \"OAuth Ecomiq no configurado: ECOMIQ_AUTH_CLIENT_ID y ECOMIQ_AUTH_CLIENT_SECRET.\",\n });\n }\n\n const body = new URLSearchParams({\n grant_type: \"password\",\n username,\n password,\n scope: scope,\n client_id: clientId,\n client_secret: clientSecret,\n });\n\n const identityScope = context.identityScope;\n const tenantId = context.tenantId;\n const storeId = context.storeId;\n\n const headers = new Headers({\n \"content-type\": \"application/x-www-form-urlencoded\",\n accept: \"application/json\",\n });\n\n if (identityScope?.trim()) {\n headers.set(STOREFRONT_HEADERS.identityScope, identityScope.trim());\n }\n if (tenantId?.trim()) {\n headers.set(STOREFRONT_HEADERS.tenantId, tenantId.trim());\n }\n if (storeId?.trim()) {\n headers.set(STOREFRONT_HEADERS.storeId, storeId.trim());\n }\n\n let res: Response;\n let text: string;\n try {\n res = await fetch(ECOMIQ_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers,\n body,\n });\n text = await res.text();\n } catch (e) {\n throw mapTokenEndpointFetchFailure(e);\n }\n\n const json = safeParseJson(text);\n if (!res.ok) {\n throwBadRequestFromOAuth(json, res.statusText || text || `HTTP ${res.status}`);\n }\n\n const parsed = tokenResponseSchema.safeParse(json);\n if (!parsed.success) {\n throwBadRequestFromOAuth(json, \"Token de acceso no recibido\");\n }\n return parsed.data;\n}\n\nfunction safeParseJson(text: string): unknown {\n try {\n return text ? JSON.parse(text) : {};\n } catch {\n return {};\n }\n}\n\nfunction throwBadRequestFromOAuth(payload: unknown, fallbackMessage: string): never {\n const err = payload as OAuthErrorBody;\n const errorCode =\n typeof err.error === \"string\" && err.error.trim()\n ? err.error.trim()\n : \"invalid_grant\";\n const errorMessage =\n typeof err.error_description === \"string\" && err.error_description.trim()\n ? err.error_description.trim()\n : typeof err.error === \"string\" && err.error.trim()\n ? err.error.trim()\n : fallbackMessage.trim() || \"Credenciales invalidas.\";\n throw APIError.from(\"BAD_REQUEST\", {\n code: errorCode,\n message: errorMessage.slice(0, 500),\n });\n}\n\n/**\n * Auth Ecomiq puede cerrar el socket ante credenciales invalidas (`TypeError: terminated`,\n * `UND_ERR_SOCKET`) en lugar de devolver JSON 400 desde Node/fetch (undici).\n */\nfunction mapTokenEndpointFetchFailure(e: unknown): never {\n const codes = collectNetworkErrorCodes(e);\n const msg = e instanceof Error ? e.message : String(e);\n\n const isDnsError = codes.some((c) => c === \"ENOTFOUND\" || c === \"EAI_AGAIN\");\n if (isDnsError) {\n throw APIError.from(\"BAD_GATEWAY\", {\n code: \"ECOMIQ_AUTH_DNS\",\n message: \"No se pudo resolver el servidor de autenticacion.\",\n });\n }\n\n const isConnectionRefused = codes.includes(\"ECONNREFUSED\");\n if (isConnectionRefused) {\n throw APIError.from(\"BAD_GATEWAY\", {\n code: \"ECOMIQ_AUTH_REFUSED\",\n message: \"Conexion rechazada al servidor de autenticacion.\",\n });\n }\n\n const looksLikeAbortOrSocketClose =\n codes.some((c) =>\n [\"UND_ERR_SOCKET\", \"ECONNRESET\", \"EPIPE\", \"ECONNABORTED\"].includes(c)\n ) ||\n /terminated|abort|closed|FIN|socket/i.test(msg);\n\n if (looksLikeAbortOrSocketClose) {\n throwBadRequestFromOAuth({}, \"Credenciales invalidas o conexion cerrada por el servidor.\");\n }\n\n throw APIError.from(\"INTERNAL_SERVER_ERROR\", {\n code: \"ECOMIQ_AUTH_REQUEST_FAILED\",\n message: msg.slice(0, 280) || \"Error al contactar el servidor de autenticacion.\",\n });\n}\n\nfunction collectNetworkErrorCodes(e: unknown): string[] {\n const out: string[] = [];\n const visit = (x: unknown): void => {\n if (!x || typeof x !== \"object\") return;\n const code = \"code\" in x && typeof (x as { code?: unknown }).code === \"string\"\n ? (x as { code: string }).code\n : undefined;\n if (code) out.push(code);\n if (\"cause\" in x && (x as { cause?: unknown }).cause) {\n visit((x as { cause: unknown }).cause);\n }\n };\n visit(e);\n return out;\n}\n"]}
@@ -1,155 +0,0 @@
1
- import { StorefrontSettingsSchema } from './chunk-64GLOWMJ.js';
2
- import { z } from 'zod';
3
- import { existsSync } from 'fs';
4
- import { createRequire } from 'module';
5
- import { join } from 'path';
6
-
7
- var EcomiqConfigSchema = z.object({
8
- /**
9
- * Slug de tienda en Ecomiq (p. ej. `mi-tienda` para `mi-tienda.ecomiq.app`).
10
- * Opcional: si se omite, la tienda se resuelve por el header `Host`.
11
- */
12
- slugStore: z.string().min(1).optional()
13
- });
14
- function parseExportedEcomiqConfig(raw) {
15
- const candidate = raw && typeof raw === "object" && "default" in raw ? raw.default : raw;
16
- const parsed = EcomiqConfigSchema.safeParse(candidate);
17
- if (!parsed.success) {
18
- console.warn(
19
- "[ecomiq] ecomiq.config.* inv\xE1lido:",
20
- parsed.error.flatten().fieldErrors
21
- );
22
- return null;
23
- }
24
- const slugStore = parsed.data.slugStore?.trim();
25
- return slugStore ? { slugStore } : {};
26
- }
27
- async function getCloudflareEnv() {
28
- try {
29
- const { getCloudflareContext } = await import('@opennextjs/cloudflare');
30
- const { env } = await getCloudflareContext({ async: true });
31
- return env;
32
- } catch {
33
- throw Object.assign(
34
- new Error(
35
- "Modo KV requiere un provider de env. En Next.js instala @opennextjs/cloudflare; en TanStack Start registra setCloudflareEnvProvider(). O usa PUBLIC_STORE_SETTINGS_SOURCE=api."
36
- ),
37
- { status: 500 }
38
- );
39
- }
40
- }
41
- var ECOMIQ_CLIENTS_STORE_KV_BINDING = "ecomiq_clients_store";
42
- var ECOMIQ_APP_APEX = "ecomiq.app";
43
- var ECOMIQ_APP_SUFFIX = [`.${ECOMIQ_APP_APEX}`, ".localhost"];
44
- function normalizeStoreHost(hostHeader) {
45
- let h = hostHeader.trim().toLowerCase();
46
- const colon = h.indexOf(":");
47
- if (colon !== -1) h = h.slice(0, colon);
48
- if (h.startsWith("www.")) h = h.slice(4);
49
- return h;
50
- }
51
- function resolveStorefrontSettingsHost(hostHeader) {
52
- const host = normalizeStoreHost(hostHeader);
53
- if (!host) {
54
- throw Object.assign(new Error("Host inv\xE1lido para tienda"), { status: 400 });
55
- }
56
- if (host === ECOMIQ_APP_APEX) {
57
- throw Object.assign(new Error("Host apex ecomiq.app sin slug de tienda"), { status: 400 });
58
- }
59
- if (ECOMIQ_APP_SUFFIX.some((suffix) => host.endsWith(suffix))) {
60
- const slug = host.slice(0, -(ECOMIQ_APP_SUFFIX.find((suffix) => host.endsWith(suffix))?.length ?? 0));
61
- if (!slug) {
62
- throw Object.assign(new Error("Host sin slug para ecomiq.app"), { status: 400 });
63
- }
64
- return slug;
65
- }
66
- return host;
67
- }
68
- function buildStorefrontKvSnapshotKeyFromStoreKey(storeKey) {
69
- const key = storeKey.trim();
70
- if (!key) {
71
- throw Object.assign(new Error("Store key vac\xEDo para KV"), { status: 400 });
72
- }
73
- return `storefront:snapshots:store:${key}`;
74
- }
75
- function buildStorefrontKvSnapshotKey(hostHeader) {
76
- return buildStorefrontKvSnapshotKeyFromStoreKey(
77
- resolveStorefrontSettingsHost(hostHeader)
78
- );
79
- }
80
- function getKvNamespace(env) {
81
- if (!env || typeof env !== "object") return void 0;
82
- const ns = env[ECOMIQ_CLIENTS_STORE_KV_BINDING];
83
- if (!ns || typeof ns !== "object" || typeof ns.get !== "function") {
84
- return void 0;
85
- }
86
- return ns;
87
- }
88
- async function getStorefrontSettingsFromKvByStoreKey(storeKey) {
89
- const env = await getCloudflareEnv();
90
- const kv = getKvNamespace(env);
91
- if (!kv) {
92
- const err = new Error(
93
- `Binding KV "${ECOMIQ_CLIENTS_STORE_KV_BINDING}" no encontrado. Configura kv_namespaces en wrangler.`
94
- );
95
- throw Object.assign(err, { status: 500 });
96
- }
97
- const cacheKey = buildStorefrontKvSnapshotKeyFromStoreKey(storeKey);
98
- const raw = await kv.get(cacheKey, { type: "json" });
99
- if (raw == null) {
100
- const err = new Error("Store settings not found in KV");
101
- throw Object.assign(err, { status: 404 });
102
- }
103
- return StorefrontSettingsSchema.parse(raw);
104
- }
105
- async function getStorefrontSettingsFromKv(hostHeader) {
106
- return getStorefrontSettingsFromKvByStoreKey(
107
- resolveStorefrontSettingsHost(hostHeader)
108
- );
109
- }
110
- var CONFIG_FILENAMES = [
111
- "ecomiq.config.js",
112
- "ecomiq.config.cjs",
113
- "ecomiq.config.mjs"
114
- ];
115
- var cachedConfig;
116
- function loadEcomiqConfig(cwd = process.cwd()) {
117
- if (cachedConfig !== void 0) return cachedConfig;
118
- for (const filename of CONFIG_FILENAMES) {
119
- const configPath = join(cwd, filename);
120
- if (!existsSync(configPath)) continue;
121
- try {
122
- const requireFromApp = createRequire(join(cwd, "package.json"));
123
- const loaded = requireFromApp(configPath);
124
- cachedConfig = parseExportedEcomiqConfig(loaded);
125
- return cachedConfig;
126
- } catch (error) {
127
- console.warn(`[ecomiq] No se pudo cargar ${configPath}:`, error);
128
- }
129
- }
130
- cachedConfig = null;
131
- return null;
132
- }
133
- function clearEcomiqConfigCache() {
134
- cachedConfig = void 0;
135
- }
136
- function resolvePublicStoreKey(hostHeader, cwd) {
137
- const slugFromConfig = loadEcomiqConfig(cwd)?.slugStore?.trim();
138
- if (slugFromConfig) return slugFromConfig;
139
- if (!hostHeader?.trim()) {
140
- throw Object.assign(
141
- new Error(
142
- "No se pudo resolver la tienda: falta el header Host. En local puedes definir slugStore en ecomiq.config.js (opcional)."
143
- ),
144
- { status: 400 }
145
- );
146
- }
147
- return resolveStorefrontSettingsHost(hostHeader);
148
- }
149
- function hasEcomiqSlugStoreConfig(cwd) {
150
- return Boolean(loadEcomiqConfig(cwd)?.slugStore?.trim());
151
- }
152
-
153
- export { ECOMIQ_CLIENTS_STORE_KV_BINDING, EcomiqConfigSchema, buildStorefrontKvSnapshotKey, buildStorefrontKvSnapshotKeyFromStoreKey, clearEcomiqConfigCache, getStorefrontSettingsFromKv, getStorefrontSettingsFromKvByStoreKey, hasEcomiqSlugStoreConfig, loadEcomiqConfig, normalizeStoreHost, resolvePublicStoreKey, resolveStorefrontSettingsHost };
154
- //# sourceMappingURL=chunk-NAJQB5DN.js.map
155
- //# sourceMappingURL=chunk-NAJQB5DN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/config/ecomiq-config.schema.ts","../src/core/client/storefront-settings-kv.service.ts","../src/core/config/ecomiq-config.load.ts"],"names":[],"mappings":"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","file":"chunk-NAJQB5DN.js","sourcesContent":["import { z } from \"zod\";\n\nexport const EcomiqConfigSchema = z.object({\n /**\n * Slug de tienda en Ecomiq (p. ej. `mi-tienda` para `mi-tienda.ecomiq.app`).\n * Opcional: si se omite, la tienda se resuelve por el header `Host`.\n */\n slugStore: z.string().min(1).optional(),\n});\n\nexport type EcomiqConfig = z.infer<typeof EcomiqConfigSchema>;\n\nexport function parseExportedEcomiqConfig(raw: unknown): EcomiqConfig | null {\n const candidate =\n raw && typeof raw === \"object\" && \"default\" in (raw as object)\n ? (raw as { default: unknown }).default\n : raw;\n const parsed = EcomiqConfigSchema.safeParse(candidate);\n if (!parsed.success) {\n console.warn(\n \"[ecomiq] ecomiq.config.* inválido:\",\n parsed.error.flatten().fieldErrors,\n );\n return null;\n }\n const slugStore = parsed.data.slugStore?.trim();\n return slugStore ? { slugStore } : {};\n}\n","import { StorefrontSettingsSchema } from \"../models/store\";\nimport type { StorefrontSettings } from \"../models/store\";\n\n/**\n * Provider de env inyectable. Cada adaptador registra cómo obtener los bindings:\n * - Next.js/OpenNext: `getCloudflareContext()` (fallback por defecto).\n * - TanStack Start (plugin de Vite de Cloudflare): `import { env } from \"cloudflare:workers\"`\n * registrado por la app vía `setCloudflareEnvProvider`.\n */\ntype CloudflareEnvProvider = () => Promise<unknown> | unknown;\n\nlet cloudflareEnvProvider: CloudflareEnvProvider | null = null;\n\n/** Registra el accesor de env (bindings). Llamar una vez en el bootstrap del server. */\nexport function setCloudflareEnvProvider(\n provider: CloudflareEnvProvider | null,\n): void {\n cloudflareEnvProvider = provider;\n}\n\n/** KV Cloudflare: usa el provider registrado o, por defecto, OpenNext. */\nasync function getCloudflareEnv(): Promise<unknown> {\n if (cloudflareEnvProvider) {\n return cloudflareEnvProvider();\n }\n try {\n const { getCloudflareContext } = await import(\"@opennextjs/cloudflare\");\n const { env } = await getCloudflareContext({ async: true });\n return env;\n } catch {\n throw Object.assign(\n new Error(\n \"Modo KV requiere un provider de env. En Next.js instala \" +\n \"@opennextjs/cloudflare; en TanStack Start registra setCloudflareEnvProvider(). \" +\n \"O usa PUBLIC_STORE_SETTINGS_SOURCE=api.\",\n ),\n { status: 500 },\n );\n }\n}\n\n/** Debe coincidir con el `binding` en wrangler.jsonc (`kv_namespaces`). */\nexport const ECOMIQ_CLIENTS_STORE_KV_BINDING = \"ecomiq_clients_store\" as const;\n\nconst ECOMIQ_APP_APEX = \"ecomiq.app\";\nconst ECOMIQ_APP_SUFFIX = [`.${ECOMIQ_APP_APEX}`, \".localhost\"];\n\ntype KvJsonGet = {\n get(key: string, options: { type: \"json\" }): Promise<unknown>;\n};\n\n/** Host sin puerto, minúsculas, sin `www.`. */\nexport function normalizeStoreHost(hostHeader: string): string {\n let h = hostHeader.trim().toLowerCase();\n const colon = h.indexOf(\":\");\n if (colon !== -1) h = h.slice(0, colon);\n if (h.startsWith(\"www.\")) h = h.slice(4);\n return h;\n}\n\n/**\n * Identificador de tienda a partir del `Host`: slug en `*.ecomiq.app`, FQDN en dominio propio.\n * Misma semántica que el sufijo de `buildStorefrontKvSnapshotKey` (sin el prefijo KV).\n */\nexport function resolveStorefrontSettingsHost(hostHeader: string): string {\n const host = normalizeStoreHost(hostHeader);\n if (!host) {\n throw Object.assign(new Error(\"Host inválido para tienda\"), { status: 400 });\n }\n if (host === ECOMIQ_APP_APEX) {\n throw Object.assign(new Error(\"Host apex ecomiq.app sin slug de tienda\"), { status: 400 });\n }\n if (ECOMIQ_APP_SUFFIX.some(suffix => host.endsWith(suffix))) {\n const slug = host.slice(0, -(ECOMIQ_APP_SUFFIX.find(suffix => host.endsWith(suffix))?.length ?? 0));\n if (!slug) {\n throw Object.assign(new Error(\"Host sin slug para ecomiq.app\"), { status: 400 });\n }\n return slug;\n }\n return host;\n}\n\n/**\n * Clave KV del snapshot de tienda.\n * - `*.ecomiq.app` → `storefront:snapshots:store:<slug>` (todo lo que va antes de `.ecomiq.app`, p. ej. `plata950`).\n * - Dominio propio (p. ej. `plata950.com`) → `storefront:snapshots:store:<dominio completo>`.\n */\nexport function buildStorefrontKvSnapshotKeyFromStoreKey(storeKey: string): string {\n const key = storeKey.trim();\n if (!key) {\n throw Object.assign(new Error(\"Store key vacío para KV\"), { status: 400 });\n }\n return `storefront:snapshots:store:${key}`;\n}\n\nexport function buildStorefrontKvSnapshotKey(hostHeader: string): string {\n return buildStorefrontKvSnapshotKeyFromStoreKey(\n resolveStorefrontSettingsHost(hostHeader),\n );\n}\n\nfunction getKvNamespace(env: unknown): KvJsonGet | undefined {\n if (!env || typeof env !== \"object\") return undefined;\n const ns = (env as Record<string, unknown>)[ECOMIQ_CLIENTS_STORE_KV_BINDING];\n if (!ns || typeof ns !== \"object\" || typeof (ns as KvJsonGet).get !== \"function\") {\n return undefined;\n }\n return ns as KvJsonGet;\n}\n\n/**\n * Lee settings desde KV con clave ya resuelta (slug o dominio).\n */\nexport async function getStorefrontSettingsFromKvByStoreKey(\n storeKey: string,\n): Promise<StorefrontSettings> {\n const env = await getCloudflareEnv();\n const kv = getKvNamespace(env);\n if (!kv) {\n const err = new Error(\n `Binding KV \"${ECOMIQ_CLIENTS_STORE_KV_BINDING}\" no encontrado. Configura kv_namespaces en wrangler.`\n );\n throw Object.assign(err, { status: 500 });\n }\n\n const cacheKey = buildStorefrontKvSnapshotKeyFromStoreKey(storeKey);\n const raw = await kv.get(cacheKey, { type: \"json\" });\n if (raw == null) {\n const err = new Error(\"Store settings not found in KV\");\n throw Object.assign(err, { status: 404 });\n }\n\n return StorefrontSettingsSchema.parse(raw);\n}\n\n/**\n * Lee settings desde KV (`ecomiq_clients_store`) usando la clave según el host.\n */\nexport async function getStorefrontSettingsFromKv(hostHeader: string): Promise<StorefrontSettings> {\n return getStorefrontSettingsFromKvByStoreKey(\n resolveStorefrontSettingsHost(hostHeader),\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { resolveStorefrontSettingsHost } from \"../client/storefront-settings-kv.service\";\nimport {\n type EcomiqConfig,\n parseExportedEcomiqConfig,\n} from \"./ecomiq-config.schema\";\n\nexport type { EcomiqConfig } from \"./ecomiq-config.schema\";\nexport { EcomiqConfigSchema } from \"./ecomiq-config.schema\";\n\nconst CONFIG_FILENAMES = [\n \"ecomiq.config.js\",\n \"ecomiq.config.cjs\",\n \"ecomiq.config.mjs\",\n] as const;\n\nlet cachedConfig: EcomiqConfig | null | undefined;\n\n/**\n * Carga `ecomiq.config.js` (o `.cjs` / `.mjs`) desde `cwd` si existe.\n * Si no hay archivo, devuelve `null` (resolución por `Host` en `resolvePublicStoreKey`).\n */\nexport function loadEcomiqConfig(cwd = process.cwd()): EcomiqConfig | null {\n if (cachedConfig !== undefined) return cachedConfig;\n\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(cwd, filename);\n if (!existsSync(configPath)) continue;\n\n try {\n const requireFromApp = createRequire(join(cwd, \"package.json\"));\n const loaded = requireFromApp(configPath) as unknown;\n cachedConfig = parseExportedEcomiqConfig(loaded);\n return cachedConfig;\n } catch (error) {\n console.warn(`[ecomiq] No se pudo cargar ${configPath}:`, error);\n }\n }\n\n cachedConfig = null;\n return null;\n}\n\n/** Limpia la caché (tests o recarga en dev). */\nexport function clearEcomiqConfigCache(): void {\n cachedConfig = undefined;\n}\n\n/**\n * Identificador de tienda para settings (API / KV).\n * 1. `slugStore` en `ecomiq.config.*` si el archivo existe.\n * 2. Si no, deriva del header `Host`.\n */\nexport function resolvePublicStoreKey(\n hostHeader: string | null | undefined,\n cwd?: string,\n): string {\n const slugFromConfig = loadEcomiqConfig(cwd)?.slugStore?.trim();\n if (slugFromConfig) return slugFromConfig;\n\n if (!hostHeader?.trim()) {\n throw Object.assign(\n new Error(\n \"No se pudo resolver la tienda: falta el header Host. En local puedes definir slugStore en ecomiq.config.js (opcional).\",\n ),\n { status: 400 },\n );\n }\n\n return resolveStorefrontSettingsHost(hostHeader);\n}\n\nexport function hasEcomiqSlugStoreConfig(cwd?: string): boolean {\n return Boolean(loadEcomiqConfig(cwd)?.slugStore?.trim());\n}\n"]}