@pakento/cms-sdk 4.0.7 → 4.0.9

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.d.mts CHANGED
@@ -267,7 +267,36 @@ declare class PakentoCMSAPI {
267
267
  key: string;
268
268
  ttl?: number;
269
269
  }>;
270
+ /**
271
+ * Limpia un cache específico que pueda estar corrupto
272
+ */
273
+ clearCorruptedCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
270
274
  }
271
275
  declare const pakentoCMSAPI: PakentoCMSAPI;
272
276
 
273
- export { type Brand, type BrandsApiResponse, type BrandsRawResponse, type CategoriesApiResponse, type CategoriesRawResponse, type CategoriesWhere, type Category, type CreateEcommerceOrderParams, type CreateEcommerceOrderResponse, type CustomGraphQLParams, type CustomGraphQLResponse, type Entity, type EntityApiResponse, type EntityRawResponse, type GetBrandsParams, type GetCategoriesParams, type GetEntityParams, type GetItemsParams, type Item, type ItemImage, type ItemsApiResponse, type ItemsRawResponse, type ItemsWhere, type SendContactUsEmailParams, type SendContactUsEmailResponse, type WhereEquals, pakentoCMSAPI };
277
+ declare class CacheService {
278
+ private redis?;
279
+ private defaultTTL;
280
+ private apiKeyHash;
281
+ constructor(defaultTTL: number, apiKey: string);
282
+ private generateParamsHash;
283
+ buildCacheKey(functionName: string, params?: Record<string, unknown>): string;
284
+ private safeJsonParse;
285
+ private serializeForCache;
286
+ getCachedOrFetch<T>(key: string, fetcher: () => Promise<T>, ttl?: number, skipCache?: boolean): Promise<T>;
287
+ hasCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
288
+ /**
289
+ * Limpia un cache específico si está corrupto
290
+ */
291
+ clearCorruptedCache(key: string): Promise<boolean>;
292
+ getCacheKey(functionName: string, params?: Record<string, unknown>): string;
293
+ clearCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
294
+ clearAllCache(): Promise<boolean>;
295
+ getCacheInfo(functionName: string, params?: Record<string, unknown>): Promise<{
296
+ exists: boolean;
297
+ key: string;
298
+ ttl?: number;
299
+ }>;
300
+ }
301
+
302
+ export { type Brand, type BrandsApiResponse, type BrandsRawResponse, CacheService, type CategoriesApiResponse, type CategoriesRawResponse, type CategoriesWhere, type Category, type CreateEcommerceOrderParams, type CreateEcommerceOrderResponse, type CustomGraphQLParams, type CustomGraphQLResponse, type Entity, type EntityApiResponse, type EntityRawResponse, type GetBrandsParams, type GetCategoriesParams, type GetEntityParams, type GetItemsParams, type Item, type ItemImage, type ItemsApiResponse, type ItemsRawResponse, type ItemsWhere, type SendContactUsEmailParams, type SendContactUsEmailResponse, type WhereEquals, pakentoCMSAPI };
package/dist/index.d.ts CHANGED
@@ -267,7 +267,36 @@ declare class PakentoCMSAPI {
267
267
  key: string;
268
268
  ttl?: number;
269
269
  }>;
270
+ /**
271
+ * Limpia un cache específico que pueda estar corrupto
272
+ */
273
+ clearCorruptedCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
270
274
  }
271
275
  declare const pakentoCMSAPI: PakentoCMSAPI;
272
276
 
273
- export { type Brand, type BrandsApiResponse, type BrandsRawResponse, type CategoriesApiResponse, type CategoriesRawResponse, type CategoriesWhere, type Category, type CreateEcommerceOrderParams, type CreateEcommerceOrderResponse, type CustomGraphQLParams, type CustomGraphQLResponse, type Entity, type EntityApiResponse, type EntityRawResponse, type GetBrandsParams, type GetCategoriesParams, type GetEntityParams, type GetItemsParams, type Item, type ItemImage, type ItemsApiResponse, type ItemsRawResponse, type ItemsWhere, type SendContactUsEmailParams, type SendContactUsEmailResponse, type WhereEquals, pakentoCMSAPI };
277
+ declare class CacheService {
278
+ private redis?;
279
+ private defaultTTL;
280
+ private apiKeyHash;
281
+ constructor(defaultTTL: number, apiKey: string);
282
+ private generateParamsHash;
283
+ buildCacheKey(functionName: string, params?: Record<string, unknown>): string;
284
+ private safeJsonParse;
285
+ private serializeForCache;
286
+ getCachedOrFetch<T>(key: string, fetcher: () => Promise<T>, ttl?: number, skipCache?: boolean): Promise<T>;
287
+ hasCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
288
+ /**
289
+ * Limpia un cache específico si está corrupto
290
+ */
291
+ clearCorruptedCache(key: string): Promise<boolean>;
292
+ getCacheKey(functionName: string, params?: Record<string, unknown>): string;
293
+ clearCache(functionName: string, params?: Record<string, unknown>): Promise<boolean>;
294
+ clearAllCache(): Promise<boolean>;
295
+ getCacheInfo(functionName: string, params?: Record<string, unknown>): Promise<{
296
+ exists: boolean;
297
+ key: string;
298
+ ttl?: number;
299
+ }>;
300
+ }
301
+
302
+ export { type Brand, type BrandsApiResponse, type BrandsRawResponse, CacheService, type CategoriesApiResponse, type CategoriesRawResponse, type CategoriesWhere, type Category, type CreateEcommerceOrderParams, type CreateEcommerceOrderResponse, type CustomGraphQLParams, type CustomGraphQLResponse, type Entity, type EntityApiResponse, type EntityRawResponse, type GetBrandsParams, type GetCategoriesParams, type GetEntityParams, type GetItemsParams, type Item, type ItemImage, type ItemsApiResponse, type ItemsRawResponse, type ItemsWhere, type SendContactUsEmailParams, type SendContactUsEmailResponse, type WhereEquals, pakentoCMSAPI };
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ CacheService: () => CacheService,
33
34
  pakentoCMSAPI: () => pakentoCMSAPI
34
35
  });
35
36
  module.exports = __toCommonJS(index_exports);
@@ -65,13 +66,35 @@ var CacheService = class {
65
66
  }
66
67
  safeJsonParse(data) {
67
68
  try {
68
- return JSON.parse(data);
69
- } catch {
69
+ if (typeof data === "object" && data !== null) {
70
+ return data;
71
+ }
72
+ if (typeof data === "string") {
73
+ return JSON.parse(data);
74
+ }
75
+ return data;
76
+ } catch (error) {
77
+ console.warn("[PakentoSDK] Error en safeJsonParse:", error);
78
+ console.warn("[PakentoSDK] Datos que causaron error:", {
79
+ type: typeof data,
80
+ isArray: Array.isArray(data),
81
+ data
82
+ });
70
83
  return null;
71
84
  }
72
85
  }
73
86
  serializeForCache(value) {
74
- return JSON.stringify(value);
87
+ try {
88
+ const cacheData = {
89
+ __pakento_cache_version: "1.0",
90
+ __pakento_timestamp: Date.now(),
91
+ data: value
92
+ };
93
+ return JSON.stringify(cacheData);
94
+ } catch (error) {
95
+ console.warn("[PakentoSDK] Error en serializeForCache:", error);
96
+ return JSON.stringify(value);
97
+ }
75
98
  }
76
99
  async getCachedOrFetch(key, fetcher, ttl, skipCache = false) {
77
100
  if (!this.redis || skipCache) {
@@ -83,13 +106,33 @@ var CacheService = class {
83
106
  try {
84
107
  console.log(`[PakentoSDK] Buscando en cache: ${key}`);
85
108
  const cached = await this.redis.get(key);
86
- if (cached) {
109
+ if (cached !== null && cached !== void 0) {
87
110
  console.log(`[PakentoSDK] \u2705 Cache hit para: ${key}`);
88
- const parsed = this.safeJsonParse(cached);
89
- if (parsed !== null) {
90
- return parsed;
91
- } else {
92
- console.warn(`[PakentoSDK] Error parseando cache para: ${key}`);
111
+ try {
112
+ const parsed = this.safeJsonParse(cached);
113
+ if (parsed !== null) {
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}`);
116
+ return parsed.data;
117
+ } else {
118
+ console.log(`[PakentoSDK] \u2705 Cache legacy v\xE1lido para: ${key}`);
119
+ return parsed;
120
+ }
121
+ } else {
122
+ console.warn(`[PakentoSDK] \u26A0\uFE0F Error parseando cache para: ${key}`);
123
+ console.warn(`[PakentoSDK] Datos raw del cache:`, {
124
+ type: typeof cached,
125
+ value: cached
126
+ });
127
+ this.clearCorruptedCache(key).catch(
128
+ (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
129
+ );
130
+ }
131
+ } catch (parseError) {
132
+ console.warn(`[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`, parseError);
133
+ this.clearCorruptedCache(key).catch(
134
+ (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
135
+ );
93
136
  }
94
137
  } else {
95
138
  console.log(`[PakentoSDK] \u274C Cache miss para: ${key}`);
@@ -100,7 +143,8 @@ var CacheService = class {
100
143
  console.log(`[PakentoSDK] Llamando a API para: ${key}`);
101
144
  const result = await fetcher();
102
145
  try {
103
- await this.redis.set(key, this.serializeForCache(result), {
146
+ const serializedData = this.serializeForCache(result);
147
+ await this.redis.set(key, serializedData, {
104
148
  ex: ttl ?? this.defaultTTL
105
149
  });
106
150
  console.log(
@@ -108,6 +152,12 @@ var CacheService = class {
108
152
  );
109
153
  } catch (err) {
110
154
  console.warn("[PakentoSDK] Error escribiendo cache Redis", err);
155
+ console.warn("[PakentoSDK] Detalles del error:", {
156
+ error: err,
157
+ key,
158
+ resultType: typeof result,
159
+ resultSize: JSON.stringify(result).length
160
+ });
111
161
  }
112
162
  return result;
113
163
  }
@@ -118,12 +168,32 @@ var CacheService = class {
118
168
  try {
119
169
  const key = this.buildCacheKey(functionName, params);
120
170
  const cached = await this.redis.get(key);
121
- return cached !== null;
171
+ if (cached === null || cached === void 0) {
172
+ return false;
173
+ }
174
+ const parsed = this.safeJsonParse(cached);
175
+ return parsed !== null;
122
176
  } catch (err) {
123
177
  console.warn("[PakentoSDK] Error verificando cache", err);
124
178
  return false;
125
179
  }
126
180
  }
181
+ /**
182
+ * Limpia un cache específico si está corrupto
183
+ */
184
+ async clearCorruptedCache(key) {
185
+ if (!this.redis) {
186
+ return false;
187
+ }
188
+ try {
189
+ await this.redis.del(key);
190
+ console.log(`[PakentoSDK] \u2705 Cache corrupto limpiado: ${key}`);
191
+ return true;
192
+ } catch (err) {
193
+ console.warn("[PakentoSDK] Error limpiando cache corrupto", err);
194
+ return false;
195
+ }
196
+ }
127
197
  getCacheKey(functionName, params = {}) {
128
198
  return this.buildCacheKey(functionName, params);
129
199
  }
@@ -831,10 +901,18 @@ var PakentoCMSAPI = class {
831
901
  async getCacheInfo(functionName, params = {}) {
832
902
  return this.cache.getCacheInfo(functionName, params);
833
903
  }
904
+ /**
905
+ * Limpia un cache específico que pueda estar corrupto
906
+ */
907
+ async clearCorruptedCache(functionName, params = {}) {
908
+ const key = this.cache.getCacheKey(functionName, params);
909
+ return this.cache.clearCorruptedCache(key);
910
+ }
834
911
  };
835
912
  var pakentoCMSAPI = new PakentoCMSAPI();
836
913
  // Annotate the CommonJS export names for ESM import in node:
837
914
  0 && (module.exports = {
915
+ CacheService,
838
916
  pakentoCMSAPI
839
917
  });
840
918
  //# sourceMappingURL=index.js.map
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\";\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\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: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return JSON.stringify(value);\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<string>(key);\n\n if (cached) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n } else {\n console.warn(`[PakentoSDK] Error parseando cache para: ${key}`);\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 await this.redis.set(key, this.serializeForCache(result), {\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 }\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<string>(key);\n return cached !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", 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":["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 (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":["axios","config"]}
package/dist/index.mjs CHANGED
@@ -29,13 +29,35 @@ var CacheService = class {
29
29
  }
30
30
  safeJsonParse(data) {
31
31
  try {
32
- return JSON.parse(data);
33
- } catch {
32
+ if (typeof data === "object" && data !== null) {
33
+ return data;
34
+ }
35
+ if (typeof data === "string") {
36
+ return JSON.parse(data);
37
+ }
38
+ return data;
39
+ } catch (error) {
40
+ console.warn("[PakentoSDK] Error en safeJsonParse:", error);
41
+ console.warn("[PakentoSDK] Datos que causaron error:", {
42
+ type: typeof data,
43
+ isArray: Array.isArray(data),
44
+ data
45
+ });
34
46
  return null;
35
47
  }
36
48
  }
37
49
  serializeForCache(value) {
38
- return JSON.stringify(value);
50
+ try {
51
+ const cacheData = {
52
+ __pakento_cache_version: "1.0",
53
+ __pakento_timestamp: Date.now(),
54
+ data: value
55
+ };
56
+ return JSON.stringify(cacheData);
57
+ } catch (error) {
58
+ console.warn("[PakentoSDK] Error en serializeForCache:", error);
59
+ return JSON.stringify(value);
60
+ }
39
61
  }
40
62
  async getCachedOrFetch(key, fetcher, ttl, skipCache = false) {
41
63
  if (!this.redis || skipCache) {
@@ -47,13 +69,33 @@ var CacheService = class {
47
69
  try {
48
70
  console.log(`[PakentoSDK] Buscando en cache: ${key}`);
49
71
  const cached = await this.redis.get(key);
50
- if (cached) {
72
+ if (cached !== null && cached !== void 0) {
51
73
  console.log(`[PakentoSDK] \u2705 Cache hit para: ${key}`);
52
- const parsed = this.safeJsonParse(cached);
53
- if (parsed !== null) {
54
- return parsed;
55
- } else {
56
- console.warn(`[PakentoSDK] Error parseando cache para: ${key}`);
74
+ try {
75
+ const parsed = this.safeJsonParse(cached);
76
+ if (parsed !== null) {
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}`);
79
+ return parsed.data;
80
+ } else {
81
+ console.log(`[PakentoSDK] \u2705 Cache legacy v\xE1lido para: ${key}`);
82
+ return parsed;
83
+ }
84
+ } else {
85
+ console.warn(`[PakentoSDK] \u26A0\uFE0F Error parseando cache para: ${key}`);
86
+ console.warn(`[PakentoSDK] Datos raw del cache:`, {
87
+ type: typeof cached,
88
+ value: cached
89
+ });
90
+ this.clearCorruptedCache(key).catch(
91
+ (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
92
+ );
93
+ }
94
+ } catch (parseError) {
95
+ console.warn(`[PakentoSDK] \u26A0\uFE0F Excepci\xF3n parseando cache para: ${key}:`, parseError);
96
+ this.clearCorruptedCache(key).catch(
97
+ (err) => console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)
98
+ );
57
99
  }
58
100
  } else {
59
101
  console.log(`[PakentoSDK] \u274C Cache miss para: ${key}`);
@@ -64,7 +106,8 @@ var CacheService = class {
64
106
  console.log(`[PakentoSDK] Llamando a API para: ${key}`);
65
107
  const result = await fetcher();
66
108
  try {
67
- await this.redis.set(key, this.serializeForCache(result), {
109
+ const serializedData = this.serializeForCache(result);
110
+ await this.redis.set(key, serializedData, {
68
111
  ex: ttl ?? this.defaultTTL
69
112
  });
70
113
  console.log(
@@ -72,6 +115,12 @@ var CacheService = class {
72
115
  );
73
116
  } catch (err) {
74
117
  console.warn("[PakentoSDK] Error escribiendo cache Redis", err);
118
+ console.warn("[PakentoSDK] Detalles del error:", {
119
+ error: err,
120
+ key,
121
+ resultType: typeof result,
122
+ resultSize: JSON.stringify(result).length
123
+ });
75
124
  }
76
125
  return result;
77
126
  }
@@ -82,12 +131,32 @@ var CacheService = class {
82
131
  try {
83
132
  const key = this.buildCacheKey(functionName, params);
84
133
  const cached = await this.redis.get(key);
85
- return cached !== null;
134
+ if (cached === null || cached === void 0) {
135
+ return false;
136
+ }
137
+ const parsed = this.safeJsonParse(cached);
138
+ return parsed !== null;
86
139
  } catch (err) {
87
140
  console.warn("[PakentoSDK] Error verificando cache", err);
88
141
  return false;
89
142
  }
90
143
  }
144
+ /**
145
+ * Limpia un cache específico si está corrupto
146
+ */
147
+ async clearCorruptedCache(key) {
148
+ if (!this.redis) {
149
+ return false;
150
+ }
151
+ try {
152
+ await this.redis.del(key);
153
+ console.log(`[PakentoSDK] \u2705 Cache corrupto limpiado: ${key}`);
154
+ return true;
155
+ } catch (err) {
156
+ console.warn("[PakentoSDK] Error limpiando cache corrupto", err);
157
+ return false;
158
+ }
159
+ }
91
160
  getCacheKey(functionName, params = {}) {
92
161
  return this.buildCacheKey(functionName, params);
93
162
  }
@@ -795,9 +864,17 @@ var PakentoCMSAPI = class {
795
864
  async getCacheInfo(functionName, params = {}) {
796
865
  return this.cache.getCacheInfo(functionName, params);
797
866
  }
867
+ /**
868
+ * Limpia un cache específico que pueda estar corrupto
869
+ */
870
+ async clearCorruptedCache(functionName, params = {}) {
871
+ const key = this.cache.getCacheKey(functionName, params);
872
+ return this.cache.clearCorruptedCache(key);
873
+ }
798
874
  };
799
875
  var pakentoCMSAPI = new PakentoCMSAPI();
800
876
  export {
877
+ CacheService,
801
878
  pakentoCMSAPI
802
879
  };
803
880
  //# sourceMappingURL=index.mjs.map
@@ -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\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: string): T | null {\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n return JSON.stringify(value);\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<string>(key);\n\n if (cached) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n const parsed = this.safeJsonParse<T>(cached);\n if (parsed !== null) {\n return parsed;\n } else {\n console.warn(`[PakentoSDK] Error parseando cache para: ${key}`);\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 await this.redis.set(key, this.serializeForCache(result), {\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 }\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<string>(key);\n return cached !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", 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 (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,OAAO,SAAwB,kBAAkB;;;ACAjD,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAEpB,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,YAAoB,QAAgB;AAC9C,SAAK,aAAa;AAClB,SAAK,aAAa,WAAW,QAAQ,EAClC,OAAO,MAAM,EACb,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAEjB,QACE,QAAQ,IAAI,0BACZ,QAAQ,IAAI,0BACZ;AACA,WAAK,QAAQ,IAAI,MAAM;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,WAAO,WAAW,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,SAAS,SAAS;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,MAAM,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,CAACA,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,YAAY;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,EAAE,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,EAAE,OAAO;AAAA,MAC3B,OAAO,EACJ,OAAO;AAAA,QACN,kBAAkB,EACf,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACxC,SAAS;AAAA,QACZ,wBAAwB,EACrB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACxC,SAAS;AAAA,QACZ,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,QAC/D,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA,MAC3D,CAAC,EACA,SAAS;AAAA,MACZ,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,MACpC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,MAChC,UAAU,EAAE,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,EAAE,OAAO;AAAA,MAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,OAAO,EAAE,OAAO,EAAE,MAAM;AAAA,MACxB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,OAAO,EACJ;AAAA,QACC,EAAE,OAAO;AAAA,UACP,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,UACxB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAChC,CAAC;AAAA,MACH,EACC,IAAI,CAAC;AAAA,MACR,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,MACtC,uBAAuB,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3C,gBAAgB,EAAE,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,YAAY;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,EAAE,OAAO;AAAA,MAC/B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,OAAO,EAAE,OAAO,EAAE,MAAM;AAAA,MACxB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,EAAE,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":["config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pakento/cms-sdk",
3
- "version": "4.0.7",
3
+ "version": "4.0.9",
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",