lf-pagebuilder-vue 0.0.3 → 0.0.4

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 CHANGED
@@ -1,300 +1,380 @@
1
- # @lefebvre/lf-pagebuilder-vue
1
+ # lf-pagebuilder-vue
2
2
 
3
- Un componente Vue 3 de Page Builder con drag-and-drop para proyectos Lefebvre. Permite crear páginas de forma visual con un sistema de filas, columnas y componentes arrastrables.
3
+ Editor visual para construir páginas HTML usando los componentes de `libreria-astro-lefebvre`.
4
4
 
5
- ---
5
+ ## Instalación
6
6
 
7
- ## ⚠️ IMPORTANTE: Configuración de Entorno
7
+ ```bash
8
+ npm i lf-pagebuilder-vue
9
+ ```
8
10
 
9
- > **El componente `Pagebuilder` requiere la prop `isProduction` para determinar qué URLs de API utilizar (desarrollo o producción).**
11
+ Luego en tu `package.json`, cambia la versión a `latest` para tener siempre la última:
10
12
 
11
- ```vue
12
- <template>
13
- <Pagebuilder
14
- :isProduction="isProduction"
15
- :renderApiDomain="apiUrl"
16
- />
17
- </template>
13
+ ```json
14
+ {
15
+ "dependencies": {
16
+ "lf-pagebuilder-vue": "latest"
17
+ }
18
+ }
19
+ ```
18
20
 
19
- <script setup>
20
- import { Pagebuilder } from 'lf-pagebuilder-vue';
21
- import 'lf-pagebuilder-vue/styles';
21
+ ## ¿Qué es?
22
22
 
23
- // Opción 1: Usando import.meta.env.PROD (Vite detecta automáticamente)
24
- const isProduction = import.meta.env.PROD;
23
+ El Pagebuilder permite al usuario arrastrar y configurar componentes de la librería de componentes Astro de Lefebvre para diseñar páginas de forma visual.
25
24
 
26
- // Opción 2: Usando una variable de entorno personalizada
27
- // const isProduction = import.meta.env.VITE_IS_PRODUCTION === 'true';
25
+ **El Pagebuilder NO renderiza la página final.** Genera un JSON de configuración que se envía a una API externa renderizadora, que es la encargada de generar el HTML final.
28
26
 
29
- const apiUrl = 'https://tu-api-render.com';
30
- </script>
31
- ```
27
+ ## Formas de uso
32
28
 
33
- | Valor de `isProduction` | URLs utilizadas |
34
- |-------------------------|-----------------|
35
- | `true` | URLs de producción (ej: `https://elderecho.com/feed`) |
36
- | `false` | URLs de desarrollo (ej: `https://led-dev-elderecho-dev.eu.els.local/feed`) |
29
+ ### 1. Como script IIFE (Symfony u otros backends)
37
30
 
38
- ---
31
+ En la carpeta `dist-symfony/` están los archivos compilados:
32
+ - `lf-pagebuilder-iife.iife.js`
33
+ - `lf-pagebuilder-iife.css`
39
34
 
40
- ## 🚀 Características
35
+ **Instalación:**
41
36
 
42
- - **Drag & Drop**: Sistema intuitivo para arrastrar y organizar componentes
43
- - **Modo Visual/Configuración**: Alterna entre vista previa y modo de edición
44
- - **Secciones**: Header, Body, Footer y Sidebar configurables
45
- - **Configuración de filas y columnas**: Padding, gap, anchos personalizables
46
- - **Feed de contenido**: Conecta componentes con fuentes de datos externas
47
- - **Preview en tiempo real**: Visualiza los cambios al instante
48
- - **Exportar/Importar**: Guarda y carga configuraciones JSON
49
- - **SEO Validator**: Valida la estructura SEO de la página
37
+ Copiar estos archivos a la carpeta pública del proyecto. En Symfony, puedes configurar el build para que los copie automáticamente a `public/build/` o copiarlos manualmente.
50
38
 
51
- ## 📦 Instalación
39
+ **Uso:**
52
40
 
53
- ```bash
54
- npm install @lefebvre/lf-pagebuilder-vue
41
+ ```html
42
+ <link rel="stylesheet" href="/build/lf-pagebuilder-iife.css">
43
+ <script src="/build/lf-pagebuilder-iife.iife.js"></script>
44
+
45
+ <!-- El Pagebuilder se monta automáticamente en elementos con el selector: -->
46
+ <div class="XXXXXXXX" data-is-production="false"></div>
55
47
  ```
56
48
 
57
- ## 📋 Peer Dependencies
49
+ El atributo `data-is-production` indica el entorno:
50
+ - `"true"` → Usa API de producción (`https://render-api.lefebvre.es`)
51
+ - `"false"` → Usa API de desarrollo (`https://led-dev-astro-render-api-dev.eu.els.local`)
52
+
53
+ ---
58
54
 
59
- Este paquete requiere las siguientes dependencias:
55
+ ### 2. Como componente Vue
60
56
 
61
57
  ```bash
62
- npm install vue@^3.3.0 vuedraggable@^4.1.0 @vueup/vue-quill@^1.2.0 libreria-astro-lefebvre@latest
58
+ npm install lf-pagebuilder-vue
63
59
  ```
64
60
 
65
- ## 🔧 Uso
66
-
67
- ### En un proyecto Vue 3
68
-
69
61
  ```vue
70
62
  <template>
71
- <Pagebuilder :renderApiDomain="apiUrl" />
63
+ <Pagebuilder :isProduction="false" />
72
64
  </template>
73
65
 
74
66
  <script setup>
75
- import { Pagebuilder } from '@lefebvre/lf-pagebuilder-vue';
76
- import '@lefebvre/lf-pagebuilder-vue/styles';
77
-
78
- const apiUrl = 'https://tu-api-render.com';
67
+ import { Pagebuilder } from 'lf-pagebuilder-vue';
79
68
  </script>
80
69
  ```
81
70
 
82
- ### En un proyecto Astro con Vue
71
+ **Props:**
83
72
 
84
- ```astro
85
- ---
86
- import Layout from '../layouts/Layout.astro';
87
- import { Pagebuilder } from '@lefebvre/lf-pagebuilder-vue';
88
- import '@lefebvre/lf-pagebuilder-vue/styles';
73
+ | Prop | Tipo | Default | Descripción |
74
+ |------|------|---------|-------------|
75
+ | `isProduction` | `boolean` | `false` | `true` = API producción, `false` = API desarrollo |
89
76
 
90
- const renderApiUrl = import.meta.env.ASTRO_RENDER_API;
91
77
  ---
92
78
 
93
- <Layout>
94
- <div class="bg-slate-100 py-20">
95
- <Pagebuilder client:only="vue" renderApiDomain={renderApiUrl} />
96
- </div>
97
- </Layout>
79
+ ## Instalación y dependencias
80
+
81
+ ### Dependencias requeridas en el proyecto padre
82
+
83
+ El proyecto que use este Pagebuilder debe tener instaladas estas dependencias:
84
+
85
+ ```bash
86
+ npm install vue@^3.3.0 vuedraggable@^4.1.0 @vueup/vue-quill@^1.2.0 libreria-astro-lefebvre@latest
98
87
  ```
99
88
 
100
- ## 🧩 Componentes exportados
89
+ | Dependencia | Versión | Descripción |
90
+ |-------------|---------|-------------|
91
+ | `vue` | ^3.3.0 | Framework Vue 3 |
92
+ | `vuedraggable` | ^4.1.0 | Drag & drop para Vue 3 |
93
+ | `@vueup/vue-quill` | ^1.2.0 | Editor de texto enriquecido |
94
+ | `libreria-astro-lefebvre` | latest | Librería de componentes Astro de Lefebvre |
101
95
 
102
- | Componente | Descripción |
103
- |------------|-------------|
104
- | `Pagebuilder` | Componente principal del page builder |
105
- | `BodySection` | Sección del body con filas y columnas |
106
- | `ColConfig` | Configuración de columnas |
107
- | `ComponentsBox` | Caja de componentes disponibles |
108
- | `FeedComponent` | Configuración de feeds de contenido |
109
- | `FieldsForm` | Formulario de campos de componente |
110
- | `GlobalConfig` | Barra de configuración global |
111
- | `InitialComponent` | Componente individual renderizado |
112
- | `RowConfig` | Configuración de filas |
113
- | `SourceFilter` | Filtros de fuentes de datos |
96
+ ### Configuración especial del proyecto padre
114
97
 
115
- ## 📐 Props del Pagebuilder
98
+ #### En proyectos Astro
116
99
 
117
- | Prop | Tipo | Requerido | Default | Descripción |
118
- |------|------|-----------|---------|-------------|
119
- | `isProduction` | `boolean` | **Sí** | `false` | Determina si usar URLs de producción o desarrollo |
120
- | `renderApiDomain` | `string` | No | - | URL del API de renderizado para previews |
100
+ El proyecto debe tener las integraciones de Vue y Tailwind:
121
101
 
122
- ## 🎨 Estilos
102
+ ```bash
103
+ npm install @astrojs/vue tailwindcss @tailwindcss/vite
104
+ ```
123
105
 
124
- Los estilos se pueden importar por separado:
106
+ En `astro.config.mjs`:
125
107
 
126
108
  ```js
127
- import '@lefebvre/lf-pagebuilder-vue/styles';
109
+ import { defineConfig } from 'astro/config';
110
+ import { searchForWorkspaceRoot } from 'vite';
111
+ import path from 'path';
112
+ import vue from '@astrojs/vue';
113
+ import tailwindcss from '@tailwindcss/vite';
114
+
115
+ export default defineConfig({
116
+ integrations: [vue()],
117
+
118
+ vite: {
119
+ plugins: [tailwindcss()],
120
+ server: {
121
+ fs: {
122
+ // Necesario si usas npm link con librerías hermanas
123
+ allow: [
124
+ searchForWorkspaceRoot(process.cwd()),
125
+ path.resolve(process.cwd(), '..'),
126
+ ],
127
+ },
128
+ },
129
+ },
130
+ });
128
131
  ```
129
132
 
130
- El componente usa Tailwind CSS para los estilos. Asegúrate de tener Tailwind configurado en tu proyecto.
133
+ > **Nota:** La configuración de `vite.server.fs.allow` es necesaria cuando usas `npm link` para desarrollo local con librerías en carpetas hermanas. Si instalas el paquete desde npm, no es necesaria.
131
134
 
132
- ## 📤 Exportación de configuración
135
+ ---
133
136
 
134
- La configuración de la página se puede exportar en formato JSON:
137
+ ## Build
135
138
 
136
- ```typescript
137
- interface PageBuilderConfig {
138
- pageConfig: PageSection[];
139
- paramsConfig: PageParameters;
140
- }
139
+ El proyecto tiene dos builds diferentes:
141
140
 
142
- interface PageSection {
143
- section: string;
144
- config: { width?: string };
145
- rows: PageRow[];
146
- }
141
+ ### Build estándar (librería npm)
147
142
 
148
- interface PageRow {
149
- config: { padding?: string; gap?: string; width?: string };
150
- columns: PageColumn[];
151
- }
152
-
153
- interface PageColumn {
154
- config: { width?: string; gap?: string; flexDirection?: string };
155
- components: PageComponent[];
156
- }
143
+ ```bash
144
+ npm run build
157
145
  ```
158
146
 
159
- ## 🔌 API de Renderizado
147
+ Genera en `dist/`:
148
+ - `index.js` - ES Module
149
+ - `index.cjs` - CommonJS
150
+ - `index.d.ts` - Tipos TypeScript
151
+ - `styles.css` - Estilos
160
152
 
161
- El Pagebuilder requiere una API externa para:
153
+ Este es el build que se publica en npm.
162
154
 
163
- 1. **Preview de componentes**: `POST /api/preview-comp/`
164
- 2. **Renderizado de página**: `POST /api/render-html/`
155
+ ### Build Symfony (IIFE)
165
156
 
166
- ## 📝 Tipos TypeScript
157
+ ```bash
158
+ npm run build:symfony
159
+ ```
167
160
 
168
- El paquete incluye tipos TypeScript completos:
161
+ Genera en `dist-symfony/`:
162
+ - `lf-pagebuilder-iife.iife.js` - Script autocontenido
163
+ - `lf-pagebuilder-iife.css` - Estilos
169
164
 
170
- ```typescript
171
- import type {
172
- PageSection,
173
- PageRow,
174
- PageColumn,
175
- PageComponent,
176
- ComponentField,
177
- PageParameters,
178
- PageBuilderConfig
179
- } from '@lefebvre/lf-pagebuilder-vue';
180
- ```
165
+ Este build incluye Vue y todas las dependencias empaquetadas. Se puede usar directamente con `<script>` sin necesidad de bundler.
181
166
 
182
- ## 🛠️ Desarrollo
167
+ ### Build completo
183
168
 
184
169
  ```bash
185
- # Clonar el repositorio
186
- git clone https://github.com/Lefebvre-El-Derecho-SA/lf-pagebuilder-vue
170
+ npm run build:all
171
+ ```
187
172
 
188
- # Instalar dependencias
189
- npm install
173
+ Ejecuta ambos builds.
190
174
 
191
- # Desarrollo con watch
192
- npm run dev
175
+ ---
176
+
177
+ ## ⚠️ Desarrollo local
178
+
179
+ > **IMPORTANTE**: Lee esta sección completa antes de trabajar con este proyecto localmente.
180
+
181
+ ### El problema del `package.json`
182
+
183
+ Este proyecto tiene **dos configuraciones de `package.json`** porque durante el desarrollo local NO queremos compilar constantemente:
184
+
185
+ | Archivo | Apunta a | Uso |
186
+ |---------|----------|-----|
187
+ | `package.dev.json` | `./src/` (código fuente) | Desarrollo local |
188
+ | `package.prod.json` | `./dist/` (compilado) | Publicar en npm |
189
+
190
+ **Durante el desarrollo**, el `package.json` debe apuntar a los archivos fuente para que los cambios se reflejen inmediatamente sin hacer build.
191
+
192
+ **Para publicar en npm**, debe apuntar a los archivos compilados.
193
+
194
+ #### Cambiar entre modos
195
+
196
+ Puedes copiar el archivo o copiar y pegar el contenido manualmente:
197
+
198
+ ```bash
199
+ # Para DESARROLLO: copiar configuración de desarrollo
200
+ cp package.dev.json package.json
193
201
 
194
- # Build
202
+ # Para PRODUCCIÓN/PUBLICAR: copiar configuración de producción
203
+ cp package.prod.json package.json
195
204
  npm run build
205
+ npm publish
196
206
  ```
197
207
 
198
- ### 📦 Configuración de package.json para desarrollo vs producción
208
+ > ⚠️ **NUNCA publiques con la configuración de desarrollo.** El paquete no funcionará porque `./src/` no se incluye en el paquete publicado.
199
209
 
200
- Para evitar tener que hacer `npm run build` constantemente durante el desarrollo local, existen dos configuraciones de `package.json`:
210
+ #### ⚠️ MUY IMPORTANTE: Mantener sincronizados los 3 archivos
201
211
 
202
- - **Desarrollo local**: Apunta directamente a los archivos fuente (`./src/`)
203
- - **Producción/npm**: Apunta a los archivos compilados (`./dist/`)
212
+ Los archivos `package.json`, `package.dev.json` y `package.prod.json` deben estar sincronizados:
204
213
 
205
- > **Instrucciones**: Copia y pega el contenido correspondiente en tu `package.json` según lo que necesites.
214
+ - **Nueva dependencia**: Si añades una dependencia, añádela también en `package.dev.json` y `package.prod.json`
215
+ - **Cambio de versión**: Cuando subas la versión del paquete, actualízala en los 3 archivos
216
+ - **Cualquier otro cambio**: Scripts, keywords, etc. deben reflejarse en los 3
206
217
 
207
- <details>
208
- <summary><strong>📁 package.dev.json para DESARROLLO LOCAL (sin build)</strong></summary>
218
+ ```bash
219
+ # Ejemplo: después de añadir una dependencia
220
+ npm install nueva-dependencia
209
221
 
210
- ```json
211
- {
212
- "name": "lf-pagebuilder-vue",
213
- "version": "0.0.1",
214
- "description": "Pagebuilder Vue component library for Lefebvre projects",
215
- "type": "module",
216
- "main": "./src/index.ts",
217
- "module": "./src/index.ts",
218
- "types": "./src/index.ts",
219
- "exports": {
220
- ".": {
221
- "import": "./src/index.ts",
222
- "types": "./src/index.ts"
223
- },
224
- "./styles": "./src/styles/pagebuilder.css"
225
- },
226
- "files": ["dist", "src", "README.md"]
227
- }
222
+ # Ahora editar manualmente package.dev.json y package.prod.json
223
+ # para añadir "nueva-dependencia" en las mismas secciones
228
224
  ```
229
225
 
230
- </details>
226
+ ---
231
227
 
232
- <details>
233
- <summary><strong>📁 package.prod.json para PRODUCCIÓN (npm publish)</strong></summary>
228
+ ### Trabajar con `npm link`
234
229
 
235
- ```json
236
- {
237
- "name": "lf-pagebuilder-vue",
238
- "version": "0.0.1",
239
- "description": "Pagebuilder Vue component library for Lefebvre projects",
240
- "type": "module",
241
- "main": "./dist/index.cjs",
242
- "module": "./dist/index.js",
243
- "types": "./dist/index.d.ts",
244
- "exports": {
245
- ".": {
246
- "import": "./dist/index.js",
247
- "require": "./dist/index.cjs",
248
- "types": "./dist/index.d.ts"
249
- },
250
- "./styles": "./dist/styles.css"
251
- },
252
- "files": ["dist", "README.md"]
253
- }
230
+ Para probar cambios localmente en otro proyecto sin publicar:
231
+
232
+ #### Paso 1: Crear el enlace en esta librería
233
+
234
+ ```bash
235
+ cd /ruta/a/lf-pagebuilder-vue
236
+ npm link
254
237
  ```
255
238
 
256
- </details>
239
+ #### Paso 2: Usar el enlace en tu proyecto
257
240
 
258
- > ⚠️ **IMPORTANTE**: Antes de hacer `npm publish`, asegúrate de usar la configuración de **PRODUCCIÓN** y ejecutar `npm run build`.
241
+ ```bash
242
+ cd /ruta/a/tu-proyecto
243
+ npm link lf-pagebuilder-vue
244
+ ```
259
245
 
260
- ### 🔗 Desarrollo local con `npm link` (múltiples librerías)
246
+ ---
261
247
 
262
- > **IMPORTANTE**: Si necesitas usar enlaces simbólicos de **múltiples librerías** (por ejemplo, `lf-pagebuilder-vue` y `libreria-astro-lefebvre`), debes linkear **todas las librerías en un solo comando**.
248
+ ### ⚠️ CRÍTICO: Múltiples librerías con `npm link`
263
249
 
264
- #### Paso 1: Crear los enlaces simbólicos en cada librería
250
+ **Este proyecto depende de `libreria-astro-lefebvre`.** Si necesitas trabajar con ambas librerías localmente (muy común), hay una trampa importante:
265
251
 
266
252
  ```bash
267
- # En el directorio de lf-pagebuilder-vue
253
+ # INCORRECTO - El segundo comando ROMPE el primero
254
+ npm link lf-pagebuilder-vue
255
+ npm link libreria-astro-lefebvre
256
+
257
+ # ✅ CORRECTO - Linkear TODAS las librerías en UN SOLO comando
258
+ npm link lf-pagebuilder-vue libreria-astro-lefebvre
259
+ ```
260
+
261
+ #### Flujo completo para trabajar con ambas librerías
262
+
263
+ ```bash
264
+ # 1. En lf-pagebuilder-vue
268
265
  cd /ruta/a/lf-pagebuilder-vue
266
+ cp package.dev.json package.json # Modo desarrollo
269
267
  npm link
270
268
 
271
- # En el directorio de libreria-astro-lefebvre (u otra librería)
269
+ # 2. En libreria-astro-lefebvre
272
270
  cd /ruta/a/libreria-astro-lefebvre
273
271
  npm link
272
+
273
+ # 3. En tu proyecto consumidor - AMBAS EN UN SOLO COMANDO
274
+ cd /ruta/a/tu-proyecto
275
+ npm link lf-pagebuilder-vue libreria-astro-lefebvre
274
276
  ```
275
277
 
276
- #### Paso 2: Usar los enlaces en tu proyecto consumidor
278
+ #### Deshacer los enlaces
277
279
 
278
280
  ```bash
279
- # ✅ CORRECTO: Linkear ambas librerías en UN SOLO COMANDO
280
281
  cd /ruta/a/tu-proyecto
281
- npm link lf-pagebuilder-vue libreria-astro-lefebvre
282
-
283
- # ❌ INCORRECTO: Linkear por separado (el segundo sobreescribe el primero)
284
- npm link lf-pagebuilder-vue
285
- npm link libreria-astro-lefebvre # ¡Esto rompe el link anterior!
282
+ npm unlink lf-pagebuilder-vue libreria-astro-lefebvre
283
+ npm install
286
284
  ```
287
285
 
288
- #### Paso 3: Para deshacer los enlaces
286
+ #### Si algo no funciona
289
287
 
290
288
  ```bash
289
+ # Nuclear option: borrar todo y reinstalar
291
290
  cd /ruta/a/tu-proyecto
292
- npm unlink lf-pagebuilder-vue libreria-astro-lefebvre
291
+ rm -rf node_modules package-lock.json
293
292
  npm install
293
+ npm link lf-pagebuilder-vue libreria-astro-lefebvre
294
+ ```
295
+
296
+ ---
297
+
298
+ ### Watch mode
299
+
300
+ Para que los cambios se reflejen automáticamente mientras desarrollas:
301
+
302
+ ```bash
303
+ npm run dev
294
304
  ```
295
305
 
296
- > **Nota**: Si experimentas problemas con los enlaces, prueba eliminar `node_modules` y el `package-lock.json` del proyecto consumidor y volver a instalar.
306
+ Esto ejecuta `vite build --watch` y recompila automáticamente cuando hay cambios.
307
+
308
+ > **Nota**: Si usas `package.dev.json` (apuntando a `./src/`), no necesitas watch mode porque los cambios en el código fuente se reflejan directamente.
309
+
310
+ ---
311
+
312
+ ### 📘 Nota para los no familiarizados con npm
313
+
314
+ Este proyecto tiene **dos lugares separados**:
315
+
316
+ #### 1. GitHub (código fuente)
297
317
 
298
- ## 📄 Licencia
318
+ ```
319
+ https://github.com/Lefebvre-El-Derecho-SA/lf-pagebuilder-vue
320
+ ```
321
+
322
+ Aquí es donde se **edita el código**. Los cambios que hagas aquí NO se reflejan automáticamente en los proyectos que usan el paquete.
323
+
324
+ #### 2. npm (paquete distribuido)
325
+
326
+ ```
327
+ https://www.npmjs.com/package/lf-pagebuilder-vue
328
+ ```
299
329
 
300
- MIT © Lefebvre-El-Derecho-SA
330
+ Aquí es donde las webs **descargan el paquete** cuando hacen `npm install`. Esta versión va **separada de GitHub**.
331
+
332
+ #### ¿Cómo actualizar el paquete en npm?
333
+
334
+ Para que los cambios en GitHub lleguen a npm, hay que **publicar una nueva versión**:
335
+
336
+ 1. **Subir la versión** en `package.json` (y en `package.dev.json` y `package.prod.json`)
337
+
338
+ > ⚠️ Si no subes la versión, npm rechazará la publicación.
339
+
340
+ 2. **Asegurarte de usar la configuración de producción**:
341
+ ```bash
342
+ cp package.prod.json package.json
343
+ ```
344
+
345
+ 3. **Compilar y publicar**:
346
+ ```bash
347
+ npm run build
348
+ npm publish --access public
349
+ ```
350
+
351
+ #### Configurar acceso a npm (primera vez)
352
+
353
+ Para poder publicar, necesitas pertenecer a la organización de npm:
354
+
355
+ 1. **Solicitar acceso** al equipo `desarrollowebteamlef` en:
356
+ ```
357
+ https://www.npmjs.com/settings/desarrollowebteamlef/packages
358
+ ```
359
+
360
+ 2. **Crear un token de acceso** en npm:
361
+ - Ve a tu perfil de npm → Access Tokens → Generate New Token
362
+ - Selecciona "Bypass 2FA" (si aplica)
363
+ - Pon expiración de 90 días
364
+ - Copia el token generado
365
+
366
+ 3. **Configurar el token** en tu máquina:
367
+
368
+ Edita (o crea) el archivo `~/.npmrc`:
369
+ ```bash
370
+ # Linux/Mac
371
+ nano ~/.npmrc
372
+
373
+ # Añadir esta línea con tu token:
374
+ //registry.npmjs.org/:_authToken=TU_TOKEN_AQUI
375
+ ```
376
+
377
+ 4. **Ya puedes publicar**:
378
+ ```bash
379
+ npm publish --access public
380
+ ```