@pakento/cms-sdk 4.0.9 → 4.0.11

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/index.js CHANGED
@@ -112,7 +112,9 @@ var CacheService = class {
112
112
  const parsed = this.safeJsonParse(cached);
113
113
  if (parsed !== null) {
114
114
  if (typeof parsed === "object" && parsed !== null && "__pakento_cache_version" in parsed && "data" in parsed) {
115
- console.log(`[PakentoSDK] \u2705 Cache con metadata v\xE1lido para: ${key}`);
115
+ console.log(
116
+ `[PakentoSDK] \u2705 Cache con metadata v\xE1lido para: ${key}`
117
+ );
116
118
  return parsed.data;
117
119
  } else {
118
120
  console.log(`[PakentoSDK] \u2705 Cache legacy v\xE1lido para: ${key}`);
@@ -125,11 +127,16 @@ var CacheService = class {
125
127
  value: cached
126
128
  });
127
129
  this.clearCorruptedCache(key).catch(
128
- (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
130
+ (err) => console.warn(
131
+ `[PakentoSDK] Error limpiando cache corrupto: ${err}`
132
+ )
129
133
  );
130
134
  }
131
135
  } catch (parseError) {
132
- console.warn(`[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`, parseError);
136
+ console.warn(
137
+ `[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`,
138
+ parseError
139
+ );
133
140
  this.clearCorruptedCache(key).catch(
134
141
  (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
135
142
  );
@@ -163,6 +170,7 @@ var CacheService = class {
163
170
  }
164
171
  async hasCache(functionName, params = {}) {
165
172
  if (!this.redis) {
173
+ console.warn("[PakentoSDK] Redis no configurado");
166
174
  return false;
167
175
  }
168
176
  try {
@@ -199,6 +207,7 @@ var CacheService = class {
199
207
  }
200
208
  async clearCache(functionName, params = {}) {
201
209
  if (!this.redis) {
210
+ console.warn("[PakentoSDK] Redis no configurado");
202
211
  return false;
203
212
  }
204
213
  try {
@@ -213,9 +222,11 @@ var CacheService = class {
213
222
  }
214
223
  async clearAllCache() {
215
224
  if (!this.redis) {
225
+ console.warn("[PakentoSDK] Redis no configurado");
216
226
  return false;
217
227
  }
218
228
  try {
229
+ console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);
219
230
  const pattern = `pakento:${this.apiKeyHash}:*`;
220
231
  const keys = await this.redis.keys(pattern);
221
232
  if (keys.length > 0) {
@@ -230,6 +241,7 @@ var CacheService = class {
230
241
  }
231
242
  async getCacheInfo(functionName, params = {}) {
232
243
  if (!this.redis) {
244
+ console.warn("[PakentoSDK] Redis no configurado");
233
245
  return {
234
246
  exists: false,
235
247
  key: this.buildCacheKey(functionName, params)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\nexport { CacheService } from \"./services/cache\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === 'object' && data !== null) {\n return data as T;\n }\n \n // Si es un string, intentamos parsearlo\n if (typeof data === 'string') {\n return JSON.parse(data) as T;\n }\n \n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn('[PakentoSDK] Error en safeJsonParse:', error);\n console.warn('[PakentoSDK] Datos que causaron error:', { \n type: typeof data, \n isArray: Array.isArray(data),\n data: data \n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: '1.0',\n __pakento_timestamp: Date.now(),\n data: value\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn('[PakentoSDK] Error en serializeForCache:', error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n \n try {\n const parsed = this.safeJsonParse(cached);\n \n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (typeof parsed === 'object' && \n parsed !== null && \n '__pakento_cache_version' in parsed && \n 'data' in parsed) {\n console.log(`[PakentoSDK] ✅ Cache con metadata válido para: ${key}`);\n return (parsed as any).data as T;\n } \n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, { \n type: typeof cached, \n value: cached \n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch(err => \n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } catch (parseError) {\n console.warn(`[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`, parseError);\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch(err => \n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n \n if (cached === null || cached === undefined) {\n return false;\n }\n \n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAiD;;;ACAjD,mBAAsB;AACtB,oBAA2B;AAEpB,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,YAAoB,QAAgB;AAC9C,SAAK,aAAa;AAClB,SAAK,iBAAa,0BAAW,QAAQ,EAClC,OAAO,MAAM,EACb,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAEjB,QACE,QAAQ,IAAI,0BACZ,QAAQ,IAAI,0BACZ;AACA,WAAK,QAAQ,IAAI,mBAAM;AAAA,QACrB,KAAK,QAAQ,IAAI;AAAA,QACjB,OAAO,QAAQ,IAAI;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAyC;AAClE,UAAM,eAAe,OAAO,KAAK,MAAM,EACpC,KAAK,EACL,OAAO,CAAC,KAAK,QAAQ;AACpB,UAAI,GAAG,IAAI,OAAO,GAAG;AACrB,aAAO;AAAA,IACT,GAAG,CAAC,CAA4B;AAElC,UAAM,eAAe,KAAK,UAAU,YAAY;AAChD,eAAO,0BAAW,QAAQ,EACvB,OAAO,YAAY,EACnB,OAAO,KAAK,EACZ,UAAU,GAAG,EAAE;AAAA,EACpB;AAAA,EAEO,cACL,cACA,SAAkC,CAAC,GAC3B;AACR,UAAM,aAAa,KAAK,mBAAmB,MAAM;AACjD,WAAO,WAAW,KAAK,UAAU,IAAI,YAAY,IAAI,UAAU;AAAA,EACjE;AAAA,EAEQ,cAAiB,MAAyB;AAChD,QAAI;AAEF,UAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,eAAO;AAAA,MACT;AAGA,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB;AAGA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,wCAAwC,KAAK;AAC1D,cAAQ,KAAK,0CAA0C;AAAA,QACrD,MAAM,OAAO;AAAA,QACb,SAAS,MAAM,QAAQ,IAAI;AAAA,QAC3B;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAwB;AAChD,QAAI;AAEF,YAAM,YAAY;AAAA,QAChB,yBAAyB;AAAA,QACzB,qBAAqB,KAAK,IAAI;AAAA,QAC9B,MAAM;AAAA,MACR;AACA,aAAO,KAAK,UAAU,SAAS;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ,KAAK,4CAA4C,KAAK;AAE9D,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAa,iBACX,KACA,SACA,KACA,YAAqB,OACT;AACZ,QAAI,CAAC,KAAK,SAAS,WAAW;AAC5B,cAAQ;AAAA,QACN,gBACE,CAAC,KAAK,QAAQ,yBAAyB,gBACzC;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI;AACF,cAAQ,IAAI,mCAAmC,GAAG,EAAE;AACpD,YAAM,SAAS,MAAM,KAAK,MAAM,IAAI,GAAG;AAEvC,UAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,gBAAQ,IAAI,uCAAkC,GAAG,EAAE;AAEnD,YAAI;AACF,gBAAM,SAAS,KAAK,cAAc,MAAM;AAExC,cAAI,WAAW,MAAM;AAEnB,gBAAI,OAAO,WAAW,YAClB,WAAW,QACX,6BAA6B,UAC7B,UAAU,QAAQ;AACpB,sBAAQ,IAAI,0DAAkD,GAAG,EAAE;AACnE,qBAAQ,OAAe;AAAA,YACzB,OAEK;AACH,sBAAQ,IAAI,oDAA4C,GAAG,EAAE;AAC7D,qBAAO;AAAA,YACT;AAAA,UACF,OAAO;AACL,oBAAQ,KAAK,yDAA+C,GAAG,EAAE;AACjE,oBAAQ,KAAK,qCAAqC;AAAA,cAChD,MAAM,OAAO;AAAA,cACb,OAAO;AAAA,YACT,CAAC;AAED,iBAAK,oBAAoB,GAAG,EAAE;AAAA,cAAM,SAClC,QAAQ,KAAK,gDAAgD,GAAG,EAAE;AAAA,YACpE;AAAA,UACF;AAAA,QACF,SAAS,YAAY;AACnB,kBAAQ,KAAK,gEAAmD,GAAG,KAAK,UAAU;AAElF,eAAK,oBAAoB,GAAG,EAAE;AAAA,YAAM,SAClC,QAAQ,KAAK,gDAAgD,GAAG,EAAE;AAAA,UACpE;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,wCAAmC,GAAG,EAAE;AAAA,MACtD;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,0CAA0C,GAAG;AAAA,IAC5D;AAEA,YAAQ,IAAI,qCAAqC,GAAG,EAAE;AACtD,UAAM,SAAS,MAAM,QAAQ;AAE7B,QAAI;AACF,YAAM,iBAAiB,KAAK,kBAAkB,MAAM;AACpD,YAAM,KAAK,MAAM,IAAI,KAAK,gBAAgB;AAAA,QACxC,IAAI,OAAO,KAAK;AAAA,MAClB,CAAC;AACD,cAAQ;AAAA,QACN,0CAAqC,GAAG,UACtC,OAAO,KAAK,UACd;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,8CAA8C,GAAG;AAC9D,cAAQ,KAAK,oCAAoC;AAAA,QAC/C,OAAO;AAAA,QACP;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,YAAY,KAAK,UAAU,MAAM,EAAE;AAAA,MACrC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SACX,cACA,SAAkC,CAAC,GACjB;AAClB,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM,KAAK,cAAc,cAAc,MAAM;AACnD,YAAM,SAAS,MAAM,KAAK,MAAM,IAAI,GAAG;AAEvC,UAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,eAAO;AAAA,MACT;AAGA,YAAM,SAAS,KAAK,cAAc,MAAM;AACxC,aAAO,WAAW;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,KAAK,wCAAwC,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAoB,KAA+B;AAC9D,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,KAAK,MAAM,IAAI,GAAG;AACxB,cAAQ,IAAI,gDAA2C,GAAG,EAAE;AAC5D,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,KAAK,+CAA+C,GAAG;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,YACL,cACA,SAAkC,CAAC,GAC3B;AACR,WAAO,KAAK,cAAc,cAAc,MAAM;AAAA,EAChD;AAAA,EAEA,MAAa,WACX,cACA,SAAkC,CAAC,GACjB;AAClB,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM,KAAK,cAAc,cAAc,MAAM;AACnD,YAAM,KAAK,MAAM,IAAI,GAAG;AACxB,cAAQ,IAAI,4CAAuC,GAAG,EAAE;AACxD,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,KAAK,sCAAsC,GAAG;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAa,gBAAkC;AAC7C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAU,WAAW,KAAK,UAAU;AAC1C,YAAM,OAAO,MAAM,KAAK,MAAM,KAAK,OAAO;AAE1C,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,KAAK,MAAM,IAAI,GAAG,IAAI;AAC5B,gBAAQ,IAAI,2CAAsC,KAAK,MAAM,OAAO;AAAA,MACtE;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,KAAK,8CAA8C,GAAG;AAC9D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAa,aACX,cACA,SAAkC,CAAC,GAKlC;AACD,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,KAAK,KAAK,cAAc,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,MAAM,KAAK,cAAc,cAAc,MAAM;AACnD,YAAM,SAAS,MAAM,KAAK,MAAM,OAAO,GAAG;AAC1C,YAAM,MAAM,SAAS,MAAM,KAAK,MAAM,IAAI,GAAG,IAAI;AAEjD,aAAO;AAAA,QACL,QAAQ,WAAW;AAAA,QACnB;AAAA,QACA,KAAK,QAAQ,KAAK,SAAY;AAAA,MAChC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,gDAAgD,GAAG;AAChE,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,KAAK,KAAK,cAAc,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;;;ADxRA,iBAAkB;AAElB,IAAM,gBAAN,MAAoB;AAAA,EAOlB,YAAY,QAAgC;AAJ5C,SAAQ,aAAqB;AAK3B,SAAK,UAAU,QAAQ,IAAI,wBAAwB;AACnD,SAAK,SAAS,QAAQ,IAAI,mBAAmB;AAE7C,QAAI,QAAQ,YAAY,OAAO,OAAO,aAAa,UAAU;AAC3D,WAAK,aAAa,OAAO;AAAA,IAC3B;AAEA,SAAK,QAAQ,IAAI,aAAa,KAAK,YAAY,KAAK,MAAM;AAE1D,SAAK,SAAS,aAAAA,QAAM,OAAO;AAAA,MACzB,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,iBAAiB,KAAK,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAGD,SAAK,OAAO,aAAa,QAAQ;AAAA,MAC/B,CAACC,YAAW;AACV,cAAM,UAAU,GAAGA,QAAO,OAAO,GAAGA,QAAO,GAAG;AAC9C,gBAAQ,IAAI,uBAAgBA,QAAO,QAAQ,YAAY,CAAC,IAAI,OAAO,EAAE;AACrE,eAAOA;AAAA,MACT;AAAA,MACA,CAAC,UAAU;AACT,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe,OAAgB,SAAyB;AAC9D,QAAI,iBAAiB,yBAAY;AAC/B,YAAM,SAAS,MAAM,UAAU;AAC/B,YAAM,kBAAkB,MAAM,UAAU,MAAM;AAC9C,UAAI,WAAW,IAAK,QAAO;AAC3B,UAAI,WAAW,IAAK,QAAO,GAAG,OAAO;AACrC,UAAI,UAAU,UAAU,IAAK,QAAO;AACpC,aACE,mBAAmB,2BAAwB,OAAO,KAAK,MAAM,OAAO;AAAA,IAExE,WAAW,iBAAiB,aAAE,UAAU;AACtC,aAAO,0BAAuB,MAAM,OACjC,IAAI,CAAC,MAA2B,EAAE,OAAO,EACzC,KAAK,IAAI,CAAC;AAAA,IACf,WAAW,iBAAiB,OAAO;AACjC,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,aACZ,OACA,WACA,aAC0E;AAC1E,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,KAAK,gBAAgB;AAAA,QACtD;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,SAAS,KAAK,QAAQ;AACxB,cAAM,eAAe,kBAAkB,SAAS,KAAK,OAAO,CAAC,EAAE,OAAO;AACtE,eAAO,EAAE,MAAM,MAAM,OAAO,MAAM,aAAa;AAAA,MACjD;AAEA,YAAM,OAAO,YAAY,SAAS,KAAK,IAAI;AAC3C,aAAO,EAAE,MAAM,OAAO,OAAO,cAAc,KAAK;AAAA,IAClD,SAAS,OAAO;AACd,YAAM,eAAe,KAAK,eAAe,OAAO,eAAe;AAC/D,aAAO,EAAE,MAAM,MAAM,OAAO,MAAM,aAAa;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAyB,CAAC,GAA8B;AAErE,UAAM,cAAc,aAAE,OAAO;AAAA,MAC3B,OAAO,aACJ,OAAO;AAAA,QACN,kBAAkB,aACf,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACxC,SAAS;AAAA,QACZ,wBAAwB,aACrB,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACxC,SAAS;AAAA,QACZ,UAAU,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,QAC/D,IAAI,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,MAC3D,CAAC,EACA,SAAS;AAAA,MACZ,YAAY,aAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,eAAe,aAAE,QAAQ,EAAE,SAAS;AAAA,MACpC,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,WAAW,aAAE,QAAQ,EAAE,SAAS;AAAA,MAChC,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,IAChC,CAAC;AAED,UAAM,kBAAkB,YAAY,UAAU,MAAM;AACpD,QAAI,CAAC,gBAAgB,SAAS;AAC5B,YAAM,eAAe,KAAK;AAAA,QACxB,gBAAgB;AAAA,QAChB;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,YAAY,OAAO,UAAU,GAAG,KAAK,IAAI,gBAAgB;AACjE,UAAM,WAAW,KAAK,MAAM,cAAc,qBAAqB,IAAI;AACnE,WAAO,KAAK,MAAM;AAAA,MAChB;AAAA,MACA,MAAM,KAAK,kBAAkB,IAAsB;AAAA,MACnD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBACZ,SAAyB,CAAC,GACC;AAC3B,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAGA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqDd,UAAM,kBAA8B,CAAC;AACrC,QAAI,OAAO,OAAO,kBAAkB,QAAQ;AAC1C,sBAAgB,mBAAmB;AAAA,QACjC,QAAQ,OAAO,MAAM,iBAAiB;AAAA,MACxC;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,wBAAwB,QAAQ;AAChD,sBAAgB,yBAAyB;AAAA,QACvC,QAAQ,OAAO,MAAM,uBAAuB;AAAA,MAC9C;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,UAAU,QAAQ;AAClC,sBAAgB,WAAW,EAAE,QAAQ,OAAO,MAAM,SAAS,OAAO;AAAA,IACpE;AAEA,QAAI,OAAO,OAAO,IAAI,QAAQ;AAC5B,sBAAgB,KAAK,EAAE,QAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,IACxD;AAEA,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH,OACE,OAAO,KAAK,eAAe,EAAE,SAAS,IAAI,kBAAkB;AAAA,IAChE;AAEA,UAAM,EAAE,MAAM,OAAO,aAAa,IAChC,MAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,CAAC,iBAAiB,aAAa;AAAA,IACjC;AAEF,QAAI,OAAO;AACT,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAM;AAAA,MACb,WAAW,KAAM;AAAA,MACjB,YAAY,KAAM;AAAA,MAClB,UAAU,KAAM;AAAA,MAChB,UAAU,KAAM;AAAA,MAChB,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,SAA8B,CAAC,GACC;AAChC,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ;AAAA,MACA,GAAG;AAAA,IACL,IAAI;AACJ,UAAM,WAAW,KAAK,MAAM,cAAc,0BAA0B,IAAI;AACxE,WAAO,KAAK,MAAM;AAAA,MAChB;AAAA,MACA,MAAM,KAAK,uBAAuB,IAA2B;AAAA,MAC7D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,SAA8B,CAAC,GACC;AAChC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBd,UAAM,EAAE,MAAM,OAAO,aAAa,IAChC,MAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,CAAC,iBAAiB,aAAa;AAAA,IACjC;AAEF,QAAI,OAAO;AACT,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,KAAM;AAAA,MACZ,YAAY,KAAM;AAAA,MAClB,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAA0B,CAAC,GAA+B;AACxE,UAAM,EAAE,YAAY,OAAO,UAAU,GAAG,KAAK,IAAI;AACjD,UAAM,WAAW,KAAK,MAAM,cAAc,sBAAsB,IAAI;AACpE,WAAO,KAAK,MAAM;AAAA,MAChB;AAAA,MACA,MAAM,KAAK,mBAAmB,IAAuB;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,SAA0B,CAAC,GACC;AAC5B,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,eAAe;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCd,UAAM,EAAE,MAAM,OAAO,aAAa,IAChC,MAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,CAAC,iBAAiB,aAAa;AAAA,IACjC;AAEF,QAAI,OAAO;AACT,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,eAAe;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,KAAM;AAAA,MACd,aAAa,KAAM;AAAA,MACnB,aAAa,KAAM;AAAA,MACnB,OAAO,KAAM;AAAA,MACb,UAAU,KAAM;AAAA,MAChB,QAAQ,KAAM;AAAA,MACd,MAAM,KAAM;AAAA,MACZ,eAAe,KAAM;AAAA,MACrB,UAAU,KAAM;AAAA,MAChB,WAAW,KAAM;AAAA,MACjB,YAAY,KAAM;AAAA,MAClB,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAA0B,CAAC,GAA+B;AACxE,UAAM,EAAE,YAAY,OAAO,UAAU,GAAG,KAAK,IAAI;AACjD,UAAM,WAAW,KAAK,MAAM,cAAc,aAAa,IAAI;AAC3D,WAAO,KAAK,MAAM;AAAA,MAChB;AAAA,MACA,MAAM,KAAK,mBAAmB,IAAuB;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,SAA0B,CAAC,GACC;AAC5B,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCd,UAAM,EAAE,MAAM,OAAO,aAAa,IAAI,MAAM,KAAK;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,CAAC,iBAAiB,aAAa;AAAA,IACjC;AAEA,QAAI,OAAO;AACT,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,QACuC;AACvC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc,aAAE,OAAO;AAAA,MAC3B,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,OAAO,aAAE,OAAO,EAAE,MAAM;AAAA,MACxB,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,KAAK,aAAE,OAAO,EAAE,SAAS;AAAA,MACzB,OAAO,aACJ;AAAA,QACC,aAAE,OAAO;AAAA,UACP,IAAI,aAAE,OAAO,EAAE,SAAS;AAAA,UACxB,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,QAChC,CAAC;AAAA,MACH,EACC,IAAI,CAAC;AAAA,MACR,kBAAkB,aAAE,OAAO,EAAE,SAAS;AAAA,MACtC,uBAAuB,aAAE,OAAO,EAAE,SAAS;AAAA,MAC3C,gBAAgB,aAAE,KAAK,CAAC,QAAQ,UAAU,CAAC,EAAE,SAAS;AAAA,IACxD,CAAC;AAED,UAAM,YAAY,YAAY,UAAU,MAAM;AAC9C,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,eAAe,KAAK;AAAA,QACxB,UAAU;AAAA,QACV;AAAA,MACF;AACA,aAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,IAC5D;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,MACZ;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO;AAAA,UACL,SAAS,SAAS,KAAK,WAAW;AAAA,UAClC,UAAU,SAAS,KAAK;AAAA,UACxB,OAAO;AAAA,UACP,cAAc;AAAA,QAChB;AAAA,MACF,OAAO;AACL,cAAM,eAAe,SAAS,KAAK,WAAW;AAC9C,eAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAe,KAAK,eAAe,OAAO,sBAAsB;AACtE,aAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,QACmC;AAEnC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAGA,QACE,CAAC,OAAO,SACR,OAAO,OAAO,UAAU,YACxB,OAAO,MAAM,KAAK,MAAM,IACxB;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,KAAK,gBAAgB;AAAA,QACtD,OAAO,OAAO;AAAA,QACd,WAAW,OAAO,aAAa,CAAC;AAAA,MAClC,CAAC;AAGD,UAAI,SAAS,KAAK,UAAU,SAAS,KAAK,OAAO,SAAS,GAAG;AAC3D,eAAO;AAAA,UACL,MAAM,SAAS,KAAK,QAAS;AAAA,UAC7B,QAAQ,SAAS,KAAK;AAAA,UACtB,OAAO;AAAA,UACP,cAAc,mBAAmB,SAAS,KAAK,OAC5C,IAAI,CAAC,QAAkB,IAAc,OAAO,EAC5C,KAAK,IAAI,CAAC;AAAA,QACf;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM,SAAS,KAAK;AAAA,QACpB,OAAO;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,yBAAY;AAC/B,cAAM,SAAS,MAAM,UAAU;AAC/B,YAAI,WAAW,KAAK;AAClB,yBAAe;AAAA,QACjB,WAAW,WAAW,KAAK;AACzB,yBAAe;AAAA,QACjB,WAAW,WAAW,KAAK;AACzB,yBAAe;AAAA,QACjB,WAAW,UAAU,UAAU,KAAK;AAClC,yBAAe;AAAA,QACjB,OAAO;AACL,yBAAe,yBAAsB,MAAM,OAAO;AAAA,QACpD;AAAA,MACF,WAAW,iBAAiB,OAAO;AACjC,uBAAe,MAAM;AAAA,MACvB;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,QACqC;AACrC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;AACjC,aAAO;AAAA,QACL,SACE;AAAA,QACF,OAAO;AAAA,QACP,cACE;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,kBAAkB,aAAE,OAAO;AAAA,MAC/B,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,OAAO,aAAE,OAAO,EAAE,MAAM;AAAA,MACxB,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,CAAC;AAED,UAAM,YAAY,gBAAgB,UAAU,MAAM;AAClD,QAAI,CAAC,UAAU,SAAS;AACtB,YAAM,eAAe,KAAK;AAAA,QACxB,UAAU;AAAA,QACV;AAAA,MACF;AACA,aAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,IAC5D;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,MACZ;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO;AAAA,UACL,SAAS,SAAS,KAAK,WAAW;AAAA,UAClC,OAAO;AAAA,UACP,cAAc;AAAA,QAChB;AAAA,MACF,OAAO;AACL,cAAM,eACJ,SAAS,KAAK,WAAW;AAC3B,eAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAAe,KAAK,eAAe,OAAO,oBAAoB;AACpE,aAAO,EAAE,SAAS,cAAc,OAAO,MAAM,aAAa;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,cACA,SAAkC,CAAC,GACjB;AAClB,WAAO,KAAK,MAAM,SAAS,cAAc,MAAM;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,YACE,cACA,SAAkC,CAAC,GAC3B;AACR,WAAO,KAAK,MAAM,YAAY,cAAc,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,cACA,SAAkC,CAAC,GACjB;AAClB,WAAO,KAAK,MAAM,WAAW,cAAc,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAkC;AACtC,WAAO,KAAK,MAAM,cAAc;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,cACA,SAAkC,CAAC,GAKlC;AACD,WAAO,KAAK,MAAM,aAAa,cAAc,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,cACA,SAAkC,CAAC,GACjB;AAClB,UAAM,MAAM,KAAK,MAAM,YAAY,cAAc,MAAM;AACvD,WAAO,KAAK,MAAM,oBAAoB,GAAG;AAAA,EAC3C;AACF;AAEO,IAAM,gBAAgB,IAAI,cAAc;","names":["axios","config"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\nexport { CacheService } from \"./services/cache\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["axios","config"]}
package/dist/index.mjs CHANGED
@@ -75,7 +75,9 @@ var CacheService = class {
75
75
  const parsed = this.safeJsonParse(cached);
76
76
  if (parsed !== null) {
77
77
  if (typeof parsed === "object" && parsed !== null && "__pakento_cache_version" in parsed && "data" in parsed) {
78
- console.log(`[PakentoSDK] \u2705 Cache con metadata v\xE1lido para: ${key}`);
78
+ console.log(
79
+ `[PakentoSDK] \u2705 Cache con metadata v\xE1lido para: ${key}`
80
+ );
79
81
  return parsed.data;
80
82
  } else {
81
83
  console.log(`[PakentoSDK] \u2705 Cache legacy v\xE1lido para: ${key}`);
@@ -88,11 +90,16 @@ var CacheService = class {
88
90
  value: cached
89
91
  });
90
92
  this.clearCorruptedCache(key).catch(
91
- (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
93
+ (err) => console.warn(
94
+ `[PakentoSDK] Error limpiando cache corrupto: ${err}`
95
+ )
92
96
  );
93
97
  }
94
98
  } catch (parseError) {
95
- console.warn(`[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`, parseError);
99
+ console.warn(
100
+ `[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`,
101
+ parseError
102
+ );
96
103
  this.clearCorruptedCache(key).catch(
97
104
  (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
98
105
  );
@@ -126,6 +133,7 @@ var CacheService = class {
126
133
  }
127
134
  async hasCache(functionName, params = {}) {
128
135
  if (!this.redis) {
136
+ console.warn("[PakentoSDK] Redis no configurado");
129
137
  return false;
130
138
  }
131
139
  try {
@@ -162,6 +170,7 @@ var CacheService = class {
162
170
  }
163
171
  async clearCache(functionName, params = {}) {
164
172
  if (!this.redis) {
173
+ console.warn("[PakentoSDK] Redis no configurado");
165
174
  return false;
166
175
  }
167
176
  try {
@@ -176,9 +185,11 @@ var CacheService = class {
176
185
  }
177
186
  async clearAllCache() {
178
187
  if (!this.redis) {
188
+ console.warn("[PakentoSDK] Redis no configurado");
179
189
  return false;
180
190
  }
181
191
  try {
192
+ console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);
182
193
  const pattern = `pakento:${this.apiKeyHash}:*`;
183
194
  const keys = await this.redis.keys(pattern);
184
195
  if (keys.length > 0) {
@@ -193,6 +204,7 @@ var CacheService = class {
193
204
  }
194
205
  async getCacheInfo(functionName, params = {}) {
195
206
  if (!this.redis) {
207
+ console.warn("[PakentoSDK] Redis no configurado");
196
208
  return {
197
209
  exists: false,
198
210
  key: this.buildCacheKey(functionName, params)
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === 'object' && data !== null) {\n return data as T;\n }\n \n // Si es un string, intentamos parsearlo\n if (typeof data === 'string') {\n return JSON.parse(data) as T;\n }\n \n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn('[PakentoSDK] Error en safeJsonParse:', error);\n console.warn('[PakentoSDK] Datos que causaron error:', { \n type: typeof data, \n isArray: Array.isArray(data),\n data: data \n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: '1.0',\n __pakento_timestamp: Date.now(),\n data: value\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn('[PakentoSDK] Error en serializeForCache:', error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n \n try {\n const parsed = this.safeJsonParse(cached);\n \n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (typeof parsed === 'object' && \n parsed !== null && \n '__pakento_cache_version' in parsed && \n 'data' in parsed) {\n console.log(`[PakentoSDK] ✅ Cache con metadata válido para: ${key}`);\n return (parsed as any).data as T;\n } \n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, { \n type: typeof cached, \n value: cached \n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch(err => \n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } catch (parseError) {\n console.warn(`[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`, parseError);\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch(err => \n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n \n if (cached === null || cached === undefined) {\n return false;\n }\n \n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pakento/cms-sdk",
3
- "version": "4.0.9",
3
+ "version": "4.0.11",
4
4
  "description": "SDK para conectar tiendas en línea con Pakento CMS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",