Build y servidor local
Scripts (package.json)
| Script | Comando | Descripción |
|---|---|---|
npm run build | node build.mjs | Genera dist/widget-loader.js |
npm run dev | node build.mjs --watch | Recompila ante cambios |
npm run serve | node serve.mjs | Sirve dist/ por HTTP |
npm test | vitest run | Tests de attachments.js y presence.js |
npm install
npm run build
npm run serve # http://localhost:8081/widget-loader.js
build.mjs
Usa la API de esbuild con estas opciones:
| Opción | Valor |
|---|---|
entryPoints | src/widget-loader.js |
outfile | dist/widget-loader.js |
bundle / minify | true / true |
format | iife |
target | es2017 |
legalComments / sourcemap | none / false |
define | __NOTIFICATION_AUDIO__ |
__NOTIFICATION_AUDIO__ se reemplaza por un data URI audio/mpeg en base64 de src/assets/notification.mp3, por lo que el widget es autónomo y no hace una request extra para el sonido. Con --watch se crea un contexto y se imprime watch activo.
:::warning Origin del CRM
La URL del CRM (CRM_ORIGIN) está escrita dentro de src/widget-loader.js. Cambiar de backend implica editar esa constante y recompilar. Ver Gotchas.
:::
serve.mjs
Servidor HTTP mínimo (node:http) para desarrollo local, sin dependencias del backend:
- Puerto:
process.env.PORTo8081. - Sirve archivos de
dist/;/equivale a/widget-loader.js. - Respuestas con
Cache-Control: no-cache;.jscontext/javascript; charset=utf-8y cualquier otra extensión comoapplication/octet-stream. - Normaliza la ruta y responde
403si el archivo resuelto queda fuera dedist/;404si no existe. - No agrega cabeceras CORS (el script se carga con una etiqueta
script, no confetch).
En producción el archivo dist/widget-loader.js debe hospedarlo quien sirva el webchat (CDN, el propio CRM, etc.); el README indica servirlo desde el CRM, por ejemplo https://TU-CRM.com/widget-loader.js.
Tests
Vitest cubre las funciones puras:
attachments.test.js: límites de tamaño, duración de audio, URL de subida y formato de duración.presence.test.js: cuándo debe emitirse el aviso de salida (contact-leaving).
El loader principal (DOM y socket) no tiene tests en este repositorio.