@pakento/cms-sdk 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,194 @@
1
+ # @pakento/cms-sdk
2
+
3
+ SDK para conectar tiendas en línea con Pakento CMS de forma rápida y sencilla.
4
+
5
+ ## Instalación
6
+
7
+ ```bash
8
+ npm install @pakento/cms-sdk
9
+ # o
10
+ bun add @pakento/cms-sdk
11
+ ```
12
+
13
+ ## Configuración
14
+
15
+ Agrega las siguientes variables de entorno a tu proyecto:
16
+
17
+ ```env
18
+ PAKENTO_CMS_BASE_URL=https://cms.pakento.com
19
+ PAKENTO_API_KEY=tu-api-key-aqui
20
+ ```
21
+
22
+ ## Uso
23
+
24
+ ### Hook useItems
25
+
26
+ ```tsx
27
+ import { useItems } from "@pakento/cms-sdk";
28
+
29
+ function ProductList() {
30
+ const { items, loading, error, totalDocs, refetch } = useItems({
31
+ page: 1,
32
+ limit: 10,
33
+ });
34
+
35
+ if (loading) return <div>Cargando...</div>;
36
+ if (error) return <div>Error: {error}</div>;
37
+
38
+ return (
39
+ <div>
40
+ <h2>Productos ({totalDocs})</h2>
41
+ {items.map((item) => (
42
+ <div key={item.id}>
43
+ <h3>{item.name}</h3>
44
+ <p>Precio: {item.price_text}</p>
45
+ <img src={item.cover_image_thumbnail_url} alt={item.name} />
46
+ </div>
47
+ ))}
48
+ <button onClick={refetch}>Recargar</button>
49
+ </div>
50
+ );
51
+ }
52
+ ```
53
+
54
+ ### API Service
55
+
56
+ ```tsx
57
+ import { pakentoCMSAPI } from "@pakento/cms-sdk";
58
+
59
+ // Uso directo del servicio
60
+ async function getProducts() {
61
+ try {
62
+ const response = await pakentoCMSAPI.getItems(1, 20);
63
+ console.log(response.docs);
64
+ } catch (error) {
65
+ console.error("Error:", error.message);
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Tipos
71
+
72
+ ```tsx
73
+ import type { Item, ItemsResponse, UseItemsReturn } from "@pakento/cms-sdk";
74
+ ```
75
+
76
+ ## Desarrollo
77
+
78
+ ### Configuración inicial
79
+
80
+ ```bash
81
+ # Instalar dependencias
82
+ bun install
83
+
84
+ # Desarrollo con watch mode
85
+ bun run dev
86
+
87
+ # Build
88
+ bun run build
89
+
90
+ # Linting
91
+ bun run lint
92
+ bun run lint:fix
93
+ ```
94
+
95
+ ### Desarrollo local con link
96
+
97
+ Para probar el SDK en tu aplicación local:
98
+
99
+ 1. En el directorio del SDK:
100
+
101
+ ```bash
102
+ bun run build
103
+ bun link
104
+ ```
105
+
106
+ 2. En tu aplicación NextJS:
107
+
108
+ ```bash
109
+ bun link @pakento/cms-sdk
110
+ ```
111
+
112
+ 3. Cuando hagas cambios en el SDK:
113
+
114
+ ```bash
115
+ bun run build
116
+ ```
117
+
118
+ Los cambios se reflejarán automáticamente en tu app.
119
+
120
+ ### Para desconectar el link:
121
+
122
+ ```bash
123
+ # En tu aplicación
124
+ bun unlink @pakento/cms-sdk
125
+
126
+ # Reinstalar desde NPM
127
+ bun add @pakento/cms-sdk
128
+ ```
129
+
130
+ ## Publicación
131
+
132
+ ### Variables de entorno necesarias
133
+
134
+ ```env
135
+ NPM_TOKEN=tu-npm-token-aqui
136
+ ```
137
+
138
+ ### Publicación automática
139
+
140
+ ```bash
141
+ bun run publish-flow
142
+ ```
143
+
144
+ Este comando te preguntará qué tipo de versión quieres publicar y ejecutará:
145
+
146
+ - Lint
147
+ - Build
148
+ - Commit
149
+ - Push
150
+ - Publish
151
+
152
+ ### Publicación manual
153
+
154
+ ```bash
155
+ # Cambiar versión manualmente en package.json
156
+ # Luego:
157
+ bun run build
158
+ npm publish --access public
159
+ ```
160
+
161
+ ### Tipos de versión
162
+
163
+ - **patch**: 1.0.0 → 1.0.1 (bug fixes)
164
+ - **minor**: 1.0.0 → 1.1.0 (nuevas features)
165
+ - **major**: 1.0.0 → 2.0.0 (breaking changes)
166
+ - **custom**: Especificar versión manualmente
167
+ - **skip**: No cambiar versión
168
+
169
+ ## Estructura del proyecto
170
+
171
+ ```
172
+ src/
173
+ ├── hooks/
174
+ │ └── useItems.ts # Hook principal para obtener items
175
+ ├── services/
176
+ │ └── api.ts # Cliente API con Axios
177
+ ├── types/
178
+ │ └── index.ts # Definiciones de tipos TypeScript
179
+ └── index.ts # Exportaciones principales
180
+ ```
181
+
182
+ ## Manejo de errores
183
+
184
+ El SDK incluye manejo de errores para:
185
+
186
+ - API Key inválida (401)
187
+ - Endpoint no encontrado (404)
188
+ - Errores del servidor (5xx)
189
+ - Errores de conexión
190
+ - Errores de GraphQL
191
+
192
+ ## Licencia
193
+
194
+ MIT
@@ -0,0 +1,47 @@
1
+ interface ItemImage {
2
+ alt: string;
3
+ url: string;
4
+ thumbnail_url: string;
5
+ }
6
+ interface Item {
7
+ id: string;
8
+ name: string;
9
+ price_text: string;
10
+ cover_image_url: string;
11
+ cover_image_thumbnail_url: string;
12
+ images: ItemImage[];
13
+ }
14
+ interface ItemsResponse {
15
+ totalDocs: number;
16
+ totalPages: number;
17
+ prevPage: number | null;
18
+ nextPage: number | null;
19
+ docs: Item[];
20
+ }
21
+ interface UseItemsOptions {
22
+ page?: number;
23
+ limit?: number;
24
+ }
25
+ interface UseItemsReturn {
26
+ items: Item[];
27
+ totalDocs: number;
28
+ totalPages: number;
29
+ prevPage: number | null;
30
+ nextPage: number | null;
31
+ loading: boolean;
32
+ error: string | null;
33
+ refetch: () => void;
34
+ }
35
+
36
+ declare function useItems(options?: UseItemsOptions): UseItemsReturn;
37
+
38
+ declare class PakentoCMSAPI {
39
+ private client;
40
+ private baseURL;
41
+ private apiKey;
42
+ constructor();
43
+ getItems(page?: number, limit?: number): Promise<any>;
44
+ }
45
+ declare const pakentoCMSAPI: PakentoCMSAPI;
46
+
47
+ export { type Item, type ItemImage, type ItemsResponse, type UseItemsOptions, type UseItemsReturn, pakentoCMSAPI, useItems };
@@ -0,0 +1,47 @@
1
+ interface ItemImage {
2
+ alt: string;
3
+ url: string;
4
+ thumbnail_url: string;
5
+ }
6
+ interface Item {
7
+ id: string;
8
+ name: string;
9
+ price_text: string;
10
+ cover_image_url: string;
11
+ cover_image_thumbnail_url: string;
12
+ images: ItemImage[];
13
+ }
14
+ interface ItemsResponse {
15
+ totalDocs: number;
16
+ totalPages: number;
17
+ prevPage: number | null;
18
+ nextPage: number | null;
19
+ docs: Item[];
20
+ }
21
+ interface UseItemsOptions {
22
+ page?: number;
23
+ limit?: number;
24
+ }
25
+ interface UseItemsReturn {
26
+ items: Item[];
27
+ totalDocs: number;
28
+ totalPages: number;
29
+ prevPage: number | null;
30
+ nextPage: number | null;
31
+ loading: boolean;
32
+ error: string | null;
33
+ refetch: () => void;
34
+ }
35
+
36
+ declare function useItems(options?: UseItemsOptions): UseItemsReturn;
37
+
38
+ declare class PakentoCMSAPI {
39
+ private client;
40
+ private baseURL;
41
+ private apiKey;
42
+ constructor();
43
+ getItems(page?: number, limit?: number): Promise<any>;
44
+ }
45
+ declare const pakentoCMSAPI: PakentoCMSAPI;
46
+
47
+ export { type Item, type ItemImage, type ItemsResponse, type UseItemsOptions, type UseItemsReturn, pakentoCMSAPI, useItems };
package/dist/index.js ADDED
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ pakentoCMSAPI: () => pakentoCMSAPI,
34
+ useItems: () => useItems
35
+ });
36
+ module.exports = __toCommonJS(index_exports);
37
+
38
+ // src/hooks/useItems.ts
39
+ var import_react = require("react");
40
+
41
+ // src/services/api.ts
42
+ var import_axios = __toESM(require("axios"));
43
+ var PakentoCMSAPI = class {
44
+ constructor() {
45
+ this.baseURL = process.env.PAKENTO_CMS_BASE_URL || "";
46
+ this.apiKey = process.env.PAKENTO_API_KEY || "";
47
+ if (!this.baseURL) {
48
+ throw new Error(
49
+ "PAKENTO_CMS_BASE_URL is required in environment variables"
50
+ );
51
+ }
52
+ if (!this.apiKey) {
53
+ throw new Error("PAKENTO_API_KEY is required in environment variables");
54
+ }
55
+ this.client = import_axios.default.create({
56
+ baseURL: this.baseURL,
57
+ headers: {
58
+ "Content-Type": "application/json",
59
+ Authorization: `Bearer ${this.apiKey}`
60
+ }
61
+ });
62
+ }
63
+ async getItems(page = 1, limit = 10) {
64
+ try {
65
+ const query = `
66
+ query Query($page: Int, $limit: Int) {
67
+ GetEcommerceItems(page: $page, limit: $limit) {
68
+ totalDocs
69
+ totalPages
70
+ prevPage
71
+ nextPage
72
+ docs {
73
+ id
74
+ name
75
+ price_text
76
+ cover_image_url
77
+ cover_image_thumbnail_url
78
+ images {
79
+ alt
80
+ url
81
+ thumbnail_url
82
+ }
83
+ }
84
+ }
85
+ }
86
+ `;
87
+ const response = await this.client.post("/api/graphql", {
88
+ query,
89
+ variables: { page, limit }
90
+ });
91
+ if (response.data.errors) {
92
+ throw new Error(`GraphQL Error: ${response.data.errors[0].message}`);
93
+ }
94
+ return response.data.data.GetEcommerceItems;
95
+ } catch (error) {
96
+ if (error instanceof import_axios.AxiosError) {
97
+ const status = error.response?.status;
98
+ if (status === 401) {
99
+ throw new Error("API Key inv\xE1lida o expirada");
100
+ }
101
+ if (status === 404) {
102
+ throw new Error("Endpoint no encontrado");
103
+ }
104
+ if (status && status >= 500) {
105
+ throw new Error("Error del servidor CMS");
106
+ }
107
+ throw new Error(`Error de conexi\xF3n: ${error.message}`);
108
+ }
109
+ throw error;
110
+ }
111
+ }
112
+ };
113
+ var pakentoCMSAPI = new PakentoCMSAPI();
114
+
115
+ // src/hooks/useItems.ts
116
+ function useItems(options = {}) {
117
+ const { page = 1, limit = 10 } = options;
118
+ const [items, setItems] = (0, import_react.useState)([]);
119
+ const [totalDocs, setTotalDocs] = (0, import_react.useState)(0);
120
+ const [totalPages, setTotalPages] = (0, import_react.useState)(0);
121
+ const [prevPage, setPrevPage] = (0, import_react.useState)(null);
122
+ const [nextPage, setNextPage] = (0, import_react.useState)(null);
123
+ const [loading, setLoading] = (0, import_react.useState)(true);
124
+ const [error, setError] = (0, import_react.useState)(null);
125
+ const fetchItems = (0, import_react.useCallback)(async () => {
126
+ try {
127
+ setLoading(true);
128
+ setError(null);
129
+ const response = await pakentoCMSAPI.getItems(page, limit);
130
+ setItems(response.docs);
131
+ setTotalDocs(response.totalDocs);
132
+ setTotalPages(response.totalPages);
133
+ setPrevPage(response.prevPage);
134
+ setNextPage(response.nextPage);
135
+ } catch (err) {
136
+ const errorMessage = err instanceof Error ? err.message : "Error desconocido al cargar items";
137
+ setError(errorMessage);
138
+ console.error("Error fetching items:", err);
139
+ } finally {
140
+ setLoading(false);
141
+ }
142
+ }, [page, limit]);
143
+ (0, import_react.useEffect)(() => {
144
+ fetchItems();
145
+ }, [fetchItems]);
146
+ const refetch = (0, import_react.useCallback)(() => {
147
+ fetchItems();
148
+ }, [fetchItems]);
149
+ return {
150
+ items,
151
+ totalDocs,
152
+ totalPages,
153
+ prevPage,
154
+ nextPage,
155
+ loading,
156
+ error,
157
+ refetch
158
+ };
159
+ }
160
+ // Annotate the CommonJS export names for ESM import in node:
161
+ 0 && (module.exports = {
162
+ pakentoCMSAPI,
163
+ useItems
164
+ });
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useItems.ts","../src/services/api.ts"],"sourcesContent":["// Hooks\nexport { useItems } from \"./hooks/useItems\";\n\n// Services\nexport { pakentoCMSAPI } from \"./services/api\";\n\n// Types\nexport type {\n Item,\n ItemImage,\n ItemsResponse,\n UseItemsOptions,\n UseItemsReturn,\n} from \"./types\";\n","import { useState, useEffect, useCallback } from \"react\";\nimport { pakentoCMSAPI } from \"../services/api\";\nimport { UseItemsOptions, UseItemsReturn, Item } from \"../types\";\n\nexport function useItems(options: UseItemsOptions = {}): UseItemsReturn {\n const { page = 1, limit = 10 } = options;\n\n const [items, setItems] = useState<Item[]>([]);\n const [totalDocs, setTotalDocs] = useState(0);\n const [totalPages, setTotalPages] = useState(0);\n const [prevPage, setPrevPage] = useState<number | null>(null);\n const [nextPage, setNextPage] = useState<number | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n const response = await pakentoCMSAPI.getItems(page, limit);\n\n setItems(response.docs);\n setTotalDocs(response.totalDocs);\n setTotalPages(response.totalPages);\n setPrevPage(response.prevPage);\n setNextPage(response.nextPage);\n } catch (err) {\n const errorMessage =\n err instanceof Error\n ? err.message\n : \"Error desconocido al cargar items\";\n setError(errorMessage);\n console.error(\"Error fetching items:\", err);\n } finally {\n setLoading(false);\n }\n }, [page, limit]);\n\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n const refetch = useCallback(() => {\n fetchItems();\n }, [fetchItems]);\n\n return {\n items,\n totalDocs,\n totalPages,\n prevPage,\n nextPage,\n loading,\n error,\n refetch,\n };\n}\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private baseURL: string;\n private apiKey: string;\n\n constructor() {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (!this.baseURL) {\n throw new Error(\n \"PAKENTO_CMS_BASE_URL is required in environment variables\"\n );\n }\n\n if (!this.apiKey) {\n throw new Error(\"PAKENTO_API_KEY is required in environment variables\");\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n }\n\n async getItems(page: number = 1, limit: number = 10) {\n try {\n const query = `\n query Query($page: Int, $limit: Int) {\n GetEcommerceItems(page: $page, limit: $limit) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n price_text\n cover_image_url\n cover_image_thumbnail_url\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: { page, limit },\n });\n\n if (response.data.errors) {\n throw new Error(`GraphQL Error: ${response.data.errors[0].message}`);\n }\n\n // Parseamos la respuesta para quitar el wrapper de data->GetEcommerceItems\n return response.data.data.GetEcommerceItems;\n } catch (error) {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n throw new Error(\"API Key inválida o expirada\");\n }\n if (status === 404) {\n throw new Error(\"Endpoint no encontrado\");\n }\n if (status && status >= 500) {\n throw new Error(\"Error del servidor CMS\");\n }\n throw new Error(`Error de conexión: ${error.message}`);\n }\n throw error;\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n"],"mappings":"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","names":["axios"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,127 @@
1
+ // src/hooks/useItems.ts
2
+ import { useState, useEffect, useCallback } from "react";
3
+
4
+ // src/services/api.ts
5
+ import axios, { AxiosError } from "axios";
6
+ var PakentoCMSAPI = class {
7
+ constructor() {
8
+ this.baseURL = process.env.PAKENTO_CMS_BASE_URL || "";
9
+ this.apiKey = process.env.PAKENTO_API_KEY || "";
10
+ if (!this.baseURL) {
11
+ throw new Error(
12
+ "PAKENTO_CMS_BASE_URL is required in environment variables"
13
+ );
14
+ }
15
+ if (!this.apiKey) {
16
+ throw new Error("PAKENTO_API_KEY is required in environment variables");
17
+ }
18
+ this.client = axios.create({
19
+ baseURL: this.baseURL,
20
+ headers: {
21
+ "Content-Type": "application/json",
22
+ Authorization: `Bearer ${this.apiKey}`
23
+ }
24
+ });
25
+ }
26
+ async getItems(page = 1, limit = 10) {
27
+ try {
28
+ const query = `
29
+ query Query($page: Int, $limit: Int) {
30
+ GetEcommerceItems(page: $page, limit: $limit) {
31
+ totalDocs
32
+ totalPages
33
+ prevPage
34
+ nextPage
35
+ docs {
36
+ id
37
+ name
38
+ price_text
39
+ cover_image_url
40
+ cover_image_thumbnail_url
41
+ images {
42
+ alt
43
+ url
44
+ thumbnail_url
45
+ }
46
+ }
47
+ }
48
+ }
49
+ `;
50
+ const response = await this.client.post("/api/graphql", {
51
+ query,
52
+ variables: { page, limit }
53
+ });
54
+ if (response.data.errors) {
55
+ throw new Error(`GraphQL Error: ${response.data.errors[0].message}`);
56
+ }
57
+ return response.data.data.GetEcommerceItems;
58
+ } catch (error) {
59
+ if (error instanceof AxiosError) {
60
+ const status = error.response?.status;
61
+ if (status === 401) {
62
+ throw new Error("API Key inv\xE1lida o expirada");
63
+ }
64
+ if (status === 404) {
65
+ throw new Error("Endpoint no encontrado");
66
+ }
67
+ if (status && status >= 500) {
68
+ throw new Error("Error del servidor CMS");
69
+ }
70
+ throw new Error(`Error de conexi\xF3n: ${error.message}`);
71
+ }
72
+ throw error;
73
+ }
74
+ }
75
+ };
76
+ var pakentoCMSAPI = new PakentoCMSAPI();
77
+
78
+ // src/hooks/useItems.ts
79
+ function useItems(options = {}) {
80
+ const { page = 1, limit = 10 } = options;
81
+ const [items, setItems] = useState([]);
82
+ const [totalDocs, setTotalDocs] = useState(0);
83
+ const [totalPages, setTotalPages] = useState(0);
84
+ const [prevPage, setPrevPage] = useState(null);
85
+ const [nextPage, setNextPage] = useState(null);
86
+ const [loading, setLoading] = useState(true);
87
+ const [error, setError] = useState(null);
88
+ const fetchItems = useCallback(async () => {
89
+ try {
90
+ setLoading(true);
91
+ setError(null);
92
+ const response = await pakentoCMSAPI.getItems(page, limit);
93
+ setItems(response.docs);
94
+ setTotalDocs(response.totalDocs);
95
+ setTotalPages(response.totalPages);
96
+ setPrevPage(response.prevPage);
97
+ setNextPage(response.nextPage);
98
+ } catch (err) {
99
+ const errorMessage = err instanceof Error ? err.message : "Error desconocido al cargar items";
100
+ setError(errorMessage);
101
+ console.error("Error fetching items:", err);
102
+ } finally {
103
+ setLoading(false);
104
+ }
105
+ }, [page, limit]);
106
+ useEffect(() => {
107
+ fetchItems();
108
+ }, [fetchItems]);
109
+ const refetch = useCallback(() => {
110
+ fetchItems();
111
+ }, [fetchItems]);
112
+ return {
113
+ items,
114
+ totalDocs,
115
+ totalPages,
116
+ prevPage,
117
+ nextPage,
118
+ loading,
119
+ error,
120
+ refetch
121
+ };
122
+ }
123
+ export {
124
+ pakentoCMSAPI,
125
+ useItems
126
+ };
127
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useItems.ts","../src/services/api.ts"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { pakentoCMSAPI } from \"../services/api\";\nimport { UseItemsOptions, UseItemsReturn, Item } from \"../types\";\n\nexport function useItems(options: UseItemsOptions = {}): UseItemsReturn {\n const { page = 1, limit = 10 } = options;\n\n const [items, setItems] = useState<Item[]>([]);\n const [totalDocs, setTotalDocs] = useState(0);\n const [totalPages, setTotalPages] = useState(0);\n const [prevPage, setPrevPage] = useState<number | null>(null);\n const [nextPage, setNextPage] = useState<number | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n const response = await pakentoCMSAPI.getItems(page, limit);\n\n setItems(response.docs);\n setTotalDocs(response.totalDocs);\n setTotalPages(response.totalPages);\n setPrevPage(response.prevPage);\n setNextPage(response.nextPage);\n } catch (err) {\n const errorMessage =\n err instanceof Error\n ? err.message\n : \"Error desconocido al cargar items\";\n setError(errorMessage);\n console.error(\"Error fetching items:\", err);\n } finally {\n setLoading(false);\n }\n }, [page, limit]);\n\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n const refetch = useCallback(() => {\n fetchItems();\n }, [fetchItems]);\n\n return {\n items,\n totalDocs,\n totalPages,\n prevPage,\n nextPage,\n loading,\n error,\n refetch,\n };\n}\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private baseURL: string;\n private apiKey: string;\n\n constructor() {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (!this.baseURL) {\n throw new Error(\n \"PAKENTO_CMS_BASE_URL is required in environment variables\"\n );\n }\n\n if (!this.apiKey) {\n throw new Error(\"PAKENTO_API_KEY is required in environment variables\");\n }\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n }\n\n async getItems(page: number = 1, limit: number = 10) {\n try {\n const query = `\n query Query($page: Int, $limit: Int) {\n GetEcommerceItems(page: $page, limit: $limit) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n price_text\n cover_image_url\n cover_image_thumbnail_url\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables: { page, limit },\n });\n\n if (response.data.errors) {\n throw new Error(`GraphQL Error: ${response.data.errors[0].message}`);\n }\n\n // Parseamos la respuesta para quitar el wrapper de data->GetEcommerceItems\n return response.data.data.GetEcommerceItems;\n } catch (error) {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n throw new Error(\"API Key inválida o expirada\");\n }\n if (status === 404) {\n throw new Error(\"Endpoint no encontrado\");\n }\n if (status && status >= 500) {\n throw new Error(\"Error del servidor CMS\");\n }\n throw new Error(`Error de conexión: ${error.message}`);\n }\n throw error;\n }\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@pakento/cms-sdk",
3
+ "version": "1.1.0",
4
+ "description": "SDK para conectar tiendas en línea con Pakento CMS",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "dev": "tsup --watch",
12
+ "build": "tsup",
13
+ "lint": "eslint src --ext .ts,.tsx",
14
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
15
+ "type-check": "tsc --noEmit",
16
+ "prepublishOnly": "bun run build",
17
+ "publish": "bun run scripts/publish.ts",
18
+ "link-local": "bun link"
19
+ },
20
+ "keywords": [
21
+ "pakento",
22
+ "cms",
23
+ "sdk",
24
+ "nextjs",
25
+ "ecommerce"
26
+ ],
27
+ "author": "Pakento",
28
+ "license": "MIT",
29
+ "devDependencies": {
30
+ "@types/node": "^24.1.0",
31
+ "@types/react": "^18.2.0",
32
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
33
+ "@typescript-eslint/parser": "^6.0.0",
34
+ "eslint": "^8.0.0",
35
+ "ts-node": "^10.9.2",
36
+ "tsup": "^8.0.0",
37
+ "typescript": "^5.0.0"
38
+ },
39
+ "dependencies": {
40
+ "axios": "^1.6.0",
41
+ "dotenv": "^17.2.1"
42
+ },
43
+ "peerDependencies": {
44
+ "react": ">=16.8.0"
45
+ },
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "https://github.com/pakento/cms-sdk.git"
49
+ }
50
+ }