From 0fee32e788897ff9a31fc0bc7157dc05ecb9efdd Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Tue, 3 Jan 2023 00:32:33 +0000 Subject: [PATCH 001/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 9242a54fc2264c152421a83b51a8124f6b2de481 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Jan 2023 10:38:29 +0000 Subject: [PATCH 002/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 94ea8ad..beea8cf 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.29-alpha.0", + "version": "0.0.31-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 3f86f72..c5287d2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.36-alpha.0", + "version": "0.0.38-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 9c2358f..252b6c8 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.47-alpha.0", + "version": "0.0.49-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 71404ba..c707e02 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.28-alpha.0", + "version": "0.0.30-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 7714e30..ed6ab28 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.34-alpha.0", + "version": "0.0.36-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From a603e3b7dc724e23063167d52a8c23b6c265a6bb Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 11:31:00 +0000 Subject: [PATCH 003/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 568978c0dc3e1acf9f100fb60f7b165ad4a72776 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 11:36:10 +0000 Subject: [PATCH 004/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d307d2e7a348025fb6819fa35246aad095d47c83 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 11:49:11 +0000 Subject: [PATCH 005/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d49a91308df49939dc9262a25c683e92fa1957f7 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 11:53:55 +0000 Subject: [PATCH 006/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From fe33c213b11f6b278ecd45c9ef878b53ea6329d6 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 12:42:05 +0000 Subject: [PATCH 007/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 9d2f57da764d4133923559b9bed6cc51b073dc7d Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 12:51:30 +0000 Subject: [PATCH 008/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d94034d5bb8501ec22d0c86206291468433e7058 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Tue, 3 Jan 2023 17:47:12 +0000 Subject: [PATCH 009/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d06294a15afba9f56e87678670bdb1636d50e2da Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 22:10:32 +0000 Subject: [PATCH 010/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 3c16f8f501748a4dc05d1e0c08e39e1ec83d4895 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Tue, 3 Jan 2023 22:14:10 +0000 Subject: [PATCH 011/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 19fd788c0f5d6f0660d211e57143ca4232531859 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 4 Jan 2023 06:02:37 +0000 Subject: [PATCH 012/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 49e55088c7d7c52324ba576329f6f849469203c8 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 4 Jan 2023 00:22:56 -0600 Subject: [PATCH 013/248] docs: se modifico el README de Starters Se modifico el README de Starters y se corrigieron los emojis de app.js --- starters/apps/base-baileys-json/README.md | 52 ++++++++++-------- starters/apps/base-baileys-memory/README.md | 52 ++++++++++-------- starters/apps/base-baileys-mongo/README.md | 56 ++++++++++---------- starters/apps/base-baileys-mysql/README.md | 58 ++++++++++----------- starters/apps/base-meta-json/README.md | 52 ++++++++++-------- starters/apps/base-meta-json/app.js | 8 +-- starters/apps/base-meta-memory/README.md | 52 ++++++++++-------- starters/apps/base-meta-memory/app.js | 8 +-- starters/apps/base-meta-mongo/README.md | 52 ++++++++++-------- starters/apps/base-meta-mongo/app.js | 8 +-- starters/apps/base-meta-mysql/README.md | 52 ++++++++++-------- starters/apps/base-meta-mysql/app.js | 8 +-- starters/apps/base-twilio-json/README.md | 52 ++++++++++-------- starters/apps/base-twilio-json/app.js | 8 +-- starters/apps/base-twilio-memory/README.md | 52 ++++++++++-------- starters/apps/base-twilio-memory/app.js | 8 +-- starters/apps/base-twilio-mongo/README.md | 56 ++++++++++---------- starters/apps/base-twilio-mongo/app.js | 8 +-- starters/apps/base-twilio-mysql/README.md | 57 ++++++++++---------- starters/apps/base-twilio-mysql/app.js | 8 +-- starters/apps/base-venom-json/README.md | 52 ++++++++++-------- starters/apps/base-venom-json/app.js | 8 +-- starters/apps/base-venom-memory/README.md | 52 ++++++++++-------- starters/apps/base-venom-memory/app.js | 8 +-- starters/apps/base-venom-mongo/README.md | 56 ++++++++++---------- starters/apps/base-venom-mongo/app.js | 8 +-- starters/apps/base-venom-mysql/README.md | 57 ++++++++++---------- starters/apps/base-venom-mysql/app.js | 8 +-- starters/apps/base-wweb-json/README.md | 52 ++++++++++-------- starters/apps/base-wweb-json/app.js | 8 +-- starters/apps/base-wweb-memory/README.md | 52 ++++++++++-------- starters/apps/base-wweb-memory/app.js | 8 +-- starters/apps/base-wweb-mongo/README.md | 56 ++++++++++---------- starters/apps/base-wweb-mongo/app.js | 8 +-- starters/apps/base-wweb-mysql/README.md | 57 ++++++++++---------- starters/apps/base-wweb-mysql/app.js | 8 +-- 36 files changed, 628 insertions(+), 577 deletions(-) diff --git a/starters/apps/base-baileys-json/README.md b/starters/apps/base-baileys-json/README.md index d0e43d2..a31dc9f 100644 --- a/starters/apps/base-baileys-json/README.md +++ b/starters/apps/base-baileys-json/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Baileys Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(BaileysProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-baileys-memory/README.md b/starters/apps/base-baileys-memory/README.md index d0e43d2..a31dc9f 100644 --- a/starters/apps/base-baileys-memory/README.md +++ b/starters/apps/base-baileys-memory/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Baileys Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(BaileysProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-baileys-mongo/README.md b/starters/apps/base-baileys-mongo/README.md index a22e43b..a31dc9f 100644 --- a/starters/apps/base-baileys-mongo/README.md +++ b/starters/apps/base-baileys-mongo/README.md @@ -1,42 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Baileys Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos: ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' -const MONGO_DB_NAME = 'db_bot' + const adapterProvider = createProvider(BaileysProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` - Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - - Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-baileys-mysql/README.md b/starters/apps/base-baileys-mysql/README.md index 4a1cab2..a31dc9f 100644 --- a/starters/apps/base-baileys-mysql/README.md +++ b/starters/apps/base-baileys-mysql/README.md @@ -1,44 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Baileys Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' -const MYSQL_DB_PASSWORD = 'pass' -const MYSQL_DB_NAME = 'bot' + const adapterProvider = createProvider(BaileysProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-meta-json/README.md b/starters/apps/base-meta-json/README.md index d0e43d2..d7a36af 100644 --- a/starters/apps/base-meta-json/README.md +++ b/starters/apps/base-meta-json/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Meta Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(MetaProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-meta-json/app.js b/starters/apps/base-meta-json/app.js index 73a186c..49dd430 100644 --- a/starters/apps/base-meta-json/app.js +++ b/starters/apps/base-meta-json/app.js @@ -21,15 +21,15 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-meta-memory/README.md b/starters/apps/base-meta-memory/README.md index d0e43d2..d7a36af 100644 --- a/starters/apps/base-meta-memory/README.md +++ b/starters/apps/base-meta-memory/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Meta Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(MetaProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-meta-memory/app.js b/starters/apps/base-meta-memory/app.js index e255d90..288929c 100644 --- a/starters/apps/base-meta-memory/app.js +++ b/starters/apps/base-meta-memory/app.js @@ -21,15 +21,15 @@ const MockAdapter = require('@bot-whatsapp/database/mock') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-meta-mongo/README.md b/starters/apps/base-meta-mongo/README.md index d0e43d2..d7a36af 100644 --- a/starters/apps/base-meta-mongo/README.md +++ b/starters/apps/base-meta-mongo/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Meta Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(MetaProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-meta-mongo/app.js b/starters/apps/base-meta-mongo/app.js index 344709b..f40a6a2 100644 --- a/starters/apps/base-meta-mongo/app.js +++ b/starters/apps/base-meta-mongo/app.js @@ -28,15 +28,15 @@ const MONGO_DB_NAME = 'db_bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -50,7 +50,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-meta-mysql/README.md b/starters/apps/base-meta-mysql/README.md index d0e43d2..d7a36af 100644 --- a/starters/apps/base-meta-mysql/README.md +++ b/starters/apps/base-meta-mysql/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Meta Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(MetaProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-meta-mysql/app.js b/starters/apps/base-meta-mysql/app.js index 73ead9e..25b171c 100644 --- a/starters/apps/base-meta-mysql/app.js +++ b/starters/apps/base-meta-mysql/app.js @@ -29,15 +29,15 @@ const MYSQL_DB_NAME = 'bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -51,7 +51,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-twilio-json/README.md b/starters/apps/base-twilio-json/README.md index d0e43d2..2734fe9 100644 --- a/starters/apps/base-twilio-json/README.md +++ b/starters/apps/base-twilio-json/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Twilio Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(TwilioProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-twilio-json/app.js b/starters/apps/base-twilio-json/app.js index c70577c..190e842 100644 --- a/starters/apps/base-twilio-json/app.js +++ b/starters/apps/base-twilio-json/app.js @@ -21,15 +21,15 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-twilio-memory/README.md b/starters/apps/base-twilio-memory/README.md index d0e43d2..2734fe9 100644 --- a/starters/apps/base-twilio-memory/README.md +++ b/starters/apps/base-twilio-memory/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Twilio Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(TwilioProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-twilio-memory/app.js b/starters/apps/base-twilio-memory/app.js index 144e753..9730709 100644 --- a/starters/apps/base-twilio-memory/app.js +++ b/starters/apps/base-twilio-memory/app.js @@ -21,15 +21,15 @@ const MockAdapter = require('@bot-whatsapp/database/mock') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-twilio-mongo/README.md b/starters/apps/base-twilio-mongo/README.md index 0791742..2734fe9 100644 --- a/starters/apps/base-twilio-mongo/README.md +++ b/starters/apps/base-twilio-mongo/README.md @@ -1,42 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Twilio Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexion de la base de datos ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' -const MONGO_DB_NAME = 'db_bot' + const adapterProvider = createProvider(TwilioProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` - Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - - Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-twilio-mongo/app.js b/starters/apps/base-twilio-mongo/app.js index 1f9a59e..9e5e3f7 100644 --- a/starters/apps/base-twilio-mongo/app.js +++ b/starters/apps/base-twilio-mongo/app.js @@ -28,15 +28,15 @@ const MONGO_DB_NAME = 'db_bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -50,7 +50,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-twilio-mysql/README.md b/starters/apps/base-twilio-mysql/README.md index ad304ee..2734fe9 100644 --- a/starters/apps/base-twilio-mysql/README.md +++ b/starters/apps/base-twilio-mysql/README.md @@ -1,43 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Twilio Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' -const MYSQL_DB_PASSWORD = 'pass' -const MYSQL_DB_NAME = 'bot' + const adapterProvider = createProvider(TwilioProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-twilio-mysql/app.js b/starters/apps/base-twilio-mysql/app.js index c011c62..7100f9c 100644 --- a/starters/apps/base-twilio-mysql/app.js +++ b/starters/apps/base-twilio-mysql/app.js @@ -30,15 +30,15 @@ const MYSQL_DB_NAME = 'bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -52,7 +52,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-venom-json/README.md b/starters/apps/base-venom-json/README.md index d0e43d2..dd6636b 100644 --- a/starters/apps/base-venom-json/README.md +++ b/starters/apps/base-venom-json/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Venom Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(VenomProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index d0e2790..8a223b2 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -21,15 +21,15 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-venom-memory/README.md b/starters/apps/base-venom-memory/README.md index d0e43d2..dd6636b 100644 --- a/starters/apps/base-venom-memory/README.md +++ b/starters/apps/base-venom-memory/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Venom Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(VenomProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 1c01403..44750c4 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -21,15 +21,15 @@ const MockAdapter = require('@bot-whatsapp/database/mock') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-venom-mongo/README.md b/starters/apps/base-venom-mongo/README.md index b2bf791..dd6636b 100644 --- a/starters/apps/base-venom-mongo/README.md +++ b/starters/apps/base-venom-mongo/README.md @@ -1,42 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Venom Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos. ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' -const MONGO_DB_NAME = 'db_bot' + const adapterProvider = createProvider(VenomProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` - Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - - Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index c466b75..266e2e0 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -28,15 +28,15 @@ const MONGO_DB_NAME = 'db_bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -50,7 +50,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-venom-mysql/README.md b/starters/apps/base-venom-mysql/README.md index ad304ee..dd6636b 100644 --- a/starters/apps/base-venom-mysql/README.md +++ b/starters/apps/base-venom-mysql/README.md @@ -1,43 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (Venom Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' -const MYSQL_DB_PASSWORD = 'pass' -const MYSQL_DB_NAME = 'bot' + const adapterProvider = createProvider(VenomProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index ed5bc78..fe19fa5 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -30,15 +30,15 @@ const MYSQL_DB_NAME = 'bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -52,7 +52,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-wweb-json/README.md b/starters/apps/base-wweb-json/README.md index d0e43d2..82f57e3 100644 --- a/starters/apps/base-wweb-json/README.md +++ b/starters/apps/base-wweb-json/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (WebWhatsapp Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(WebWhatsappProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 80a0cb9..2b8a55d 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -21,15 +21,15 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-wweb-memory/README.md b/starters/apps/base-wweb-memory/README.md index d0e43d2..82f57e3 100644 --- a/starters/apps/base-wweb-memory/README.md +++ b/starters/apps/base-wweb-memory/README.md @@ -1,34 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (WebWhatsapp Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. + const adapterProvider = createProvider(WebWhatsappProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} +``` ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 8b6acad..1e47221 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -21,15 +21,15 @@ const MockAdapter = require('@bot-whatsapp/database/mock') */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -43,7 +43,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-wweb-mongo/README.md b/starters/apps/base-wweb-mongo/README.md index a22e43b..82f57e3 100644 --- a/starters/apps/base-wweb-mongo/README.md +++ b/starters/apps/base-wweb-mongo/README.md @@ -1,42 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (WebWhatsapp Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos: ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MONGO_DB_URI = 'mongodb://0.0.0.0:27017' -const MONGO_DB_NAME = 'db_bot' + const adapterProvider = createProvider(WebWhatsappProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` - Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - - Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index ae3ee40..e78f1b1 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -28,15 +28,15 @@ const MONGO_DB_NAME = 'db_bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -50,7 +50,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], diff --git a/starters/apps/base-wweb-mysql/README.md b/starters/apps/base-wweb-mysql/README.md index ad304ee..82f57e3 100644 --- a/starters/apps/base-wweb-mysql/README.md +++ b/starters/apps/base-wweb-mysql/README.md @@ -1,43 +1,40 @@ -### CHATBOT Whatsapp +### CHATBOT Whatsapp (WebWhatsapp Provider) -Este bot es una aplicación que puedes vincular con tu whatsapp y crear flujos para automatizar tareas en tu negocio o procesos repetitivos. +

+ +

-Este bot contiene un flujo básico en el cual una persona (cliente) escribe **"hola"** y el bot responde: -- Bienvenido a mi tienda -- ¿Como puedo ayudarte? -- Tengo: Zapatos, Bolsos etc.. -__Iniciar__ +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** -Recuerda configurar los parametros de conexión de la base de datos ```js -// app.js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) -const MYSQL_DB_HOST = 'localhost' -const MYSQL_DB_USER = 'user' -const MYSQL_DB_PASSWORD = 'pass' -const MYSQL_DB_NAME = 'bot' + const adapterProvider = createProvider(WebWhatsappProvider, { + accountSid: process.env.ACC_SID, + authToken: process.env.ACC_TOKEN, + vendorNumber: process.env.ACC_VENDOR, + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} ``` -Los flujos se declaran de atrás para adelante, es decir que si tienes un flujo de este tipo: - - Menu Principal - - SubMenu 1 - - Submenu 1.1 - - Submenu 2 - - Submenu 2.1 - -Primero se declaran los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. ``` npm install npm start ``` -__¿Tienes problemas?:__ [Abrir Issue](https://github.com/codigoencasa/bot-whatsapp/issues/new/choose) - ------- -> ¿Quieres se parte de este proyecto? -> - [Discord](https://link.codigoencasa.com/DISCORD) -> - [Twitter](https://twitter.com/leifermendez) -> - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -> - [Telegram](https://t.me/leifermendez) +--- +## Recursos +- [📄 Documentación](https://bot-whatsapp.netlify.app/) +- [🚀 Roadmap](https://github.com/orgs/codigoencasa/projects/1) +- [💻 Discord](https://link.codigoencasa.com/DISCORD) +- [👌 Twitter](https://twitter.com/leifermendez) +- [🎥 Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) \ No newline at end of file diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index e6341cb..2d92136 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -30,15 +30,15 @@ const MYSQL_DB_NAME = 'bot' */ const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('� *MUCHOS* bolsos ...') + .addAnswer('🤯 *MUCHOS* bolsos ...') .addAnswer('y mas bolsos... bla bla') const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('� repito que tengo *MUCHOS* zapatos.') + .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') .addAnswer('y algunas otras cosas.') const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('� Veo que elegiste zapatos') + .addAnswer('🤯 Veo que elegiste zapatos') .addAnswer('Tengo muchos zapatos...bla bla') .addAnswer( ['Manda:', '*(2) Zapatos2*', 'para mas información'], @@ -52,7 +52,7 @@ const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) ) const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('� Veo que elegiste bolsos') + .addAnswer('🙌 Veo que elegiste bolsos') .addAnswer('Tengo muchos bolsos...bla bla') .addAnswer( ['Manda:', '*(2) Bolsos2*', 'para mas información.'], From 47a59dc989d529b2fab378333f32a3a5be87c8e6 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 4 Jan 2023 06:24:31 +0000 Subject: [PATCH 014/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From f7da73050db8b05ca4a7d2cce1edb8459a413edb Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:14:38 +0000 Subject: [PATCH 015/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 5ae588e9cb4419db8476e47fbdf59eff7f46dc46 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:16:24 +0000 Subject: [PATCH 016/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 6d6a4aea8402d5bd0227f0764c02421be910a404 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:30:24 +0000 Subject: [PATCH 017/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 7d22a474089b5feba9597726704a97ec205a65b4 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:31:23 +0000 Subject: [PATCH 018/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index beea8cf..dce6a40 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.31-alpha.0", + "version": "0.0.37-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index c5287d2..3972e00 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.38-alpha.0", + "version": "0.0.44-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 252b6c8..427a7c7 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.49-alpha.0", + "version": "0.0.55-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index c707e02..f34a87d 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.30-alpha.0", + "version": "0.0.36-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 238ca50..7471853 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.36-alpha.0", + "version": "0.0.42-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From a3403dfd9294bfb8cc2e5bb88b5dd5ff7fff15cc Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:47:04 +0000 Subject: [PATCH 019/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 6e8e8090fb814d01834d4aac3e83ae2b70a10bfa Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 4 Jan 2023 21:47:54 +0000 Subject: [PATCH 020/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index dce6a40..4879bc8 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.37-alpha.0", + "version": "0.0.38-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 3972e00..34a71d0 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 427a7c7..2a07645 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.55-alpha.0", + "version": "0.0.56-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index f34a87d..3fd67f3 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.36-alpha.0", + "version": "0.0.37-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 7471853..fa98f64 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From faa4ea01525fa45a0010ff86566953fde6cd4008 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Thu, 5 Jan 2023 00:44:27 +0000 Subject: [PATCH 021/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 62c16785a2c492f2f7be78d5d9e40e2329f22172 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 5 Jan 2023 12:39:40 +0000 Subject: [PATCH 022/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2f9f2169f3a71077c44bb1fc7dd9147e12f545dc Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 5 Jan 2023 13:53:05 +0000 Subject: [PATCH 023/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From f77581fc9d9961187b33b9401b6d3cc80961d203 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 5 Jan 2023 13:57:08 +0000 Subject: [PATCH 024/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 4879bc8..3003990 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.38-alpha.0", + "version": "0.0.39-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 34a71d0..c860046 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.45-alpha.0", + "version": "0.0.46-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 2a07645..d0b33c9 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.56-alpha.0", + "version": "0.0.57-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 3fd67f3..f7debcc 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.37-alpha.0", + "version": "0.0.38-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index fa98f64..1da435c 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.43-alpha.0", + "version": "0.0.44-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 665e19fe5bea3e8e6310c952a05673ce1da77e25 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:07:48 +0000 Subject: [PATCH 025/248] docs(contributor): contrib-readme-action has updated readme --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b4a2271..2cfdab5 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,13 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Manuel Vicente Ortiz + + + cheveguerra +
+ Null +
+ leifermendezfroged @@ -62,6 +69,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Leifer Mendez + + + danielcasta0398 +
+ Juan Daniel Castaño +
+ + + + + marianarolfo +
+ Null +
+ HKong31 @@ -75,8 +97,14 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Zvi
- - + + + + JosephVTX +
+ Joseph Vega Callupe +
+ Gonzalito87 @@ -84,6 +112,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Null + + + jlferrete +
+ Jose Luis Ferrete Olarte +
+ + + + + 6rak0 +
+ Null +
+ tonyvazgar From ba61b6718db92d64646d9d6b7b38c2add27eb456 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 5 Jan 2023 14:08:20 +0000 Subject: [PATCH 026/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From c05de8556fa2f3c8c7b23e930155d6efdbdac478 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:12:32 +0000 Subject: [PATCH 027/248] docs(contributor): contrib-readme-action has updated readme --- README.md | 47 ++--------------------------------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 2cfdab5..b4a2271 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Manuel Vicente Ortiz - - - cheveguerra -
- Null -
- leifermendezfroged @@ -69,21 +62,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Leifer Mendez - - - danielcasta0398 -
- Juan Daniel Castaño -
- - - - - marianarolfo -
- Null -
- HKong31 @@ -97,32 +75,11 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Zvi
- - - - JosephVTX -
- Joseph Vega Callupe -
- - - - Gonzalito87 -
- Null -
- - - - jlferrete -
- Jose Luis Ferrete Olarte -
- - 6rak0 + + Gonzalito87
Null
From 3202d45aa87fbaee91b7d506b74bcc1b52dad7fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:12:34 +0000 Subject: [PATCH 028/248] docs(contributor): contrib-readme-action has updated readme --- README.md | 47 ++--------------------------------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 2cfdab5..b4a2271 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Manuel Vicente Ortiz - - - cheveguerra -
- Null -
- leifermendezfroged @@ -69,21 +62,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Leifer Mendez - - - danielcasta0398 -
- Juan Daniel Castaño -
- - - - - marianarolfo -
- Null -
- HKong31 @@ -97,32 +75,11 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Zvi
- - - - JosephVTX -
- Joseph Vega Callupe -
- - - - Gonzalito87 -
- Null -
- - - - jlferrete -
- Jose Luis Ferrete Olarte -
- - 6rak0 + + Gonzalito87
Null
From 8dad0a49b17339da24dd19a4279ae23dce8a73ff Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Thu, 5 Jan 2023 15:33:48 +0000 Subject: [PATCH 029/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 53fe5b2e14d4f420d29475087d7386893bb12806 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 5 Jan 2023 21:09:20 +0000 Subject: [PATCH 030/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 983db5c7b87ff41aba9d759bf1fadb1ca85543c8 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 6 Jan 2023 06:29:55 +0000 Subject: [PATCH 031/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From ec2041b75a5265b2c90258f4cd8ea99a113457cc Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 6 Jan 2023 06:46:09 +0000 Subject: [PATCH 032/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 6e10a1084d824a096c7cb16c3f0002cc0ba44059 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 09:10:01 +0000 Subject: [PATCH 033/248] =?UTF-8?q?ci(providers):=20=F0=9F=9A=A9=20Check?= =?UTF-8?q?=20BREAKING=20CHANGE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/provider/src/baileys/package.json | 2 +- starters/apps/base-baileys-json/package.json | 2 +- starters/apps/base-baileys-memory/package.json | 2 +- starters/apps/base-baileys-mongo/package.json | 2 +- starters/apps/base-baileys-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json index da529d3..4326d59 100644 --- a/packages/provider/src/baileys/package.json +++ b/packages/provider/src/baileys/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@adiwajshing/baileys": "4.4.0", + "@adiwajshing/baileys": "5.0.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" } diff --git a/starters/apps/base-baileys-json/package.json b/starters/apps/base-baileys-json/package.json index 7693630..a366e88 100644 --- a/starters/apps/base-baileys-json/package.json +++ b/starters/apps/base-baileys-json/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "4.4.0", + "@adiwajshing/baileys": "5.0.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" }, diff --git a/starters/apps/base-baileys-memory/package.json b/starters/apps/base-baileys-memory/package.json index 481e00a..e27fef1 100644 --- a/starters/apps/base-baileys-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "4.4.0", + "@adiwajshing/baileys": "5.0.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" }, diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index d828a88..2b4e0f7 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "4.4.0", + "@adiwajshing/baileys": "5.0.0", "mime-types": "2.1.35", "mongodb": "^4.12.1", "wa-sticker-formatter": "4.3.2" diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 4a7b07a..2d1684f 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "4.4.0", + "@adiwajshing/baileys": "5.0.0", "mime-types": "2.1.35", "mysql2": "^2.3.3", "wa-sticker-formatter": "4.3.2" From 0feb51cfd07222b104f2d7e95ee34ea2f7c29848 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 12:20:22 +0100 Subject: [PATCH 034/248] build(bot): :zap: fix ci --- .github/workflows/check-provider-major.yml | 12 +++++++----- .github/workflows/contributors.yml | 1 - packages/provider/src/baileys/package.json | 2 +- scripts/checker.js | 12 +++++++++--- starters/apps/base-baileys-json/package.json | 2 +- starters/apps/base-baileys-memory/package.json | 2 +- starters/apps/base-baileys-mongo/package.json | 2 +- starters/apps/base-baileys-mysql/package.json | 2 +- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/.github/workflows/check-provider-major.yml b/.github/workflows/check-provider-major.yml index 5f0227b..9557ead 100644 --- a/.github/workflows/check-provider-major.yml +++ b/.github/workflows/check-provider-major.yml @@ -25,20 +25,22 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Check Baileys - run: yarn node ./scripts/checker.js --name=baileys --stable=false + run: yarn node ./scripts/checker.js --name=baileys --stable=true - name: Check Venom - run: yarn node ./scripts/checker.js --name=venom --stable=false + run: yarn node ./scripts/checker.js --name=venom --stable=true - name: Check web-whatsapp - run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=false + run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true - name: Check Meta - run: yarn node ./scripts/checker.js --name=meta --stable=false + run: yarn node ./scripts/checker.js --name=meta --stable=true - name: Check Twilio - run: yarn node ./scripts/checker.js --name=twilio --stable=false + run: yarn node ./scripts/checker.js --name=twilio --stable=true - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: 'ci(providers): 🚩 Check BREAKING CHANGE' + create_branch: true + branch: feature/breaking-change diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index a7d4e46..9f9e814 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -6,7 +6,6 @@ on: pull_request: branches: - dev - - main types: [closed] jobs: diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json index 4326d59..da529d3 100644 --- a/packages/provider/src/baileys/package.json +++ b/packages/provider/src/baileys/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@adiwajshing/baileys": "5.0.0", + "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" } diff --git a/scripts/checker.js b/scripts/checker.js index 67952c8..b68cd57 100644 --- a/scripts/checker.js +++ b/scripts/checker.js @@ -47,9 +47,15 @@ const checkPkgStable = async (pkgName = '', version = '') => { } ) - const listVersions = JSON.parse(stdout).reverse() - console.log(`[${pkgName}]: `, listVersions) - return listVersions.at(0) + try { + const listVersions = JSON.parse(stdout).reverse() + console.log(`[${pkgName}]: `, listVersions) + return listVersions.at(0) + } catch (e) { + const listVersions = [stdout.trim().replace('\n').replaceAll('"', '')] + console.log(`[${pkgName}]: `, listVersions) + return listVersions.at(0) + } } /** diff --git a/starters/apps/base-baileys-json/package.json b/starters/apps/base-baileys-json/package.json index a366e88..7693630 100644 --- a/starters/apps/base-baileys-json/package.json +++ b/starters/apps/base-baileys-json/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "5.0.0", + "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" }, diff --git a/starters/apps/base-baileys-memory/package.json b/starters/apps/base-baileys-memory/package.json index e27fef1..481e00a 100644 --- a/starters/apps/base-baileys-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "5.0.0", + "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" }, diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index 2b4e0f7..d828a88 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "5.0.0", + "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mongodb": "^4.12.1", "wa-sticker-formatter": "4.3.2" diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 2d1684f..4a7b07a 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -13,7 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "@adiwajshing/baileys": "5.0.0", + "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mysql2": "^2.3.3", "wa-sticker-formatter": "4.3.2" From d945f0ea7954a7df1971ef6a0ca02dff33d9af0a Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:22:17 +0000 Subject: [PATCH 035/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 15c3747fbf64a99565f96a4e26762b98c1dc5d2c Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:22:35 +0000 Subject: [PATCH 036/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From e07e6c5e19526ad02af1d8d917738936d4c4bbc3 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:26:37 +0000 Subject: [PATCH 037/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 3003990..7c90391 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.39-alpha.0", + "version": "0.0.40-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index c860046..8cdaee4 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.46-alpha.0", + "version": "0.0.47-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index d0b33c9..963569e 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.57-alpha.0", + "version": "0.0.58-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index f7debcc..443e245 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.38-alpha.0", + "version": "0.0.39-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 1da435c..08b00b4 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From db7257638a476267027f8ebad6151ef8cbeb7a59 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 12:32:27 +0100 Subject: [PATCH 038/248] build: :rocket: new release --- .github/workflows/releases.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index ac91a75..daafe13 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -48,6 +48,9 @@ jobs: - name: Release @bot-whatsapp/provider run: yarn node ./scripts/release.js --name=provider --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}" + - name: Set CHANGELOG + run: yarn release + - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 with: From 75ec60a1bfbded636dae700ae226251a79bf9d11 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:34:16 +0000 Subject: [PATCH 039/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 9b77b3f14877c6065df0a1e0878c2eb90031f5e8 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:34:21 +0000 Subject: [PATCH 040/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 21773e244e6f83926108db3b824f520e6bf1b049 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:36:30 +0000 Subject: [PATCH 041/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From acf13fb02fe05c7a905f7c8c8d527e7a8380d9b9 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:37:07 +0000 Subject: [PATCH 042/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 7c90391..fa7dc12 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.40-alpha.0", + "version": "0.0.41-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 8cdaee4..5a86b89 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.47-alpha.0", + "version": "0.0.48-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 963569e..c96f366 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.58-alpha.0", + "version": "0.0.59-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 443e245..50a5cee 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.39-alpha.0", + "version": "0.0.40-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 08b00b4..9fb35b8 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.45-alpha.0", + "version": "0.0.46-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 31a7b58709d45530b428f99b47a24769f382b64d Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 12:42:20 +0100 Subject: [PATCH 043/248] build: :rocket: new release --- .github/workflows/check-providers.yml | 3 --- .github/workflows/ci.yml | 3 --- package.json | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml index 5bdae6c..9965606 100644 --- a/.github/workflows/check-providers.yml +++ b/.github/workflows/check-providers.yml @@ -1,9 +1,6 @@ name: Rev Providers on: - push: - branches: - - dev pull_request: branches: - dev diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82f5ff0..8fd8fa3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,6 @@ name: Build and Test on: - push: - branches: - - dev pull_request: branches: - dev diff --git a/package.json b/package.json index cd6eb54..72109ae 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "prepare": "npx husky install", "preinstall": "npx only-allow yarn", "postinstall": "npx prettier --write .", - "release": "standard-version -- --prerelease" + "release": "standard-version -- --prerelease --global" }, "workspaces": [ "packages/create-bot-whatsapp", From 2040f857a56d2d6eee6504b6bb602476831d0a44 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:44:19 +0000 Subject: [PATCH 044/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From a71566f2ad3bf37deb450dac350c4ff858cd4120 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:45:52 +0000 Subject: [PATCH 045/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index fa7dc12..4a722ce 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.41-alpha.0", + "version": "0.0.42-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a86b89..5a0007c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.48-alpha.0", + "version": "0.0.49-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index c96f366..ddfae8e 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.59-alpha.0", + "version": "0.0.60-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 50a5cee..6d8e007 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.40-alpha.0", + "version": "0.0.41-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 9fb35b8..d5c0ea2 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.46-alpha.0", + "version": "0.0.47-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From a6c10fe414b8502c0ddfefa63c4e75d264d95346 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 14:31:04 +0100 Subject: [PATCH 046/248] chore: :art: working --- packages/bot/core/core.class.js | 43 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 7550dd0..9491219 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -18,6 +18,7 @@ class CoreClass { flowClass databaseClass providerClass + listCallbacks = [] constructor(_flow, _database, _provider) { this.flowClass = _flow this.databaseClass = _database @@ -114,18 +115,24 @@ class CoreClass { } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = (inRef) => { - this.flowClass.allCallbacks[inRef](messageCtxInComming, { - fallBack, - flowDynamic, - }) - } + const cbEveryCtx = + (inRef, _injectMessageCtx, _injectfallBack, _injectflowDynamic) => + () => { + this.flowClass.allCallbacks[inRef](_injectMessageCtx, { + fallBack: _injectfallBack, + flowDynamic: _injectflowDynamic, + }) + } // 📄 [options: callback]: Si se tiene un callback se ejecuta - if (!fallBackFlag) { - if (refToContinue?.options?.capture) cbEveryCtx(refToContinue?.ref) - for (const ite of this.flowClass.find(body)) { - if (!ite?.options?.capture) cbEveryCtx(ite?.ref) + const callAllCb = (_msgToList = []) => { + for (const ite of _msgToList) { + this.listCallbacks[ite?.ref] = cbEveryCtx( + ite?.ref, + messageCtxInComming, + fallBack, + flowDynamic + ) } } @@ -138,10 +145,7 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - for (const ite of msgToSend) { - cbEveryCtx(ite?.ref) - } - + callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } @@ -153,12 +157,14 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] + callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] + callAllCb(msgToSend) this.sendFlow(msgToSend, from) } @@ -169,10 +175,19 @@ class CoreClass { * @returns */ sendProviderAndSave = (numberOrId, ctxMessage) => { + const executeCb = (ref) => { + try { + return this.listCallbacks[ref]() + } catch (e) { + return Promise.resolve() + } + } + const { answer } = ctxMessage return Promise.all([ this.providerClass.sendMessage(numberOrId, answer, ctxMessage), this.databaseClass.save({ ...ctxMessage, from: numberOrId }), + executeCb(ctxMessage?.ref), ]) } From e8e14d3b6514dc080de86dd595e89d41cafbcc1a Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 15:12:33 +0100 Subject: [PATCH 047/248] build: :zap: ready for video --- packages/bot/core/core.class.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 9491219..2f76071 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -106,6 +106,7 @@ class CoreClass { from, keyword: null, index, + options: prevMsg?.options ?? {}, }) ) .slice(0, optListMsg.limit) From 0451043a212c513bada629e6fa7ee902f9330796 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 15:05:32 +0000 Subject: [PATCH 048/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 930e120d70ef09d274b19484e5656949bf7c08af Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 15:09:04 +0000 Subject: [PATCH 049/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 4a722ce..6382380 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a0007c..71fec46 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.49-alpha.0", + "version": "0.0.50-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index ddfae8e..2ef3d52 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.60-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 6d8e007..191750c 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.41-alpha.0", + "version": "0.0.42-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index d5c0ea2..84ae965 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.47-alpha.0", + "version": "0.0.48-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From b588479fd155e91a9af82d0d871aa68bbcf789b8 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 19:17:18 +0000 Subject: [PATCH 050/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 8017426cfcd7351965c1ce99284632590483b2be Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 19:18:41 +0000 Subject: [PATCH 051/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 6382380..cf9f3e0 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.43-alpha.0", + "version": "0.0.44-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 71fec46..0279c4d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.50-alpha.0", + "version": "0.0.51-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 2ef3d52..5dce363 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.61-alpha.0", + "version": "0.0.62-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 191750c..616b1c2 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 84ae965..607e549 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.48-alpha.0", + "version": "0.0.49-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 6ea377e9e55c62b9228ab8ee524f69f3069daf25 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 21:20:08 +0100 Subject: [PATCH 052/248] build: :zap: working fallback, flowDynamic --- packages/bot/core/core.class.js | 44 +++++++++++---------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 2f76071..4243713 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -18,7 +18,6 @@ class CoreClass { flowClass databaseClass providerClass - listCallbacks = [] constructor(_flow, _database, _provider) { this.flowClass = _flow this.databaseClass = _database @@ -106,7 +105,6 @@ class CoreClass { from, keyword: null, index, - options: prevMsg?.options ?? {}, }) ) .slice(0, optListMsg.limit) @@ -116,24 +114,18 @@ class CoreClass { } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = - (inRef, _injectMessageCtx, _injectfallBack, _injectflowDynamic) => - () => { - this.flowClass.allCallbacks[inRef](_injectMessageCtx, { - fallBack: _injectfallBack, - flowDynamic: _injectflowDynamic, - }) - } + const cbEveryCtx = (inRef) => { + this.flowClass.allCallbacks[inRef](messageCtxInComming, { + fallBack, + flowDynamic, + }) + } // 📄 [options: callback]: Si se tiene un callback se ejecuta - const callAllCb = (_msgToList = []) => { - for (const ite of _msgToList) { - this.listCallbacks[ite?.ref] = cbEveryCtx( - ite?.ref, - messageCtxInComming, - fallBack, - flowDynamic - ) + if (!fallBackFlag) { + if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) + for (const ite of this.flowClass.find(body)) { + if (!ite?.options?.capture) cbEveryCtx(ite?.ref) } } @@ -146,7 +138,10 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - callAllCb(msgToSend) + for (const ite of msgToSend) { + cbEveryCtx(ite?.ref) + } + this.sendFlow(msgToSend, from) return } @@ -158,14 +153,12 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] - callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] - callAllCb(msgToSend) this.sendFlow(msgToSend, from) } @@ -176,19 +169,10 @@ class CoreClass { * @returns */ sendProviderAndSave = (numberOrId, ctxMessage) => { - const executeCb = (ref) => { - try { - return this.listCallbacks[ref]() - } catch (e) { - return Promise.resolve() - } - } - const { answer } = ctxMessage return Promise.all([ this.providerClass.sendMessage(numberOrId, answer, ctxMessage), this.databaseClass.save({ ...ctxMessage, from: numberOrId }), - executeCb(ctxMessage?.ref), ]) } From 716349a8394ed6a8355dedc69110ad2f6dbd711a Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 09:08:56 +0000 Subject: [PATCH 053/248] =?UTF-8?q?ci(providers):=20=F0=9F=9A=A9=20Check?= =?UTF-8?q?=20BREAKING=20CHANGE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 5d10cb9026da60043e9a2f86117ebb04d0631a3f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:34:17 +0100 Subject: [PATCH 054/248] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 3b46135..9f89e13 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -4,7 +4,7 @@ const pino = require('pino') const rimraf = require('rimraf') const mime = require('mime-types') const { join } = require('path') -const { existsSync, createWriteStream } = require('fs') +const { existsSync, createWriteStream, readFileSync } = require('fs') const { Console } = require('console') const { @@ -167,8 +167,8 @@ class BaileysProvider extends ProviderClass { sendMedia = async (number, imageUrl, text) => { const fileDownloaded = await baileyDownloadMedia(imageUrl) return this.vendor.sendMessage(number, { - image: { url: fileDownloaded }, - text, + image: readFileSync(fileDownloaded), + caption: text, }) } From 391e11ce738cd64792b5237d69f3739b0263c198 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:59:25 +0100 Subject: [PATCH 055/248] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 9f89e13..e5c2276 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -238,6 +238,9 @@ class BaileysProvider extends ProviderClass { }, })) + + console.log(templateButtons) + return this.vendor.sendMessage(`${numberClean}@c.us`, { text, footer: '', From 2ddea5468d235035478d4e91e63c821da19da179 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:59:48 +0100 Subject: [PATCH 056/248] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index e5c2276..7f25b80 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -137,7 +137,7 @@ class BaileysProvider extends ProviderClass { } const btnCtx = - payload?.message?.templateButtonReplyMessage + payload?.message?.buttonsResponseMessage ?.selectedDisplayText if (btnCtx) payload.body = btnCtx @@ -229,23 +229,22 @@ class BaileysProvider extends ProviderClass { */ sendButtons = async (number, text, buttons) => { - const numberClean = number.replace('+', '') + const numberClean = baileyCleanNumber(number) + const templateButtons = buttons.map((btn, i) => ({ - index: `${i}`, - quickReplyButton: { - displayText: btn.body, - id: `id-btn-${i}`, - }, + buttonId: `id-btn-${i}`, + buttonText: { displayText: btn.body }, + type: 1, })) - - console.log(templateButtons) - - return this.vendor.sendMessage(`${numberClean}@c.us`, { + const buttonMessage = { text, footer: '', - templateButtons: templateButtons, - }) + buttons: templateButtons, + headerType: 1, + } + + return this.vendor.sendMessage(numberClean, buttonMessage) } /** From 4ff02d2bfa238cafaa6165f06e8eba459f718447 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 17:55:11 +0100 Subject: [PATCH 057/248] build: :zap: fix --- .../contexts/src/dialogflow/dialogflow.class.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index ffe50e7..ebd92bc 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -97,13 +97,21 @@ class DialogFlowContext extends CoreClass { }) customPayload = { - media: fields?.media?.stringValue, - buttons: mapButtons, + options: { + media: fields?.media?.stringValue, + buttons: mapButtons, + }, } + + const ctxFromDX = { + ...customPayload, + answer: fields?.answer?.stringValue, + } + this.sendFlow([ctxFromDX], from) + return } const ctxFromDX = { - ...customPayload, answer: queryResult?.fulfillmentText, } From 4f2fbaf21b09c1f39df11e6f372d8e018e4af9c2 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 16:57:18 +0000 Subject: [PATCH 058/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2ad57a8be1adab01a3308e37b26f812b42684fef Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 16:57:52 +0000 Subject: [PATCH 059/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index cf9f3e0..77cb142 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 0279c4d..04118d7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.51-alpha.0", + "version": "0.0.52-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 5dce363..bb19123 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.62-alpha.0", + "version": "0.0.63-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 616b1c2..cdab548 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.43-alpha.0", + "version": "0.0.44-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 607e549..4c53f47 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.49-alpha.0", + "version": "0.0.50-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From f9e3bbc6655060408e4fdbe1d7e920c2ed4fca53 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Sun, 8 Jan 2023 04:57:27 -0600 Subject: [PATCH 060/248] feat: agregamos dockerfile y webserver a starters agregamos dockerfile y webserver a starters --- .gitignore | 4 +++ starters/apps/base-baileys-json/Dockerfile | 7 +++++ starters/apps/base-baileys-json/app.js | 2 ++ .../apps/base-baileys-json/public/index.html | 12 ++++++++ .../apps/base-baileys-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-memory/Dockerfile | 7 +++++ starters/apps/base-baileys-memory/app.js | 2 ++ .../base-baileys-memory/public/index.html | 12 ++++++++ .../apps/base-baileys-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-mongo/Dockerfile | 7 +++++ starters/apps/base-baileys-mongo/app.js | 2 ++ .../apps/base-baileys-mongo/public/index.html | 12 ++++++++ .../apps/base-baileys-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-mysql/Dockerfile | 7 +++++ starters/apps/base-baileys-mysql/app.js | 2 ++ .../apps/base-baileys-mysql/public/index.html | 12 ++++++++ .../apps/base-baileys-mysql/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-json/Dockerfile | 7 +++++ starters/apps/base-venom-json/app.js | 2 ++ .../apps/base-venom-json/public/index.html | 12 ++++++++ starters/apps/base-venom-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-memory/Dockerfile | 7 +++++ starters/apps/base-venom-memory/app.js | 2 ++ .../apps/base-venom-memory/public/index.html | 12 ++++++++ .../apps/base-venom-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-mongo/Dockerfile | 7 +++++ starters/apps/base-venom-mongo/app.js | 2 ++ .../apps/base-venom-mongo/public/index.html | 12 ++++++++ starters/apps/base-venom-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-mysql/Dockerfile | 7 +++++ starters/apps/base-venom-mysql/app.js | 2 ++ .../apps/base-venom-mysql/public/index.html | 12 ++++++++ starters/apps/base-venom-mysql/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-json/Dockerfile | 7 +++++ starters/apps/base-wweb-json/app.js | 2 ++ .../apps/base-wweb-json/public/index.html | 12 ++++++++ starters/apps/base-wweb-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-memory/Dockerfile | 7 +++++ starters/apps/base-wweb-memory/app.js | 2 ++ .../apps/base-wweb-memory/public/index.html | 12 ++++++++ starters/apps/base-wweb-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-mongo/Dockerfile | 7 +++++ starters/apps/base-wweb-mongo/app.js | 2 ++ .../apps/base-wweb-mongo/public/index.html | 12 ++++++++ starters/apps/base-wweb-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-mysql/Dockerfile | 7 +++++ starters/apps/base-wweb-mysql/app.js | 2 ++ .../apps/base-wweb-mysql/public/index.html | 12 ++++++++ starters/apps/base-wweb-mysql/server.http.js | 30 +++++++++++++++++++ 49 files changed, 616 insertions(+) create mode 100644 starters/apps/base-baileys-json/Dockerfile create mode 100644 starters/apps/base-baileys-json/public/index.html create mode 100644 starters/apps/base-baileys-json/server.http.js create mode 100644 starters/apps/base-baileys-memory/Dockerfile create mode 100644 starters/apps/base-baileys-memory/public/index.html create mode 100644 starters/apps/base-baileys-memory/server.http.js create mode 100644 starters/apps/base-baileys-mongo/Dockerfile create mode 100644 starters/apps/base-baileys-mongo/public/index.html create mode 100644 starters/apps/base-baileys-mongo/server.http.js create mode 100644 starters/apps/base-baileys-mysql/Dockerfile create mode 100644 starters/apps/base-baileys-mysql/public/index.html create mode 100644 starters/apps/base-baileys-mysql/server.http.js create mode 100644 starters/apps/base-venom-json/Dockerfile create mode 100644 starters/apps/base-venom-json/public/index.html create mode 100644 starters/apps/base-venom-json/server.http.js create mode 100644 starters/apps/base-venom-memory/Dockerfile create mode 100644 starters/apps/base-venom-memory/public/index.html create mode 100644 starters/apps/base-venom-memory/server.http.js create mode 100644 starters/apps/base-venom-mongo/Dockerfile create mode 100644 starters/apps/base-venom-mongo/public/index.html create mode 100644 starters/apps/base-venom-mongo/server.http.js create mode 100644 starters/apps/base-venom-mysql/Dockerfile create mode 100644 starters/apps/base-venom-mysql/public/index.html create mode 100644 starters/apps/base-venom-mysql/server.http.js create mode 100644 starters/apps/base-wweb-json/Dockerfile create mode 100644 starters/apps/base-wweb-json/public/index.html create mode 100644 starters/apps/base-wweb-json/server.http.js create mode 100644 starters/apps/base-wweb-memory/Dockerfile create mode 100644 starters/apps/base-wweb-memory/public/index.html create mode 100644 starters/apps/base-wweb-memory/server.http.js create mode 100644 starters/apps/base-wweb-mongo/Dockerfile create mode 100644 starters/apps/base-wweb-mongo/public/index.html create mode 100644 starters/apps/base-wweb-mongo/server.http.js create mode 100644 starters/apps/base-wweb-mysql/Dockerfile create mode 100644 starters/apps/base-wweb-mysql/public/index.html create mode 100644 starters/apps/base-wweb-mysql/server.http.js diff --git a/.gitignore b/.gitignore index 2a3fcb7..721d12c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,10 @@ mediaSend/* !mediaSend/nota-de-voz.mp3 .env .wwebjs_auth +/session +/session/* +/tokens +/tokens/* packages/cli/config.json config.json .yarnrc.yml diff --git a/starters/apps/base-baileys-json/Dockerfile b/starters/apps/base-baileys-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-json/app.js b/starters/apps/base-baileys-json/app.js index 267d860..99ecf65 100644 --- a/starters/apps/base-baileys-json/app.js +++ b/starters/apps/base-baileys-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-baileys-json/public/index.html b/starters/apps/base-baileys-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/Dockerfile b/starters/apps/base-baileys-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index 3b967a8..522bb6c 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/Dockerfile b/starters/apps/base-baileys-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 96f04b0..277115d 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/Dockerfile b/starters/apps/base-baileys-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 6982000..02a13c0 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-json/Dockerfile b/starters/apps/base-venom-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index 8a223b2..c742f78 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/Dockerfile b/starters/apps/base-venom-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 44750c4..6f89ef2 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/Dockerfile b/starters/apps/base-venom-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index 266e2e0..d8de982 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/Dockerfile b/starters/apps/base-venom-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index fe19fa5..24da8ee 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/Dockerfile b/starters/apps/base-wweb-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 2b8a55d..31f03dd 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/Dockerfile b/starters/apps/base-wweb-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 1e47221..5318283 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/Dockerfile b/starters/apps/base-wweb-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index e78f1b1..34f3887 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -8,6 +8,8 @@ const { const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') +require('./server.http') + /** * Declaramos las conexiones de Mongo */ diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/Dockerfile b/starters/apps/base-wweb-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2d92136..2095842 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) From 5a033da83aee1f614120bccf27c9f330500cc7b0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 8 Jan 2023 15:54:32 +0100 Subject: [PATCH 061/248] fix(provider): fix error docker as root user --- packages/provider/src/web-whatsapp/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index ef9427f..5c35a6c 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -24,6 +24,7 @@ class WebWhatsappProvider extends ProviderClass { super() this.vendor = new Client({ authStrategy: new LocalAuth(), + puppeteer: { headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'] } }) const listEvents = this.busEvents() From 4e0d33c6bb46ad259774f6d0c38c6c0b5f8ca4a9 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 8 Jan 2023 16:47:28 +0100 Subject: [PATCH 062/248] fix: :zap: add Dockerfile, starter --- .../apps/base-baileys-json/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-json/server.http.js | 20 +++-- .../base-baileys-memory/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-memory/server.http.js | 20 +++-- .../apps/base-baileys-mongo/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-mongo/server.http.js | 20 +++-- .../apps/base-baileys-mysql/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-mysql/server.http.js | 20 +++-- starters/apps/base-venom-json/Dockerfile | 25 ++++++- .../apps/base-venom-json/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-json/server.http.js | 20 +++-- starters/apps/base-venom-memory/Dockerfile | 25 ++++++- .../apps/base-venom-memory/public/index.html | 74 ++++++++++++++++++- .../apps/base-venom-memory/server.http.js | 20 +++-- starters/apps/base-venom-mongo/Dockerfile | 25 ++++++- .../apps/base-venom-mongo/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-mongo/server.http.js | 20 +++-- starters/apps/base-venom-mysql/Dockerfile | 25 ++++++- .../apps/base-venom-mysql/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-mysql/server.http.js | 20 +++-- starters/apps/base-wweb-json/Dockerfile | 25 ++++++- .../apps/base-wweb-json/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-json/server.http.js | 20 +++-- starters/apps/base-wweb-memory/Dockerfile | 25 ++++++- .../apps/base-wweb-memory/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-memory/server.http.js | 20 +++-- starters/apps/base-wweb-mongo/Dockerfile | 25 ++++++- .../apps/base-wweb-mongo/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-mongo/server.http.js | 20 +++-- starters/apps/base-wweb-mysql/Dockerfile | 25 ++++++- .../apps/base-wweb-mysql/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-mysql/server.http.js | 20 +++-- 32 files changed, 1164 insertions(+), 164 deletions(-) diff --git a/starters/apps/base-baileys-json/public/index.html b/starters/apps/base-baileys-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-json/public/index.html +++ b/starters/apps/base-baileys-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-json/server.http.js +++ b/starters/apps/base-baileys-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-memory/public/index.html +++ b/starters/apps/base-baileys-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-memory/server.http.js +++ b/starters/apps/base-baileys-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-mongo/public/index.html +++ b/starters/apps/base-baileys-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-mongo/server.http.js +++ b/starters/apps/base-baileys-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-mysql/public/index.html +++ b/starters/apps/base-baileys-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-mysql/server.http.js +++ b/starters/apps/base-baileys-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-json/Dockerfile b/starters/apps/base-venom-json/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-json/Dockerfile +++ b/starters/apps/base-venom-json/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-json/public/index.html +++ b/starters/apps/base-venom-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-json/server.http.js +++ b/starters/apps/base-venom-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/Dockerfile b/starters/apps/base-venom-memory/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-memory/Dockerfile +++ b/starters/apps/base-venom-memory/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-memory/public/index.html +++ b/starters/apps/base-venom-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-memory/server.http.js +++ b/starters/apps/base-venom-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/Dockerfile b/starters/apps/base-venom-mongo/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-mongo/Dockerfile +++ b/starters/apps/base-venom-mongo/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-mongo/public/index.html +++ b/starters/apps/base-venom-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-mongo/server.http.js +++ b/starters/apps/base-venom-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/Dockerfile b/starters/apps/base-venom-mysql/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-mysql/Dockerfile +++ b/starters/apps/base-venom-mysql/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-mysql/public/index.html +++ b/starters/apps/base-venom-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-mysql/server.http.js +++ b/starters/apps/base-venom-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/Dockerfile b/starters/apps/base-wweb-json/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-json/Dockerfile +++ b/starters/apps/base-wweb-json/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-json/public/index.html +++ b/starters/apps/base-wweb-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-json/server.http.js +++ b/starters/apps/base-wweb-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/Dockerfile b/starters/apps/base-wweb-memory/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-memory/Dockerfile +++ b/starters/apps/base-wweb-memory/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-memory/public/index.html +++ b/starters/apps/base-wweb-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-memory/server.http.js +++ b/starters/apps/base-wweb-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/Dockerfile b/starters/apps/base-wweb-mongo/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-mongo/Dockerfile +++ b/starters/apps/base-wweb-mongo/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-mongo/public/index.html +++ b/starters/apps/base-wweb-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-mongo/server.http.js +++ b/starters/apps/base-wweb-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/Dockerfile b/starters/apps/base-wweb-mysql/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-mysql/Dockerfile +++ b/starters/apps/base-wweb-mysql/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-mysql/public/index.html +++ b/starters/apps/base-wweb-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-mysql/server.http.js +++ b/starters/apps/base-wweb-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) From 1c5da9cc6addf58e363dae892b69d4c265613eb4 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sun, 8 Jan 2023 15:52:28 +0000 Subject: [PATCH 063/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- packages/provider/src/web-whatsapp/index.js | 9 ++++++++- 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 77cb142..fc82ecf 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.45-alpha.0", + "version": "0.0.46-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 04118d7..3984281 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.52-alpha.0", + "version": "0.0.53-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index bb19123..09b5ff1 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.63-alpha.0", + "version": "0.0.64-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index cdab548..4c50a2e 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 4c53f47..f778bfc 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.50-alpha.0", + "version": "0.0.51-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 5c35a6c..07b37da 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -24,7 +24,14 @@ class WebWhatsappProvider extends ProviderClass { super() this.vendor = new Client({ authStrategy: new LocalAuth(), - puppeteer: { headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'] } + puppeteer: { + headless: true, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--unhandled-rejections=strict', + ], + }, }) const listEvents = this.busEvents() From 3de5f4b77a10e30632ff7555f5af5d8e93cb2019 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 9 Jan 2023 18:37:58 +0100 Subject: [PATCH 064/248] feat: :zap: new portal web for qr scan --- .github/workflows/ci.yml | 2 +- .github/workflows/releases-dev.yml | 2 +- .github/workflows/releases.yml | 2 +- package.json | 6 +- packages/portal/.eslintignore | 33 + packages/portal/.eslintrc.cjs | 41 + packages/portal/.gitignore | 38 + packages/portal/.prettierignore | 6 + packages/portal/README.md | 71 + .../portal/adaptors/static/vite.config.ts | 19 + packages/portal/package.json | 48 + packages/portal/portal.http.js | 56 + packages/portal/public/favicon.svg | 1 + packages/portal/public/manifest.json | 9 + packages/portal/public/robots.txt | 0 packages/portal/public/water-mark.png | Bin 0 -> 95495 bytes packages/portal/rollup-portal.config.js | 13 + .../portal/src/components/header/header.css | 36 + .../portal/src/components/header/header.tsx | 47 + packages/portal/src/components/icons/bot.css | 12 + packages/portal/src/components/icons/bot.tsx | 18 + packages/portal/src/components/icons/qwik.tsx | 38 + packages/portal/src/components/qr/qr.css | 12 + packages/portal/src/components/qr/qr.tsx | 35 + .../components/router-head/router-head.tsx | 32 + packages/portal/src/entry.dev.tsx | 18 + packages/portal/src/entry.preview.tsx | 20 + packages/portal/src/entry.ssr.tsx | 28 + packages/portal/src/global.css | 125 ++ packages/portal/src/root.tsx | 29 + packages/portal/src/routes/index.css | 23 + packages/portal/src/routes/index.tsx | 61 + packages/portal/src/routes/layout.tsx | 20 + packages/portal/src/routes/service-worker.ts | 18 + packages/portal/tsconfig.json | 26 + packages/portal/vite.config.ts | 23 + packages/provider/src/web-whatsapp/index.js | 9 +- scripts/move.js | 24 +- yarn.lock | 1356 +++++++++++++---- 39 files changed, 2054 insertions(+), 303 deletions(-) create mode 100644 packages/portal/.eslintignore create mode 100644 packages/portal/.eslintrc.cjs create mode 100644 packages/portal/.gitignore create mode 100644 packages/portal/.prettierignore create mode 100644 packages/portal/README.md create mode 100644 packages/portal/adaptors/static/vite.config.ts create mode 100644 packages/portal/package.json create mode 100644 packages/portal/portal.http.js create mode 100644 packages/portal/public/favicon.svg create mode 100644 packages/portal/public/manifest.json create mode 100644 packages/portal/public/robots.txt create mode 100644 packages/portal/public/water-mark.png create mode 100644 packages/portal/rollup-portal.config.js create mode 100644 packages/portal/src/components/header/header.css create mode 100644 packages/portal/src/components/header/header.tsx create mode 100644 packages/portal/src/components/icons/bot.css create mode 100644 packages/portal/src/components/icons/bot.tsx create mode 100644 packages/portal/src/components/icons/qwik.tsx create mode 100644 packages/portal/src/components/qr/qr.css create mode 100644 packages/portal/src/components/qr/qr.tsx create mode 100644 packages/portal/src/components/router-head/router-head.tsx create mode 100644 packages/portal/src/entry.dev.tsx create mode 100644 packages/portal/src/entry.preview.tsx create mode 100644 packages/portal/src/entry.ssr.tsx create mode 100644 packages/portal/src/global.css create mode 100644 packages/portal/src/root.tsx create mode 100644 packages/portal/src/routes/index.css create mode 100644 packages/portal/src/routes/index.tsx create mode 100644 packages/portal/src/routes/layout.tsx create mode 100644 packages/portal/src/routes/service-worker.ts create mode 100644 packages/portal/tsconfig.json create mode 100644 packages/portal/vite.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8fd8fa3..968147b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Build Eslint rules run: yarn lint:fix diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index a2d9979..165b906 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -27,7 +27,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Release @bot-whatsapp/bot run: yarn node ./scripts/release.js --name=bot --version= --token="${{ secrets.NPM_TOKEN }}" diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index daafe13..1b07570 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -31,7 +31,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Release @bot-whatsapp/bot run: yarn node ./scripts/release.js --name=bot --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}" diff --git a/package.json b/package.json index 72109ae..af82cd9 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,15 @@ "contexts:rollup": "rollup --config ./packages/contexts/rollup-contexts.config.js", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js", "create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js", + "portal:rollup": "rollup --config ./packages/portal/rollup-portal.config.js", "format:check": "prettier --check ./packages", "format:write": "prettier --write ./packages", "fmt.staged": "pretty-quick --staged", "lint:check": "eslint ./packages", "lint:fix": "eslint --fix ./packages", - "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup", + "build:portal-web": "cd ./packages/portal/ && yarn run build.types && yarn run build.client && yarn run build.server && yarn run lint --fix", + "build:full": "yarn run build:portal-web && yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup", + "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", @@ -39,6 +42,7 @@ "packages/database", "packages/provider", "packages/contexts", + "packages/portal", "packages/docs" ], "keywords": [ diff --git a/packages/portal/.eslintignore b/packages/portal/.eslintignore new file mode 100644 index 0000000..73d2683 --- /dev/null +++ b/packages/portal/.eslintignore @@ -0,0 +1,33 @@ +**/*.log +**/.DS_Store +*. +.vscode/settings.json +.history +.yarn +bazel-* +bazel-bin +bazel-out +bazel-qwik +bazel-testlogs +dist +dist-dev +lib +lib-types +etc +external +node_modules +temp +tsc-out +tsdoc-metadata.json +target +output +rollup.config.js +build +.cache +.vscode +.rollup.cache +dist +tsconfig.tsbuildinfo +vite.config.ts +*.spec.tsx +*.spec.ts diff --git a/packages/portal/.eslintrc.cjs b/packages/portal/.eslintrc.cjs new file mode 100644 index 0000000..039b99a --- /dev/null +++ b/packages/portal/.eslintrc.cjs @@ -0,0 +1,41 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:qwik/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + ecmaVersion: 2021, + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + }, + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + 'prefer-spread': 'off', + 'no-case-declarations': 'off', + 'no-console': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + '@typescript-eslint/consistent-type-imports': 'warn', + }, +}; diff --git a/packages/portal/.gitignore b/packages/portal/.gitignore new file mode 100644 index 0000000..e95b829 --- /dev/null +++ b/packages/portal/.gitignore @@ -0,0 +1,38 @@ +# Build +/dist +/lib +/lib-types +/server + +# Development +node_modules + +# Cache +.cache +.mf +.vscode +.rollup.cache +tsconfig.tsbuildinfo + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Editor +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Yarn +.yarn/* +!.yarn/releases diff --git a/packages/portal/.prettierignore b/packages/portal/.prettierignore new file mode 100644 index 0000000..1592248 --- /dev/null +++ b/packages/portal/.prettierignore @@ -0,0 +1,6 @@ +# Files Prettier should not format +**/*.log +**/.DS_Store +*. +dist +node_modules diff --git a/packages/portal/README.md b/packages/portal/README.md new file mode 100644 index 0000000..0b9a2a9 --- /dev/null +++ b/packages/portal/README.md @@ -0,0 +1,71 @@ +# Qwik City App ⚡️ + +- [Qwik Docs](https://qwik.builder.io/) +- [Discord](https://qwik.builder.io/chat) +- [Qwik GitHub](https://github.com/BuilderIO/qwik) +- [@QwikDev](https://twitter.com/QwikDev) +- [Vite](https://vitejs.dev/) + +--- + +## Project Structure + +This project is using Qwik with [QwikCity](https://qwik.builder.io/qwikcity/overview/). QwikCity is just a extra set of tools on top of Qwik to make it easier to build a full site, including directory-based routing, layouts, and more. + +Inside your project, you'll see the following directory structure: + +``` +├── public/ +│ └── ... +└── src/ + ├── components/ + │ └── ... + └── routes/ + └── ... +``` + +- `src/routes`: Provides the directory based routing, which can include a hierarchy of `layout.tsx` layout files, and an `index.tsx` file as the page. Additionally, `index.ts` files are endpoints. Please see the [routing docs](https://qwik.builder.io/qwikcity/routing/overview/) for more info. + +- `src/components`: Recommended directory for components. + +- `public`: Any static assets, like images, can be placed in the public directory. Please see the [Vite public directory](https://vitejs.dev/guide/assets.html#the-public-directory) for more info. + +## Add Integrations and deployment + +Use the `npm run qwik add` command to add additional integrations. Some examples of integrations include: Cloudflare, Netlify or Express server, and the [Static Site Generator (SSG)](https://qwik.builder.io/qwikcity/static-site-generation/static-site-config/). + +```shell +npm run qwik add # or `yarn qwik add` +``` + +## Development + +Development mode uses [Vite's development server](https://vitejs.dev/). During development, the `dev` command will server-side render (SSR) the output. + +```shell +npm start # or `yarn start` +``` + +> Note: during dev mode, Vite may request a significant number of `.js` files. This does not represent a Qwik production build. + +## Preview + +The preview command will create a production build of the client modules, a production build of `src/entry.preview.tsx`, and run a local server. The preview server is only for convenience to locally preview a production build, and it should not be used as a production server. + +```shell +npm run preview # or `yarn preview` +``` + +## Production + +The production build will generate client and server modules by running both client and server build commands. Additionally, the build command will use Typescript to run a type check on the source code. + +```shell +npm run build # or `yarn build` +``` + +## Static Site Generator (Node.js) + +``` +npm run build.server +``` diff --git a/packages/portal/adaptors/static/vite.config.ts b/packages/portal/adaptors/static/vite.config.ts new file mode 100644 index 0000000..dba968a --- /dev/null +++ b/packages/portal/adaptors/static/vite.config.ts @@ -0,0 +1,19 @@ +import { staticAdaptor } from '@builder.io/qwik-city/adaptors/static/vite' +import { extendConfig } from '@builder.io/qwik-city/vite' +import baseConfig from '../../vite.config' + +export default extendConfig(baseConfig, () => { + return { + build: { + ssr: true, + rollupOptions: { + input: ['@qwik-city-plan'], + }, + }, + plugins: [ + staticAdaptor({ + origin: 'https://bot-whatsapp.netlify.app', + }), + ], + } +}) diff --git a/packages/portal/package.json b/packages/portal/package.json new file mode 100644 index 0000000..6ba104a --- /dev/null +++ b/packages/portal/package.json @@ -0,0 +1,48 @@ +{ + "name": "@bot-whatsapp/portal", + "version": "0.0.1-alpha.0", + "description": "Portal WEB para escanear QR", + "main": "./lib/portal.http.cjs", + "scripts": { + "build": "qwik build", + "build.client": "vite build", + "build.preview": "vite build --ssr src/entry.preview.tsx", + "build.server": "vite build -c adaptors/static/vite.config.ts", + "build.types": "tsc --incremental --noEmit", + "deploy": "echo 'Run \"npm run qwik add\" to install a server adaptor'", + "dev": "vite --mode ssr", + "dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force", + "fmt": "prettier --write .", + "fmt.check": "prettier --check .", + "lint": "eslint \"src/**/*.ts*\"", + "preview": "qwik build preview && vite preview --open", + "start": "vite --open --mode ssr", + "qwik": "qwik" + }, + "files": [ + "./dist/*", + "./lib/portal.http.cjs" + ], + "devDependencies": { + "@builder.io/qwik": "0.16.2", + "@builder.io/qwik-city": "0.0.128", + "@types/eslint": "8.4.10", + "@types/node": "^18.11.18", + "@types/node-fetch": "latest", + "@typescript-eslint/eslint-plugin": "5.48.0", + "@typescript-eslint/parser": "5.48.0", + "eslint": "8.31.0", + "eslint-plugin-qwik": "0.16.2", + "node-fetch": "3.3.0", + "prettier": "2.8.1", + "typescript": "4.9.4", + "undici": "5.14.0", + "vite": "4.0.3", + "vite-tsconfig-paths": "3.5.0" + }, + "dependencies": { + "kleur": "^4.1.5", + "polka": "^0.5.2", + "serve-static": "^1.13.1" + } +} diff --git a/packages/portal/portal.http.js b/packages/portal/portal.http.js new file mode 100644 index 0000000..62dc676 --- /dev/null +++ b/packages/portal/portal.http.js @@ -0,0 +1,56 @@ +const { join } = require('path') +const { createReadStream, existsSync } = require('fs') +const { bgYellow, cyan } = require('kleur') +const polka = require('polka') + +const HTTP_PORT = process.env.PORT || 3000 +const QR_FILE = process.env.QR_FILE ?? 'qr.png' +const PUBLIC_URL = + process.env.PUBLIC_URL ?? + process.env.RAILWAY_STATIC_URL ?? + 'http://localhost' + +const dir = [join(__dirname, 'dist'), join(__dirname, '..', 'dist')].find((i) => + existsSync(i) +) +const serve = require('serve-static')(dir) + +/** + * Iniciamos Portal WEB para escanear QR + * @param {port:3000, publicSite:'http://mistio.com', qrFile:'qr.png', dir:__dirname} + */ +const start = ( + { port, publicSite, qrFile } = { + port: HTTP_PORT, + publicSite: PUBLIC_URL, + qrFile: QR_FILE, + } +) => { + polka() + .use(serve) + .get(qrFile, (_, res) => { + const qrSource = [ + join(process.cwd(), qrFile), + join(__dirname, '..', qrFile), + join(__dirname, qrFile), + ].find((i) => existsSync(i)) + + const qrMark = [ + join(__dirname, 'dist', 'water-mark.png'), + join(__dirname, '..', 'dist', 'water-mark.png'), + ].find((i) => existsSync(i)) + const fileStream = createReadStream(qrSource ?? qrMark) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + }) + .listen(port, () => { + console.log(``) + console.log(bgYellow(`🚩 ESCANEAR QR 🚩`)) + console.log(cyan(`Existen varias maneras de escanear el QR code`)) + console.log(cyan(`- Se ha creado un archivo /qr.png`)) + console.log(cyan(`- Tambien puedes visitar ${publicSite}:${port}`)) + console.log(``) + }) +} + +module.exports = start diff --git a/packages/portal/public/favicon.svg b/packages/portal/public/favicon.svg new file mode 100644 index 0000000..0ded7c1 --- /dev/null +++ b/packages/portal/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/portal/public/manifest.json b/packages/portal/public/manifest.json new file mode 100644 index 0000000..44825fa --- /dev/null +++ b/packages/portal/public/manifest.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/web-manifest-combined.json", + "name": "qwik-project-name", + "short_name": "Welcome to Qwik", + "start_url": ".", + "display": "standalone", + "background_color": "#fff", + "description": "A Qwik project app." +} diff --git a/packages/portal/public/robots.txt b/packages/portal/public/robots.txt new file mode 100644 index 0000000..e69de29 diff --git a/packages/portal/public/water-mark.png b/packages/portal/public/water-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..e44ada3c7c0f1c144584f4d812caea656a4c81a5 GIT binary patch literal 95495 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 { + useStylesScoped$(styles) + + return ( +
+ + +
+ ) +}) diff --git a/packages/portal/src/components/icons/bot.css b/packages/portal/src/components/icons/bot.css new file mode 100644 index 0000000..481f167 --- /dev/null +++ b/packages/portal/src/components/icons/bot.css @@ -0,0 +1,12 @@ +.logo { + display: flex; + gap: 0.5rem; + align-items: center; + align-content: center; + color: #1a1a1a; +} + +.logo h1 { + font-size: 1.5rem; + margin: 0; +} diff --git a/packages/portal/src/components/icons/bot.tsx b/packages/portal/src/components/icons/bot.tsx new file mode 100644 index 0000000..3c69ef7 --- /dev/null +++ b/packages/portal/src/components/icons/bot.tsx @@ -0,0 +1,18 @@ +import { component$, useStylesScoped$ } from '@builder.io/qwik' + +import styles from './bot.css?inline' + +export const BotLogo = component$(() => { + useStylesScoped$(styles) + return ( +
+ +

Chatbot

+
+ ) +}) diff --git a/packages/portal/src/components/icons/qwik.tsx b/packages/portal/src/components/icons/qwik.tsx new file mode 100644 index 0000000..3bd8d91 --- /dev/null +++ b/packages/portal/src/components/icons/qwik.tsx @@ -0,0 +1,38 @@ +export const QwikLogo = () => ( + + + + + + + + + +) diff --git a/packages/portal/src/components/qr/qr.css b/packages/portal/src/components/qr/qr.css new file mode 100644 index 0000000..37d8779 --- /dev/null +++ b/packages/portal/src/components/qr/qr.css @@ -0,0 +1,12 @@ +div img { + display: block; + background-color: #f0f0f0; + width: 350px; + height: 350px; + object-fit: contain; + border-radius: 10px; +} +div { + display: flex; + justify-content: center; +} diff --git a/packages/portal/src/components/qr/qr.tsx b/packages/portal/src/components/qr/qr.tsx new file mode 100644 index 0000000..a0fb3d2 --- /dev/null +++ b/packages/portal/src/components/qr/qr.tsx @@ -0,0 +1,35 @@ +import { + component$, + useClientEffect$, + useStore, + useStylesScoped$, +} from '@builder.io/qwik' +import { useLocation } from '@builder.io/qwik-city' +import style from './qr.css?inline' + +export const QR = component$(() => { + useStylesScoped$(style) + const state = useStore({ + count: 0, + }) + + useClientEffect$(() => { + setInterval(() => { + state.count++ + }, 800) + }) + + const location = useLocation() + const qrImage = location.query?.qr ?? 'qr.png' + + return ( +
+ { + const head = useDocumentHead() + const loc = useLocation() + + return ( + <> + {head.title} + + + + + + {head.meta.map((m) => ( + + ))} + + {head.links.map((l) => ( + + ))} + + {head.styles.map((s) => ( + - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/Dockerfile b/starters/apps/base-baileys-memory/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-memory/Dockerfile +++ b/starters/apps/base-baileys-memory/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-memory/README.md b/starters/apps/base-baileys-memory/README.md index a31dc9f..13d73f2 100644 --- a/starters/apps/base-baileys-memory/README.md +++ b/starters/apps/base-baileys-memory/README.md @@ -5,26 +5,8 @@

-**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver documentación](https://bot-whatsapp.netlify.app/)** -```js -const main = async () => { - const adapterDB = new MockAdapter() - const adapterFlow = createFlow([flowPrincipal]) - - const adapterProvider = createProvider(BaileysProvider, { - accountSid: process.env.ACC_SID, - authToken: process.env.ACC_TOKEN, - vendorNumber: process.env.ACC_VENDOR, - }) - - createBot({ - flow: adapterFlow, - provider: adapterProvider, - database: adapterDB, - }) -} -``` ``` npm install diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index 522bb6c..a8fbd00 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -5,86 +5,62 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') -/** - * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: - * - * Menu Principal - * - SubMenu 1 - * - Submenu 1.1 - * - Submenu 2 - * - Submenu 2.1 - * - * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - */ +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer([ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', +]) -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', +]) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) - -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) - -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer([ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', +]) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { const adapterDB = new MockAdapter() const adapterFlow = createFlow([flowPrincipal]) const adapterProvider = createProvider(BaileysProvider) + createBot({ flow: adapterFlow, provider: adapterProvider, database: adapterDB, }) + + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-memory/package.json b/starters/apps/base-baileys-memory/package.json index 481e00a..2d01103 100644 --- a/starters/apps/base-baileys-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-memory", + "name": "base-bailey-memory", "version": "1.0.0", "description": "", "main": "app.js", @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index d828a88..c2f8624 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-mongo", + "name": "base-bailey-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 4a7b07a..7ecb417 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-mysql", + "name": "base-bailey-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-json/package.json b/starters/apps/base-meta-json/package.json index 3243406..e034a53 100644 --- a/starters/apps/base-meta-json/package.json +++ b/starters/apps/base-meta-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-json", + "name": "base-meta-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-memory/package.json b/starters/apps/base-meta-memory/package.json index f86e916..51da345 100644 --- a/starters/apps/base-meta-memory/package.json +++ b/starters/apps/base-meta-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-memory", + "name": "base-meta-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-mongo/package.json b/starters/apps/base-meta-mongo/package.json index 94055f8..686ac63 100644 --- a/starters/apps/base-meta-mongo/package.json +++ b/starters/apps/base-meta-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-mongo", + "name": "base-meta-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-mysql/package.json b/starters/apps/base-meta-mysql/package.json index a9a71b0..45fe39e 100644 --- a/starters/apps/base-meta-mysql/package.json +++ b/starters/apps/base-meta-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-mysql", + "name": "base-meta-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-json/package.json b/starters/apps/base-twilio-json/package.json index 4f5fdf4..00ab354 100644 --- a/starters/apps/base-twilio-json/package.json +++ b/starters/apps/base-twilio-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-json", + "name": "base-twilio-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index e71ca5a..cdfaf65 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-memory", + "name": "base-twilio-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index 4a8c063..69a05bb 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-mongo", + "name": "base-twilio-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index d4c4d37..453955b 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-mysql", + "name": "base-twilio-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index 88d7f6f..4d10427 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-json", + "name": "base-venom-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index dfe5408..57af4e1 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-memory", + "name": "base-venom-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index 3b46613..0d84d2b 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-mongo", + "name": "base-venom-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index 670fd00..a029a70 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-mysql", + "name": "base-venom-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index 9abc893..d55dfeb 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-json", + "name": "base-wweb-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index fbf9400..d9c3ee0 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-memory", + "name": "base-wweb-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index c58767a..e7ecebb 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-mongo", + "name": "base-wweb-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index b1c44ff..3ab34d5 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-mysql", + "name": "base-wweb-mysql", "version": "1.0.0", "description": "", "main": "app.js", From 2fc274725df91d5e83b4f3eab233c149b4715d05 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 11:58:25 +0100 Subject: [PATCH 104/248] docs: :memo: meta added --- .../docs/src/routes/docs/providers/index.mdx | 6 + .../src/routes/docs/providers/meta/index.mdx | 158 +++++++++++++++++- 2 files changed, 163 insertions(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/providers/index.mdx b/packages/docs/src/routes/docs/providers/index.mdx index 26241ec..0f6db6a 100644 --- a/packages/docs/src/routes/docs/providers/index.mdx +++ b/packages/docs/src/routes/docs/providers/index.mdx @@ -39,6 +39,12 @@ Estamos trabajando en el apartado de la documentación lo más claro posible. Pu --- +### Meta: Configuración + +Estamos trabajando en el apartado de la documentación lo más claro posible. Puedes encontrar los [detalles aquí](/docs/providers/meta) + +--- + + En el ejemplo de abajo puedes ver como una sugerencia de como puede ser + utilizando variables de entorno + + +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) + + const adapterProvider = createProvider(MetaProvider, { + jwtToken: process.env.JWTOKEN, //EAARBW3ZBGU0UBAACDjtQIzI8JuEa............. + numberId: process.env.NUMBER_ID, //103975305758520 + verifyToken: process.env.VERIFY_TOKEN, //LO_QUE_SEA + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} + +main() +``` + +--- + +Luego de ejecutar el bot encontraras un mensaje en la consola similar al siguiente. +Donde podrás encontrar la URL para tu **webhook** + +```shell +$ npm start + +> bot-whatsapp-base-meta-memory@1.0.0 start +> node app.js + + +[meta]: Agregar esta url "WHEN A MESSAGE COMES IN" +[meta]: POST http://localhost:3000/webhook +[meta]: Más información en la documentacion +``` + +--- + +## ¿Ahora que hago? + +Podrás observar que el bot inicia un servicio HTTP (endpoint) que debe estar en un servidor en linea para que puedas conectarlo con Meta. + +--- + +### Opción 1: + +Puedes hacer pruebas en local atrevés de un servidor proxy tunnel.  +Descarga **[ngork](https://ngrok.com/download)** es una herramienta gratuita que nos ayudara con esto. + +![](https://i.imgur.com/TjjBtRh.png) + +--- + +Esto genera una URL en línea que podemos usar en la parte de **WebHook** de Meta + +![](https://i.imgur.com/NXHMDsf.png) + +--- + +![](https://i.imgur.com/tpov3D1.png) + +--- + +![](https://i.imgur.com/haRGylR.png) + +--- + +![](https://i.imgur.com/cMaIzeC.png) + +--- + +### Opción 2: + +Si ya tienes desplegado tu bot en un servidor tienes que obtener la IP publica o subdominio que te proporcionaron. **Ejemplo** si estas usando +[Railway](https://railway.app/) puedes ir a la seccion de ajustes y generar un subdominio. Ya tendriamos el **WebHook** +`https://base-twilio-memory-production.up.railway.app/twilio-hook` + +![](https://i.imgur.com/Yg2BYqB.png) + +--- + +![](https://i.imgur.com/dIbyEwp.png) + +--- + + From af44ed12684c54f8c7948c199755c49e5afd9964 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:25:18 +0100 Subject: [PATCH 105/248] ci: :zap: add github release --- .github/workflows/releases-dev.yml | 2 +- .github/workflows/releases.yml | 2 +- package.json | 5 ++- packages/docs/src/components/widgets/Hero.tsx | 9 ++++- scripts/release.js | 38 ++++++++++++++++++- yarn.lock | 1 + 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 6f380a2..7848669 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -3,7 +3,7 @@ name: 🚀 (DEV) Liberando versiones on: push: branches: - - next-release + - release/next jobs: ############ RELEASE ############ diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index df211d4..2fd43fe 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -3,7 +3,7 @@ name: 🚀⚡ Liberando versiones on: push: branches: - - production-release + - release/production jobs: ############ RELEASE ############ release: diff --git a/package.json b/package.json index b15b835..7387dfc 100644 --- a/package.json +++ b/package.json @@ -97,5 +97,8 @@ "npm": "please-use-yarn", "yarn": ">=3" }, - "author": "Leifer Mendez " + "author": "Leifer Mendez ", + "dependencies": { + "@octokit/core": "^4.1.0" + } } diff --git a/packages/docs/src/components/widgets/Hero.tsx b/packages/docs/src/components/widgets/Hero.tsx index 4700421..0e7cc5e 100644 --- a/packages/docs/src/components/widgets/Hero.tsx +++ b/packages/docs/src/components/widgets/Hero.tsx @@ -47,13 +47,20 @@ export default component$(() => { npm create bot-whatsapp@latest
- diff --git a/scripts/release.js b/scripts/release.js index 9dfcc62..e88e740 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -3,16 +3,50 @@ const { join } = require('path') const { execFile } = require('node:child_process') const process = require('node:process') const util = require('node:util') +const { Octokit } = require('@octokit/core') const OS_ENVIROMENT_WIN = process.platform.includes('win32') const semver = require('semver') const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm' -const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN] = process.argv.slice(2) || [null] +const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN, GITHUB_TOKEN] = process.argv.slice( + 2 +) || [null] const PATH_PACKAGES = join(__dirname, '..', `packages`) const cmd = util.promisify(execFile) +/** + * Publicar Release en Github + * @param {*} name + * @param {*} tag_name + * @param {*} auth + * @param {*} owner + * @param {*} repo + */ +const githubGithubRelease = async ( + name = '', + tag_name = '', + auth = '', + owner = 'codigoencasa', + repo = 'bot-whatsapp' +) => { + const octokit = new Octokit({ + auth, + }) + + await octokit.request(`POST /repos/${owner}/${repo}/releases`, { + owner, + repo, + tag_name, + name, + body: 'Description of the release', + draft: false, + prerelease: false, + generate_release_notes: true, + }) +} + /** * Create Token */ @@ -147,6 +181,7 @@ const publishRelease = async (packageName, latest = null) => { const main = async () => { if (PKG_ARG) { let EXIST_VERSION = true + const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null const pkgNumber = PKG_ARG_VERSION @@ -161,6 +196,7 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } diff --git a/yarn.lock b/yarn.lock index 05e6737..cf802d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1100,6 +1100,7 @@ __metadata: dependencies: "@commitlint/cli": ^17.3.0 "@commitlint/config-conventional": ^17.3.0 + "@octokit/core": ^4.1.0 "@rollup/plugin-commonjs": ^23.0.2 "@rollup/plugin-json": ^5.0.1 "@rollup/plugin-node-resolve": ^15.0.1 From d00547866a0d39a9d0f777943795948a9117597e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:31:34 +0100 Subject: [PATCH 106/248] ci: :zap: add github release --- scripts/release.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/release.js b/scripts/release.js index e88e740..5ed1f58 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -196,7 +196,8 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) - await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) + if (pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } From 0619641f82225adbc687bd609dd15af4b9a1d342 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:33:39 +0000 Subject: [PATCH 107/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d90a42b9628dd60a013a903909c03c6ba74055eb Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:33:52 +0100 Subject: [PATCH 108/248] ci: :zap: add github release --- .github/workflows/releases.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 2fd43fe..961efbf 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,22 +43,22 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Commit and push changes uses: devops-infra/action-commit-push@master From afb127278aadc23436d3d3530f84a694d4e0dbbc Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:38:01 +0000 Subject: [PATCH 109/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 8e3413ca80ce9507e7136ff11ef54e58d4fe2bd6 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:48:33 +0100 Subject: [PATCH 110/248] ci: :zap: add github release --- .github/workflows/releases.yml | 12 +++++++----- package.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 961efbf..fc2081b 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -60,8 +60,10 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - - name: Commit and push changes - uses: devops-infra/action-commit-push@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - commit_message: 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + - name: GIT commit and push all changed files + if: github.event_name == 'push' + run: | + git config --global user.name "${{ env.CI_COMMIT_AUTHOR }}" + git config --global user.email "username@users.noreply.github.com" + git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + git push diff --git a/package.json b/package.json index 7387dfc..471f7a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.8", + "version": "0.1.9", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 375a997f25a78d1c469c9466a86e3d00cb201571 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:49:52 +0000 Subject: [PATCH 111/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 5b3e7cefde57b38fad32a2ade2641b944989bb2d Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 14:32:59 +0100 Subject: [PATCH 112/248] ci: :zap: add github release --- package.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 471f7a1..983f107 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,8 @@ "rollup-plugin-copy": "^3.4.0", "semver": "^7.3.8", "standard-version": "^9.5.0", - "uvu": "^0.5.6" + "uvu": "^0.5.6", + "@octokit/core": "^4.1.0" }, "packageManager": "yarn@3.3.0", "engines": { @@ -97,8 +98,5 @@ "npm": "please-use-yarn", "yarn": ">=3" }, - "author": "Leifer Mendez ", - "dependencies": { - "@octokit/core": "^4.1.0" - } + "author": "Leifer Mendez " } From c621d0ee2439e19783a75c39f81e3cee8ae20cbb Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 13:36:55 +0000 Subject: [PATCH 113/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 983f107..fe8cb42 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "devDependencies": { "@commitlint/cli": "^17.3.0", "@commitlint/config-conventional": "^17.3.0", + "@octokit/core": "^4.1.0", "@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-json": "^5.0.1", "@rollup/plugin-node-resolve": "^15.0.1", @@ -89,8 +90,7 @@ "rollup-plugin-copy": "^3.4.0", "semver": "^7.3.8", "standard-version": "^9.5.0", - "uvu": "^0.5.6", - "@octokit/core": "^4.1.0" + "uvu": "^0.5.6" }, "packageManager": "yarn@3.3.0", "engines": { From d52951adf9a962b2a1a14c990554c359781a95d1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 14:41:13 +0100 Subject: [PATCH 114/248] ci: :fire: fix ci version name --- .github/workflows/netlify.yml | 2 +- .github/workflows/releases-dev.yml | 3 +++ .github/workflows/releases.yml | 15 +++++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/netlify.yml b/.github/workflows/netlify.yml index 76d5383..8f1ba08 100644 --- a/.github/workflows/netlify.yml +++ b/.github/workflows/netlify.yml @@ -3,7 +3,7 @@ name: 📄 (PROD) Desplegando documentacion on: push: branches: - - next-release + - release/next jobs: ############ DOCUMENTATION BUILD ############ diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 7848669..4e5c169 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -44,6 +44,9 @@ jobs: - name: Release @bot-whatsapp/provider run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}" + - name: Release @bot-whatsapp/contexts + run: yarn node ./scripts/release.js --name=contexts --version= --token="${{ secrets.NPM_TOKEN }}" + - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index fc2081b..26b8391 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,22 +43,25 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + + - name: Release @bot-whatsapp/contexts + run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: GIT commit and push all changed files if: github.event_name == 'push' From 787cdc69a068ea4d1da7e31b6f74e853c5f2d9ec Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 13:45:16 +0000 Subject: [PATCH 115/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 0af9ef2dae723ec4f8bde1949714a69faf95b01e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:14:51 +0100 Subject: [PATCH 116/248] ci: :fire: fix ci version name --- packages/contexts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 2301645..92b9561 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.1", + "version": "0.0.4-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ From faa3a21ffe1c1ffc0d3e58f9b2bb6876e18d9437 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:16:19 +0000 Subject: [PATCH 117/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/provider/src/twilio/package.json | 2 +- starters/apps/base-twilio-json/package.json | 2 +- starters/apps/base-twilio-memory/package.json | 2 +- starters/apps/base-twilio-mongo/package.json | 2 +- starters/apps/base-twilio-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/twilio/package.json b/packages/provider/src/twilio/package.json index dd0a9bf..e4bb7d4 100644 --- a/packages/provider/src/twilio/package.json +++ b/packages/provider/src/twilio/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "twilio": "3.84.0" + "twilio": "3.84.1" } } diff --git a/starters/apps/base-twilio-json/package.json b/starters/apps/base-twilio-json/package.json index 00ab354..15367a6 100644 --- a/starters/apps/base-twilio-json/package.json +++ b/starters/apps/base-twilio-json/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index cdfaf65..bf1501c 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index 69a05bb..06bdef2 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index 453955b..90149e2 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", From 9704bc0f0203f7be200ccd80c69bef55837fe2f4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:28:30 +0100 Subject: [PATCH 118/248] docs: :memo: meta added --- .github/workflows/releases.yml | 17 +++++++----- packages/portal/package.json | 2 +- scripts/github.js | 47 ++++++++++++++++++++++++++++++++++ scripts/release.js | 39 +--------------------------- 4 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 scripts/github.js diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 26b8391..ab4faa4 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,25 +43,28 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/contexts - run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + + - name: Release Github + run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - name: GIT commit and push all changed files if: github.event_name == 'push' diff --git a/packages/portal/package.json b/packages/portal/package.json index f32cf85..e8941f8 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.9-alpha.0", + "version": "v0.1.11", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/scripts/github.js b/scripts/github.js new file mode 100644 index 0000000..9277d83 --- /dev/null +++ b/scripts/github.js @@ -0,0 +1,47 @@ +const process = require('node:process') +const { Octokit } = require('@octokit/core') + +const [PKG_ARG, GITHUB_TOKEN] = process.argv.slice(2) || [null] + +/** + * Publicar Release en Github + * @param {*} name + * @param {*} tag_name + * @param {*} auth + * @param {*} owner + * @param {*} repo + */ +const githubGithubRelease = async ( + name = '', + tag_name = '', + auth = '', + owner = 'codigoencasa', + repo = 'bot-whatsapp' +) => { + const octokit = new Octokit({ + auth, + }) + + await octokit.request(`POST /repos/${owner}/${repo}/releases`, { + owner, + repo, + tag_name, + name, + body: 'Description of the release', + draft: false, + prerelease: false, + generate_release_notes: true, + }) +} + +const main = async () => { + if (PKG_ARG) { + const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null + const pkgNumber = PKG_ARG ? PKG_ARG.split('=').at(1) : null + + if (pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) + } +} + +main() diff --git a/scripts/release.js b/scripts/release.js index 5ed1f58..9dfcc62 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -3,50 +3,16 @@ const { join } = require('path') const { execFile } = require('node:child_process') const process = require('node:process') const util = require('node:util') -const { Octokit } = require('@octokit/core') const OS_ENVIROMENT_WIN = process.platform.includes('win32') const semver = require('semver') const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm' -const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN, GITHUB_TOKEN] = process.argv.slice( - 2 -) || [null] +const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN] = process.argv.slice(2) || [null] const PATH_PACKAGES = join(__dirname, '..', `packages`) const cmd = util.promisify(execFile) -/** - * Publicar Release en Github - * @param {*} name - * @param {*} tag_name - * @param {*} auth - * @param {*} owner - * @param {*} repo - */ -const githubGithubRelease = async ( - name = '', - tag_name = '', - auth = '', - owner = 'codigoencasa', - repo = 'bot-whatsapp' -) => { - const octokit = new Octokit({ - auth, - }) - - await octokit.request(`POST /repos/${owner}/${repo}/releases`, { - owner, - repo, - tag_name, - name, - body: 'Description of the release', - draft: false, - prerelease: false, - generate_release_notes: true, - }) -} - /** * Create Token */ @@ -181,7 +147,6 @@ const publishRelease = async (packageName, latest = null) => { const main = async () => { if (PKG_ARG) { let EXIST_VERSION = true - const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null const pkgNumber = PKG_ARG_VERSION @@ -196,8 +161,6 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) - if (pkgNumber) - await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } From e2fec5d521974c51a0f9ff1169e1546f51b9e100 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:33:19 +0000 Subject: [PATCH 119/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From c6f58e913d02ac9cbda21b09e55fd71018547b80 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:35:47 +0100 Subject: [PATCH 120/248] chore(release): 0.1.10 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eae6a68..360aa17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11) + + +### Bug Fixes + +* :fire: update qr package ([ecde23f](https://github.com/leifermendez/bot-whatsapp/commit/ecde23fdea65def209aa874af35a3f293e6b1a91)) + ### [0.1.8](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.8) (2023-01-10) ### [0.1.7](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7) (2023-01-10) diff --git a/package.json b/package.json index fe8cb42..87b8f0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.9", + "version": "0.1.10", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From be6c609570bf76f6112f861c4949f79ac1af1653 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:36:19 +0100 Subject: [PATCH 121/248] chore: :zap: set MANUAL version to bypass From 68a6e4b241c70cb0b91d5e2a557d3bcbb92738a5 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:39:57 +0000 Subject: [PATCH 122/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From eb1fcbff228876d748c87a6cf060a165dcc56638 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:11:55 +0100 Subject: [PATCH 123/248] chore(release): 0.1.11 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 360aa17..00a5618 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11) + +### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) + +### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10) + +### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10) + ### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11) diff --git a/package.json b/package.json index 87b8f0b..5e3d098 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.10", + "version": "0.1.11", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From edf5fdcbdc46a8a96367042df6a23a4a46b88545 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:12:09 +0100 Subject: [PATCH 124/248] chore(release): 0.1.12 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a5618..3c74d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) + +### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) + +### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10) + +### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10) + ### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11) ### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) diff --git a/package.json b/package.json index 5e3d098..d7ef271 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.11", + "version": "0.1.12", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From b321b03b2a04566a90a5ff41929734e021a6476e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:12:24 +0100 Subject: [PATCH 125/248] chore(release): 0.1.12 --- .github/workflows/releases.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index ab4faa4..2cbe8e6 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -26,9 +26,6 @@ jobs: - run: corepack enable - - name: Set User - run: git config --global user.email "leifer.contacto@gmail.com" && git config --global user.name "Leifer Mendez" - - name: Install NPM Dependencies run: yarn install --immutable --network-timeout 300000 @@ -69,7 +66,7 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git config --global user.name "${{ env.CI_COMMIT_AUTHOR }}" + git config --global user.name "Leifer" git config --global user.email "username@users.noreply.github.com" git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' git push From fea6276b89b17da8070828fa9059666743bb02b4 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:16:00 +0000 Subject: [PATCH 126/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From f029c7317a954ceb008f5d3808934484634ef4f0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:18:47 +0100 Subject: [PATCH 127/248] chore(release): 0.1.12 --- .github/workflows/releases.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 2cbe8e6..90aa18b 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -26,6 +26,9 @@ jobs: - run: corepack enable + - name: Set User + run: git config --global user.email "leifer.contacto@gmail.com" && git config --global user.name "Leifer Mendez" + - name: Install NPM Dependencies run: yarn install --immutable --network-timeout 300000 @@ -66,7 +69,5 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git config --global user.name "Leifer" - git config --global user.email "username@users.noreply.github.com" git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' git push From 288894ee8e1f0720d282a87efc40c6e42fc0fa9c Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:22:46 +0000 Subject: [PATCH 128/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 9688ec1844b9147751215ceb7f8524cdbe58655b Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:26:04 +0100 Subject: [PATCH 129/248] chore(release): 0.1.13 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c74d4a..023883a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) + ### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) ### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) diff --git a/package.json b/package.json index d7ef271..07bc07d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.12", + "version": "0.1.13", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From f80a051fa950d8d01bb01c9f4295245881df3087 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:26:16 +0100 Subject: [PATCH 130/248] chore(release): 0.1.13 --- .github/workflows/releases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 90aa18b..72f0c48 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -69,5 +69,5 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' git push From 9fb34cc9e0d5ea721cfaa36e816518581c757d59 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:30:38 +0000 Subject: [PATCH 131/248] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From ef03478683b73d182c37ab15caf8173097a492ef Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:36:27 +0000 Subject: [PATCH 132/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index c549214..44ebca0 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.53-alpha.0", + "version": "0.0.55-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 391098e..6f04765 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.60-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 92b9561..7f0f0a8 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.4-alpha.0", + "version": "0.0.5-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index f9ffe1c..b6cf5b4 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.71-alpha.0", + "version": "0.0.72-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 6c53960..3d745a8 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.52-alpha.0", + "version": "0.0.53-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index ce7784d..03c9bae 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.10-alpha.0", + "version": "0.0.11-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 007f079..c32af01 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.58-alpha.0", + "version": "0.0.59-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From eceb170df03721dca4183b658c863b94fa04bc84 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 11 Jan 2023 10:36:18 -0600 Subject: [PATCH 133/248] feat: mod de starters para habiltar portal Modificacion de starters para habiltar el portal para el QR --- starters/apps/base-baileys-json/app.js | 64 +++++++--- starters/apps/base-baileys-memory/app.js | 64 +++++++--- starters/apps/base-baileys-mongo/app.js | 108 +++++++++-------- starters/apps/base-baileys-mysql/app.js | 108 +++++++++-------- .../apps/base-baileys-mysql/public/index.html | 80 ------------- .../apps/base-baileys-mysql/server.http.js | 34 ------ starters/apps/base-meta-json/app.js | 104 +++++++++-------- starters/apps/base-meta-memory/app.js | 104 +++++++++-------- starters/apps/base-meta-mongo/app.js | 104 +++++++++-------- starters/apps/base-meta-mysql/app.js | 104 +++++++++-------- starters/apps/base-twilio-json/app.js | 104 +++++++++-------- starters/apps/base-twilio-memory/app.js | 104 +++++++++-------- starters/apps/base-twilio-mongo/app.js | 104 +++++++++-------- starters/apps/base-twilio-mysql/app.js | 104 +++++++++-------- starters/apps/base-venom-json/app.js | 108 +++++++++-------- .../apps/base-venom-json/public/index.html | 80 ------------- starters/apps/base-venom-json/server.http.js | 34 ------ starters/apps/base-venom-memory/app.js | 108 +++++++++-------- .../apps/base-venom-memory/public/index.html | 80 ------------- .../apps/base-venom-memory/server.http.js | 34 ------ starters/apps/base-venom-mongo/app.js | 108 +++++++++-------- .../apps/base-venom-mongo/public/index.html | 80 ------------- starters/apps/base-venom-mongo/server.http.js | 34 ------ starters/apps/base-venom-mysql/app.js | 108 +++++++++-------- .../apps/base-venom-mysql/public/index.html | 80 ------------- starters/apps/base-venom-mysql/server.http.js | 34 ------ starters/apps/base-wweb-json/app.js | 108 +++++++++-------- .../apps/base-wweb-json/public/index.html | 80 ------------- starters/apps/base-wweb-json/server.http.js | 34 ------ starters/apps/base-wweb-memory/app.js | 108 +++++++++-------- .../apps/base-wweb-memory/public/index.html | 80 ------------- starters/apps/base-wweb-memory/server.http.js | 34 ------ starters/apps/base-wweb-mongo/app.js | 109 ++++++++++-------- .../apps/base-wweb-mongo/public/index.html | 80 ------------- starters/apps/base-wweb-mongo/server.http.js | 34 ------ starters/apps/base-wweb-mysql/app.js | 108 +++++++++-------- .../apps/base-wweb-mysql/public/index.html | 80 ------------- starters/apps/base-wweb-mysql/server.http.js | 34 ------ 38 files changed, 1174 insertions(+), 1893 deletions(-) delete mode 100644 starters/apps/base-baileys-mysql/public/index.html delete mode 100644 starters/apps/base-baileys-mysql/server.http.js delete mode 100644 starters/apps/base-venom-json/public/index.html delete mode 100644 starters/apps/base-venom-json/server.http.js delete mode 100644 starters/apps/base-venom-memory/public/index.html delete mode 100644 starters/apps/base-venom-memory/server.http.js delete mode 100644 starters/apps/base-venom-mongo/public/index.html delete mode 100644 starters/apps/base-venom-mongo/server.http.js delete mode 100644 starters/apps/base-venom-mysql/public/index.html delete mode 100644 starters/apps/base-venom-mysql/server.http.js delete mode 100644 starters/apps/base-wweb-json/public/index.html delete mode 100644 starters/apps/base-wweb-json/server.http.js delete mode 100644 starters/apps/base-wweb-memory/public/index.html delete mode 100644 starters/apps/base-wweb-memory/server.http.js delete mode 100644 starters/apps/base-wweb-mongo/public/index.html delete mode 100644 starters/apps/base-wweb-mongo/server.http.js delete mode 100644 starters/apps/base-wweb-mysql/public/index.html delete mode 100644 starters/apps/base-wweb-mysql/server.http.js diff --git a/starters/apps/base-baileys-json/app.js b/starters/apps/base-baileys-json/app.js index 67d4be6..b06887c 100644 --- a/starters/apps/base-baileys-json/app.js +++ b/starters/apps/base-baileys-json/app.js @@ -9,31 +9,59 @@ const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const JsonFileAdapter = require('@bot-whatsapp/database/json') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) + const flowDocs = addKeyword([ 'doc', 'documentacion', 'documentación', -]).addAnswer([ - '📄 Aquí encontras las documentación recuerda que puedes mejorarla', - 'https://bot-whatsapp.netlify.app/', -]) +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ - '🙌 Aquí encontras un ejemplo rapido', - 'https://bot-whatsapp.netlify.app/docs/example/', -]) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ - '🚀 Puedes aportar tu granito de arena a este proyecto', - '[*opencollective*] https://opencollective.com/bot-whatsapp', - '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', - '[*patreon*] https://www.patreon.com/leifermendez', -]) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowDiscord = addKeyword(['discord']).addAnswer([ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', -]) +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) .addAnswer('🙌 Hola bienvenido a este *Chatbot*') diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index a8fbd00..3d05e79 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -9,31 +9,59 @@ const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) + const flowDocs = addKeyword([ 'doc', 'documentacion', 'documentación', -]).addAnswer([ - '📄 Aquí encontras las documentación recuerda que puedes mejorarla', - 'https://bot-whatsapp.netlify.app/', -]) +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ - '🙌 Aquí encontras un ejemplo rapido', - 'https://bot-whatsapp.netlify.app/docs/example/', -]) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ - '🚀 Puedes aportar tu granito de arena a este proyecto', - '[*opencollective*] https://opencollective.com/bot-whatsapp', - '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', - '[*patreon*] https://www.patreon.com/leifermendez', -]) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowDiscord = addKeyword(['discord']).addAnswer([ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', -]) +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) .addAnswer('🙌 Hola bienvenido a este *Chatbot*') diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 277115d..253d1fa 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +108,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 02a13c0..3dc800b 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -30,58 +29,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -98,6 +111,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-meta-json/app.js b/starters/apps/base-meta-json/app.js index 49dd430..cc4c7ac 100644 --- a/starters/apps/base-meta-json/app.js +++ b/starters/apps/base-meta-json/app.js @@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-memory/app.js b/starters/apps/base-meta-memory/app.js index 288929c..c8201e8 100644 --- a/starters/apps/base-meta-memory/app.js +++ b/starters/apps/base-meta-memory/app.js @@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-mongo/app.js b/starters/apps/base-meta-mongo/app.js index f40a6a2..18cd9ac 100644 --- a/starters/apps/base-meta-mongo/app.js +++ b/starters/apps/base-meta-mongo/app.js @@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-mysql/app.js b/starters/apps/base-meta-mysql/app.js index 25b171c..102f977 100644 --- a/starters/apps/base-meta-mysql/app.js +++ b/starters/apps/base-meta-mysql/app.js @@ -28,58 +28,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-json/app.js b/starters/apps/base-twilio-json/app.js index 190e842..047a126 100644 --- a/starters/apps/base-twilio-json/app.js +++ b/starters/apps/base-twilio-json/app.js @@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-memory/app.js b/starters/apps/base-twilio-memory/app.js index 9730709..cc1d16b 100644 --- a/starters/apps/base-twilio-memory/app.js +++ b/starters/apps/base-twilio-memory/app.js @@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-mongo/app.js b/starters/apps/base-twilio-mongo/app.js index 9e5e3f7..dcabb99 100644 --- a/starters/apps/base-twilio-mongo/app.js +++ b/starters/apps/base-twilio-mongo/app.js @@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-mysql/app.js b/starters/apps/base-twilio-mysql/app.js index 7100f9c..4725cd3 100644 --- a/starters/apps/base-twilio-mysql/app.js +++ b/starters/apps/base-twilio-mysql/app.js @@ -29,58 +29,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index c742f78..c399b5e 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-json/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 6f89ef2..c539f36 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index d8de982..bae23f8 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +108,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index 24da8ee..737dc99 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -31,58 +30,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -99,6 +112,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 31f03dd..3144bd0 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-json/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 5318283..29eb0bc 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index 34f3887..43eed81 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -4,12 +4,10 @@ const { createFlow, addKeyword, } = require('@bot-whatsapp/bot') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') -require('./server.http') - /** * Declaramos las conexiones de Mongo */ @@ -29,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +107,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2095842..2b31f4a 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -31,58 +30,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -99,6 +112,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) From f430380b4f23d41702395c96c628bf13bf443278 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 11 Jan 2023 10:49:48 -0600 Subject: [PATCH 134/248] fix: correccion en starters app.js para portal QR correccion en starters app.js para portal QR --- starters/apps/base-baileys-mongo/app.js | 2 +- starters/apps/base-baileys-mysql/app.js | 2 +- starters/apps/base-venom-json/app.js | 2 +- starters/apps/base-venom-memory/app.js | 2 +- starters/apps/base-venom-mongo/app.js | 2 +- starters/apps/base-venom-mysql/app.js | 2 +- starters/apps/base-wweb-json/app.js | 2 +- starters/apps/base-wweb-memory/app.js | 2 +- starters/apps/base-wweb-mongo/app.js | 3 ++- starters/apps/base-wweb-mysql/app.js | 2 +- 10 files changed, 11 insertions(+), 10 deletions(-) diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 253d1fa..2de3ad6 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 3dc800b..d3dbbe5 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index c399b5e..120deee 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index c539f36..8402cf9 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index bae23f8..2f4f16a 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index 737dc99..8c5c2db 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 3144bd0..729ac2a 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 29eb0bc..d6a567a 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index 43eed81..a8e8aad 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -4,7 +4,8 @@ const { createFlow, addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') + +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2b31f4a..68f7f37 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') From 675046cc58a63f6583da85fc35d3a873458e6051 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:34:59 +0100 Subject: [PATCH 135/248] ci: :fire: fix github action --- .github/workflows/check-providers.yml | 45 --------------------------- .github/workflows/codeql.yml | 3 +- .github/workflows/contributors.yml | 6 ++-- .github/workflows/netlify-dev.yml | 1 + .github/workflows/netlify.yml | 2 +- .github/workflows/releases-dev.yml | 12 ++++--- .github/workflows/releases.yml | 5 +-- .gitignore | 1 + 8 files changed, 18 insertions(+), 57 deletions(-) delete mode 100644 .github/workflows/check-providers.yml diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml deleted file mode 100644 index 9965606..0000000 --- a/.github/workflows/check-providers.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Rev Providers - -on: - pull_request: - branches: - - dev - -jobs: - check-npm: - name: Install Dependencies - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 16.x - cache: 'yarn' - registry-url: https://registry.npmjs.org/ - - - run: corepack enable - - - name: Install NPM Dependencies - run: yarn install --immutable --network-timeout 300000 - - - name: Check Baileys - run: yarn node ./scripts/checker.js --name=baileys --stable=true - - - name: Check Venom - run: yarn node ./scripts/checker.js --name=venom --stable=true - - - name: Check web-whatsapp - run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true - - - name: Check Meta - run: yarn node ./scripts/checker.js --name=meta --stable=true - - - name: Check Twilio - run: yarn node ./scripts/checker.js --name=twilio --stable=true - - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: 'ci(providers): 👍 updated versions stable providers' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 86178fd..a1fed1b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,7 +13,7 @@ name: 'CodeQL' on: push: - branches: ['main', dev, next-release] + branches: [release/next] pull_request: # The branches below must be a subset of the branches above branches: ['main'] @@ -22,6 +22,7 @@ on: jobs: analyze: + if: ${{ !github.event.act }} name: Analyze runs-on: ubuntu-latest permissions: diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 4f3d94e..b126e98 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -1,8 +1,8 @@ name: Revisando Colaboradores + on: - push: - branches: - - main + schedule: + - cron: '0 9 * * *' jobs: contrib-readme-job: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index e3e8200..1820da5 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,6 +13,7 @@ on: jobs: ############ DOCUMENTATION BUILD ############ build-documentation: + if: ${{ !github.event.act }} name: Build Package runs-on: ubuntu-latest diff --git a/.github/workflows/netlify.yml b/.github/workflows/netlify.yml index 8f1ba08..2dac101 100644 --- a/.github/workflows/netlify.yml +++ b/.github/workflows/netlify.yml @@ -7,7 +7,7 @@ on: jobs: ############ DOCUMENTATION BUILD ############ - build-documentation: + build-documentation-prod: name: Build Package runs-on: ubuntu-latest diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 4e5c169..6901587 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -50,8 +50,10 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: Commit Versioning & Push changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' - branch: dev + - name: GIT commit and push all changed files + if: github.event_name == 'push' + run: | + git config --global user.email "leifer.contacto@gmail.com" + git config --global user.name "Leifer Mendez" + git commit -a -m 'chore(version): dev release 🫡' + git push origin dev diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 72f0c48..343164e 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -6,7 +6,8 @@ on: - release/production jobs: ############ RELEASE ############ - release: + release-prod: + if: ${{ !github.event.act }} name: Release runs-on: ubuntu-latest steps: @@ -70,4 +71,4 @@ jobs: if: github.event_name == 'push' run: | git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - git push + git push origin dev diff --git a/.gitignore b/.gitignore index 721d12c..1cc3038 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ yarn-error.log .npmrc # Local Netlify folder .netlify +.secrets \ No newline at end of file From 89cf90988833e0845368461beffa3cbc436f25de Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:40:41 +0100 Subject: [PATCH 136/248] ci: :fire: fix github action --- .github/workflows/releases-dev.yml | 12 +++++------- .github/workflows/releases.yml | 9 +++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 6901587..4e5c169 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -50,10 +50,8 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: GIT commit and push all changed files - if: github.event_name == 'push' - run: | - git config --global user.email "leifer.contacto@gmail.com" - git config --global user.name "Leifer Mendez" - git commit -a -m 'chore(version): dev release 🫡' - git push origin dev + - name: Commit Versioning & Push changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' + branch: dev diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 343164e..aab4756 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,8 +67,9 @@ jobs: - name: Release Github run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - - name: GIT commit and push all changed files + - name: Commit Versioning & Push changes if: github.event_name == 'push' - run: | - git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - git push origin dev + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' + branch: dev From 0f9e57df378bcbf1dfe9de6390c925f87521bda0 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 19:44:10 +0000 Subject: [PATCH 137/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 44ebca0..b205714 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.55-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6f04765..18b8619 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.61-alpha.0", + "version": "0.0.67-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 7f0f0a8..7381d6a 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.5-alpha.0", + "version": "0.0.11-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index b6cf5b4..49503df 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.72-alpha.0", + "version": "0.0.78-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 3d745a8..80bbcd1 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.53-alpha.0", + "version": "0.0.59-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 03c9bae..9fd3307 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.11-alpha.0", + "version": "0.0.17-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index c32af01..683ca66 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.59-alpha.0", + "version": "0.0.65-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 9723e9d908f240070fbb06ae99e7107ea9919756 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:49:04 +0100 Subject: [PATCH 138/248] chore(release): 0.1.14 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 023883a..f5cd96d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) + ### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) ### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) diff --git a/package.json b/package.json index 07bc07d..e77273f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.13", + "version": "0.1.14", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From b682b0b6ba857cee126a3cde861270a3c94e8927 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:03:43 +0100 Subject: [PATCH 139/248] chore(release): 0.1.15 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5cd96d..c16e624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) + ### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) ### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) diff --git a/package.json b/package.json index e77273f..c7f64fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.14", + "version": "0.1.15", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From e442d05aa4570e5147498695474e810e8de0b149 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:04:00 +0100 Subject: [PATCH 140/248] chore(version): launch release --- .github/workflows/releases.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index aab4756..32d04cf 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,6 +67,12 @@ jobs: - name: Release Github run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" + - name: 'Run if changes have been detected' + if: steps.auto-commit-action.outputs.changes_detected == 'true' + run: | + git add . + git commit -m "chore(version): pre release" + - name: Commit Versioning & Push changes if: github.event_name == 'push' uses: stefanzweifel/git-auto-commit-action@v4 From 42b98801db6dc13a9c7e247325788e72d48cbb64 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:16:19 +0100 Subject: [PATCH 141/248] chore(release): 0.1.16 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c16e624..48381f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.16](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.15...v0.1.16) (2023-01-11) + ### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) ### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) diff --git a/package.json b/package.json index c7f64fc..a6e64e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.15", + "version": "0.1.16", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From aaec0751408ab49483d428810d94aaf7d46acb94 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:17:32 +0100 Subject: [PATCH 142/248] fix(ci): pre-release --- .github/workflows/releases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 32d04cf..d1c2e8f 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -68,7 +68,6 @@ jobs: run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - name: 'Run if changes have been detected' - if: steps.auto-commit-action.outputs.changes_detected == 'true' run: | git add . git commit -m "chore(version): pre release" From 230981e2676361149cb2a99def7f705e75009260 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 09:35:06 +0100 Subject: [PATCH 143/248] fix(starters): :zap: added dockerfile --- starters/apps/base-baileys-mongo/Dockerfile | 4 +++- starters/apps/base-baileys-mysql/Dockerfile | 4 +++- starters/apps/base-meta-json/Dockerfile | 9 +++++++++ starters/apps/base-meta-memory/Dockerfile | 9 +++++++++ starters/apps/base-meta-mongo/Dockerfile | 9 +++++++++ starters/apps/base-meta-mysql/Dockerfile | 9 +++++++++ starters/apps/base-twilio-json/Dockerfile | 9 +++++++++ starters/apps/base-twilio-memory/Dockerfile | 9 +++++++++ starters/apps/base-twilio-mongo/Dockerfile | 9 +++++++++ starters/apps/base-twilio-mysql/Dockerfile | 9 +++++++++ 10 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 starters/apps/base-meta-json/Dockerfile create mode 100644 starters/apps/base-meta-memory/Dockerfile create mode 100644 starters/apps/base-meta-mongo/Dockerfile create mode 100644 starters/apps/base-meta-mysql/Dockerfile create mode 100644 starters/apps/base-twilio-json/Dockerfile create mode 100644 starters/apps/base-twilio-memory/Dockerfile create mode 100644 starters/apps/base-twilio-mongo/Dockerfile create mode 100644 starters/apps/base-twilio-mysql/Dockerfile diff --git a/starters/apps/base-baileys-mongo/Dockerfile b/starters/apps/base-baileys-mongo/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-mongo/Dockerfile +++ b/starters/apps/base-baileys-mongo/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mysql/Dockerfile b/starters/apps/base-baileys-mysql/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-mysql/Dockerfile +++ b/starters/apps/base-baileys-mysql/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-meta-json/Dockerfile b/starters/apps/base-meta-json/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-json/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-memory/Dockerfile b/starters/apps/base-meta-memory/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-memory/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-mongo/Dockerfile b/starters/apps/base-meta-mongo/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-mongo/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-mysql/Dockerfile b/starters/apps/base-meta-mysql/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-mysql/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-json/Dockerfile b/starters/apps/base-twilio-json/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-json/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-memory/Dockerfile b/starters/apps/base-twilio-memory/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-memory/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-mongo/Dockerfile b/starters/apps/base-twilio-mongo/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-mongo/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-mysql/Dockerfile b/starters/apps/base-twilio-mysql/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-mysql/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] From a1ce98bdc884e59d104456c5883250024492fa63 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 10:31:41 +0100 Subject: [PATCH 144/248] docs: :art: more doc --- packages/docs/src/routes/docs/flows/index.mdx | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 027c793..7a2171c 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -1,6 +1,6 @@ import Navigation from '../../../components/widgets/Navigation' -# Flow (Flujos) +# Flow Los flujos hace referencia al hecho de construir un flujo de conversion. Esto es un flow podemos observar que estan presente dos metodos importantes **addKeyword** y el **addAnswer**. @@ -23,6 +23,142 @@ const flowPrincipal = addKeyword(['hola', 'alo']) --- +## addKeyword() + +Esta funcion se utliza para iniciar un flujo de conversion.
Recibe un `string` o un `array` +de string `['hola','buenas']`. + +**Opciones** + +- sensitive: Sensible a mayusculas y minusculas por defecto `false` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola') + +const flowArray = addKeyword(['hola', 'alo']) + +const flowSensitive = addKeyword(['hola', 'alo'], { + sensitive: true, +}) +``` + +--- + +## addAnswer() + +Esta funcion se utliza para responder un mensaje despues del `addKeyword()` + +**Opciones** + +- delay: 0 (milisegundos) +- media: url de imagen +- buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` +- capture: false (para esperar respuesta) +- child: Objecto tipo flujo o arra de flujos hijos + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje se enviara 1 segundo despues', + { + delay: 1000, + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje envia una imagen', + { + media: 'https://i.imgur.com/0HpzsEm.png', + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje envia tres botones', + { + buttons: [ + { body: 'Boton 1' }, + { body: 'Boton 2' }, + { body: 'Boton 3' }, + ], + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje espera una respueta del usuario', + { + capture: true, + } +) +``` + +--- + +## ctx + +Este argumento se utiliza para obtener el contexto de la conversación + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Indica cual es tu email', + null, + (ctx) => { + console.log('👉 Informacion del contexto: ', ctx) + } +) +``` + +--- + +## fallBack() + +Esta funcion se utliza para volver a enviar el ultimo mensaje abajo un ejemplo. +En el ejemplo de abajo esperamos que el usuario ingrese un mensaje que contenga `@` sino contiene +se repetira el mensaje `Indica cual es tu email` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Indica cual es tu email', + null, + (ctx, { fallBack }) => { + if (!ctx.body.includes('@')) return fallBack() + } +) +``` + +--- + +## flowDynamic() + +Esta funcion se utliza para devolver mensajes dinamicos que pueden venir de una API o Base de datos. +La funcion recibe un array que debe contener la siguiente estrucutura: + +`[{body:'Mensaje}, {body:'Mensaje2}]` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola') + .addAnswer('Indica cual es tu email', null, async (ctx, {flowDynamic}) => { + const mensajesDB = () => { + const categories = db.find(...) + const mapDatos = categories.map((c) => ({body:c.name})) + return mapDatos + } + await flowDynamic(mensajesDB()) + }) + + +``` + +--- + Date: Thu, 12 Jan 2023 11:43:58 +0100 Subject: [PATCH 145/248] refactor(bot): :sparkles: async callbacks --- packages/bot/core/core.class.js | 72 +++++++++++++++++++-------------- packages/bot/utils/queue.js | 8 ++-- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 4243713..e084b20 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -8,6 +8,10 @@ const { createWriteStream } = require('fs') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/core.class.log`), }) + +const QueuePrincipal = new Queue() +const QueueDynamic = new Queue() + /** * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos * [ ] Guardar historial en db @@ -84,17 +88,33 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx + const sendFlow = async (messageToSend, numberOrId) => { + const queue = [] + for (const ctxMessage of messageToSend) { + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + QueuePrincipal.enqueue(() => + Promise.all([ + this.sendProviderAndSave(numberOrId, ctxMessage), + cbEveryCtx(ctxMessage?.ref), + ]) + ) + } + return Promise.all(queue) + } + // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje const fallBack = () => { fallBackFlag = true msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return refToContinue } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp - const flowDynamic = (listMsg = [], optListMsg = { limit: 3 }) => { + const flowDynamic = async (listMsg = [], optListMsg = { limit: 3 }) => { if (!Array.isArray(listMsg)) throw new Error('Esto debe ser un ARRAY') @@ -108,26 +128,29 @@ class CoreClass { }) ) .slice(0, optListMsg.limit) - msgToSend = parseListMsg - this.sendFlow(msgToSend, from) + for (const msg of parseListMsg) { + await this.sendProviderAndSave(from, msg) + } return } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = (inRef) => { - this.flowClass.allCallbacks[inRef](messageCtxInComming, { + const cbEveryCtx = async (inRef) => { + if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve() + return this.flowClass.allCallbacks[inRef](messageCtxInComming, { fallBack, flowDynamic, }) } // 📄 [options: callback]: Si se tiene un callback se ejecuta - if (!fallBackFlag) { - if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) - for (const ite of this.flowClass.find(body)) { - if (!ite?.options?.capture) cbEveryCtx(ite?.ref) - } - } + //TODO AQUI + // if (!fallBackFlag) { + // if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) + // for (const ite of this.flowClass.find(body)) { + // if (!ite?.options?.capture) cbEveryCtx(ite?.ref) + // } + // } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa if (!fallBackFlag && prevMsg?.options?.nested?.length) { @@ -138,11 +161,12 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - for (const ite of msgToSend) { - cbEveryCtx(ite?.ref) - } + // //TODO AQUI + // for (const ite of msgToSend) { + // cbEveryCtx(ite?.ref) + // } - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return } @@ -153,13 +177,13 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) } /** @@ -176,18 +200,6 @@ class CoreClass { ]) } - sendFlow = async (messageToSend, numberOrId) => { - const queue = [] - for (const ctxMessage of messageToSend) { - const delayMs = ctxMessage?.options?.delay || 0 - if (delayMs) await delay(delayMs) - Queue.enqueue(() => - this.sendProviderAndSave(numberOrId, ctxMessage) - ) - } - return Promise.all(queue) - } - /** * @private * @param {*} message diff --git a/packages/bot/utils/queue.js b/packages/bot/utils/queue.js index 1f610e9..873024a 100644 --- a/packages/bot/utils/queue.js +++ b/packages/bot/utils/queue.js @@ -1,8 +1,8 @@ class Queue { - static queue = [] - static pendingPromise = false + queue = [] + pendingPromise = false - static enqueue(promise) { + enqueue(promise) { return new Promise((resolve, reject) => { this.queue.push({ promise, @@ -13,7 +13,7 @@ class Queue { }) } - static dequeue() { + dequeue() { if (this.workingOnPromise) { return false } From 8a1bdc58785950493cc2683b0ecb0fa881dc683f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 16:35:43 +0100 Subject: [PATCH 146/248] refactor(bot): :fire: fallback --- packages/bot/core/core.class.js | 25 +++++++++++++++++++------ packages/bot/rollup-bot.config.js | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e084b20..c0186d8 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -10,7 +10,6 @@ const logger = new Console({ }) const QueuePrincipal = new Queue() -const QueueDynamic = new Queue() /** * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos @@ -92,12 +91,13 @@ class CoreClass { const sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { + console.log('🙌 ', ctxMessage.answer) const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => Promise.all([ this.sendProviderAndSave(numberOrId, ctxMessage), - cbEveryCtx(ctxMessage?.ref), + resolveCbEveryCtx(ctxMessage), ]) ) } @@ -105,19 +105,23 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = () => { + const fallBack = async () => { fallBackFlag = true - msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] - sendFlow(msgToSend, from) + await this.sendProviderAndSave(from, refToContinue) + QueuePrincipal.queue = [] return refToContinue } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp - const flowDynamic = async (listMsg = [], optListMsg = { limit: 3 }) => { + const flowDynamic = async ( + listMsg = [], + optListMsg = { limit: 5, fallback: false } + ) => { if (!Array.isArray(listMsg)) throw new Error('Esto debe ser un ARRAY') + fallBackFlag = optListMsg.fallback const parseListMsg = listMsg .map(({ body }, index) => toCtx({ @@ -134,6 +138,13 @@ class CoreClass { return } + // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback + const resolveCbEveryCtx = async (ctxMessage) => { + if (prevMsg?.options?.capture) return cbEveryCtx(prevMsg?.ref) + if (!ctxMessage?.options?.capture) + return await cbEveryCtx(ctxMessage?.ref) + } + // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo const cbEveryCtx = async (inRef) => { if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve() @@ -143,6 +154,8 @@ class CoreClass { }) } + if (prevMsg?.ref) resolveCbEveryCtx(prevMsg) + // 📄 [options: callback]: Si se tiene un callback se ejecuta //TODO AQUI // if (!fallBackFlag) { diff --git a/packages/bot/rollup-bot.config.js b/packages/bot/rollup-bot.config.js index f8ffa2a..36bbb87 100644 --- a/packages/bot/rollup-bot.config.js +++ b/packages/bot/rollup-bot.config.js @@ -10,6 +10,7 @@ module.exports = [ banner: banner['banner.output'].join(''), file: join(__dirname, 'lib', 'bundle.bot.cjs'), format: 'cjs', + sourcemap: true, }, plugins: [commonjs(), nodeResolve()], }, From ee30df73b879f4bf712b7e51f09e44ac943bea7f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 21:04:04 +0100 Subject: [PATCH 147/248] ci(cli): :zap: fix --- packages/bot/core/core.class.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index c0186d8..79d996b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -91,7 +91,6 @@ class CoreClass { const sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { - console.log('🙌 ', ctxMessage.answer) const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => From 8f27d34081a899dc1aa7de6afeb5a1184d7a8fd3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 21:04:44 +0100 Subject: [PATCH 148/248] ci(cli): :zap: fix --- .github/workflows/releases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index d1c2e8f..d587c64 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -77,4 +77,3 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - branch: dev From 8357eda573985b1477025defb3fead7911b6d394 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 12 Jan 2023 20:10:58 +0000 Subject: [PATCH 149/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index b205714..f8c71c4 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.61-alpha.0", + "version": "0.0.62-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 18b8619..6cdd841 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.67-alpha.0", + "version": "0.0.68-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 7381d6a..e1497ba 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.11-alpha.0", + "version": "0.0.12-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 49503df..62e0a29 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.78-alpha.0", + "version": "0.0.79-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 80bbcd1..f1f58cc 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.59-alpha.0", + "version": "0.0.60-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 9fd3307..8ea9ac2 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.17-alpha.0", + "version": "0.0.18-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 683ca66..33d9e96 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.65-alpha.0", + "version": "0.0.66-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 46a9fa6793e06600335de998d2bd9d0691b02ca4 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 13 Jan 2023 11:57:42 -0600 Subject: [PATCH 150/248] fix: se agrego @bot-whatsapp/portal a package.json se agrego @bot-whatsapp/portal a package.json --- starters/apps/base-baileys-mongo/package.json | 1 + starters/apps/base-baileys-mysql/package.json | 1 + starters/apps/base-venom-json/package.json | 1 + starters/apps/base-venom-memory/package.json | 1 + starters/apps/base-venom-mongo/package.json | 1 + starters/apps/base-venom-mysql/package.json | 1 + starters/apps/base-wweb-json/package.json | 1 + starters/apps/base-wweb-memory/package.json | 1 + starters/apps/base-wweb-mongo/package.json | 1 + starters/apps/base-wweb-mysql/package.json | 1 + 10 files changed, 10 insertions(+) diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index c2f8624..92f84a8 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mongodb": "^4.12.1", diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 7ecb417..8bb2c71 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mysql2": "^2.3.3", diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index 4d10427..87b993b 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35" }, "author": "", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index 57af4e1..228c623 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35" }, "author": "", diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index 0d84d2b..d6b5693 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35", "mongodb": "^4.12.1" }, diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index a029a70..d8d5466 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mysql2": "^2.3.3", "mime-types": "2.1.35" }, diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index d55dfeb..f52ab5a 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "whatsapp-web.js": "1.18.4" }, "author": "", diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index d9c3ee0..b9c4712 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "whatsapp-web.js": "1.18.4" }, "author": "", diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index e7ecebb..9c51d8a 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "^2.1.35", "mongodb": "^4.12.1" }, diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index 3ab34d5..e95ec1a 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mysql2": "^2.3.3" }, "author": "", From 6aed100d96e4c43b10f3ced470051b6bcb526ffa Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 19:08:08 +0000 Subject: [PATCH 151/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index f8c71c4..1164b02 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.62-alpha.0", + "version": "0.0.64-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6cdd841..29c6e07 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.68-alpha.0", + "version": "0.0.70-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index e1497ba..ecd06e8 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.12-alpha.0", + "version": "0.0.14-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 62e0a29..ac7ad87 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.79-alpha.0", + "version": "0.0.81-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index f1f58cc..b8b625a 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.60-alpha.0", + "version": "0.0.62-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 8ea9ac2..80ad83e 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.18-alpha.0", + "version": "0.0.20-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 33d9e96..f9102b4 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.66-alpha.0", + "version": "0.0.68-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From d483b9135972caa637bed4fcabd149fb64ab5966 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Fri, 13 Jan 2023 13:41:19 -0600 Subject: [PATCH 152/248] git como requisito e instrucciones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se agregó Git como requisito e instrucciones para instalarlo en Windows --- .../src/routes/docs/requirements/index.mdx | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/docs/src/routes/docs/requirements/index.mdx b/packages/docs/src/routes/docs/requirements/index.mdx index 03718d2..d51a65b 100644 --- a/packages/docs/src/routes/docs/requirements/index.mdx +++ b/packages/docs/src/routes/docs/requirements/index.mdx @@ -4,17 +4,9 @@ import Navigation from '../../../components/widgets/Navigation' A continuación se describen los puntos técnicos que debes de tener en cuenta antes de trabajar con esta herramienta -- Node v16 o superior **[descargar node](https://nodejs.org/es/download/)** - +- Node v16 o superior - **[descargar node](https://nodejs.org/es/download/)** +- Git - **[descargar Git](https://git-scm.com/download/win)** --- - -## ¿Como instalar Node? - -- **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Necesita ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. -- **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. - ---- - ## ¿Como saber que tengo el Node? Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16 @@ -23,7 +15,28 @@ Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja $ node -v v18.12.1 ``` +--- +## ¿Como instalar Node? +- **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Si necesitas ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. +- **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. +- --- +## ¿Como saber que tengo Git? + +Solo debes ejecutar el siguiente comando y esperar que te mande la versión que tienes instalada, si te manda un error de comando no reconocido es que no lo tienes instalado. + +```shell +$ git -v +git +``` +--- +## ¿Como instalar Git? + +- Solo es necesario instalar Git si estás usando **Windows**, ya que Mac y Linux lo traen preinstalado. +- Lo puedes descargar desde esta **[liga](https://git-scm.com/download/win)** . +- Descarga la versión necesaria para tu sistema operativo (32-bit o 64-bit). +- Una vez terminada la descarga, ejecuta el archivo descargado y dale "Siguiente" en todas las pantallas. +- Haz clic en el botón de "Finalizar". --- Date: Fri, 13 Jan 2023 21:34:40 +0100 Subject: [PATCH 153/248] ci: :bug: add message cli GIT --- packages/cli/check/index.js | 19 ++++++++++++++++--- packages/cli/interactive/index.js | 5 +++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index 73d5924..abd4eb1 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -1,4 +1,5 @@ const { red, yellow, green, bgCyan } = require('kleur') +const { exec } = require('node:child_process') const checkNodeVersion = () => { console.log(bgCyan('🚀 Revisando tu Node.js')) @@ -12,7 +13,7 @@ const checkNodeVersion = () => { ) process.exit(1) } - console.log(green(`Node.js compatible ${version}`)) + console.log(green(`Node.js: ${version} compatible ✅`)) console.log(``) } @@ -31,8 +32,20 @@ const checkOs = () => { console.log(yellow(messages.join(' \n'))) } - + console.log(green(`OS: compatible ✅`)) console.log(``) } -module.exports = { checkNodeVersion, checkOs } +const checkGit = () => { + console.log(bgCyan('🤓 Revisando GIT')) + exec('git --version', (error) => { + if (error) { + console.error(red(`🔴 Se require instalar GIT`)) + process.exit(1) + } + }) + console.log(green(`Git: Compatible ✅`)) + console.log(``) +} + +module.exports = { checkNodeVersion, checkOs, checkGit } diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index a0a4034..5d0e197 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -3,7 +3,7 @@ const { join } = require('path') const { yellow, red, cyan, bgMagenta } = require('kleur') const { existsSync } = require('fs') const { copyBaseApp } = require('../create-app') -const { checkNodeVersion, checkOs } = require('../check') +const { checkNodeVersion, checkOs, checkGit } = require('../check') const bannerDone = () => { console.log(``) @@ -59,8 +59,9 @@ const startInteractive = async () => { ] console.clear() - checkNodeVersion() checkOs() + checkNodeVersion() + checkGit() const onCancel = () => { console.log('¡Proceso cancelado!') return true From 03b5b441ded82336376b192f6b55e25eae7d2332 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 20:42:36 +0000 Subject: [PATCH 154/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/docs/src/routes/docs/requirements/index.mdx | 11 ++++++++++- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 8 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 1164b02..6ed70a3 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.64-alpha.0", + "version": "0.0.65-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 29c6e07..6418421 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.70-alpha.0", + "version": "0.0.71-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index ecd06e8..0f37f5f 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.14-alpha.0", + "version": "0.0.15-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index ac7ad87..c580a8b 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.81-alpha.0", + "version": "0.0.82-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index b8b625a..a83f31c 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.62-alpha.0", + "version": "0.0.63-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/docs/src/routes/docs/requirements/index.mdx b/packages/docs/src/routes/docs/requirements/index.mdx index d51a65b..8f1ef96 100644 --- a/packages/docs/src/routes/docs/requirements/index.mdx +++ b/packages/docs/src/routes/docs/requirements/index.mdx @@ -6,7 +6,9 @@ A continuación se describen los puntos técnicos que debes de tener en cuenta a - Node v16 o superior - **[descargar node](https://nodejs.org/es/download/)** - Git - **[descargar Git](https://git-scm.com/download/win)** + --- + ## ¿Como saber que tengo el Node? Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16 @@ -15,12 +17,16 @@ Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja $ node -v v18.12.1 ``` + --- + ## ¿Como instalar Node? - **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Si necesitas ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. - **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. -- --- + +--- + ## ¿Como saber que tengo Git? Solo debes ejecutar el siguiente comando y esperar que te mande la versión que tienes instalada, si te manda un error de comando no reconocido es que no lo tienes instalado. @@ -29,7 +35,9 @@ Solo debes ejecutar el siguiente comando y esperar que te mande la versión que $ git -v git ``` + --- + ## ¿Como instalar Git? - Solo es necesario instalar Git si estás usando **Windows**, ya que Mac y Linux lo traen preinstalado. @@ -37,6 +45,7 @@ git - Descarga la versión necesaria para tu sistema operativo (32-bit o 64-bit). - Una vez terminada la descarga, ejecuta el archivo descargado y dale "Siguiente" en todas las pantallas. - Haz clic en el botón de "Finalizar". + --- Date: Fri, 13 Jan 2023 22:31:45 +0100 Subject: [PATCH 155/248] chore: :zap: improvement cli --- packages/cli/check/index.js | 84 +++++++++++++---------- packages/cli/interactive/index.js | 22 ++++-- packages/create-bot-whatsapp/package.json | 2 +- 3 files changed, 67 insertions(+), 41 deletions(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index abd4eb1..cbd8e08 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -2,50 +2,64 @@ const { red, yellow, green, bgCyan } = require('kleur') const { exec } = require('node:child_process') const checkNodeVersion = () => { - console.log(bgCyan('🚀 Revisando tu Node.js')) - const version = process.version - const majorVersion = parseInt(version.replace('v', '').split('.').shift()) - if (majorVersion < 16) { - console.error( - red( - `🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` - ) + return new Promise((resolve, reject) => { + console.log(bgCyan('🚀 Revisando tu Node.js')) + const version = process.version + const majorVersion = parseInt( + version.replace('v', '').split('.').shift() ) - process.exit(1) - } - console.log(green(`Node.js: ${version} compatible ✅`)) - console.log(``) + if (majorVersion < 16) { + console.error( + red( + `🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` + ) + ) + console.log(``) + reject('ERROR_NODE') + } + console.log(green(`Node.js: ${version} compatible ✅`)) + console.log(``) + resolve() + }) } const checkOs = () => { - console.log(bgCyan('🙂 Revisando tu sistema operativo')) - const os = process.platform - if (!os.includes('win32')) { - const messages = [ - `El sistema operativo actual (${os}) posiblemente requiera`, - `una configuración adicional referente al puppeteer`, - ``, - `Recuerda pasar por el WIKI`, - `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`, - ``, - ] + return new Promise((resolve, reject) => { + console.log(bgCyan('🙂 Revisando tu sistema operativo')) + const os = process.platform + if (!os.includes('win32')) { + const messages = [ + `El sistema operativo actual (${os}) posiblemente requiera`, + `una configuración adicional referente al puppeteer`, + ``, + `Recuerda pasar por el WIKI`, + `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`, + ``, + ] - console.log(yellow(messages.join(' \n'))) - } - console.log(green(`OS: compatible ✅`)) - console.log(``) + console.log(yellow(messages.join(' \n'))) + } + console.log(green(`OS: compatible ✅`)) + console.log(``) + resolve() + }) } const checkGit = () => { - console.log(bgCyan('🤓 Revisando GIT')) - exec('git --version', (error) => { - if (error) { - console.error(red(`🔴 Se require instalar GIT`)) - process.exit(1) - } + return new Promise((resolve, reject) => { + console.log(bgCyan('🤓 Revisando GIT')) + exec('git --version', (error) => { + if (error) { + console.error(red(`🔴 Se require instalar GIT`)) + console.log(``) + reject('ERROR_GIT') + } else { + console.log(green(`Git: Compatible ✅`)) + console.log(``) + resolve() + } + }) }) - console.log(green(`Git: Compatible ✅`)) - console.log(``) } module.exports = { checkNodeVersion, checkOs, checkGit } diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index 5d0e197..b3f063d 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -1,6 +1,6 @@ const prompts = require('prompts') const { join } = require('path') -const { yellow, red, cyan, bgMagenta } = require('kleur') +const { yellow, red, cyan, bgMagenta, bgRed } = require('kleur') const { existsSync } = require('fs') const { copyBaseApp } = require('../create-app') const { checkNodeVersion, checkOs, checkGit } = require('../check') @@ -21,6 +21,22 @@ const bannerDone = () => { } const startInteractive = async () => { + try { + console.clear() + await checkNodeVersion() + checkOs() + await checkGit() + console.clear() + await nextSteps() + } catch (e) { + console.error(bgRed(`Ups! 🙄 algo no va bien.`)) + console.error( + bgRed(`Revisa los requerimientos minimos en la documentacion`) + ) + } +} + +const nextSteps = async () => { const questions = [ { type: 'text', @@ -58,10 +74,6 @@ const startInteractive = async () => { }, ] - console.clear() - checkOs() - checkNodeVersion() - checkGit() const onCancel = () => { console.log('¡Proceso cancelado!') return true diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 49503df..873522f 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.78-alpha.0", + "version": "0.0.92-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ From f274379c53afcda6e602edbf1d963ec96ab972d2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 13 Jan 2023 22:32:23 +0100 Subject: [PATCH 156/248] chore(release): 0.1.17 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48381f1..8d3865b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.17](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.16...v0.1.17) (2023-01-13) + + +### Features + +* mod de starters para habiltar portal ([eceb170](https://github.com/leifermendez/bot-whatsapp/commit/eceb170df03721dca4183b658c863b94fa04bc84)) + + +### Bug Fixes + +* **ci:** pre-release ([aaec075](https://github.com/leifermendez/bot-whatsapp/commit/aaec0751408ab49483d428810d94aaf7d46acb94)) +* correccion en starters app.js para portal QR ([f430380](https://github.com/leifermendez/bot-whatsapp/commit/f430380b4f23d41702395c96c628bf13bf443278)) +* **starters:** :zap: added dockerfile ([230981e](https://github.com/leifermendez/bot-whatsapp/commit/230981e2676361149cb2a99def7f705e75009260)) + ### [0.1.16](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.15...v0.1.16) (2023-01-11) ### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) diff --git a/package.json b/package.json index a6e64e7..354bc44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.16", + "version": "0.1.17", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From e72794a296aa33218401379014e9eefcc3652c95 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 21:36:53 +0000 Subject: [PATCH 157/248] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 6ed70a3..d3f004e 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.65-alpha.0", + "version": "0.0.66-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6418421..60361be 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.71-alpha.0", + "version": "0.0.72-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 0f37f5f..c186a5f 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.15-alpha.0", + "version": "0.0.16-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 873522f..3b372ca 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.92-alpha.0", + "version": "0.0.93-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index a83f31c..f69d0c9 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.63-alpha.0", + "version": "0.0.64-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 0892707..c26ab32 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.21-alpha.0", + "version": "0.0.22-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index a5ab3b0..5c3ef0a 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.69-alpha.0", + "version": "0.0.70-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 8cbfd560a3585750c6edbccd544a21318c71c337 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:13:52 +0100 Subject: [PATCH 158/248] =?UTF-8?q?ci(providers):=20=EF=BF=BD=20Check=20BR?= =?UTF-8?q?EAKING=20CHANGE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/provider/src/web-whatsapp/package.json | 2 +- starters/apps/base-wweb-json/package.json | 2 +- starters/apps/base-wweb-memory/package.json | 2 +- starters/apps/base-wweb-mongo/package.json | 2 +- starters/apps/base-wweb-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 7514818..d15dbe0 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" } } diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index f52ab5a..d01b825 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index b9c4712..d508c4f 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index 9c51d8a..a64f35c 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index e95ec1a..ee90e12 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", From 6683715ad617ea1075654a475a1c62ea607c733f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:21:26 +0100 Subject: [PATCH 159/248] fix(cli): :zap: refactor --- .github/workflows/check-providers.yml | 13 ++- packages/portal/.vscode/extensions.json | 4 + .../portal/.vscode/qwik-city.code-snippets | 32 +++++++ packages/portal/.vscode/qwik.code-snippets | 84 +++++++++++++++++++ .../server/@qwik-city-not-found-paths.js | 15 ++++ packages/portal/server/@qwik-city-plan.mjs | 5 ++ .../portal/server/@qwik-city-static-paths.js | 23 +++++ packages/portal/server/entry.ssr.js | 1 + packages/portal/server/entry.ssr.mjs | 2 + packages/portal/server/package.json | 3 + 10 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 packages/portal/.vscode/extensions.json create mode 100644 packages/portal/.vscode/qwik-city.code-snippets create mode 100644 packages/portal/.vscode/qwik.code-snippets create mode 100644 packages/portal/server/@qwik-city-not-found-paths.js create mode 100644 packages/portal/server/@qwik-city-plan.mjs create mode 100644 packages/portal/server/@qwik-city-static-paths.js create mode 100644 packages/portal/server/entry.ssr.js create mode 100644 packages/portal/server/entry.ssr.mjs create mode 100644 packages/portal/server/package.json diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml index 9965606..5811dc2 100644 --- a/.github/workflows/check-providers.yml +++ b/.github/workflows/check-providers.yml @@ -40,6 +40,15 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true - - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Add and commit changes to gh-pages branch + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git add . + git commit -m 'major' + + - name: Push changes + uses: ad-m/github-push-action@master with: - commit_message: 'ci(providers): 👍 updated versions stable providers' + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: feature/providers-major diff --git a/packages/portal/.vscode/extensions.json b/packages/portal/.vscode/extensions.json new file mode 100644 index 0000000..1396082 --- /dev/null +++ b/packages/portal/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "unifiedjs.vscode-mdx"], + "unwantedRecommendations": [] +} diff --git a/packages/portal/.vscode/qwik-city.code-snippets b/packages/portal/.vscode/qwik-city.code-snippets new file mode 100644 index 0000000..b6c1c17 --- /dev/null +++ b/packages/portal/.vscode/qwik-city.code-snippets @@ -0,0 +1,32 @@ +{ + "onGet": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:onGet", + "description": "onGet function for a route index", + "body": [ + "export const onGet: RequestHandler = (request) => {", + " $0", + "};" + ] + }, + "onGet (typed)": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:onGet typed", + "description": "onGet function for a route index", + "body": [ + "export interface ${1:PageData} {", + " $2", + "};", + "", + "export const onGet: RequestHandler<$1> = (request) => {", + " $4", + "};" + ] + }, + "useEndpoint": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useEndpoint", + "description": "useEndpoint declaration", + "body": "const $1 = useEndpoint();" + } +} diff --git a/packages/portal/.vscode/qwik.code-snippets b/packages/portal/.vscode/qwik.code-snippets new file mode 100644 index 0000000..4b89dbf --- /dev/null +++ b/packages/portal/.vscode/qwik.code-snippets @@ -0,0 +1,84 @@ +{ + "Qwik component (simple)": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:component", + "description": "Simple Qwik component", + "body": [ + "export const ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}} = component$(() => {", + " return <${2:div}>$4", + "});" + ] + }, + "Qwik component (props)": { + "scope": "typescriptreact", + "prefix": "q:component w/props", + "description": "Qwik component w/ props", + "body": [ + "export interface ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}}Props {", + " $2", + "}", + "", + "export const $1 = component$<$1Props>((props) => {", + " const ${2:count} = useSignal(0);", + " return (", + " <${3:div} on${4:Click}$={(ev) => {$5}}>", + " $6", + " ", + " );", + "});" + ] + }, + "Qwik signal": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useSignal", + "description": "useSignal() declaration", + "body": ["const ${1:foo} = useSignal($2);", "$0"] + }, + "Qwik store": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useStore", + "description": "useStore() declaration", + "body": ["const ${1:state} = useStore({", " $2", "});", "$0"] + }, + "$ hook": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:$", + "description": "$() function hook", + "body": ["$(() => {", " $0", "});", ""] + }, + "useClientEffect": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useClientEffect", + "description": "useClientEffect$() function hook", + "body": ["useClientEffect$(({ track }) => {", " $0", "});", ""] + }, + "useTask": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useTask", + "description": "useTask$() function hook", + "body": [ + "useTask$(({ track }) => {", + " track(() => $1);", + " $0", + "});", + "" + ] + }, + "useResource": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useResource", + "description": "useResource$() declaration", + "body": [ + "const $1 = useResource$(({ track, cleanup }) => {", + " $0", + "});", + "" + ] + }, + "useServerMount": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useServerMount", + "description": "useServerMount$() function hook", + "body": ["useServerMount$(() => {", " $0", "});", ""] + } +} diff --git a/packages/portal/server/@qwik-city-not-found-paths.js b/packages/portal/server/@qwik-city-not-found-paths.js new file mode 100644 index 0000000..f5f657d --- /dev/null +++ b/packages/portal/server/@qwik-city-not-found-paths.js @@ -0,0 +1,15 @@ +const notFounds = [ + [ + '/', + '\n\n\n \n \n 404 Resource Not Found\n \n \n\n\n

404 Resource Not Found

\n\n', + ], +] +function getNotFound(p) { + for (const r of notFounds) { + if (p.startsWith(r[0])) { + return r[1] + } + } + return 'Resource Not Found' +} +export { getNotFound } diff --git a/packages/portal/server/@qwik-city-plan.mjs b/packages/portal/server/@qwik-city-plan.mjs new file mode 100644 index 0000000..4ae6623 --- /dev/null +++ b/packages/portal/server/@qwik-city-plan.mjs @@ -0,0 +1,5 @@ +import{componentQrl as o,inlinedQrl as i,useStylesScopedQrl as n,Slot as s,useStore as c,useClientEffectQrl as r,_noopQrl as l}from"@builder.io/qwik";import{jsxs as t,jsx as e,Fragment as d}from"@builder.io/qwik/jsx-runtime";const h=`.logo{display:flex;gap:.5rem;align-items:center;align-content:center;color:#1a1a1a}.logo h1{font-size:1.5rem;margin:0} +`,g=o(i(()=>(n(i(h,"s_a8xI1ebvPf4")),t("div",{class:"logo",children:[e("img",{width:"40",height:"40",src:"data:image/png;base64,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",alt:""}),e("h1",{children:"Chatbot"})]})),"s_PjfpaY6FOTY")),P=`header{display:flex;background:white}header .logo a{display:inline-block;padding:10px 10px 7px 20px;text-decoration:none}header ul{margin:0;padding:3px 10px 0 0;list-style:none;flex:1;text-align:right}header li{display:inline-block;margin:0;padding:0}header li a{display:inline-block;padding:15px 10px;text-decoration:none;color:#1a1a1a;font-weight:500}header li a:hover{text-decoration:underline} +`,p=o(i(()=>(n(i(P,"s_DUMnr602HUE")),t("header",{children:[e("div",{class:"logo",children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp",target:"_blank",title:"qwik",children:e(g,{},"k2_0")})}),t("ul",{children:[e("li",{children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp",target:"_blank",children:"Docs"})}),e("li",{children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp/tree/main/starters/apps",target:"_blank",children:"Examples"})}),e("li",{children:e("a",{href:"https://www.youtube.com/watch?v=1u0TTbjK5bo&list=PL_WGMLcL4jzViIlmyDZPnhAdkc8RXGkFh",target:"_blank",children:"Tutorials"})})]})]})),"s_rUlpxt0UkP8")),A=o(i(()=>t(d,{children:[t("main",{children:[e(p,{},"3N_0"),e("section",{children:e(s,{},"3N_1")})]}),e("footer",{children:t("a",{href:"https://qwik.builder.io/",target:"_blank",children:["Made with ",e("strong",{children:"Qwik"})]})})]},"3N_2"),"s_dyI7p8LxEE8")),u=Object.freeze(Object.defineProperty({__proto__:null,default:A},Symbol.toStringTag,{value:"Module"})),w=`div img{display:block;background-color:#f0f0f0;width:350px;height:350px;object-fit:contain;border-radius:10px}div{display:flex;justify-content:center} +`,j=o(i(()=>{n(i(w,"s_C1zLAObj2Tc"));const a=c({count:0});return r(l("s_9iPc0ZNOdxU",[a])),e("div",{children:e("img",{width:350,height:350,src:"qr.png?time="+a.count,alt:"QR"})})},"s_rghJxmpKVus")),m=`.page{display:grid;padding:1rem;gap:2rem}.page .qr-section.links{display:flex;gap:1rem;flex-wrap:wrap}.page .btn-link{background:white;box-shadow:#00000029 0 10px 36px,#0000000f 0 0 0 1px;padding:10px;border-radius:5px;font-weight:600;text-decoration:none;color:#1a1a1a;border:solid 1px #afafaf} +`,y=o(i(()=>(n(i(m,"s_A20fm0z03Yw")),t("div",{class:"page",children:[e("div",{class:"qr-section",children:e(j,{},"UZ_0")}),t("div",{class:"qr-section intructions",children:[e("h1",{children:"Whatsapp QR"}),t("p",{children:["Con esta libreria, puedes configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. ",e("br",{})," Además, nuestro Chatbot se integra fácilmente con otros sistemas y herramientas que ya esté utilizando en su negocio."]}),t("div",{class:"qr-section links",children:[e("a",{class:"btn-link ",target:"_blank",href:"https://bot-whatsapp.netlify.app/",children:"Ver documentación"}),e("a",{class:"btn-link ",target:"_blank",href:"https://www.youtube.com/watch?v=1u0TTbjK5bo&list=PL_WGMLcL4jzViIlmyDZPnhAdkc8RXGkFh",children:"Ver videos"}),e("a",{class:"btn-link ",target:"_blank",href:"https://opencollective.com/bot-whatsapp",children:"Comprar café"})]})]})]})),"s_4uCQXYaqoXY")),f={title:"🤖 Crear chatbot WhatsApp en minutos",meta:[{name:"description",content:"🤖 Crear chatbot WhatsApp en minutos"}]},b=Object.freeze(Object.defineProperty({__proto__:null,default:y,head:f},Symbol.toStringTag,{value:"Module"})),x=()=>u,z=[[/^\/$/,[x,()=>b],void 0,"/",["q-eaa41d1e.js","q-9cbd2586.js"]]],B=[],I=!0,E="/",L=!0,v={routes:z,menus:B,trailingSlash:I,basePathname:E,cacheModules:L};export{E as basePathname,L as cacheModules,v as default,B as menus,z as routes,I as trailingSlash}; diff --git a/packages/portal/server/@qwik-city-static-paths.js b/packages/portal/server/@qwik-city-static-paths.js new file mode 100644 index 0000000..1afa65f --- /dev/null +++ b/packages/portal/server/@qwik-city-static-paths.js @@ -0,0 +1,23 @@ +const staticPaths = new Set([ + '/', + '/favicon.svg', + '/manifest.json', + '/q-manifest.json', + '/robots.txt', + '/service-worker.js', + '/sitemap.xml', + '/water-mark.png', +]) +function isStaticPath(p) { + if (p.startsWith('/build/')) { + return true + } + if (p.startsWith('/assets/')) { + return true + } + if (staticPaths.has(p)) { + return true + } + return false +} +export { isStaticPath } diff --git a/packages/portal/server/entry.ssr.js b/packages/portal/server/entry.ssr.js new file mode 100644 index 0000000..eed19e1 --- /dev/null +++ b/packages/portal/server/entry.ssr.js @@ -0,0 +1 @@ +export * from './entry.ssr.mjs' diff --git a/packages/portal/server/entry.ssr.mjs b/packages/portal/server/entry.ssr.mjs new file mode 100644 index 0000000..c4fbac2 --- /dev/null +++ b/packages/portal/server/entry.ssr.mjs @@ -0,0 +1,2 @@ +import{jsx as r,jsxs as z,Fragment as qe}from"@builder.io/qwik/jsx-runtime";import{renderToStream as je}from"@builder.io/qwik/server";import{componentQrl as j,inlinedQrl as p,useContext as E,jsx as be,SkipRender as we,useEnvData as te,useStore as m,useContextProvider as u,useWatchQrl as ke,useLexicalScope as ne,getLocale as ve,noSerialize as se,Slot as U,useOnDocument as Ce,createContext as k,withLocale as H,_wrapSignal as P,_IMMUTABLE as W,useStylesQrl as Le}from"@builder.io/qwik";const Ne={symbols:{s_kzjavhDI3L0:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onClick",canonicalFilename:"s_kzjavhdi3l0",hash:"kzjavhDI3L0",ctxKind:"event",ctxName:"onClick$",captures:!0,parent:"s_8gdLBszqbaM"},s_yiXwCC0m3jY:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onMouseOver",canonicalFilename:"s_yixwcc0m3jy",hash:"yiXwCC0m3jY",ctxKind:"event",ctxName:"onMouseOver$",captures:!1,parent:"s_8gdLBszqbaM"},s_EpaZ5qQ4Lg4:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onQVisible",canonicalFilename:"s_epaz5qq4lg4",hash:"EpaZ5qQ4Lg4",ctxKind:"event",ctxName:"onQVisible$",captures:!1,parent:"s_8gdLBszqbaM"},s_9iPc0ZNOdxU:{origin:"components/qr/qr.tsx",displayName:"QR_component_useClientEffect",canonicalFilename:"s_9ipc0znodxu",hash:"9iPc0ZNOdxU",ctxKind:"function",ctxName:"useClientEffect$",captures:!0,parent:"s_rghJxmpKVus"},s_4uCQXYaqoXY:{origin:"routes/index.tsx",displayName:"routes_component",canonicalFilename:"s_4ucqxyaqoxy",hash:"4uCQXYaqoXY",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_8gdLBszqbaM:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component",canonicalFilename:"s_8gdlbszqbam",hash:"8gdLBszqbaM",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_AKetNByE5TM:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"RouterOutlet_component",canonicalFilename:"s_aketnbye5tm",hash:"AKetNByE5TM",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_BVs20TDbvq4:{origin:"root.tsx",displayName:"root_component",canonicalFilename:"s_bvs20tdbvq4",hash:"BVs20TDbvq4",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_D0p4a09aSQg:{origin:"components/router-head/router-head.tsx",displayName:"RouterHead_component",canonicalFilename:"s_d0p4a09asqg",hash:"D0p4a09aSQg",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_PjfpaY6FOTY:{origin:"components/icons/bot.tsx",displayName:"BotLogo_component",canonicalFilename:"s_pjfpay6foty",hash:"PjfpaY6FOTY",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_TxCFOy819ag:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityProvider_component",canonicalFilename:"s_txcfoy819ag",hash:"TxCFOy819ag",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_WmYC5H00wtI:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityMockProvider_component",canonicalFilename:"s_wmyc5h00wti",hash:"WmYC5H00wtI",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_dyI7p8LxEE8:{origin:"routes/layout.tsx",displayName:"layout_component",canonicalFilename:"s_dyi7p8lxee8",hash:"dyI7p8LxEE8",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_rUlpxt0UkP8:{origin:"components/header/header.tsx",displayName:"header_component",canonicalFilename:"s_rulpxt0ukp8",hash:"rUlpxt0UkP8",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_rghJxmpKVus:{origin:"components/qr/qr.tsx",displayName:"QR_component",canonicalFilename:"s_rghjxmpkvus",hash:"rghJxmpKVus",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_xHG1bWPFcUU:{origin:"root.tsx",displayName:"root_component_useStyles",canonicalFilename:"s_xhg1bwpfcuu",hash:"xHG1bWPFcUU",ctxKind:"function",ctxName:"useStyles$",captures:!1,parent:"s_BVs20TDbvq4"},s_A20fm0z03Yw:{origin:"routes/index.tsx",displayName:"routes_component_useStylesScoped",canonicalFilename:"s_a20fm0z03yw",hash:"A20fm0z03Yw",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_4uCQXYaqoXY"},s_C1zLAObj2Tc:{origin:"components/qr/qr.tsx",displayName:"QR_component_useStylesScoped",canonicalFilename:"s_c1zlaobj2tc",hash:"C1zLAObj2Tc",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_rghJxmpKVus"},s_DUMnr602HUE:{origin:"components/header/header.tsx",displayName:"header_component_useStylesScoped",canonicalFilename:"s_dumnr602hue",hash:"DUMnr602HUE",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_rUlpxt0UkP8"},s_a8xI1ebvPf4:{origin:"components/icons/bot.tsx",displayName:"BotLogo_component_useStylesScoped",canonicalFilename:"s_a8xi1ebvpf4",hash:"a8xI1ebvPf4",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_PjfpaY6FOTY"},s_00bFc4tHmxA:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"useEndpoint_useResource",canonicalFilename:"s_00bfc4thmxa",hash:"00bFc4tHmxA",ctxKind:"function",ctxName:"useResource$",captures:!0,parent:null},s_2Eo7WCpaqI8:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityProvider_component_useWatch",canonicalFilename:"s_2eo7wcpaqi8",hash:"2Eo7WCpaqI8",ctxKind:"function",ctxName:"useWatch$",captures:!0,parent:"s_TxCFOy819ag"},s_u0YVoxt2aTY:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_useOnDocument",canonicalFilename:"s_u0yvoxt2aty",hash:"u0YVoxt2aTY",ctxKind:"function",ctxName:"useOnDocument",captures:!1,parent:"s_8gdLBszqbaM"}},mapping:{s_kzjavhDI3L0:"q-a72d609e.js",s_yiXwCC0m3jY:"q-a72d609e.js",s_EpaZ5qQ4Lg4:"q-a72d609e.js",s_9iPc0ZNOdxU:"q-a72d609e.js",s_4uCQXYaqoXY:"q-a72d609e.js",s_8gdLBszqbaM:"q-a72d609e.js",s_AKetNByE5TM:"q-a72d609e.js",s_BVs20TDbvq4:"q-a72d609e.js",s_D0p4a09aSQg:"q-a72d609e.js",s_PjfpaY6FOTY:"q-a72d609e.js",s_TxCFOy819ag:"q-a72d609e.js",s_WmYC5H00wtI:"q-a72d609e.js",s_dyI7p8LxEE8:"q-a72d609e.js",s_rUlpxt0UkP8:"q-a72d609e.js",s_rghJxmpKVus:"q-a72d609e.js",s_xHG1bWPFcUU:"q-a72d609e.js",s_A20fm0z03Yw:"q-a72d609e.js",s_C1zLAObj2Tc:"q-a72d609e.js",s_DUMnr602HUE:"q-a72d609e.js",s_a8xI1ebvPf4:"q-a72d609e.js",s_00bFc4tHmxA:"q-a72d609e.js",s_2Eo7WCpaqI8:"q-a72d609e.js",s_u0YVoxt2aTY:"q-a72d609e.js"},bundles:{"q-0d007131.js":{size:507,imports:["q-3e21ace4.js"],dynamicImports:["q-9cbd2586.js","q-eaa41d1e.js","q-f1036226.js"],origins:["@qwik-city-plan"]},"q-3e21ace4.js":{size:43312,origins:["\0vite/preload-helper","node_modules/@builder.io/qwik/core.min.mjs"]},"q-45aab3b6.js":{size:2536,origins:["../../node_modules/@builder.io/qwik-city/service-worker.mjs","src/routes/service-worker.ts"]},"q-9cbd2586.js":{size:319,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/routes/index.tsx"]},"q-a72d609e.js":{size:25263,imports:["q-3e21ace4.js"],dynamicImports:["q-0d007131.js"],origins:["../../node_modules/@builder.io/qwik-city/index.qwik.mjs","src/components/header/header.css?used&inline","src/components/header/header.tsx","src/components/icons/bot.css?used&inline","src/components/icons/bot.tsx","src/components/qr/qr.css?used&inline","src/components/qr/qr.tsx","src/components/router-head/router-head.tsx","src/entry_hooks.js","src/global.css?used&inline","src/routes/index.css?used&inline","src/s_00bfc4thmxa.js","src/s_2eo7wcpaqi8.js","src/s_4ucqxyaqoxy.js","src/s_8gdlbszqbam.js","src/s_9ipc0znodxu.js","src/s_a20fm0z03yw.js","src/s_a8xi1ebvpf4.js","src/s_aketnbye5tm.js","src/s_bvs20tdbvq4.js","src/s_c1zlaobj2tc.js","src/s_d0p4a09asqg.js","src/s_dumnr602hue.js","src/s_dyi7p8lxee8.js","src/s_epaz5qq4lg4.js","src/s_kzjavhdi3l0.js","src/s_pjfpay6foty.js","src/s_rghjxmpkvus.js","src/s_rulpxt0ukp8.js","src/s_txcfoy819ag.js","src/s_u0yvoxt2aty.js","src/s_wmyc5h00wti.js","src/s_xhg1bwpfcuu.js","src/s_yixwcc0m3jy.js"],symbols:["s_00bFc4tHmxA","s_2Eo7WCpaqI8","s_4uCQXYaqoXY","s_8gdLBszqbaM","s_9iPc0ZNOdxU","s_A20fm0z03Yw","s_a8xI1ebvPf4","s_AKetNByE5TM","s_BVs20TDbvq4","s_C1zLAObj2Tc","s_D0p4a09aSQg","s_DUMnr602HUE","s_dyI7p8LxEE8","s_EpaZ5qQ4Lg4","s_kzjavhDI3L0","s_PjfpaY6FOTY","s_rghJxmpKVus","s_rUlpxt0UkP8","s_TxCFOy819ag","s_u0YVoxt2aTY","s_WmYC5H00wtI","s_xHG1bWPFcUU","s_yiXwCC0m3jY"]},"q-df6dc34c.js":{size:185,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/root.tsx"]},"q-eaa41d1e.js":{size:185,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/routes/layout.tsx"]},"q-f1036226.js":{size:112,imports:["q-3e21ace4.js"],dynamicImports:["q-45aab3b6.js"],origins:["@qwik-city-entries"]}},injections:[],version:"1",options:{target:"client",buildMode:"production",forceFullBuild:!0,entryStrategy:{type:"single"}},platform:{qwik:"0.16.2",vite:"",rollup:"3.9.1",env:"node",os:"win32",node:"18.12.1"}},Ee=!0,Ie=!1,oe=k("qc-c"),D=k("qc-ic"),O=k("qc-h"),Q=k("qc-l"),M=k("qc-n"),Pe=j(p(()=>{const{contents:e}=E(D);if(e&&e.length>0){const t=e.length;let n=null;for(let s=t-1;s>=0;s--)n=be(e[s].default,{children:n});return n}return we},"RouterOutlet_component_AKetNByE5TM")),R=new WeakMap,N=Symbol(),F=Symbol(),w=new Map,Se=async(e,t,n,s)=>{if(Array.isArray(e))for(const o of e){const a=o[0].exec(s);if(a){const i=o[1],c=Ye(o[2],a),l=o[4],f=new Array(i.length),y=[],_=Te(t,s);let v;return i.forEach((d,g)=>{$(d,y,I=>f[g]=I,n)}),$(_,y,d=>v=d==null?void 0:d.default,n),y.length>0&&await Promise.all(y),[c,f,v,l]}}return null},$=(e,t,n,s)=>{if(typeof e=="function"){const o=R.get(e);if(o)n(o);else{const a=e();typeof a.then=="function"?t.push(a.then(i=>{s!==!1&&R.set(e,i),n(i)})):a&&n(a)}}},Te=(e,t)=>{if(e){t=t.endsWith("/")?t:t+"/";const n=e.find(s=>s[0]===t||t.startsWith(s[0]+(t.endsWith("/")?"":"/")));if(n)return n[1]}},Ye=(e,t)=>{const n={};if(e)for(let s=0;s{const o=K(),a={data:e?e.body:null,head:o,withLocale:i=>H(s,i),...t};for(let i=n.length-1;i>=0;i--){const c=n[i]&&n[i].head;c&&(typeof c=="function"?V(o,H(s,()=>c(a))):typeof c=="object"&&V(o,c))}return a.head},V=(e,t)=>{typeof t.title=="string"&&(e.title=t.title),S(e.meta,t.meta),S(e.links,t.links),S(e.styles,t.styles),Object.assign(e.frontmatter,t.frontmatter)},S=(e,t)=>{if(Array.isArray(t))for(const n of t){if(typeof n.key=="string"){const s=e.findIndex(o=>o.key===n.key);if(s>-1){e[s]=n;continue}}e.push(n)}},K=()=>({title:"",meta:[],links:[],styles:[],frontmatter:{}}),Fe=()=>E(O),ae=()=>E(Q),Ue=()=>E(M),De=()=>se(te("qwikcity")),x=e=>e.pathname+e.search+e.hash,q=(e,t)=>new URL(e,t.href),ie=(e,t)=>e.origin===t.origin,ce=(e,t)=>e.pathname+e.search===t.pathname+t.search,Oe=(e,t)=>e.pathname===t.pathname,X=(e,t)=>ie(e,t)&&!ce(e,t),Qe=(e,t)=>e+(e.endsWith("/")?"":"/")+"q-data.json"+(t??""),Me=(e,t)=>{const n=e.href;if(typeof n=="string"&&n.trim()!==""&&typeof e.target!="string")try{const s=q(n,t),o=q("",t);if(ie(s,o))return x(s)}catch(s){console.error(s)}return null},Ke=(e,t,n)=>{if(e.prefetch!==!1&&t){const s=q(t,n);if(!Oe(s,q("",n)))return""}return null},Ae=(e,t)=>{const n=e.location,s=q(t.path,n);X(n,s)&&(Z(e,n,s),e.history.pushState("","",x(s))),e[F]||(e[F]=1,e.addEventListener("popstate",()=>{const o=e.location,a=q(t.path,o);X(o,a)&&(Z(e,a,o),t.path=x(o))}),e.removeEventListener("popstate",e[N]))},Z=async(e,t,n)=>{const s=e.document,o=n.hash;if(ce(t,n))t.hash!==o&&(await T(),o?J(s,o):e.scrollTo(0,0));else if(o)for(let a=0;a<24&&(await T(),!J(s,o));a++);else await T(),e.scrollTo(0,0)},T=()=>new Promise(e=>setTimeout(e,12)),J=(e,t)=>{const n=t.slice(1),s=e.getElementById(n);return s&&s.scrollIntoView(),s},G=e=>{typeof document<"u"&&document.dispatchEvent(new CustomEvent("qprefetch",{detail:e}))},re=async(e,t)=>{const n=new URL(e),s=n.pathname,o=n.search,a=Qe(s,o);let i=w.get(a);return G({links:[s]}),i||(i=fetch(a).then(c=>{if(c.ok&&(c.headers.get("content-type")||"").includes("json"))return c.json().then(l=>(G({bundles:l.prefetch}),t&&w.delete(a),l));w.delete(a)}),w.set(a,i)),i},Be=j(p(()=>{const e=De();if(!(e!=null&&e.params))throw new Error("Missing Qwik City Env Data");const t=te("url");if(!t)throw new Error("Missing Qwik URL Env Data");const n=new URL(t),s=m({href:n.href,pathname:n.pathname,query:Object.fromEntries(n.searchParams.entries()),params:e.params}),o=m({path:x(n)}),a=m(K),i=m({headings:void 0,menu:void 0}),c=m({contents:void 0});return u(oe,i),u(D,c),u(O,a),u(Q,s),u(M,o),ke(p(async({track:l})=>{const[f,y,_,v,d,g]=ne(),I=ve(""),{routes:le,menus:de,cacheModules:pe,trailingSlash:A}=await import("./@qwik-city-plan.mjs"),me=l(()=>g.path),h=new URL(me,d.href),C=h.pathname,ue=Se(le,de,pe,C),he=Ee?v.response:re(h.href,!0),B=await ue;if(B){const[fe,_e,xe]=B,L=_e,ye=L[L.length-1];if(C.endsWith("/")){if(!A){h.pathname=C.slice(0,-1),g.path=x(h);return}}else if(A){h.pathname+="/",g.path=x(h);return}d.href=h.href,d.pathname=C,d.params={...fe},d.query=Object.fromEntries(h.searchParams.entries()),f.headings=ye.headings,f.menu=xe,y.contents=se(L);const ge=await he,b=ze(ge,d,L,I);w.clear(),_.links=b.links,_.meta=b.meta,_.styles=b.styles,_.title=b.title,_.frontmatter=b.frontmatter,Ie&&Ae(window,g)}},"QwikCityProvider_component_useWatch_2Eo7WCpaqI8",[i,c,a,e,s,o])),r(U,{},"qY_0")},"QwikCityProvider_component_TxCFOy819ag"));p(e=>{const t=e.url??"http://localhost/",n=new URL(t),s=m({href:n.href,pathname:n.pathname,query:Object.fromEntries(n.searchParams.entries()),params:e.params??{}}),o=m({path:x(n)}),a=m(K),i=m({headings:void 0,menu:void 0}),c=m({contents:void 0});return u(oe,i),u(D,c),u(O,a),u(Q,s),u(M,o),r(U,{},"qY_1")},"QwikCityMockProvider_component_WmYC5H00wtI");p(e=>{const t=Ue(),n=ae(),s=e.href,o={...e},a=Me(o,n),i=Ke(e,a,n);return o["preventdefault:click"]=!!a,o.href=a||s,Ce("qinit",p(()=>{window[N]||(window[N]=()=>{window[F]||location.reload()},setTimeout(()=>{addEventListener("popstate",window[N])},0))},"Link_component_useOnDocument_u0YVoxt2aTY")),r("a",{...o,onClick$:p(()=>{const[c,l,f]=ne();c&&(f.path=l.href)},"Link_component_a_onClick_kzjavhDI3L0",[a,o,t]),"data-prefetch":i,onMouseOver$:p((c,l)=>ee(l),"Link_component_a_onMouseOver_yiXwCC0m3jY"),onQVisible$:p((c,l)=>ee(l,!0),"Link_component_a_onQVisible_EpaZ5qQ4Lg4"),children:r(U,{},"AD_0")})},"Link_component_8gdLBszqbaM");const ee=(e,t)=>{e&&e.href&&e.hasAttribute("data-prefetch")&&(Y||(Y=innerWidth),(!t||t&&Y<520)&&re(e.href))};let Y=0;const He=j(p(()=>{const e=Fe(),t=ae();return z(qe,{children:[r("title",{children:P(e,"title")}),r("link",{rel:"canonical",get href(){return t.href},[W]:{href:P(t,"href")}}),r("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),r("link",{rel:"icon",type:"image/svg+xml",href:"/favicon.svg"}),e.meta.map(n=>r("meta",{...n})),e.links.map(n=>r("link",{...n})),e.styles.map(n=>r("style",{...n.props,get dangerouslySetInnerHTML(){return n.style},[W]:{dangerouslySetInnerHTML:P(n,"style")}}))]},"Qn_0")},"s_D0p4a09aSQg")),We=`:root{--qwik-dark-blue: #1a1a1a;--qwik-light-blue: #349713;--qwik-light-purple: #73da51;--qwik-dark-purple: #3f9622}body{background-color:#fafafa;font-family:Inter,sans-serif,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;padding:20px 20px 40px}main{max-width:760px;margin:0 auto;background-color:#fff;border-radius:5px;box-shadow:#110c2e26 0 48px 100px;overflow:hidden}h1,h2{margin:0 0 5px}.lightning{filter:hue-rotate(180deg)}section{padding:20px}ul{list-style-type:square;margin:5px 0 30px;padding-left:25px}li{padding:8px 0}li::marker{color:var(--qwik-light-blue)}a,a:visited{color:var(--qwik-dark-blue)}a:hover{text-decoration:none}table.commands{margin:0 0 30px}.commands td{padding:5px}.commands td:first-child{white-space:nowrap;padding-right:20px}code{font-family:Menlo,Monaco,Courier New,monospace;font-size:.9em;background-color:#e0e0e0;padding:2px 4px;border-radius:3px;border-bottom:2px solid #bfbfbf}footer{padding:15px;text-align:center;font-size:.8em}footer a{text-decoration:none}footer a:hover{text-decoration:underline}a.mindblow{margin:0 auto;display:block;background:var(--qwik-dark-purple);padding:10px 20px;border-radius:10px;border:0;color:#fff;text-decoration:none;font-size:20px;width:fit-content;border-bottom:4px solid black;cursor:url("data:image/svg+xml;utf8,\\1f92f") 16 0,auto}a.mindblow:hover{border-bottom-width:0px;margin-bottom:4px;transform:translateY(4px)} +`,Re=j(p(()=>(Le(p(We,"s_xHG1bWPFcUU")),z(Be,{children:[z("head",{children:[r("meta",{charSet:"utf-8"}),r("link",{rel:"preconnect",href:"https://rsms.me/"}),r("link",{rel:"stylesheet",href:"https://rsms.me/inter/inter.css"}),r(He,{},"pq_0")]}),r("body",{lang:"en",children:r(Pe,{},"pq_1")})]},"pq_2")),"s_BVs20TDbvq4"));function Ze(e){return je(r(Re,{},"we_0"),{manifest:Ne,...e,containerAttributes:{lang:"en-us",...e.containerAttributes}})}export{Ze as default}; diff --git a/packages/portal/server/package.json b/packages/portal/server/package.json new file mode 100644 index 0000000..4720025 --- /dev/null +++ b/packages/portal/server/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} From f36cff1eefdd96be4ab531e1cb2d3b630b1a81c3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:54:10 +0100 Subject: [PATCH 160/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56dcd60..54fedc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m 'major' + git commit -m '"${{ github.event.head_commit.message }}"' - name: Push changes uses: ad-m/github-push-action@master From 56fcb8fb72169bc21fce7c4fcdceccf2acd39c73 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:58:46 +0100 Subject: [PATCH 161/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54fedc7..6920700 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ github.event.head_commit.message }}"' + git commit -m "${{ github.event.head_commit.message }}" - name: Push changes uses: ad-m/github-push-action@master From cc19974579379777b05cb69c38cec0fce6740471 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:04:07 +0100 Subject: [PATCH 162/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6920700..54fedc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m "${{ github.event.head_commit.message }}" + git commit -m '"${{ github.event.head_commit.message }}"' - name: Push changes uses: ad-m/github-push-action@master From 82a99b2c80e6738566042ea738bbab8208a17758 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:12:00 +0100 Subject: [PATCH 163/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54fedc7..47c545a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,6 +64,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{github.event.after}} - name: Setup Node uses: actions/setup-node@v3 @@ -92,12 +95,17 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Get Commit Message + run: | + MSG=$(git log --format=%B -n 1 ${{github.event.after}}) + echo "::set-env name=COMMIT_MESSAGE::${MSG}" + - name: Add and commit changes to gh-pages branch run: | git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ github.event.head_commit.message }}"' + git commit -m '"${{env.COMMIT_MESSAGE}}"' - name: Push changes uses: ad-m/github-push-action@master From 21a72702817bc6b344223b34ca4513a7ff45fc93 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:34:19 +0100 Subject: [PATCH 164/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 47c545a..695b6da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,8 @@ jobs: check-providers: name: Check Providers Versions runs-on: ubuntu-latest + outputs: + commit: ${{ steps.vars.outputs.commit }} steps: - name: Checkout uses: actions/checkout@v3 @@ -95,6 +97,10 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Set output + id: vars + run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT + - name: Get Commit Message run: | MSG=$(git log --format=%B -n 1 ${{github.event.after}}) @@ -105,7 +111,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{env.COMMIT_MESSAGE}}"' + git commit -m '"${{ steps.vars.outputs.commit }}"' - name: Push changes uses: ad-m/github-push-action@master From 5e879188b8bf9d486399b308a9a9c2612607d465 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:36:22 +0100 Subject: [PATCH 165/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 695b6da..d23fd3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,11 +101,6 @@ jobs: id: vars run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Get Commit Message - run: | - MSG=$(git log --format=%B -n 1 ${{github.event.after}}) - echo "::set-env name=COMMIT_MESSAGE::${MSG}" - - name: Add and commit changes to gh-pages branch run: | git config --local user.email 'action@github.com' From 039ce5dd7cac8115b335ad5de05f7bd871e24140 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:41:40 +0100 Subject: [PATCH 166/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d23fd3b..5998932 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ steps.vars.outputs.commit }}"' + git commit -m "${{ steps.vars.outputs.commit }}" - name: Push changes uses: ad-m/github-push-action@master From 0c0f4375b84549bee809340a85f9ce038ee2739e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:45:29 +0100 Subject: [PATCH 167/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5998932..2e2ee2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,8 +108,8 @@ jobs: git add . git commit -m "${{ steps.vars.outputs.commit }}" - - name: Push changes - uses: ad-m/github-push-action@master + - name: Commit Versioning & Push changes + uses: stefanzweifel/git-auto-commit-action@v4 with: - github_token: ${{ secrets.GITHUB_TOKEN }} + commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major From 8c825e7f6b7133f7cc7f3041ce331b80a9fe60e0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:49:58 +0100 Subject: [PATCH 168/248] fix(cli): :zap: refactor --- packages/cli/check/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index cbd8e08..454f67c 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -24,7 +24,7 @@ const checkNodeVersion = () => { } const checkOs = () => { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { console.log(bgCyan('🙂 Revisando tu sistema operativo')) const os = process.platform if (!os.includes('win32')) { From 32f6a70f8f6fb26d8ea2a0f1a4aec4827b9d6a93 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:56:34 +0100 Subject: [PATCH 169/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e2ee2c..df9c6d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,6 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m "${{ steps.vars.outputs.commit }}" - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 From 3648757fa083bdb88a16bf6c2e90c828c233bdb1 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Mon, 16 Jan 2023 09:58:30 +0000 Subject: [PATCH 170/248] fix(cli): :zap: refactor --- packages/provider/src/web-whatsapp/package.json | 2 +- starters/apps/base-wweb-json/package.json | 2 +- starters/apps/base-wweb-memory/package.json | 2 +- starters/apps/base-wweb-mongo/package.json | 2 +- starters/apps/base-wweb-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 7514818..d15dbe0 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" } } diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index f52ab5a..d01b825 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index b9c4712..d508c4f 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index 9c51d8a..a64f35c 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index e95ec1a..ee90e12 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", From ecf0eef928917d76c59bd23886cb7a4108b421f1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:11:33 +0100 Subject: [PATCH 171/248] fix(bot): :bug: body undefined --- .github/workflows/check-provider-major.yml | 8 +++++++- packages/bot/core/core.class.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-provider-major.yml b/.github/workflows/check-provider-major.yml index 9557ead..ed04610 100644 --- a/.github/workflows/check-provider-major.yml +++ b/.github/workflows/check-provider-major.yml @@ -39,8 +39,14 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Add and commit changes to gh-pages branch + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git add . + - uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: 'ci(providers): 🚩 Check BREAKING CHANGE' + commit_message: 'ci(providers): check provider versions' create_branch: true branch: feature/breaking-change diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 79d996b..e3efc04 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -70,7 +70,7 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false - + if (!body) return if (!body.length) return const prevMsg = await this.databaseClass.getPrevByNumber(from) From 70dd4d73e814fc5636d19a887f3621c483b837c1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:17:25 +0100 Subject: [PATCH 172/248] fix(bot): :bug: body undefined --- .github/workflows/check-provider-major.yml | 2 +- .github/workflows/ci.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check-provider-major.yml b/.github/workflows/check-provider-major.yml index ed04610..ea91659 100644 --- a/.github/workflows/check-provider-major.yml +++ b/.github/workflows/check-provider-major.yml @@ -49,4 +49,4 @@ jobs: with: commit_message: 'ci(providers): check provider versions' create_branch: true - branch: feature/breaking-change + branch: feature/providers-major diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df9c6d2..40e4d30 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,6 +106,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . + git pull origin feature/providers-major - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 From 72e0a910503e9643db7dfbc6e09c41c96934e1f7 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:25:42 +0100 Subject: [PATCH 173/248] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40e4d30..2312061 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,7 +105,8 @@ jobs: run: | git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' - git add . + git add packages/provider + git add starters/apps git pull origin feature/providers-major - name: Commit Versioning & Push changes From f54dea52b01063acd6122eeba1fbbe324aa7805d Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:28:45 +0100 Subject: [PATCH 174/248] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2312061..d176383 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,8 +103,8 @@ jobs: - name: Add and commit changes to gh-pages branch run: | - git config --local user.email 'action@github.com' - git config --local user.name 'GitHub Action' + git config --globa user.email 'action@github.com' + git config --globa user.name 'GitHub Action' git add packages/provider git add starters/apps git pull origin feature/providers-major From a118bbbf7f0a7023cb7f33c23f37db72adad151f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:30:36 +0100 Subject: [PATCH 175/248] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d176383..1c5761a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,8 +103,8 @@ jobs: - name: Add and commit changes to gh-pages branch run: | - git config --globa user.email 'action@github.com' - git config --globa user.name 'GitHub Action' + git config --global user.email 'action@github.com' + git config --global user.name 'GitHub Action' git add packages/provider git add starters/apps git pull origin feature/providers-major From 9234cf1c5d00abdd35e62a826b3c450ab056987a Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:44:23 +0100 Subject: [PATCH 176/248] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c5761a..a84ee99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,10 +107,10 @@ jobs: git config --global user.name 'GitHub Action' git add packages/provider git add starters/apps - git pull origin feature/providers-major - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major + push_options: '--force' From bb6ed4a084ae98070dfdf0c4ba1eca574c4092cc Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:20:51 +0100 Subject: [PATCH 177/248] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a84ee99..12ab717 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,6 +69,7 @@ jobs: with: fetch-depth: 0 ref: ${{github.event.after}} + persist-credentials: false - name: Setup Node uses: actions/setup-node@v3 @@ -101,16 +102,8 @@ jobs: id: vars run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Add and commit changes to gh-pages branch - run: | - git config --global user.email 'action@github.com' - git config --global user.name 'GitHub Action' - git add packages/provider - git add starters/apps - - - name: Commit Versioning & Push changes - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major - push_options: '--force' + github_token: ${{ secrets.GITHUB_TOKEN }} From 18ef4e9d726575ca390ca24354825860328d3347 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:30:53 +0100 Subject: [PATCH 178/248] fix(cli): :zap: refactor --- packages/provider/src/web-whatsapp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index d15dbe0..80f6152 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.19.2" + "whatsapp-web.js": "1.18.2" } } From a29b9d4e1f85fc163cf1d633c0857f0c8b7f03e1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:38:47 +0100 Subject: [PATCH 179/248] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12ab717..87e42a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,3 +107,4 @@ jobs: with: branch: feature/providers-major github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From 464dd44ce21010b5a1165a4e91ce6d4b91e5cb67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Jan 2023 11:39:58 +0000 Subject: [PATCH 180/248] chore: autopublish 2023-01-16T11:39:58Z --- packages/provider/src/web-whatsapp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 80f6152..d15dbe0 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.18.2" + "whatsapp-web.js": "1.19.2" } } From 98793d0cfc1674830beaa3707f933c5a791eec14 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 17:32:09 +0100 Subject: [PATCH 181/248] fix(bot): :memo: more docs --- .../src/components/widgets/Collaborator.tsx | 6 +- packages/docs/src/components/widgets/Hero.tsx | 2 +- .../docs/src/components/widgets/Members.tsx | 54 +++++++++ packages/docs/src/root.tsx | 12 +- .../src/routes/docs/deploy/cloud/index.mdx | 108 ++++++++++++++++++ .../src/routes/docs/deploy/docker/index.mdx | 32 ++++++ .../src/routes/docs/deploy/local/index.mdx | 26 +++++ .../docs/src/routes/docs/masterclass/index.md | 24 ---- .../src/routes/docs/masterclass/index.mdx | 26 +++++ packages/docs/src/routes/index.tsx | 21 +++- packages/docs/src/services/github.ts | 7 +- packages/docs/src/services/opencollective.ts | 19 +++ 12 files changed, 301 insertions(+), 36 deletions(-) create mode 100644 packages/docs/src/components/widgets/Members.tsx create mode 100644 packages/docs/src/routes/docs/deploy/cloud/index.mdx create mode 100644 packages/docs/src/routes/docs/deploy/docker/index.mdx create mode 100644 packages/docs/src/routes/docs/deploy/local/index.mdx delete mode 100644 packages/docs/src/routes/docs/masterclass/index.md create mode 100644 packages/docs/src/routes/docs/masterclass/index.mdx create mode 100644 packages/docs/src/services/opencollective.ts diff --git a/packages/docs/src/components/widgets/Collaborator.tsx b/packages/docs/src/components/widgets/Collaborator.tsx index 4337d2b..bc72b08 100644 --- a/packages/docs/src/components/widgets/Collaborator.tsx +++ b/packages/docs/src/components/widgets/Collaborator.tsx @@ -14,7 +14,7 @@ export default component$( {props.user.login}
-
{props.user.login}
+
+ {props.user.login} +
diff --git a/packages/docs/src/components/widgets/Hero.tsx b/packages/docs/src/components/widgets/Hero.tsx index 0e7cc5e..b3761f8 100644 --- a/packages/docs/src/components/widgets/Hero.tsx +++ b/packages/docs/src/components/widgets/Hero.tsx @@ -56,7 +56,7 @@ export default component$(() => {
Ver video diff --git a/packages/docs/src/components/widgets/Members.tsx b/packages/docs/src/components/widgets/Members.tsx new file mode 100644 index 0000000..36ec435 --- /dev/null +++ b/packages/docs/src/components/widgets/Members.tsx @@ -0,0 +1,54 @@ +import { component$ } from '@builder.io/qwik' +import { RequestHandlerCloudflarePages } from '@builder.io/qwik-city/middleware/cloudflare-pages' +import { User } from '~/contexts' +import Collaborator from './Collaborator' + +export const onRequest: RequestHandlerCloudflarePages = async () => { + console.log('??heree') +} + +export const TaleUsers = component$((props: { users: User[] }) => { + return ( + <> + {props.users.map((user) => ( +
+ {' '} + +
+ ))} + + ) +}) + +export default component$((props: { users: User[] }) => { + return ( +
+ +
+ ) +}) diff --git a/packages/docs/src/root.tsx b/packages/docs/src/root.tsx index 7d6db36..2cddda0 100644 --- a/packages/docs/src/root.tsx +++ b/packages/docs/src/root.tsx @@ -52,16 +52,22 @@ export default component$(() => { title: 'Avanzado', list: [ { name: 'Migración', link: '/docs/migration' }, - { name: 'Extender funcionalidades', link: '/docs/custom' }, + { name: 'MasterClass', link: '/docs/masterclass' }, + ], + }, + { + title: 'Despliegue', + list: [ + { name: 'Local', link: '/docs/deploy/local' }, + { name: 'Docker', link: '/docs/deploy/docker' }, + { name: 'Cloud', link: '/docs/deploy/cloud' }, ], }, { title: 'Comunidad', list: [ - { name: 'MasterClass', link: '/docs/masterclass' }, { name: 'Colabores', link: '/docs/contributing' }, { name: 'Unirme al proyecto', link: '/docs/join' }, - { name: 'Sponsors', link: '/docs/sponsors' }, ], }, ]) diff --git a/packages/docs/src/routes/docs/deploy/cloud/index.mdx b/packages/docs/src/routes/docs/deploy/cloud/index.mdx new file mode 100644 index 0000000..2e38ff3 --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/cloud/index.mdx @@ -0,0 +1,108 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Cloud + +Si deseas tener tu chatbot en ejecución en un servidor en la nueba esta, guía te ayudará. +El servidor deberá cumplir con los requisitos mínimos, puedes ver en [este enlace.](/docs/requirements) + +--- + +Dependiendo de tu proveedor de **servicio Cloud** debes crear una instancia (máquina virtual), este ejemplo iremos orientando en un entorno de AWS. +En nuestro ejemplo creamos una maquina virtual con **Ubuntu 20.04** + +![](https://i.imgur.com/5zRCz9q.png) + +--- + +Posterior al proceso de crear la máquina esperamos unos minutos hasta que ya está operativo y tomamos nota del usuario y la IP pública para proceder a conectarnos vía SSH + +## ![](https://i.imgur.com/ljyJPBm.png) + +## Conectarse via SSH + +Luego de obtener los datos necesarios para conectarnos a nuestra máquina, procedemos a hacerlo + +```shell +ssh -i llaveBot.pem ubutnu@34.228.208.104 +``` + +--- + +Luego puede aparecer un mensaje como el siguiente donde solo debes de responder **yes** + +![](https://i.imgur.com/rUBASqR.png) + +--- + +Una vez conectado ya estás dentro de la máquina virtual, te aconsejamos la primera vez hacer una actualización de dependencias de Ubuntu con los siguientes comandos + +```shell +sudo apt-get update +``` + +```shell +sudo apt-get upgrade +``` + +--- + +## Recuerda instalar Node 16 o superior + +Puedes ver más a detalle los pasos de la instalacion en este [blog](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es) + +```shell +curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh +``` + +```shell +sudo bash nodesource_setup.sh +``` + +```shell +sudo apt-get install -y nodejs +``` + +--- + +## Implementar el bot + +Si tienes el código de tu chatbot en un repositorio, solo falta que clones el repo en el servidor y ejecutes `npm start` + +Para escanear el **QR** puedes hacerlo vía WEB accediendo a la URL `http://[TU_IP_PUBLICA]:3000` en este ejemplo seria `http://34.228.208.10:3000` + +![](https://i.imgur.com/xcovczm.png) + +--- + +## Firewall + +Si no te abre la pagina web asegurate de tener el puerto abierto en tu firewall. +Ejemplo permitir el puerto **3000** + +![](https://i.imgur.com/0dAz0B1.png) + +--- + +## Escanear QR + +![](https://i.imgur.com/2m3NbXC.png) + +--- + +## Ejecutar en Producción + +Debes ubicarte en el directorio donde tienes el codigo fuente de tu chatbot. + +Independientemente de tu sistema operativo deberás ejecutar el chatbot con el comando atrevés de un sistema que mantenga el proceso en ejecución. +Recomendamos [Pm2](https://pm2.keymetrics.io/) + +```shell +pm2 start app.js --name=bot1 +``` + +![](https://i.imgur.com/ilPS75H.png) + +La consola de devolver un mensaje con una lista de procesos, en el ejemplo puedes observar, que tenemos un proceso llamado `bot1` + +De esta manera ya puedes cerrar la terminal y tu bot seguirá en ejecución sin problema diff --git a/packages/docs/src/routes/docs/deploy/docker/index.mdx b/packages/docs/src/routes/docs/deploy/docker/index.mdx new file mode 100644 index 0000000..9db9e2e --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/docker/index.mdx @@ -0,0 +1,32 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Docker + +Previamente, necesitas tener instalado Docker en tu servidor dependiendo del sistema operativo, los procesos cambian, +puedes encontrar toda la información oficial de docker en [este enlace.](https://docs.docker.com/get-docker/) + +--- + +Dependiendo del proveedor que has elegido necesitaras una implementación de Docker específica, pero no te preocupes, ya que viene implementada automáticamente en un archivo llamado **Dockerfile**, también puedes ver los otros Dockerfile en el apartado de [plantillas.](https://github.com/codigoencasa/bot-whatsapp/tree/main/starters/apps) + +![](https://i.imgur.com/cDspa0R.png) + +--- + +## Contruir imagen + +Solo es necesario construir la imagen del docker lo puedes hacer con el siguiente comando + +```shell +docker build . -t botwhatsapp:latest +``` + +## Iniciar contenedor + +Para iniciar el contenedor con la imagen previamente construida puedes realizarlo ejecutando el siguiente comando. +Se utiliza el puerto **3001** solo com un ejemplo puedes usar el puerto que tu quieras + +```shell +docker run -e PORT=3001 -p 3001:3001 botwhatsapp:latest +``` diff --git a/packages/docs/src/routes/docs/deploy/local/index.mdx b/packages/docs/src/routes/docs/deploy/local/index.mdx new file mode 100644 index 0000000..394af82 --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/local/index.mdx @@ -0,0 +1,26 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Local + +Si deseas tener tu chatbot en ejecución en un servidor local (computadora personal, etc.) esta, guía te ayudará. +El servidor local deberá cumplir con los requisitos mínimos, puedes ver en [este enlace.](/docs/requirements) + +--- + +Si deseas instalar pm2 puedes ejecutar `npm install pm2 --global` + +Debes ubicarte en el directorio donde tienes el codigo fuente de tu chatbot. + +Independientemente de tu sistema operativo deberás ejecutar el chatbot con el comando atrevés de un sistema que mantenga el proceso en ejecución. +Recomendamos [Pm2](https://pm2.keymetrics.io/) + +```shell +pm2 start app.js --name=bot1 +``` + +![](https://i.imgur.com/ilPS75H.png) + +La consola de devolver un mensaje con una lista de procesos, en el ejemplo puedes observar, que tenemos un proceso llamado `bot1` + +De esta manera ya puedes cerrar la terminal y tu bot seguirá en ejecución sin problema diff --git a/packages/docs/src/routes/docs/masterclass/index.md b/packages/docs/src/routes/docs/masterclass/index.md deleted file mode 100644 index 9f94b4e..0000000 --- a/packages/docs/src/routes/docs/masterclass/index.md +++ /dev/null @@ -1,24 +0,0 @@ -[![hackmd-github-sync-badge](https://hackmd.io/79xQyVSgRD6RsTpqtMPPdw/badge)](https://hackmd.io/79xQyVSgRD6RsTpqtMPPdw) -### Preguntas Frecuentes para Master Class BOT v2 -> Anota aqui las preguntas o dudas que tengas -> Pronto estare publicando fecha y hora para la masterclass - -1.- Si necesito correr dos bots al mismo tiempo ¿donde puedo cambiar el puerto? - -2.- Si necesito agregar o modificar funciones del bot, ¿como puedo hacerlo? - -3.- Si quiero mi bot con otra base de datos diferente a MySQL ¿como lo puedo hacer? - -4.- Quiero conectarme a tal o cual API con JSON/XML/etc, ¿se puede hacer? - -5.- ¿Como integrar listas? - -6.- Preguntas y respuestas con el Bot - -7.- Guardar conversaciones en Excel. - -8.- ¿Puedo usar 2 o mas sesiones (códigos QR) al mismo tiempo? - -9.- ¿Puede ser que al usar el provider bailey, al leer el qr.png, que sea desde una url en el navegador, y no desde visual studio? Gracias - -10.- ¿Cómo tomo los datos que me envían en un mensaje para utilizarlo internamente en la búsqueda de datos propios y devolver la respuesta? diff --git a/packages/docs/src/routes/docs/masterclass/index.mdx b/packages/docs/src/routes/docs/masterclass/index.mdx new file mode 100644 index 0000000..97612b4 --- /dev/null +++ b/packages/docs/src/routes/docs/masterclass/index.mdx @@ -0,0 +1,26 @@ +# MasterClass + + + +--- + +### Preguntas de la masterclass + +- Si necesito correr dos bots al mismo tiempo ¿donde puedo cambiar el puerto? +- Si necesito agregar o modificar funciones del bot, ¿como puedo hacerlo? +- Si quiero mi bot con otra base de datos diferente a MySQL ¿como lo puedo hacer? +- Quiero conectarme a tal o cual API con JSON/XML/etc, ¿se puede hacer? +- ¿Como integrar listas? +- Preguntas y respuestas con el Bot +- Guardar conversaciones en Excel. +- ¿Puedo usar 2 o mas sesiones (códigos QR) al mismo tiempo? +- ¿Puede ser que al usar el provider bailey, al leer el qr.png, que sea desde una url en el navegador, y no desde visual studio? Gracias +- ¿Cómo tomo los datos que me envían en un mensaje para utilizarlo internamente en la búsqueda de datos propios y devolver la respuesta? diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index aa594f8..8ad3b75 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -5,7 +5,9 @@ import Features from '~/components/widgets/Features' import FAQs from '~/components/widgets/FAQs' import CallToAction from '~/components/widgets/CallToAction' import Collaborators from '~/components/widgets/Collaborators' +import Members from '~/components/widgets/Members' import { fetchGithub } from '~/services/github' +import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' @@ -13,8 +15,12 @@ export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN console.log(`[🚩 platform]: `, GITHUB_TOKEN) - const data = await fetchGithub(CHECK_GITHUB_TOKEN) - return data + const dataGithub = await fetchGithub(CHECK_GITHUB_TOKEN) + const dataOpenCollective = await fetchOpenCollective() + return { + dataGithub, + dataOpenCollective, + } } export default component$(() => { @@ -27,9 +33,16 @@ export default component$(() => { } + onResolved={(data: any) => { + return ( + <> + + + + + ) + }} > - ) }) diff --git a/packages/docs/src/services/github.ts b/packages/docs/src/services/github.ts index 05d2b8f..e60d250 100644 --- a/packages/docs/src/services/github.ts +++ b/packages/docs/src/services/github.ts @@ -14,6 +14,9 @@ export const fetchGithub = async (token: string) => { }, } ) - const listUsers = data.json() - return listUsers + const listUsers = await data.json() + return listUsers.map((u: any) => ({ + ...u, + avatar_url: `${u.avatar_url}&s=80`, + })) } diff --git a/packages/docs/src/services/opencollective.ts b/packages/docs/src/services/opencollective.ts new file mode 100644 index 0000000..2eb60c8 --- /dev/null +++ b/packages/docs/src/services/opencollective.ts @@ -0,0 +1,19 @@ +/** + * GET API from OpenCollective + * @returns + */ +export const fetchOpenCollective = async () => { + const data = await fetch( + `https://opencollective.com/bot-whatsapp/members/users.json?limit=10&offset=0`, + { + method: 'GET', + } + ) + const listUsers = await data.json() + return listUsers.map((u: any) => ({ + html_url: u.profile, + avatar_url: u.image ?? 'https://i.imgur.com/HhiYKwN.png', + login: u.name, + id: u.MemberId, + })) +} From 126158000449fab7612d42c605000b6f7d236696 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:05:29 +0100 Subject: [PATCH 182/248] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 1 - packages/cli/interactive/index.js | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 4e5c169..e793e01 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -54,4 +54,3 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' - branch: dev diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index b3f063d..53cc885 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -48,11 +48,11 @@ const nextSteps = async () => { name: 'providerWs', message: '¿Cuál proveedor de whatsapp quieres utilizar?', choices: [ - { title: 'whatsapp-web.js (gratis)', value: 'wweb' }, - { title: 'Venom (gratis)', value: 'venom' }, { title: 'Baileys (gratis)', value: 'baileys' }, + { title: 'Venom (gratis)', value: 'venom' }, + { title: 'whatsapp-web.js (gratis)', value: 'wweb' }, { title: 'Twilio', value: 'twilio' }, - { title: 'API Oficial (Meta)', value: 'meta' }, + { title: 'Meta', value: 'meta' }, ], max: 1, hint: 'Espacio para seleccionar', From 7e25dcaa93b036e2230b88ce58ee7c76872cc8dd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:11:08 +0100 Subject: [PATCH 183/248] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index e793e01..2c11144 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -13,6 +13,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{github.event.after}} + persist-credentials: false - name: Setup Node uses: actions/setup-node@v3 @@ -50,7 +54,13 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: Commit Versioning & Push changes - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Set output + id: vars + run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT + + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' + branch: release/next + github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From cb047cca8e9f356bdd8dbe5f226d99c3d9ac4fc4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:17:32 +0100 Subject: [PATCH 184/248] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 2c11144..8a01895 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -10,6 +10,8 @@ jobs: release: name: Release runs-on: ubuntu-latest + outputs: + commit: ${{ steps.vars.outputs.commit }} steps: - name: Checkout uses: actions/checkout@v3 From 5edd755491ae0cc3611181a7b0bc653725507cca Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:23:22 +0100 Subject: [PATCH 185/248] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 8a01895..be2e1d6 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -56,10 +56,6 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: Set output - id: vars - run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Commit & Push changes uses: actions-js/push@master with: From 4ade5f02a7eca55532fa735425670ea6d9fdd037 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 10:00:21 +0100 Subject: [PATCH 186/248] chore: :rocket: launch DEV --- .github/workflows/releases.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index d587c64..acbc5c4 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,13 +67,8 @@ jobs: - name: Release Github run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - - name: 'Run if changes have been detected' - run: | - git add . - git commit -m "chore(version): pre release" - - - name: Commit Versioning & Push changes - if: github.event_name == 'push' - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' + github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From fcd1a636765920445e8d871764647e772d75322e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 10:02:14 +0100 Subject: [PATCH 187/248] chore: :rocket: launch DEV --- .github/workflows/releases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index acbc5c4..a9b490f 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -70,5 +70,6 @@ jobs: - name: Commit & Push changes uses: actions-js/push@master with: + branch: release/production github_token: ${{ secrets.GITHUB_TOKEN }} force: true From 9f9d8339252d60ebd8852f516240b1d10a6c4266 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:33:59 -0700 Subject: [PATCH 188/248] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f6130cf0b91c552cf41254f1807640dcfa26dd32 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:35:21 -0700 Subject: [PATCH 189/248] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f5a7de3a003c012e2164e51fff26892cfc3144be Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 11:58:50 +0100 Subject: [PATCH 190/248] fix(bot): :bug: flowDynamic stranger behaviour --- .gitignore | 1 + packages/bot/core/core.class.js | 25 ++++++------------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 1cc3038..9f6dbbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules +/packages/repl /packages/*/starters /packages/*/node_modules /packages/*/dist diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e3efc04..e1e16e4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -89,14 +89,18 @@ class CoreClass { // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx const sendFlow = async (messageToSend, numberOrId) => { + // [1 Paso] esto esta bien! + if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) + const queue = [] for (const ctxMessage of messageToSend) { const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => Promise.all([ - this.sendProviderAndSave(numberOrId, ctxMessage), - resolveCbEveryCtx(ctxMessage), + this.sendProviderAndSave(numberOrId, ctxMessage).then( + () => resolveCbEveryCtx(ctxMessage) + ), ]) ) } @@ -139,7 +143,6 @@ class CoreClass { // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback const resolveCbEveryCtx = async (ctxMessage) => { - if (prevMsg?.options?.capture) return cbEveryCtx(prevMsg?.ref) if (!ctxMessage?.options?.capture) return await cbEveryCtx(ctxMessage?.ref) } @@ -153,17 +156,6 @@ class CoreClass { }) } - if (prevMsg?.ref) resolveCbEveryCtx(prevMsg) - - // 📄 [options: callback]: Si se tiene un callback se ejecuta - //TODO AQUI - // if (!fallBackFlag) { - // if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) - // for (const ite of this.flowClass.find(body)) { - // if (!ite?.options?.capture) cbEveryCtx(ite?.ref) - // } - // } - // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa if (!fallBackFlag && prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested @@ -173,11 +165,6 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - // //TODO AQUI - // for (const ite of msgToSend) { - // cbEveryCtx(ite?.ref) - // } - sendFlow(msgToSend, from) return } From 877252bd4a8a7bbbbf083c3ceaeaeb952b0a1828 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 12:02:01 +0100 Subject: [PATCH 191/248] fix(bot): :bug: flowDynamic stranger behaviour --- packages/bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index d3f004e..fe542c1 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.66-alpha.0", + "version": "0.0.73-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From 7067b4a80b7938ccfaf1ed141a37d645a1a3a062 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:09:16 +0100 Subject: [PATCH 192/248] fix(contexts): :bug: fixed #524 issue --- packages/bot/core/core.class.js | 19 +++++++++++++++++++ .../src/dialogflow-cx/dialogflow-cx.class.js | 2 +- .../src/dialogflow/dialogflow.class.js | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e1e16e4..ea5eff3 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -212,5 +212,24 @@ class CoreClass { this.continue(null, responde.ref) } } + + /** + * Funcion dedicada a enviar el mensaje sin pasar por el flow + * (dialogflow) + * @param {*} messageToSend + * @param {*} numberOrId + * @returns + */ + sendFlowSimple = async (messageToSend, numberOrId) => { + const queue = [] + for (const ctxMessage of messageToSend) { + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + QueuePrincipal.enqueue(() => + this.sendProviderAndSave(numberOrId, ctxMessage) + ) + } + return Promise.all(queue) + } } module.exports = CoreClass diff --git a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js index 25bd2a6..2d0ebd2 100644 --- a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js +++ b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js @@ -117,7 +117,7 @@ class DialogFlowCXContext extends CoreClass { } }) - this.sendFlow(listMessages, from) + this.sendFlowSimple(listMessages, from) } } diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index ebd92bc..6a7cda0 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -107,7 +107,7 @@ class DialogFlowContext extends CoreClass { ...customPayload, answer: fields?.answer?.stringValue, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) return } @@ -115,7 +115,7 @@ class DialogFlowContext extends CoreClass { answer: queryResult?.fulfillmentText, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) } } From 79cc31a96f6a9836447cc4e6bb1e1521c54183fe Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:14:36 +0100 Subject: [PATCH 193/248] fix(contexts): :bug: fixed #524 issue --- packages/bot/tests/flow.class.test.js | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/bot/tests/flow.class.test.js diff --git a/packages/bot/tests/flow.class.test.js b/packages/bot/tests/flow.class.test.js new file mode 100644 index 0000000..b9c55e2 --- /dev/null +++ b/packages/bot/tests/flow.class.test.js @@ -0,0 +1,29 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const FlowClass = require('../io/flow.class') +const MockProvider = require('../../../__mocks__/mock.provider') +const { addKeyword } = require('../index') + +test(`[FlowClass] Probando instanciamiento de clase`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando find`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.find('hola') + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando findBySerialize`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.findBySerialize('') + assert.is(flowClass instanceof FlowClass, true) +}) + +test.run() From 3c4b1c0fc4b6d98d67c67806d918d3604bb2209b Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 11:52:49 +0100 Subject: [PATCH 194/248] feat(bot): :zap: flowDynamic buttons, media --- packages/bot/core/core.class.js | 13 ++++++++++--- packages/bot/io/methods/toCtx.js | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index ea5eff3..3f20b7b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -117,6 +117,7 @@ class CoreClass { // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp + const flowDynamic = async ( listMsg = [], optListMsg = { limit: 5, fallback: false } @@ -126,15 +127,21 @@ class CoreClass { fallBackFlag = optListMsg.fallback const parseListMsg = listMsg - .map(({ body }, index) => - toCtx({ + .map((opt, index) => { + const body = typeof opt === 'string' ? opt : opt.body + const media = opt?.media ?? null + const buttons = opt?.buttons ?? [] + + return toCtx({ body, from, keyword: null, index, + options: { media, buttons }, }) - ) + }) .slice(0, optListMsg.limit) + for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } diff --git a/packages/bot/io/methods/toCtx.js b/packages/bot/io/methods/toCtx.js index d29295e..980cbfb 100644 --- a/packages/bot/io/methods/toCtx.js +++ b/packages/bot/io/methods/toCtx.js @@ -5,12 +5,12 @@ const { generateRef, generateRefSerialize } = require('../../utils/hash') * @param options {media:string, buttons:[], capture:true default false} * @returns */ -const toCtx = ({ body, from, prevRef, index }) => { +const toCtx = ({ body, from, prevRef, options = {}, index }) => { return { ref: generateRef(), keyword: prevRef, answer: body, - options: {}, + options: options ?? {}, from, refSerialize: generateRefSerialize({ index, answer: body }), } From 7078dc4c93d01bf90ef08ecb34e89a1abbe16fd2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 12:02:31 +0100 Subject: [PATCH 195/248] feat(bot): :zap: add blacklist --- packages/bot/core/core.class.js | 5 ++++- packages/bot/index.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 3f20b7b..30e6f4d 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -21,10 +21,12 @@ class CoreClass { flowClass databaseClass providerClass - constructor(_flow, _database, _provider) { + generalArgs = { blackList: [] } + constructor(_flow, _database, _provider, _args) { this.flowClass = _flow this.databaseClass = _database this.providerClass = _provider + this.generalArgs = { ...this.generalArgs, ..._args } for (const { event, func } of this.listenerBusEvents()) { this.providerClass.on(event, func) @@ -70,6 +72,7 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false + if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return diff --git a/packages/bot/index.js b/packages/bot/index.js index eb9df24..ac96063 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -8,8 +8,8 @@ const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods') * @param {*} args * @returns */ -const createBot = async ({ flow, database, provider }) => - new CoreClass(flow, database, provider) +const createBot = async ({ flow, database, provider }, args = {}) => + new CoreClass(flow, database, provider, args) /** * Crear instancia de clase Io (Flow) From 767e0764d61a038d66ae510a97fbe1d5f10736af Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 13:09:41 +0100 Subject: [PATCH 196/248] test: :art: more test e2e --- __test__/01-case.test.js | 41 +++++++++++++++++ __test__/02-case.test.js | 99 ++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- 3 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 __test__/01-case.test.js create mode 100644 __test__/02-case.test.js diff --git a/__test__/01-case.test.js b/__test__/01-case.test.js new file mode 100644 index 0000000..bce4a42 --- /dev/null +++ b/__test__/01-case.test.js @@ -0,0 +1,41 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot') + +test(`[Caso - 01] Flow Basico`, async () => { + const [VALUE_A, VALUE_B] = ['hola', 'buenas'] + + const flow = addKeyword(VALUE_A).addAnswer(VALUE_B) + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + createBot({ + database, + flow: createFlow([flow]), + provider, + }) + + provider.delaySendMessage(100, 'message', { + from: '000', + body: VALUE_A, + }) + + await delay(100) + + const prevMsg = database.getPrevByNumber('000') + + assert.is(prevMsg.answer, VALUE_B) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js new file mode 100644 index 0000000..426e110 --- /dev/null +++ b/__test__/02-case.test.js @@ -0,0 +1,99 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/lib/bundle.bot.cjs') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + console.log('⚡ Server request!') + await delay(50) + console.log('⚡ Server return!') + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + console.log(data) + return Promise.resolve(data) +} + +test(`[Caso - 02] Flow Más Complejo`, async () => { + const MOCK_VALUES = [ + 'Bienvenido te envio muchas marcas (5510)', + 'Seleccione marca del auto a cotizar, con el *número* correspondiente', + 'Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:', + 'Los precios rondan:', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0], null, async (ctx, { flowDynamic }) => { + console.log('execute...') + const data = await fakeHTTP(['Ford', 'GM', 'BMW']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[1], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Ranger', 'Explorer']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Usado', 'Nuevos']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[3], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['1000', '2000', '3000']) + return flowDynamic(data) + }) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + + //FlowDynamic + assert.is('1 Ford', getHistory[1]) + assert.is('2 GM', getHistory[2]) + assert.is('3 BMW', getHistory[3]) + + assert.is(MOCK_VALUES[1], getHistory[4]) + + //FlowDynamic + assert.is('1 Ranger', getHistory[5]) + assert.is('2 Explorer', getHistory[6]) + + assert.is(MOCK_VALUES[2], getHistory[7]) + + //FlowDynamic + assert.is('1 Usado', getHistory[8]) + assert.is('2 Nuevos', getHistory[9]) + + assert.is(MOCK_VALUES[3], getHistory[10]) + + //FlowDynamic + assert.is('1 1000', getHistory[11]) + assert.is('2 2000', getHistory[12]) + assert.is('3 3000', getHistory[13]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/package.json b/package.json index 354bc44..2d1061e 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", - "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", + "test.e2e": "node ./node_modules/uvu/bin.js __test__", + "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit && npm run test.e2e", "test": "npm run test.coverage", "cli": "node ./packages/cli/bin/cli.js", "create": "node ./packages/create-bot-whatsapp/bin/create.js", From 0af74602f52ef4b5164e818f5f4ddfc893c54245 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 13:13:41 +0100 Subject: [PATCH 197/248] test: :art: more test e2e --- __test__/02-case.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js index 426e110..f400284 100644 --- a/__test__/02-case.test.js +++ b/__test__/02-case.test.js @@ -7,7 +7,7 @@ const { createBot, createFlow, createProvider, -} = require('../packages/bot/lib/bundle.bot.cjs') +} = require('../packages/bot/index') /** * Falsear peticion async From ac39ac831c1b0d2cf186908d33fc5a01f26236a3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 14:38:43 +0100 Subject: [PATCH 198/248] test: :art: more test e2e --- __test__/02-case.test.js | 2 +- __test__/03-case.test.js | 44 +++++++++++++++++++++++++++ packages/bot/tests/flow.class.test.js | 1 - 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 __test__/03-case.test.js diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js index f400284..a2a93ec 100644 --- a/__test__/02-case.test.js +++ b/__test__/02-case.test.js @@ -23,7 +23,7 @@ const fakeHTTP = async (fakeData = []) => { return Promise.resolve(data) } -test(`[Caso - 02] Flow Más Complejo`, async () => { +test(`[Caso - 02] Flow (flowDynamic)`, async () => { const MOCK_VALUES = [ 'Bienvenido te envio muchas marcas (5510)', 'Seleccione marca del auto a cotizar, con el *número* correspondiente', diff --git a/__test__/03-case.test.js b/__test__/03-case.test.js new file mode 100644 index 0000000..45c399a --- /dev/null +++ b/__test__/03-case.test.js @@ -0,0 +1,44 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +test(`[Caso - 03] Flow puro`, async () => { + const MOCK_VALUES = ['Bienvenido a mi tienda', 'Como estas?'] + + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0]) + .addAnswer(MOCK_VALUES[1]) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(10) + const getHistory = database.listHistory.map((i) => i.answer) + + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is(MOCK_VALUES[1], getHistory[1]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/tests/flow.class.test.js b/packages/bot/tests/flow.class.test.js index b9c55e2..e1c93d7 100644 --- a/packages/bot/tests/flow.class.test.js +++ b/packages/bot/tests/flow.class.test.js @@ -1,7 +1,6 @@ const { test } = require('uvu') const assert = require('uvu/assert') const FlowClass = require('../io/flow.class') -const MockProvider = require('../../../__mocks__/mock.provider') const { addKeyword } = require('../index') test(`[FlowClass] Probando instanciamiento de clase`, async () => { From cebfed03823e8fdbd4742aaad0408bf2d5a85b82 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 20:27:55 +0100 Subject: [PATCH 199/248] test(bot): :zap: more test and endflow --- __test__/04-case.test.js | 82 +++++++++++++++++++++++++++++++++ packages/bot/core/core.class.js | 22 ++++++++- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 __test__/04-case.test.js diff --git a/__test__/04-case.test.js b/__test__/04-case.test.js new file mode 100644 index 0000000..2291a0c --- /dev/null +++ b/__test__/04-case.test.js @@ -0,0 +1,82 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + console.log('⚡ Server request!') + await delay(50) + console.log('⚡ Server return!') + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + console.log(data) + return Promise.resolve(data) +} + +test(`[Caso - 04] Romper flujo (endFlow)`, async () => { + const MOCK_VALUES = [ + 'Bienvenido te envio muchas marcas (5510)', + 'Seleccione marca del auto a cotizar, con el *número* correspondiente', + 'Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:', + 'Los precios rondan:', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0], null, async (ctx, { flowDynamic }) => { + console.log('execute...') + const data = await fakeHTTP(['Ford', 'GM', 'BMW']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[1], null, async (ctx, { endFlow }) => { + return endFlow() + }) + .addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Usado', 'Nuevos']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[3], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['1000', '2000', '3000']) + return flowDynamic(data) + }) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + + //FlowDynamic + assert.is('1 Ford', getHistory[1]) + assert.is('2 GM', getHistory[2]) + assert.is('3 BMW', getHistory[3]) + + assert.is(MOCK_VALUES[1], getHistory[4]) + assert.is(undefined, getHistory[5]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 30e6f4d..f7051b3 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -72,11 +72,12 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false + let endFlowFlag = false if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return - const prevMsg = await this.databaseClass.getPrevByNumber(from) + let prevMsg = await this.databaseClass.getPrevByNumber(from) const refToContinue = this.flowClass.findBySerialize( prevMsg?.refSerialize ) @@ -90,13 +91,28 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Limpiar cola de procesos + const clearQueue = () => { + QueuePrincipal.pendingPromise = false + QueuePrincipal.queue = [] + } + + // 📄 Finalizar flujo + const endFlow = async () => { + prevMsg = null + endFlowFlag = true + clearQueue() + return + } + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx const sendFlow = async (messageToSend, numberOrId) => { // [1 Paso] esto esta bien! - if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) + if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) const queue = [] for (const ctxMessage of messageToSend) { + if (endFlowFlag) return const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => @@ -145,6 +161,7 @@ class CoreClass { }) .slice(0, optListMsg.limit) + if (endFlowFlag) return for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } @@ -163,6 +180,7 @@ class CoreClass { return this.flowClass.allCallbacks[inRef](messageCtxInComming, { fallBack, flowDynamic, + endFlow, }) } From 71c969f3e9f58217820afea2e22b3a3690767546 Mon Sep 17 00:00:00 2001 From: lisandroprada Date: Mon, 23 Jan 2023 16:34:53 -0300 Subject: [PATCH 200/248] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 2e078d7..1a5e879 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -159,6 +159,19 @@ const flowString = addKeyword('hola') --- +# QRPortalWeb + +Argumento para asignar nombre y puerto al BOT + +```js +QRPortalWeb({name:BOTNAME, port:3005 }); + +``` + +--- + + + Date: Tue, 24 Jan 2023 09:10:45 +0000 Subject: [PATCH 201/248] docs(contributor): contrib-readme-action has updated readme --- README.md | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b4a2271..777209f 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,13 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. + + + + - + + + + + - + + + - + + + +
+ + cheveguerra +
+ Jose Alberto Guerra Ugalde +
+
leifermendez @@ -62,6 +69,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Leifer Mendez + + danielcasta0398 +
+ Juan Daniel Castaño +
+
+ + marianarolfo +
+ Null +
+
HKong31 @@ -75,8 +97,14 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Zvi
-
+ + JosephVTX +
+ Joseph Vega Callupe +
+
Gonzalito87 @@ -84,6 +112,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Null + + jlferrete +
+ Jose Luis Ferrete Olarte +
+
+ + 6rak0 +
+ Null +
+
tonyvazgar @@ -91,13 +134,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Luis Antonio Vázquez García - - ulisesvina -
- Ulises Viña -
-
rrruuuyyy From 77145bcc548f1a65e18f5118ca860b8a3a56499c Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 14:22:33 +0100 Subject: [PATCH 202/248] docs: :art: modal added --- .../src/components/widgets/SearchModal.tsx | 20 +++++++++++++++++++ packages/docs/src/routes/docs/layout!.tsx | 2 ++ packages/docs/src/routes/index.tsx | 2 +- packages/docs/src/services/opencollective.ts | 2 +- .../server/@qwik-city-not-found-paths.js | 2 +- .../portal/server/@qwik-city-static-paths.js | 1 - 6 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 packages/docs/src/components/widgets/SearchModal.tsx diff --git a/packages/docs/src/components/widgets/SearchModal.tsx b/packages/docs/src/components/widgets/SearchModal.tsx new file mode 100644 index 0000000..ed31b87 --- /dev/null +++ b/packages/docs/src/components/widgets/SearchModal.tsx @@ -0,0 +1,20 @@ +import { component$, useStore } from '@builder.io/qwik' + +export const SearchModal = component$(() => { + const state = useStore({ + open: false, + src: '', + }) + + return ( +
+
+ +
+
+ ) +}) + +export const SingleModal = component$(() => { + return
Modal singlke
+}) diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index cb34220..4d66df2 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -3,6 +3,7 @@ import type { DocumentHead } from '@builder.io/qwik-city' import ExtraBar from '~/components/widgets/ExtraBar' import Header from '~/components/widgets/Header' import NavBar from '~/components/widgets/NavBar' +import { SearchModal } from '~/components/widgets/SearchModal' import SponsorBar from '~/components/widgets/SponsorBar' import { GlobalStore } from '~/contexts' // import Navigation from '~/components/widgets/Navigation' @@ -14,6 +15,7 @@ export default component$(() => { return ( <> +
diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index 8ad3b75..dbfb2da 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -10,11 +10,11 @@ import { fetchGithub } from '~/services/github' import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' +import { SearchModal } from '~/components/widgets/SearchModal' export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN - console.log(`[🚩 platform]: `, GITHUB_TOKEN) const dataGithub = await fetchGithub(CHECK_GITHUB_TOKEN) const dataOpenCollective = await fetchOpenCollective() return { diff --git a/packages/docs/src/services/opencollective.ts b/packages/docs/src/services/opencollective.ts index 2eb60c8..9a89f25 100644 --- a/packages/docs/src/services/opencollective.ts +++ b/packages/docs/src/services/opencollective.ts @@ -4,7 +4,7 @@ */ export const fetchOpenCollective = async () => { const data = await fetch( - `https://opencollective.com/bot-whatsapp/members/users.json?limit=10&offset=0`, + `https://opencollective.com/bot-whatsapp/members/users.json?limit=22&offset=0`, { method: 'GET', } diff --git a/packages/portal/server/@qwik-city-not-found-paths.js b/packages/portal/server/@qwik-city-not-found-paths.js index f5f657d..473076c 100644 --- a/packages/portal/server/@qwik-city-not-found-paths.js +++ b/packages/portal/server/@qwik-city-not-found-paths.js @@ -1,7 +1,7 @@ const notFounds = [ [ '/', - '\n\n\n \n \n 404 Resource Not Found\n \n \n\n\n

404 Resource Not Found

\n\n', + '\n\n \n \n \n 404 Resource Not Found\n \n \n \n \n

404 Resource Not Found

\n \n\n', ], ] function getNotFound(p) { diff --git a/packages/portal/server/@qwik-city-static-paths.js b/packages/portal/server/@qwik-city-static-paths.js index 1afa65f..1835f6b 100644 --- a/packages/portal/server/@qwik-city-static-paths.js +++ b/packages/portal/server/@qwik-city-static-paths.js @@ -1,5 +1,4 @@ const staticPaths = new Set([ - '/', '/favicon.svg', '/manifest.json', '/q-manifest.json', From eab39e4ac06fd46f1a4671f8c15d1456b4400b97 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 16:54:31 +0100 Subject: [PATCH 203/248] feat: :fire: bailey add media --- package.json | 2 + packages/provider/common/fileType.js | 16 ++++++ packages/provider/src/baileys/index.js | 42 ++++++++++++++- packages/provider/src/baileys/package.json | 1 - packages/provider/src/baileys/utils.js | 50 ++++++++++++------ yarn.lock | 61 ++++++++++++++++++++-- 6 files changed, 149 insertions(+), 23 deletions(-) create mode 100644 packages/provider/common/fileType.js diff --git a/package.json b/package.json index 2d1061e..3f7f729 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,9 @@ "eslint-config-prettier": "^8.5.0", "fs-extra": "^11.1.0", "git-cz": "^4.9.0", + "got": "11.8.3", "husky": "^8.0.2", + "mime-types": "^2.1.35", "only-allow": "^1.1.1", "prettier": "^2.8.0", "pretty-quick": "^3.1.3", diff --git a/packages/provider/common/fileType.js b/packages/provider/common/fileType.js new file mode 100644 index 0000000..3521e61 --- /dev/null +++ b/packages/provider/common/fileType.js @@ -0,0 +1,16 @@ +const mimeDep = require('mime-types') +/** + * Extrar el mimetype from buffer + * @param {string} response + * @returns + */ +const fileTypeFromFile = async (response) => { + const type = response.headers['content-type'] ?? null + const ext = mimeDep.extension(type) + return { + type, + ext, + } +} + +module.exports = { fileTypeFromFile } diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index de6c66d..b12d094 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -170,12 +170,51 @@ class BaileysProvider extends ProviderClass { sendMedia = async (number, imageUrl, text) => { const fileDownloaded = await baileyDownloadMedia(imageUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded, text) + + console.log(mimeType) return this.vendor.sendMessage(number, { image: readFileSync(fileDownloaded), caption: text, }) } + /** + * + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + return this.vendor.sendMessage(number, { + image: readFileSync(filePath), + caption: text, + }) + } + + /** + * + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath, text) => { + return this.vendor.sendMessage(number, { + video: readFileSync(filePath), + caption: text, + gifPlayback: true, + }) + } + /** * @alpha * @param {string} number @@ -185,8 +224,7 @@ class BaileysProvider extends ProviderClass { */ sendAudio = async (number, audioUrl, voiceNote = false) => { - const numberClean = number.replace('+', '') - await this.vendor.sendMessage(`${numberClean}@c.us`, { + await this.vendor.sendMessage(number, { audio: { url: audioUrl }, ptt: voiceNote, }) diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json index da529d3..918a8e9 100644 --- a/packages/provider/src/baileys/package.json +++ b/packages/provider/src/baileys/package.json @@ -1,7 +1,6 @@ { "dependencies": { "@adiwajshing/baileys": "4.4.0", - "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" } } diff --git a/packages/provider/src/baileys/utils.js b/packages/provider/src/baileys/utils.js index 433ddee..22c36a7 100644 --- a/packages/provider/src/baileys/utils.js +++ b/packages/provider/src/baileys/utils.js @@ -1,10 +1,12 @@ -const { createWriteStream } = require('fs') +const { createWriteStream, rename } = require('fs') const combineImage = require('combine-image') const qr = require('qr-image') const { tmpdir } = require('os') const http = require('http') const https = require('https') +const { fileTypeFromFile } = require('../../common/fileType') + const baileyCleanNumber = (number, full = false) => { number = number.replace('@s.whatsapp.net', '') number = !full ? `${number}@s.whatsapp.net` : `${number}` @@ -47,27 +49,43 @@ const baileyIsValidNumber = (rawNumber) => { * @param {*} url * @returns */ -const baileyDownloadMedia = (url) => { - return new Promise((resolve, reject) => { - const ext = url.split('.').pop() +const baileyDownloadMedia = async (url) => { + const handleDownload = () => { const checkProtocol = url.includes('https:') const handleHttp = checkProtocol ? https : http - const name = `tmp-${Date.now()}.${ext}` + const name = `tmp-${Date.now()}-dat` const fullPath = `${tmpdir()}/${name}` const file = createWriteStream(fullPath) - handleHttp.get(url, function (response) { - response.pipe(file) - file.on('finish', function () { - file.close() - resolve(fullPath) - }) - file.on('error', function () { - console.log('errro') - file.close() - reject(null) + + return new Promise((res, rej) => { + handleHttp.get(url, function (response) { + response.pipe(file) + file.on('finish', async function () { + file.close() + res({ response, fullPath }) + }) + file.on('error', function () { + file.close() + rej(null) + }) }) }) - }) + } + + const handleFile = (pathInput, ext) => + new Promise((resolve, reject) => { + const fullPath = `${pathInput}.${ext}` + rename(pathInput, fullPath, (err) => { + if (err) reject(null) + resolve(fullPath) + }) + }) + + const httpResponse = await handleDownload() + const { ext } = await fileTypeFromFile(httpResponse.response) + const getPath = await handleFile(httpResponse.fullPath, ext) + + return getPath } module.exports = { diff --git a/yarn.lock b/yarn.lock index cf802d5..4b1ffb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1112,7 +1112,10 @@ __metadata: eslint-config-prettier: ^8.5.0 fs-extra: ^11.1.0 git-cz: ^4.9.0 + got: 11.8.3 husky: ^8.0.2 + mime-types: ^2.1.35 + name2mime: ^1.0.1 only-allow: ^1.1.1 prettier: ^2.8.0 pretty-quick: ^3.1.3 @@ -2933,6 +2936,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^5.2.0": version: 5.3.0 resolution: "@sindresorhus/is@npm:5.3.0" @@ -2977,7 +2987,7 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.0": +"@szmarczak/http-timer@npm:^4.0.0, @szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" dependencies: @@ -5073,6 +5083,13 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -5125,7 +5142,7 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^7.0.1": +"cacheable-request@npm:^7.0.1, cacheable-request@npm:^7.0.2": version: 7.0.2 resolution: "cacheable-request@npm:7.0.2" dependencies: @@ -9899,6 +9916,25 @@ __metadata: languageName: node linkType: hard +"got@npm:11.8.3": + version: 11.8.3 + resolution: "got@npm:11.8.3" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: 3b6db107d9765470b18e4cb22f7c7400381be7425b9be5823f0168d6c21b5d6b28b023c0b3ee208f73f6638c3ce251948ca9b54a1e8f936d3691139ac202d01b + languageName: node + linkType: hard + "got@npm:^10.0.0, got@npm:^10.7.0": version: 10.7.0 resolution: "got@npm:10.7.0" @@ -10446,6 +10482,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "http2-wrapper@npm:^2.1.10": version: 2.2.0 resolution: "http2-wrapper@npm:2.2.0" @@ -13443,7 +13489,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -13839,6 +13885,13 @@ __metadata: languageName: node linkType: hard +"name2mime@npm:^1.0.1": + version: 1.0.1 + resolution: "name2mime@npm:1.0.1" + checksum: 46630096d2a5c381231f5e5025d3aaef824b5db29677971b8a93f565e63979524d6f43457dd4b93591341c26af2abb44ef7aa87943c51d2eed60b94519815880 + languageName: node + linkType: hard + "named-placeholders@npm:^1.1.2": version: 1.1.2 resolution: "named-placeholders@npm:1.1.2" @@ -16820,7 +16873,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 From e19c3a25a40259c74b4add9635af4844907eed26 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 19:43:11 +0100 Subject: [PATCH 204/248] feat: :zap: more feature --- packages/provider/src/baileys/index.js | 32 +++++++++++--------------- yarn.lock | 8 ------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index b12d094..4bc0a03 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -13,6 +13,7 @@ const { Browsers, DisconnectReason, } = require('@adiwajshing/baileys') + const { baileyGenerateImage, baileyCleanNumber, @@ -179,15 +180,11 @@ class BaileysProvider extends ProviderClass { if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text) - console.log(mimeType) - return this.vendor.sendMessage(number, { - image: readFileSync(fileDownloaded), - caption: text, - }) + return this.sendFile() } /** - * + * Enviar imagen * @param {*} number * @param {*} imageUrl * @param {*} text @@ -201,7 +198,7 @@ class BaileysProvider extends ProviderClass { } /** - * + * Enviar video * @param {*} number * @param {*} imageUrl * @param {*} text @@ -216,6 +213,7 @@ class BaileysProvider extends ProviderClass { } /** + * Enviar audio * @alpha * @param {string} number * @param {string} message @@ -224,7 +222,7 @@ class BaileysProvider extends ProviderClass { */ sendAudio = async (number, audioUrl, voiceNote = false) => { - await this.vendor.sendMessage(number, { + return this.vendor.sendMessage(number, { audio: { url: audioUrl }, ptt: voiceNote, }) @@ -248,17 +246,13 @@ class BaileysProvider extends ProviderClass { */ sendFile = async (number, filePath) => { - if (existsSync(filePath)) { - const mimeType = mime.lookup(filePath) - const numberClean = number.replace('+', '') - const fileName = filePath.split('/').pop() - - await this.vendor.sendMessage(`${numberClean}@c.us`, { - document: { url: filePath }, - mimetype: mimeType, - fileName: fileName, - }) - } + const mimeType = mime.lookup(filePath) + const fileName = filePath.split('/').pop() + return this.vendor.sendMessage(number, { + document: { url: filePath }, + mimetype: mimeType, + fileName: fileName, + }) } /** diff --git a/yarn.lock b/yarn.lock index 4b1ffb6..c99a8c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1115,7 +1115,6 @@ __metadata: got: 11.8.3 husky: ^8.0.2 mime-types: ^2.1.35 - name2mime: ^1.0.1 only-allow: ^1.1.1 prettier: ^2.8.0 pretty-quick: ^3.1.3 @@ -13885,13 +13884,6 @@ __metadata: languageName: node linkType: hard -"name2mime@npm:^1.0.1": - version: 1.0.1 - resolution: "name2mime@npm:1.0.1" - checksum: 46630096d2a5c381231f5e5025d3aaef824b5db29677971b8a93f565e63979524d6f43457dd4b93591341c26af2abb44ef7aa87943c51d2eed60b94519815880 - languageName: node - linkType: hard - "named-placeholders@npm:^1.1.2": version: 1.1.2 resolution: "named-placeholders@npm:1.1.2" From 371b403456398d150b4839e1805cbb6afe76b2fe Mon Sep 17 00:00:00 2001 From: Gregoriotecnico <118696506+Gregoriotecnico@users.noreply.github.com> Date: Tue, 24 Jan 2023 21:38:38 +0100 Subject: [PATCH 205/248] =?UTF-8?q?Adici=C3=B3n=20de=20endFlow()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/routes/docs/flows/index.mdx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 1a5e879..f1a8d3b 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -158,6 +158,51 @@ const flowString = addKeyword('hola') ``` --- +## endFlow() + +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +que el usuario pueda finalizar por él mismo el flujo. +Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. + + + +```js +const flowFormulario = addKeyword(['Hola']) + +.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], +{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, +async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + .addAnswer(['También necesito tus dos apellidos'], + {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, + async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], +{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, +async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + + + +``` + +--- + + + + # QRPortalWeb From 943fe8698caf82706386c60960bc79a9bd9412cd Mon Sep 17 00:00:00 2001 From: Gregoriotecnico <118696506+Gregoriotecnico@users.noreply.github.com> Date: Tue, 24 Jan 2023 21:55:11 +0100 Subject: [PATCH 206/248] =?UTF-8?q?Adici=C3=B3n=20blackList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/routes/docs/flows/index.mdx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 1a5e879..e363630 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -23,6 +23,23 @@ const flowPrincipal = addKeyword(['hola', 'alo']) --- +## blackList + +Éste argumento se utiliza para **evitar que el bot se active** cuando los números de la lista activen el bot. +Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". + +```js +createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + },{ + blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] + }) +``` + +--- + ## addKeyword() Esta funcion se utliza para iniciar un flujo de conversion.
Recibe un `string` o un `array` From 14d1a61fa259c09135c37c55bd79e97c9c8367e4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:14:55 +0100 Subject: [PATCH 207/248] feat(provider): :zap: bailey add send file video audio --- packages/provider/common/download.js | 65 ++++++++++++++++++++++++++ packages/provider/common/fileType.js | 16 ------- packages/provider/src/baileys/index.js | 9 ++-- packages/provider/src/baileys/utils.js | 53 +-------------------- 4 files changed, 71 insertions(+), 72 deletions(-) create mode 100644 packages/provider/common/download.js delete mode 100644 packages/provider/common/fileType.js diff --git a/packages/provider/common/download.js b/packages/provider/common/download.js new file mode 100644 index 0000000..76e23a0 --- /dev/null +++ b/packages/provider/common/download.js @@ -0,0 +1,65 @@ +const mimeDep = require('mime-types') +const { tmpdir } = require('os') +const http = require('http') +const https = require('https') +const { rename, createWriteStream } = require('fs') + +/** + * Extrar el mimetype from buffer + * @param {string} response + * @returns + */ +const fileTypeFromFile = async (response) => { + const type = response.headers['content-type'] ?? null + const ext = mimeDep.extension(type) + return { + type, + ext, + } +} + +/** + * Descargar archivo binay en tmp + * @param {*} url + * @returns + */ +const generalDownload = async (url) => { + const handleDownload = () => { + const checkProtocol = url.includes('https:') + const handleHttp = checkProtocol ? https : http + const name = `tmp-${Date.now()}-dat` + const fullPath = `${tmpdir()}/${name}` + const file = createWriteStream(fullPath) + + return new Promise((res, rej) => { + handleHttp.get(url, function (response) { + response.pipe(file) + file.on('finish', async function () { + file.close() + res({ response, fullPath }) + }) + file.on('error', function () { + file.close() + rej(null) + }) + }) + }) + } + + const handleFile = (pathInput, ext) => + new Promise((resolve, reject) => { + const fullPath = `${pathInput}.${ext}` + rename(pathInput, fullPath, (err) => { + if (err) reject(null) + resolve(fullPath) + }) + }) + + const httpResponse = await handleDownload() + const { ext } = await fileTypeFromFile(httpResponse.response) + const getPath = await handleFile(httpResponse.fullPath, ext) + + return getPath +} + +module.exports = { generalDownload } diff --git a/packages/provider/common/fileType.js b/packages/provider/common/fileType.js deleted file mode 100644 index 3521e61..0000000 --- a/packages/provider/common/fileType.js +++ /dev/null @@ -1,16 +0,0 @@ -const mimeDep = require('mime-types') -/** - * Extrar el mimetype from buffer - * @param {string} response - * @returns - */ -const fileTypeFromFile = async (response) => { - const type = response.headers['content-type'] ?? null - const ext = mimeDep.extension(type) - return { - type, - ext, - } -} - -module.exports = { fileTypeFromFile } diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 4bc0a03..9361731 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -4,7 +4,7 @@ const pino = require('pino') const rimraf = require('rimraf') const mime = require('mime-types') const { join } = require('path') -const { existsSync, createWriteStream, readFileSync } = require('fs') +const { createWriteStream, readFileSync } = require('fs') const { Console } = require('console') const { @@ -18,9 +18,10 @@ const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber, - baileyDownloadMedia, } = require('./utils') +const { generalDownload } = require('../../common/download') + const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/baileys.log`), }) @@ -170,7 +171,7 @@ class BaileysProvider extends ProviderClass { */ sendMedia = async (number, imageUrl, text) => { - const fileDownloaded = await baileyDownloadMedia(imageUrl) + const fileDownloaded = await generalDownload(imageUrl) const mimeType = mime.lookup(fileDownloaded) if (mimeType.includes('image')) @@ -180,7 +181,7 @@ class BaileysProvider extends ProviderClass { if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text) - return this.sendFile() + return this.sendFile(number, fileDownloaded) } /** diff --git a/packages/provider/src/baileys/utils.js b/packages/provider/src/baileys/utils.js index 22c36a7..0b2a886 100644 --- a/packages/provider/src/baileys/utils.js +++ b/packages/provider/src/baileys/utils.js @@ -1,11 +1,6 @@ -const { createWriteStream, rename } = require('fs') +const { createWriteStream } = require('fs') const combineImage = require('combine-image') const qr = require('qr-image') -const { tmpdir } = require('os') -const http = require('http') -const https = require('https') - -const { fileTypeFromFile } = require('../../common/fileType') const baileyCleanNumber = (number, full = false) => { number = number.replace('@s.whatsapp.net', '') @@ -43,54 +38,8 @@ const baileyIsValidNumber = (rawNumber) => { return !exist } -/** - * Incompleta - * Descargar archivo multimedia para enviar - * @param {*} url - * @returns - */ -const baileyDownloadMedia = async (url) => { - const handleDownload = () => { - const checkProtocol = url.includes('https:') - const handleHttp = checkProtocol ? https : http - const name = `tmp-${Date.now()}-dat` - const fullPath = `${tmpdir()}/${name}` - const file = createWriteStream(fullPath) - - return new Promise((res, rej) => { - handleHttp.get(url, function (response) { - response.pipe(file) - file.on('finish', async function () { - file.close() - res({ response, fullPath }) - }) - file.on('error', function () { - file.close() - rej(null) - }) - }) - }) - } - - const handleFile = (pathInput, ext) => - new Promise((resolve, reject) => { - const fullPath = `${pathInput}.${ext}` - rename(pathInput, fullPath, (err) => { - if (err) reject(null) - resolve(fullPath) - }) - }) - - const httpResponse = await handleDownload() - const { ext } = await fileTypeFromFile(httpResponse.response) - const getPath = await handleFile(httpResponse.fullPath, ext) - - return getPath -} - module.exports = { baileyCleanNumber, baileyGenerateImage, baileyIsValidNumber, - baileyDownloadMedia, } From 24220822f431afb0b4765addca90587576e0b7d2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:44:24 +0100 Subject: [PATCH 208/248] chore(release): 0.1.18 --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d3865b..9b39939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,47 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.18](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.17...v0.1.18) (2023-01-24) + + +### Features + +* **bot:** :zap: add blacklist ([7078dc4](https://github.com/leifermendez/bot-whatsapp/commit/7078dc4c93d01bf90ef08ecb34e89a1abbe16fd2)) +* **bot:** :zap: flowDynamic buttons, media ([3c4b1c0](https://github.com/leifermendez/bot-whatsapp/commit/3c4b1c0fc4b6d98d67c67806d918d3604bb2209b)) + + +### Bug Fixes + +* **bot:** :bug: body undefined ([bb6ed4a](https://github.com/leifermendez/bot-whatsapp/commit/bb6ed4a084ae98070dfdf0c4ba1eca574c4092cc)) +* **bot:** :bug: body undefined ([9234cf1](https://github.com/leifermendez/bot-whatsapp/commit/9234cf1c5d00abdd35e62a826b3c450ab056987a)) +* **bot:** :bug: body undefined ([a118bbb](https://github.com/leifermendez/bot-whatsapp/commit/a118bbbf7f0a7023cb7f33c23f37db72adad151f)) +* **bot:** :bug: body undefined ([f54dea5](https://github.com/leifermendez/bot-whatsapp/commit/f54dea52b01063acd6122eeba1fbbe324aa7805d)) +* **bot:** :bug: body undefined ([72e0a91](https://github.com/leifermendez/bot-whatsapp/commit/72e0a910503e9643db7dfbc6e09c41c96934e1f7)) +* **bot:** :bug: body undefined ([70dd4d7](https://github.com/leifermendez/bot-whatsapp/commit/70dd4d73e814fc5636d19a887f3621c483b837c1)) +* **bot:** :bug: body undefined ([ecf0eef](https://github.com/leifermendez/bot-whatsapp/commit/ecf0eef928917d76c59bd23886cb7a4108b421f1)) +* **bot:** :bug: flowDynamic stranger behaviour ([877252b](https://github.com/leifermendez/bot-whatsapp/commit/877252bd4a8a7bbbbf083c3ceaeaeb952b0a1828)) +* **bot:** :bug: flowDynamic stranger behaviour ([f5a7de3](https://github.com/leifermendez/bot-whatsapp/commit/f5a7de3a003c012e2164e51fff26892cfc3144be)) +* **bot:** :memo: more docs ([98793d0](https://github.com/leifermendez/bot-whatsapp/commit/98793d0cfc1674830beaa3707f933c5a791eec14)) +* **cli:** :zap: refactor ([a29b9d4](https://github.com/leifermendez/bot-whatsapp/commit/a29b9d4e1f85fc163cf1d633c0857f0c8b7f03e1)) +* **cli:** :zap: refactor ([18ef4e9](https://github.com/leifermendez/bot-whatsapp/commit/18ef4e9d726575ca390ca24354825860328d3347)) +* **cli:** :zap: refactor ([3648757](https://github.com/leifermendez/bot-whatsapp/commit/3648757fa083bdb88a16bf6c2e90c828c233bdb1)) +* **cli:** :zap: refactor ([32f6a70](https://github.com/leifermendez/bot-whatsapp/commit/32f6a70f8f6fb26d8ea2a0f1a4aec4827b9d6a93)) +* **cli:** :zap: refactor ([8c825e7](https://github.com/leifermendez/bot-whatsapp/commit/8c825e7f6b7133f7cc7f3041ce331b80a9fe60e0)) +* **cli:** :zap: refactor ([0c0f437](https://github.com/leifermendez/bot-whatsapp/commit/0c0f4375b84549bee809340a85f9ce038ee2739e)) +* **cli:** :zap: refactor ([039ce5d](https://github.com/leifermendez/bot-whatsapp/commit/039ce5dd7cac8115b335ad5de05f7bd871e24140)) +* **cli:** :zap: refactor ([5e87918](https://github.com/leifermendez/bot-whatsapp/commit/5e879188b8bf9d486399b308a9a9c2612607d465)) +* **cli:** :zap: refactor ([21a7270](https://github.com/leifermendez/bot-whatsapp/commit/21a72702817bc6b344223b34ca4513a7ff45fc93)) +* **cli:** :zap: refactor ([82a99b2](https://github.com/leifermendez/bot-whatsapp/commit/82a99b2c80e6738566042ea738bbab8208a17758)) +* **cli:** :zap: refactor ([cc19974](https://github.com/leifermendez/bot-whatsapp/commit/cc19974579379777b05cb69c38cec0fce6740471)) +* **cli:** :zap: refactor ([56fcb8f](https://github.com/leifermendez/bot-whatsapp/commit/56fcb8fb72169bc21fce7c4fcdceccf2acd39c73)) +* **cli:** :zap: refactor ([f36cff1](https://github.com/leifermendez/bot-whatsapp/commit/f36cff1eefdd96be4ab531e1cb2d3b630b1a81c3)) +* **cli:** :zap: refactor ([b393c11](https://github.com/leifermendez/bot-whatsapp/commit/b393c11af6c0ebccb0a690be8b90b9df8877dad1)) +* **cli:** :zap: refactor ([6683715](https://github.com/leifermendez/bot-whatsapp/commit/6683715ad617ea1075654a475a1c62ea607c733f)) +* **contexts:** :bug: fixed [#524](https://github.com/leifermendez/bot-whatsapp/issues/524) issue ([79cc31a](https://github.com/leifermendez/bot-whatsapp/commit/79cc31a96f6a9836447cc4e6bb1e1521c54183fe)) +* **contexts:** :bug: fixed [#524](https://github.com/leifermendez/bot-whatsapp/issues/524) issue ([7067b4a](https://github.com/leifermendez/bot-whatsapp/commit/7067b4a80b7938ccfaf1ed141a37d645a1a3a062)) +* **provider:** wwebjs upgrade ([345f256](https://github.com/leifermendez/bot-whatsapp/commit/345f256a1b4a238519dafc15c9a31bc5e6bad4fe)) +* se agrego @bot-whatsapp/portal a package.json ([46a9fa6](https://github.com/leifermendez/bot-whatsapp/commit/46a9fa6793e06600335de998d2bd9d0691b02ca4)) + ### [0.1.17](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.16...v0.1.17) (2023-01-13) diff --git a/package.json b/package.json index 2d1061e..fda898a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.17", + "version": "0.1.18", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 558013b2b4ca7d72977045485bedbbdb7113ff63 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:50:59 +0100 Subject: [PATCH 209/248] docs: :memo: add --- packages/docs/src/components/widgets/SearchModal.tsx | 10 +++++----- packages/docs/src/routes/index.tsx | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/docs/src/components/widgets/SearchModal.tsx b/packages/docs/src/components/widgets/SearchModal.tsx index ed31b87..287a28b 100644 --- a/packages/docs/src/components/widgets/SearchModal.tsx +++ b/packages/docs/src/components/widgets/SearchModal.tsx @@ -1,10 +1,10 @@ -import { component$, useStore } from '@builder.io/qwik' +import { component$ } from '@builder.io/qwik' export const SearchModal = component$(() => { - const state = useStore({ - open: false, - src: '', - }) + // const state = useStore({ + // open: false, + // src: '', + // }) return (
diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index dbfb2da..9b0f04a 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -10,7 +10,7 @@ import { fetchGithub } from '~/services/github' import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' -import { SearchModal } from '~/components/widgets/SearchModal' +// import { SearchModal } from '~/components/widgets/SearchModal' export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = From b2feaea588278a4bf85cfaf70e4673d8f2bc7226 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 25 Jan 2023 09:05:01 +0100 Subject: [PATCH 210/248] docs: :bug: fix modal --- packages/docs/src/routes/docs/layout!.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index 4d66df2..8f49e8a 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -3,7 +3,7 @@ import type { DocumentHead } from '@builder.io/qwik-city' import ExtraBar from '~/components/widgets/ExtraBar' import Header from '~/components/widgets/Header' import NavBar from '~/components/widgets/NavBar' -import { SearchModal } from '~/components/widgets/SearchModal' +// import { SearchModal } from '~/components/widgets/SearchModal' import SponsorBar from '~/components/widgets/SponsorBar' import { GlobalStore } from '~/contexts' // import Navigation from '~/components/widgets/Navigation' @@ -15,7 +15,7 @@ export default component$(() => { return ( <> - + {/* */}
From e7a8e85ead9a7dffbdbb04e172f83c3f66bc7262 Mon Sep 17 00:00:00 2001 From: lisandroprada Date: Wed, 25 Jan 2023 08:21:12 -0300 Subject: [PATCH 211/248] Update index.mdx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agregado: Definición de la constante BOTNAME. --- packages/docs/src/routes/docs/flows/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..cf6c23c 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -226,6 +226,7 @@ async (ctx,{flowDynamic, endFlow})=>{ Argumento para asignar nombre y puerto al BOT ```js +const BOTNAME = 'bot'; QRPortalWeb({name:BOTNAME, port:3005 }); ``` From 9dd7c02b6a5474aff063f7d6be0ca8519504b93c Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Wed, 25 Jan 2023 16:10:13 -0500 Subject: [PATCH 212/248] feat(provider): :rocket: implements all send media to venom provider --- packages/provider/src/venom/index.js | 67 +++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 4b7c231..10fe5aa 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -2,18 +2,20 @@ const { ProviderClass } = require('@bot-whatsapp/bot') const venom = require('venom-bot') const { createWriteStream } = require('fs') const { Console } = require('console') +const mime = require('mime-types') const { venomCleanNumber, venomGenerateImage, venomisValidNumber, - venomDownloadMedia, } = require('./utils') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/venom.log`), }) +const { generalDownload } = require('../../common/download') + /** * ⚙️ VenomProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -134,6 +136,53 @@ class VenomProvider extends ProviderClass { // return this.vendor.sendButtons(number, "Title", buttons1, "Description"); } + /** + * Enviar audio + * @alpha + * @param {string} number + * @param {string} message + * @param {boolean} voiceNote optional + * @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3') + */ + + sendAudio = async (number, audioPath, voiceNote = false) => { + return this.vendor.sendVoice(number, audioPath) + } + + /** + * Enviar imagen + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + return this.vendor.sendImage(number, filePath, 'image-name', text) + } + + /** + * + * @param {string} number + * @param {string} filePath + * @example await sendMessage('+XXXXXXXXXXX', './document/file.pdf') + */ + + sendFile = async (number, filePath, text) => { + const fileName = filePath.split('/').pop() + return this.vendor.sendFile(number, filePath, fileName, text) + } + + /** + * Enviar video + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath, text) => { + return this.vendor.sendVideoAsGif(number, filePath, 'video.gif', text) + } + /** * Enviar imagen o multimedia * @param {*} number @@ -141,10 +190,18 @@ class VenomProvider extends ProviderClass { * @param {*} message * @returns */ - sendMedia = async (number, mediaInput, message) => { - if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) - const fileDownloaded = await venomDownloadMedia(mediaInput) - return this.vendor.sendImage(number, fileDownloaded, '.', message) + sendMedia = async (number, mediaUrl, text) => { + const fileDownloaded = await generalDownload(mediaUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded) + + return this.sendFile(number, fileDownloaded, text) } /** From 6ff1a3a980196c01c66ed04ee07d0e7e57256504 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 12:51:15 -0500 Subject: [PATCH 213/248] feat(provider): :rocket: send file wwebjs --- packages/provider/src/web-whatsapp/index.js | 122 +++++++++++++++++--- 1 file changed, 104 insertions(+), 18 deletions(-) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index f7f8bd0..2709960 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -1,7 +1,7 @@ const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js') const { ProviderClass } = require('@bot-whatsapp/bot') const { Console } = require('console') -const { createWriteStream } = require('fs') +const { createWriteStream, readFileSync } = require('fs') const { wwebCleanNumber, wwebDownloadMedia, @@ -13,6 +13,9 @@ const logger = new Console({ stdout: createWriteStream('./log'), }) +const { generalDownload } = require('../../common/download') +const mime = require('mime-types') + /** * ⚙️ WebWhatsappProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -35,6 +38,7 @@ class WebWhatsappProvider extends ProviderClass { '--disable-setuid-sandbox', '--unhandled-rejections=strict', ], + //executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', }, }) @@ -103,23 +107,6 @@ class WebWhatsappProvider extends ProviderClass { }, ] - /** - * Enviar un archivo multimedia - * https://docs.wwebjs.dev/MessageMedia.html - * @private - * @param {*} number - * @param {*} mediaInput - * @returns - */ - sendMedia = async (number, mediaInput = null) => { - if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) - const fileDownloaded = await wwebDownloadMedia(mediaInput) - const media = MessageMedia.fromFilePath(fileDownloaded) - return this.vendor.sendMessage(number, media, { - sendAudioAsVoice: true, - }) - } - /** * Enviar botones * https://docs.wwebjs.dev/Buttons.html @@ -170,6 +157,105 @@ class WebWhatsappProvider extends ProviderClass { return this.vendor.sendMessage(number, message) } + /** + * Enviar imagen + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendAudio = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendAudio = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar video + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, { + sendMediaAsDocument: true, + }) + } + + /** + * Enviar Arhivos/pdf + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendFile = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar imagen o multimedia + * @param {*} number + * @param {*} mediaInput + * @param {*} message + * @returns + */ + sendMedia = async (number, mediaUrl, text) => { + const fileDownloaded = await generalDownload(mediaUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded) + + return this.sendFile(number, fileDownloaded) + } + /** * * @param {*} userId From cbe438b77854e8df48b9dafaf7a837d21124ac5f Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:28:25 -0500 Subject: [PATCH 214/248] feat(provider): :rocket: fix issues in providers venom and wwebjs --- packages/provider/src/venom/index.js | 2 +- packages/provider/src/web-whatsapp/index.js | 34 ++++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 10fe5aa..3e1b630 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -145,7 +145,7 @@ class VenomProvider extends ProviderClass { * @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3') */ - sendAudio = async (number, audioPath, voiceNote = false) => { + sendAudio = async (number, audioPath) => { return this.vendor.sendVoice(number, audioPath) } diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 2709960..f66e97a 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -4,7 +4,6 @@ const { Console } = require('console') const { createWriteStream, readFileSync } = require('fs') const { wwebCleanNumber, - wwebDownloadMedia, wwebGenerateImage, wwebIsValidNumber, } = require('./utils') @@ -168,7 +167,9 @@ class WebWhatsappProvider extends ProviderClass { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media, { + caption: 'soy una imagen', + }) } /** @@ -178,31 +179,14 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - /** - * Enviar audio - * @param {*} number - * @param {*} imageUrl - * @param {*} text - * @returns - */ + sendAudio = async (number, filePath, text) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) - } - /** - * Enviar audio - * @param {*} number - * @param {*} imageUrl - * @param {*} text - * @returns - */ - sendAudio = async (number, filePath, text) => { - const base64 = readFileSync(filePath, { encoding: 'base64' }) - const mimeType = mime.lookup(filePath) - const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media, { + caption: 'soy un audio', + }) } /** @@ -228,11 +212,11 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - sendFile = async (number, filePath, text) => { + sendFile = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media) } /** From dcb0566d2bc3da40cd0c71554bb5ea0ec115d9ca Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:31:05 -0500 Subject: [PATCH 215/248] feat(provider): :rocket: fix provider venom and wwebjs From b2afa45352a7ab1f5d9775f3c1fde475bd8ca204 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:32:42 -0500 Subject: [PATCH 216/248] feat(provider): :rocket: fix provider From f8c7184487065443ab10f77aaf585e8bd63ca441 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:42:45 -0500 Subject: [PATCH 217/248] feat(provider): :rocket: fix provider From 0ad4c58457b548dc41c0f9e8470d59c48de7b95a Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:51:20 -0500 Subject: [PATCH 218/248] feat(provider): :rocket: fix provider --- packages/provider/src/web-whatsapp/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index f66e97a..693d1b9 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -163,7 +163,7 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - sendImage = async (number, filePath, text) => { + sendImage = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) @@ -180,7 +180,7 @@ class WebWhatsappProvider extends ProviderClass { * @returns */ - sendAudio = async (number, filePath, text) => { + sendAudio = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) From e22780d3faba94f71a70f1f201a20690608fa5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sat, 28 Jan 2023 15:46:13 +0100 Subject: [PATCH 219/248] fix(bot): :zap: fix fallback refactor --- __test__/05-case.test.js | 118 ++++++++++++++++++ packages/bot/core/core.class.js | 48 ++++--- packages/docs/src/routes/docs/flows/index.mdx | 98 ++++++++------- 3 files changed, 204 insertions(+), 60 deletions(-) create mode 100644 __test__/05-case.test.js diff --git a/__test__/05-case.test.js b/__test__/05-case.test.js new file mode 100644 index 0000000..6ca65d0 --- /dev/null +++ b/__test__/05-case.test.js @@ -0,0 +1,118 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + await delay(5) + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + return Promise.resolve(data) +} + +test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { + const MOCK_VALUES = [ + '¿CUal es tu email?', + 'Continuamos....', + '¿Cual es tu edad?', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer( + MOCK_VALUES[0], + { + capture: true, + }, + async (ctx, { flowDynamic, fallBack }) => { + const validation = ctx.body.includes('@') + + if (validation) { + const getDataFromApi = await fakeHTTP([ + 'Gracias por tu email se ha validado de manera correcta', + ]) + return flowDynamic(getDataFromApi) + } + return fallBack(validation) + } + ) + .addAnswer(MOCK_VALUES[1]) + .addAnswer( + MOCK_VALUES[2], + { capture: true }, + async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') + } + return flowDynamic('Bien tu edad es correcta!') + } + ) + .addAnswer('Puedes pasar') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(10, 'message', { + from: '000', + body: 'this is not email value', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: 'test@test.com', + }) + + provider.delaySendMessage(90, 'message', { + from: '000', + body: '20', + }) + + provider.delaySendMessage(200, 'message', { + from: '000', + body: '18', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is('this is not email value', getHistory[1]) + assert.is(MOCK_VALUES[0], getHistory[2]) + assert.is('test@test.com', getHistory[3]) + assert.is( + '1 Gracias por tu email se ha validado de manera correcta', + getHistory[4] + ) + assert.is(MOCK_VALUES[1], getHistory[5]) + assert.is(MOCK_VALUES[2], getHistory[6]) + assert.is('20', getHistory[7]) + assert.is('Ups creo que no eres mayor de edad', getHistory[8]) + assert.is('18', getHistory[9]) + assert.is('Bien tu edad es correcta!', getHistory[10]) + assert.is('Puedes pasar', getHistory[11]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index f7051b3..418fef4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -71,8 +71,8 @@ class CoreClass { logger.log(`[handleMsg]: `, messageCtxInComming) const { body, from } = messageCtxInComming let msgToSend = [] - let fallBackFlag = false let endFlowFlag = false + let fallBackFlag = false if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return @@ -105,11 +105,23 @@ class CoreClass { return } - // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx - const sendFlow = async (messageToSend, numberOrId) => { - // [1 Paso] esto esta bien! + // 📄 Continuar con el siguiente flujo + const continueFlow = async () => { + const cotinueMessage = + this.flowClass.find(refToContinue?.ref, true) || [] + sendFlow(cotinueMessage, from, { continue: true }) + return + } + + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx + const sendFlow = async ( + messageToSend, + numberOrId, + options = { continue: false } + ) => { + if (!options.continue && prevMsg?.options?.capture) + await cbEveryCtx(prevMsg?.ref) - if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) const queue = [] for (const ctxMessage of messageToSend) { if (endFlowFlag) return @@ -127,11 +139,13 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = async () => { - fallBackFlag = true - await this.sendProviderAndSave(from, refToContinue) + const fallBack = async (next = false, message = null) => { QueuePrincipal.queue = [] - return refToContinue + if (next) return continueFlow() + return this.sendProviderAndSave(from, { + ...refToContinue, + answer: message ?? refToContinue.answer, + }) } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes @@ -141,8 +155,7 @@ class CoreClass { listMsg = [], optListMsg = { limit: 5, fallback: false } ) => { - if (!Array.isArray(listMsg)) - throw new Error('Esto debe ser un ARRAY') + if (!Array.isArray(listMsg)) listMsg = [listMsg] fallBackFlag = optListMsg.fallback const parseListMsg = listMsg @@ -165,7 +178,7 @@ class CoreClass { for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } - return + return continueFlow() } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback @@ -181,11 +194,12 @@ class CoreClass { fallBack, flowDynamic, endFlow, + continueFlow, }) } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa - if (!fallBackFlag && prevMsg?.options?.nested?.length) { + if (prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested const flowStandalone = nestedRef.map((f) => ({ ...nestedRef.find((r) => r.refSerialize === f.refSerialize), @@ -197,12 +211,11 @@ class CoreClass { return } - // 📄🤘(tiene return) [options: capture (boolean)]: Si se tiene option boolean - if (!fallBackFlag && !prevMsg?.options?.nested?.length) { + // 📄🤘(tiene return) Si el mensaje previo implementa capture + if (!prevMsg?.options?.nested?.length) { const typeCapture = typeof prevMsg?.options?.capture - const valueCapture = prevMsg?.options?.capture - if (['string', 'boolean'].includes(typeCapture) && valueCapture) { + if (typeCapture === 'boolean' && fallBackFlag) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] sendFlow(msgToSend, from) return @@ -228,6 +241,7 @@ class CoreClass { } /** + * @deprecated * @private * @param {*} message * @param {*} ref diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..29a0c63 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -29,13 +29,16 @@ const flowPrincipal = addKeyword(['hola', 'alo']) Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". ```js -createBot({ +createBot( + { flow: adapterFlow, provider: adapterProvider, database: adapterDB, - },{ - blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] - }) + }, + { + blackList: ['34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX'], + } +) ``` --- @@ -175,65 +178,74 @@ const flowString = addKeyword('hola') ``` --- + ## endFlow() -Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y que el usuario pueda finalizar por él mismo el flujo. Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. - - ```js const flowFormulario = addKeyword(['Hola']) - -.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['También necesito tus dos apellidos'], - {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, - async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - - - + .addAnswer( + ['Hola!', 'Escriba su *Nombre* para generar su solicitud'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['También necesito tus dos apellidos'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['Dejeme su número de teléfono y le llamaré lo antes posible.'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) ``` --- - - - - # QRPortalWeb Argumento para asignar nombre y puerto al BOT ```js -QRPortalWeb({name:BOTNAME, port:3005 }); - +QRPortalWeb({ name: BOTNAME, port: 3005 }) ``` --- - - Date: Sat, 28 Jan 2023 16:06:12 +0100 Subject: [PATCH 220/248] fix(cli): :zap: refactor fallback in child flow --- packages/bot/core/core.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 418fef4..b3bc15b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -143,8 +143,8 @@ class CoreClass { QueuePrincipal.queue = [] if (next) return continueFlow() return this.sendProviderAndSave(from, { - ...refToContinue, - answer: message ?? refToContinue.answer, + ...prevMsg, + answer: message ?? prevMsg.answer, }) } From f95331d3dc70e76a3dfbe4c8d24059f0e7a164ef Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 28 Jan 2023 16:25:22 +0100 Subject: [PATCH 221/248] feat(provider): :zap: venom wweb --- package.json | 1 - packages/docs/src/routes/docs/flows/index.mdx | 98 +++++++++++-------- .../provider/src/web-whatsapp/package.json | 2 +- yarn.lock | 50 +--------- 4 files changed, 59 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index 859f059..2ad9893 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "eslint-config-prettier": "^8.5.0", "fs-extra": "^11.1.0", "git-cz": "^4.9.0", - "got": "11.8.3", "husky": "^8.0.2", "mime-types": "^2.1.35", "only-allow": "^1.1.1", diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..29a0c63 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -29,13 +29,16 @@ const flowPrincipal = addKeyword(['hola', 'alo']) Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". ```js -createBot({ +createBot( + { flow: adapterFlow, provider: adapterProvider, database: adapterDB, - },{ - blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] - }) + }, + { + blackList: ['34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX'], + } +) ``` --- @@ -175,65 +178,74 @@ const flowString = addKeyword('hola') ``` --- + ## endFlow() -Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y que el usuario pueda finalizar por él mismo el flujo. Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. - - ```js const flowFormulario = addKeyword(['Hola']) - -.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['También necesito tus dos apellidos'], - {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, - async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - - - + .addAnswer( + ['Hola!', 'Escriba su *Nombre* para generar su solicitud'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['También necesito tus dos apellidos'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['Dejeme su número de teléfono y le llamaré lo antes posible.'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) ``` --- - - - - # QRPortalWeb Argumento para asignar nombre y puerto al BOT ```js -QRPortalWeb({name:BOTNAME, port:3005 }); - +QRPortalWeb({ name: BOTNAME, port: 3005 }) ``` --- - - Date: Sat, 28 Jan 2023 16:44:30 +0100 Subject: [PATCH 222/248] feat(provider): :zap: venom wweb --- packages/bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index fe542c1..30211e4 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.73-alpha.0", + "version": "0.0.84-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From 1c66f178a56d284bb8cb9df5ca17685c7e5d1ddd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 28 Jan 2023 18:41:58 +0100 Subject: [PATCH 223/248] fix(cli): :zap: endflow --- __test__/06-case.test.js | 111 ++++++++++++++++++++++++++++++++ packages/bot/core/core.class.js | 11 +++- packages/bot/package.json | 2 +- 3 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 __test__/06-case.test.js diff --git a/__test__/06-case.test.js b/__test__/06-case.test.js new file mode 100644 index 0000000..c68679e --- /dev/null +++ b/__test__/06-case.test.js @@ -0,0 +1,111 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + await delay(5) + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + return Promise.resolve(data) +} + +test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { + const MOCK_VALUES = [ + '¿CUal es tu email?', + 'Continuamos....', + '¿Cual es tu edad?', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer( + MOCK_VALUES[0], + { + capture: true, + }, + async (ctx, { flowDynamic, fallBack }) => { + const validation = ctx.body.includes('@') + + if (validation) { + const getDataFromApi = await fakeHTTP([ + 'Gracias por tu email se ha validado de manera correcta', + ]) + return flowDynamic(getDataFromApi) + } + return fallBack(validation) + } + ) + .addAnswer(MOCK_VALUES[1], null, async (_, { endFlow }) => { + return endFlow() + }) + .addAnswer( + MOCK_VALUES[2], + { capture: true }, + async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') + } + return flowDynamic('Bien tu edad es correcta!') + } + ) + .addAnswer('Puedes pasar') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(10, 'message', { + from: '000', + body: 'this is not email value', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: 'test@test.com', + }) + + provider.delaySendMessage(90, 'message', { + from: '000', + body: '20', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is('this is not email value', getHistory[1]) + assert.is(MOCK_VALUES[0], getHistory[2]) + assert.is('test@test.com', getHistory[3]) + assert.is( + '1 Gracias por tu email se ha validado de manera correcta', + getHistory[4] + ) + assert.is(MOCK_VALUES[1], getHistory[5]) + assert.is('20', getHistory[6]) + assert.is(undefined, getHistory[7]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index b3bc15b..90340e6 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -98,10 +98,15 @@ class CoreClass { } // 📄 Finalizar flujo - const endFlow = async () => { + const endFlow = async (message = null) => { prevMsg = null endFlowFlag = true clearQueue() + if (message) + this.sendProviderAndSave(from, { + ...prevMsg, + answer: message ?? prevMsg.answer, + }) return } @@ -199,7 +204,7 @@ class CoreClass { } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa - if (prevMsg?.options?.nested?.length) { + if (!endFlowFlag && prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested const flowStandalone = nestedRef.map((f) => ({ ...nestedRef.find((r) => r.refSerialize === f.refSerialize), @@ -212,7 +217,7 @@ class CoreClass { } // 📄🤘(tiene return) Si el mensaje previo implementa capture - if (!prevMsg?.options?.nested?.length) { + if (!endFlowFlag && !prevMsg?.options?.nested?.length) { const typeCapture = typeof prevMsg?.options?.capture if (typeCapture === 'boolean' && fallBackFlag) { diff --git a/packages/bot/package.json b/packages/bot/package.json index 30211e4..827194b 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.84-alpha.0", + "version": "0.0.86-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From b655ae449e7958ea940d8cc3c678fd66f60b6385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sun, 29 Jan 2023 12:46:31 +0100 Subject: [PATCH 224/248] fix(bot): :fire: endFlow with ctx --- packages/bot/core/core.class.js | 48 ++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index b3bc15b..9ddf444 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -91,6 +91,25 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Crar CTX de mensaje (uso private) + const createCtxMessage = (payload = {}, index = 0) => { + const body = + typeof payload === 'string' + ? payload + : payload?.body ?? payload?.answer + const media = payload?.media ?? null + const buttons = payload?.buttons ?? [] + const capture = payload?.capture ?? false + + return toCtx({ + body, + from, + keyword: null, + index, + options: { media, buttons, capture }, + }) + } + // 📄 Limpiar cola de procesos const clearQueue = () => { QueuePrincipal.pendingPromise = false @@ -98,9 +117,12 @@ class CoreClass { } // 📄 Finalizar flujo - const endFlow = async () => { + const endFlow = async (message = null) => { prevMsg = null endFlowFlag = true + if (message) + this.sendProviderAndSave(from, createCtxMessage(message)) + clearQueue() return } @@ -151,28 +173,12 @@ class CoreClass { // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp - const flowDynamic = async ( - listMsg = [], - optListMsg = { limit: 5, fallback: false } - ) => { + const flowDynamic = async (listMsg = []) => { if (!Array.isArray(listMsg)) listMsg = [listMsg] - fallBackFlag = optListMsg.fallback - const parseListMsg = listMsg - .map((opt, index) => { - const body = typeof opt === 'string' ? opt : opt.body - const media = opt?.media ?? null - const buttons = opt?.buttons ?? [] - - return toCtx({ - body, - from, - keyword: null, - index, - options: { media, buttons }, - }) - }) - .slice(0, optListMsg.limit) + const parseListMsg = listMsg.map((opt, index) => + createCtxMessage(opt, index) + ) if (endFlowFlag) return for (const msg of parseListMsg) { From f6114affadfbc324536a86167d1fdfe8da3c8de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sun, 29 Jan 2023 13:39:09 +0100 Subject: [PATCH 225/248] fix(bot): :fire: endFlow with ctx --- packages/bot/core/core.class.js | 9 ++++++++- packages/bot/package.json | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 9ddf444..60644a5 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -166,7 +166,14 @@ class CoreClass { if (next) return continueFlow() return this.sendProviderAndSave(from, { ...prevMsg, - answer: message ?? prevMsg.answer, + answer: + typeof message === 'string' + ? message + : message?.body ?? prevMsg.answer, + options: { + ...prevMsg.options, + buttons: message?.buttons ?? prevMsg.options?.buttons, + }, }) } diff --git a/packages/bot/package.json b/packages/bot/package.json index 30211e4..5d2dc0c 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.84-alpha.0", + "version": "0.0.89-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From f7d90efc2f48dad8fed3cbd21b2578ad296c2bd6 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 29 Jan 2023 18:33:32 +0100 Subject: [PATCH 226/248] chore(release): 0.1.19 --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b39939..d0bdbfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.19](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.18...v0.1.19) (2023-01-29) + + +### Features + +* :fire: bailey add media ([eab39e4](https://github.com/leifermendez/bot-whatsapp/commit/eab39e4ac06fd46f1a4671f8c15d1456b4400b97)) +* :zap: more feature ([e19c3a2](https://github.com/leifermendez/bot-whatsapp/commit/e19c3a25a40259c74b4add9635af4844907eed26)) +* **provider:** :rocket: fix issues in providers venom and wwebjs ([cbe438b](https://github.com/leifermendez/bot-whatsapp/commit/cbe438b77854e8df48b9dafaf7a837d21124ac5f)) +* **provider:** :rocket: fix provider ([0ad4c58](https://github.com/leifermendez/bot-whatsapp/commit/0ad4c58457b548dc41c0f9e8470d59c48de7b95a)) +* **provider:** :rocket: fix provider ([f8c7184](https://github.com/leifermendez/bot-whatsapp/commit/f8c7184487065443ab10f77aaf585e8bd63ca441)) +* **provider:** :rocket: fix provider ([b2afa45](https://github.com/leifermendez/bot-whatsapp/commit/b2afa45352a7ab1f5d9775f3c1fde475bd8ca204)) +* **provider:** :rocket: fix provider venom and wwebjs ([dcb0566](https://github.com/leifermendez/bot-whatsapp/commit/dcb0566d2bc3da40cd0c71554bb5ea0ec115d9ca)) +* **provider:** :rocket: implements all send media to venom provider ([9dd7c02](https://github.com/leifermendez/bot-whatsapp/commit/9dd7c02b6a5474aff063f7d6be0ca8519504b93c)) +* **provider:** :rocket: send file wwebjs ([6ff1a3a](https://github.com/leifermendez/bot-whatsapp/commit/6ff1a3a980196c01c66ed04ee07d0e7e57256504)) +* **provider:** :zap: bailey add send file video audio ([14d1a61](https://github.com/leifermendez/bot-whatsapp/commit/14d1a61fa259c09135c37c55bd79e97c9c8367e4)) +* **provider:** :zap: venom wweb ([fd2847a](https://github.com/leifermendez/bot-whatsapp/commit/fd2847aea0db17a0bdf33b5bca67a4cb8db2da16)) +* **provider:** :zap: venom wweb ([f95331d](https://github.com/leifermendez/bot-whatsapp/commit/f95331d3dc70e76a3dfbe4c8d24059f0e7a164ef)) +* **provider:** 🚀 implements all send media to venom provider ([bd7d150](https://github.com/leifermendez/bot-whatsapp/commit/bd7d150c047af41fdbb47f0a50a21e82cd79ee85)) + + +### Bug Fixes + +* **bot:** :fire: endFlow with ctx ([f6114af](https://github.com/leifermendez/bot-whatsapp/commit/f6114affadfbc324536a86167d1fdfe8da3c8de6)) +* **bot:** :fire: endFlow with ctx ([b655ae4](https://github.com/leifermendez/bot-whatsapp/commit/b655ae449e7958ea940d8cc3c678fd66f60b6385)) +* **bot:** :zap: endFlow butons ([87a4203](https://github.com/leifermendez/bot-whatsapp/commit/87a4203cd5b88f566387a76d586248e4265d6e4e)) +* **bot:** :zap: fix fallback refactor ([e22780d](https://github.com/leifermendez/bot-whatsapp/commit/e22780d3faba94f71a70f1f201a20690608fa5bf)) +* **cli:** :zap: endflow ([1c66f17](https://github.com/leifermendez/bot-whatsapp/commit/1c66f178a56d284bb8cb9df5ca17685c7e5d1ddd)) +* **cli:** :zap: refactor fallback in child flow ([b33e346](https://github.com/leifermendez/bot-whatsapp/commit/b33e34692d3abcb6874308a9be79f74be4a2c3a8)) +* **cli:** :zap: refactor fallback in child flow ([8da4b20](https://github.com/leifermendez/bot-whatsapp/commit/8da4b204b41125b5d0fa0aee4fa87c1f5faf5568)) + ### [0.1.18](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.17...v0.1.18) (2023-01-24) diff --git a/package.json b/package.json index 2ad9893..30e3cf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.18", + "version": "0.1.19", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 0a69b8d9b5180d40c373a9234eebdee966f6c4fb Mon Sep 17 00:00:00 2001 From: Jhonarias13 Date: Tue, 31 Jan 2023 09:35:02 -0500 Subject: [PATCH 227/248] corrige caption 'soy una imagen' en sendImage() wwebprovider --- packages/provider/src/web-whatsapp/index.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 693d1b9..60a142d 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -163,13 +163,11 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - sendImage = async (number, filePath) => { + sendImage = async (number, filePath, caption) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, { - caption: 'soy una imagen', - }) + return this.vendor.sendMessage(number, media, { caption }) } /** @@ -180,13 +178,11 @@ class WebWhatsappProvider extends ProviderClass { * @returns */ - sendAudio = async (number, filePath) => { + sendAudio = async (number, filePath, caption) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, { - caption: 'soy un audio', - }) + return this.vendor.sendMessage(number, media, { caption }) } /** @@ -235,7 +231,7 @@ class WebWhatsappProvider extends ProviderClass { if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded) if (mimeType.includes('audio')) - return this.sendAudio(number, fileDownloaded) + return this.sendAudio(number, fileDownloaded, text) return this.sendFile(number, fileDownloaded) } From 0f8a33cc0ca33236da6c2b28d2d5859b22573409 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 1 Feb 2023 16:33:57 +0100 Subject: [PATCH 228/248] refactor(cli): :zap: flowDynamic --- __test__/05-case.test.js | 2 +- packages/bot/core/core.class.js | 40 ++++++++++++++--------------- packages/database/src/mock/index.js | 5 +++- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/__test__/05-case.test.js b/__test__/05-case.test.js index 6ca65d0..16b11f5 100644 --- a/__test__/05-case.test.js +++ b/__test__/05-case.test.js @@ -54,7 +54,7 @@ test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { async (ctx, { flowDynamic, fallBack }) => { if (ctx.body !== '18') { await delay(50) - return fallBack(false, 'Ups creo que no eres mayor de edad') + return fallBack('Ups creo que no eres mayor de edad') } return flowDynamic('Bien tu edad es correcta!') } diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 9b329cc..68fd4d5 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -118,19 +118,11 @@ class CoreClass { // 📄 Finalizar flujo const endFlow = async (message = null) => { - prevMsg = null endFlowFlag = true if (message) this.sendProviderAndSave(from, createCtxMessage(message)) clearQueue() - return - } - - // 📄 Continuar con el siguiente flujo - const continueFlow = async () => { - const cotinueMessage = - this.flowClass.find(refToContinue?.ref, true) || [] - sendFlow(cotinueMessage, from, { continue: true }) + sendFlow([]) return } @@ -138,10 +130,10 @@ class CoreClass { const sendFlow = async ( messageToSend, numberOrId, - options = { continue: false } + options = { prev: prevMsg } ) => { - if (!options.continue && prevMsg?.options?.capture) - await cbEveryCtx(prevMsg?.ref) + if (options.prev?.options?.capture) + await cbEveryCtx(options.prev?.ref) const queue = [] for (const ctxMessage of messageToSend) { @@ -160,9 +152,8 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = async (next = false, message = null) => { + const fallBack = async (message = null) => { QueuePrincipal.queue = [] - if (next) return continueFlow() return this.sendProviderAndSave(from, { ...prevMsg, answer: @@ -171,7 +162,7 @@ class CoreClass { : message?.body ?? prevMsg.answer, options: { ...prevMsg.options, - buttons: message?.buttons ?? prevMsg.options?.buttons, + buttons: prevMsg.options?.buttons, }, }) } @@ -185,12 +176,19 @@ class CoreClass { const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index) ) + const currentPrev = await this.databaseClass.getPrevByNumber(from) if (endFlowFlag) return for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } - return continueFlow() + + const nextFlow = await this.flowClass.find(refToContinue?.ref, true) + const filterNextFlow = nextFlow.filter( + (msg) => msg.refSerialize !== currentPrev?.refSerialize + ) + + return sendFlow(filterNextFlow, from, { prev: undefined }) } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback @@ -206,7 +204,6 @@ class CoreClass { fallBack, flowDynamic, endFlow, - continueFlow, }) } @@ -246,10 +243,11 @@ class CoreClass { */ sendProviderAndSave = (numberOrId, ctxMessage) => { const { answer } = ctxMessage - return Promise.all([ - this.providerClass.sendMessage(numberOrId, answer, ctxMessage), - this.databaseClass.save({ ...ctxMessage, from: numberOrId }), - ]) + return this.providerClass + .sendMessage(numberOrId, answer, ctxMessage) + .then(() => + this.databaseClass.save({ ...ctxMessage, from: numberOrId }) + ) } /** diff --git a/packages/database/src/mock/index.js b/packages/database/src/mock/index.js index 4c07c03..2ab91a0 100644 --- a/packages/database/src/mock/index.js +++ b/packages/database/src/mock/index.js @@ -10,7 +10,10 @@ class MockDatabase { constructor() {} getPrevByNumber = (from) => { - const history = this.listHistory.slice().reverse() + const history = this.listHistory + .slice() + .reverse() + .filter((i) => !!i.keyword) return history.find((a) => a.from === from) } From ebd30ea1d78125d105d2785def8780a626305556 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 1 Feb 2023 16:34:24 +0100 Subject: [PATCH 229/248] refactor(cli): :zap: flowDynamic --- .prettierrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierrc.json b/.prettierrc.json index e74ed9f..f0db82f 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,5 +2,6 @@ "trailingComma": "es5", "tabWidth": 4, "semi": false, - "singleQuote": true + "singleQuote": true, + "printWidth": 120 } From c655c480095bfb54b10f3bc6f7be4daaa545b70f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 1 Feb 2023 16:58:10 +0100 Subject: [PATCH 230/248] refactor(bot): :zap: working fallBack --- __test__/05-case.test.js | 38 +++++------------- packages/bot/core/core.class.js | 69 +++++++++++++-------------------- 2 files changed, 36 insertions(+), 71 deletions(-) diff --git a/__test__/05-case.test.js b/__test__/05-case.test.js index 16b11f5..f61d114 100644 --- a/__test__/05-case.test.js +++ b/__test__/05-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') /** * Falsear peticion async @@ -21,11 +16,7 @@ const fakeHTTP = async (fakeData = []) => { } test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { - const MOCK_VALUES = [ - '¿CUal es tu email?', - 'Continuamos....', - '¿Cual es tu edad?', - ] + const MOCK_VALUES = ['¿CUal es tu email?', 'Continuamos....', '¿Cual es tu edad?'] const provider = createProvider(PROVIDER_DB) const database = new MOCK_DB() @@ -39,26 +30,20 @@ test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { const validation = ctx.body.includes('@') if (validation) { - const getDataFromApi = await fakeHTTP([ - 'Gracias por tu email se ha validado de manera correcta', - ]) + const getDataFromApi = await fakeHTTP(['Gracias por tu email se ha validado de manera correcta']) return flowDynamic(getDataFromApi) } return fallBack(validation) } ) .addAnswer(MOCK_VALUES[1]) - .addAnswer( - MOCK_VALUES[2], - { capture: true }, - async (ctx, { flowDynamic, fallBack }) => { - if (ctx.body !== '18') { - await delay(50) - return fallBack('Ups creo que no eres mayor de edad') - } - return flowDynamic('Bien tu edad es correcta!') + .addAnswer(MOCK_VALUES[2], { capture: true }, async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') } - ) + return flowDynamic('Bien tu edad es correcta!') + }) .addAnswer('Puedes pasar') createBot({ @@ -98,10 +83,7 @@ test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { assert.is('this is not email value', getHistory[1]) assert.is(MOCK_VALUES[0], getHistory[2]) assert.is('test@test.com', getHistory[3]) - assert.is( - '1 Gracias por tu email se ha validado de manera correcta', - getHistory[4] - ) + assert.is('1 Gracias por tu email se ha validado de manera correcta', getHistory[4]) assert.is(MOCK_VALUES[1], getHistory[5]) assert.is(MOCK_VALUES[2], getHistory[6]) assert.is('20', getHistory[7]) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 68fd4d5..fae0ba4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -43,8 +43,7 @@ class CoreClass { }, { event: 'require_action', - func: ({ instructions, title = '⚡⚡ ACCIÓN REQUERIDA ⚡⚡' }) => - printer(instructions, title), + func: ({ instructions, title = '⚡⚡ ACCIÓN REQUERIDA ⚡⚡' }) => printer(instructions, title), }, { event: 'ready', @@ -52,8 +51,7 @@ class CoreClass { }, { event: 'auth_failure', - func: ({ instructions }) => - printer(instructions, '⚡⚡ ERROR AUTH ⚡⚡'), + func: ({ instructions }) => printer(instructions, '⚡⚡ ERROR AUTH ⚡⚡'), }, { @@ -78,9 +76,7 @@ class CoreClass { if (!body.length) return let prevMsg = await this.databaseClass.getPrevByNumber(from) - const refToContinue = this.flowClass.findBySerialize( - prevMsg?.refSerialize - ) + const refToContinue = this.flowClass.findBySerialize(prevMsg?.refSerialize) if (prevMsg?.ref) { const ctxByNumber = toCtx({ @@ -93,10 +89,7 @@ class CoreClass { // 📄 Crar CTX de mensaje (uso private) const createCtxMessage = (payload = {}, index = 0) => { - const body = - typeof payload === 'string' - ? payload - : payload?.body ?? payload?.answer + const body = typeof payload === 'string' ? payload : payload?.body ?? payload?.answer const media = payload?.media ?? null const buttons = payload?.buttons ?? [] const capture = payload?.capture ?? false @@ -119,21 +112,15 @@ class CoreClass { // 📄 Finalizar flujo const endFlow = async (message = null) => { endFlowFlag = true - if (message) - this.sendProviderAndSave(from, createCtxMessage(message)) + if (message) this.sendProviderAndSave(from, createCtxMessage(message)) clearQueue() sendFlow([]) return } // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx - const sendFlow = async ( - messageToSend, - numberOrId, - options = { prev: prevMsg } - ) => { - if (options.prev?.options?.capture) - await cbEveryCtx(options.prev?.ref) + const sendFlow = async (messageToSend, numberOrId, options = { prev: prevMsg }) => { + if (options.prev?.options?.capture) await cbEveryCtx(options.prev?.ref) const queue = [] for (const ctxMessage of messageToSend) { @@ -142,9 +129,7 @@ class CoreClass { if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => Promise.all([ - this.sendProviderAndSave(numberOrId, ctxMessage).then( - () => resolveCbEveryCtx(ctxMessage) - ), + this.sendProviderAndSave(numberOrId, ctxMessage).then(() => resolveCbEveryCtx(ctxMessage)), ]) ) } @@ -152,19 +137,26 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = async (message = null) => { + const fallBack = async (validation = false, message = null) => { QueuePrincipal.queue = [] - return this.sendProviderAndSave(from, { + + if (validation) { + const currentPrev = await this.databaseClass.getPrevByNumber(from) + const nextFlow = await this.flowClass.find(refToContinue?.ref, true) + const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) + + return sendFlow(filterNextFlow, from, { prev: undefined }) + } + + await this.sendProviderAndSave(from, { ...prevMsg, - answer: - typeof message === 'string' - ? message - : message?.body ?? prevMsg.answer, + answer: typeof message === 'string' ? message : message?.body ?? prevMsg.answer, options: { ...prevMsg.options, buttons: prevMsg.options?.buttons, }, }) + return } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes @@ -173,9 +165,7 @@ class CoreClass { const flowDynamic = async (listMsg = []) => { if (!Array.isArray(listMsg)) listMsg = [listMsg] - const parseListMsg = listMsg.map((opt, index) => - createCtxMessage(opt, index) - ) + const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index)) const currentPrev = await this.databaseClass.getPrevByNumber(from) if (endFlowFlag) return @@ -184,17 +174,14 @@ class CoreClass { } const nextFlow = await this.flowClass.find(refToContinue?.ref, true) - const filterNextFlow = nextFlow.filter( - (msg) => msg.refSerialize !== currentPrev?.refSerialize - ) + const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) return sendFlow(filterNextFlow, from, { prev: undefined }) } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback const resolveCbEveryCtx = async (ctxMessage) => { - if (!ctxMessage?.options?.capture) - return await cbEveryCtx(ctxMessage?.ref) + if (!ctxMessage?.options?.capture) return await cbEveryCtx(ctxMessage?.ref) } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo @@ -245,9 +232,7 @@ class CoreClass { const { answer } = ctxMessage return this.providerClass .sendMessage(numberOrId, answer, ctxMessage) - .then(() => - this.databaseClass.save({ ...ctxMessage, from: numberOrId }) - ) + .then(() => this.databaseClass.save({ ...ctxMessage, from: numberOrId })) } /** @@ -277,9 +262,7 @@ class CoreClass { for (const ctxMessage of messageToSend) { const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) - QueuePrincipal.enqueue(() => - this.sendProviderAndSave(numberOrId, ctxMessage) - ) + QueuePrincipal.enqueue(() => this.sendProviderAndSave(numberOrId, ctxMessage)) } return Promise.all(queue) } From 331d2a309c3377342c8e7d9519c19e9456a4f78c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Feb 2023 09:10:57 +0000 Subject: [PATCH 231/248] docs(contributor): contrib-readme-action has updated readme --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 777209f..ce15a85 100644 --- a/README.md +++ b/README.md @@ -112,14 +112,35 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Null
+ + devrlbusiness +
+ Developer RL Business +
+
+ + Gregoriotecnico +
+ Null +
+
jlferrete
Jose Luis Ferrete Olarte
-
+ + lisandroprada +
+ Null +
+
6rak0 @@ -140,7 +161,8 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Rodrigo Mendoza Cabrera
-
yond1994 From 811618b256975220dae402a9a69020d9f788e122 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 10:12:45 +0100 Subject: [PATCH 232/248] docs: :sparkles: digitalocean sponsor --- .../docs/src/assets/images/digital-ocean.png | Bin 0 -> 9212 bytes .../src/components/atoms/DigitalOcean.tsx | 213 ++++++++++++++++++ .../src/components/widgets/SponsorBar.tsx | 17 +- 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 packages/docs/src/assets/images/digital-ocean.png create mode 100644 packages/docs/src/components/atoms/DigitalOcean.tsx diff --git a/packages/docs/src/assets/images/digital-ocean.png b/packages/docs/src/assets/images/digital-ocean.png new file mode 100644 index 0000000000000000000000000000000000000000..0d0163b02358556eca5f264990a0c67f534289b7 GIT binary patch literal 9212 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 ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) diff --git a/packages/docs/src/components/widgets/SponsorBar.tsx b/packages/docs/src/components/widgets/SponsorBar.tsx index c0d8183..f355691 100644 --- a/packages/docs/src/components/widgets/SponsorBar.tsx +++ b/packages/docs/src/components/widgets/SponsorBar.tsx @@ -7,6 +7,8 @@ import { src as qwik } from '~/assets/images/qwik.png?width=100&metadata' import { src as leanga } from '~/assets/images/leanga.png?width=40&metadata' // @ts-ignore import { src as netlify } from '~/assets/images/full-logo-light.png?width=100&metadata' +// @ts-ignore +import { src as digitalOcean } from '~/assets/images/digital-ocean.png?width=100&metadata' /** * options = [] array con la lista de opciones de la documentacion @@ -41,7 +43,20 @@ export default component$(() => { Qwind Hero Image (Cool dog) + + + +
  • + + + DigitalOcean From 88c05c12a4b79368307bc8733c7b95dc7bf3a9e8 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 10:24:48 +0100 Subject: [PATCH 233/248] docs: :sparkles: digitalocean sponsor --- .prettierrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierrc.json b/.prettierrc.json index e74ed9f..f0db82f 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,5 +2,6 @@ "trailingComma": "es5", "tabWidth": 4, "semi": false, - "singleQuote": true + "singleQuote": true, + "printWidth": 120 } From 74fb3b864d25a3cd4bafffe95f5122b504a6443e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 10:39:17 +0100 Subject: [PATCH 234/248] docs: :sparkles: digitalocean sponsor --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ce15a85..af4b124 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # Chatbot Library ![](https://img.shields.io/npm/v/@bot-whatsapp/bot?color=%2300c200&label=%40bot-whatsapp) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) -[![BotWhatsapp Releases(Prod)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml/badge.svg)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml) - +[![](https://img.shields.io/discord/915193197645402142?logo=discord)](https://link.codigoencasa.com/DISCORD)

    From 96c2bffd093269be8e39474a84c156938504a6cb Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 13:37:21 +0100 Subject: [PATCH 235/248] fix(provider): :zap: baily wa.link --- packages/bot/package.json | 2 +- packages/provider/src/baileys/index.js | 53 +++++++------------------- 2 files changed, 15 insertions(+), 40 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 3d4acf3..563cd74 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.91-alpha.0", + "version": "0.0.96-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 9361731..7a5de23 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -7,18 +7,9 @@ const { join } = require('path') const { createWriteStream, readFileSync } = require('fs') const { Console } = require('console') -const { - default: makeWASocket, - useMultiFileAuthState, - Browsers, - DisconnectReason, -} = require('@adiwajshing/baileys') +const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require('@adiwajshing/baileys') -const { - baileyGenerateImage, - baileyCleanNumber, - baileyIsValidNumber, -} = require('./utils') +const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber } = require('./utils') const { generalDownload } = require('../../common/download') @@ -46,9 +37,7 @@ class BaileysProvider extends ProviderClass { */ initBailey = async () => { const NAME_DIR_SESSION = `${this.globalVendorArgs.name}_sessions` - const { state, saveCreds } = await useMultiFileAuthState( - NAME_DIR_SESSION - ) + const { state, saveCreds } = await useMultiFileAuthState(NAME_DIR_SESSION) this.saveCredsGlobal = saveCreds try { @@ -57,7 +46,7 @@ class BaileysProvider extends ProviderClass { auth: state, browser: Browsers.macOS('Desktop'), syncFullHistory: false, - logger: pino({ level: 'error' }), + logger: pino({ level: 'fatal' }), }) sock.ev.on('connection.update', async (update) => { @@ -96,10 +85,7 @@ class BaileysProvider extends ProviderClass { `Necesitas ayuda: https://link.codigoencasa.com/DISCORD`, ], }) - await baileyGenerateImage( - qr, - `${this.globalVendorArgs.name}.qr.png` - ) + await baileyGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`) } }) @@ -131,9 +117,10 @@ class BaileysProvider extends ProviderClass { const [messageCtx] = messages let payload = { ...messageCtx, - body: messageCtx?.message?.conversation, + body: messageCtx?.message?.extendedTextMessage?.text ?? messageCtx?.message?.conversation, from: messageCtx?.key?.remoteJid, } + if (payload.from === 'status@broadcast') return if (payload?.key?.fromMe) return @@ -142,9 +129,7 @@ class BaileysProvider extends ProviderClass { return } - const btnCtx = - payload?.message?.buttonsResponseMessage - ?.selectedDisplayText + const btnCtx = payload?.message?.buttonsResponseMessage?.selectedDisplayText if (btnCtx) payload.body = btnCtx @@ -174,12 +159,9 @@ class BaileysProvider extends ProviderClass { const fileDownloaded = await generalDownload(imageUrl) const mimeType = mime.lookup(fileDownloaded) - if (mimeType.includes('image')) - return this.sendImage(number, fileDownloaded, text) - if (mimeType.includes('video')) - return this.sendVideo(number, fileDownloaded, text) - if (mimeType.includes('audio')) - return this.sendAudio(number, fileDownloaded, text) + if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text) return this.sendFile(number, fileDownloaded) } @@ -294,10 +276,8 @@ class BaileysProvider extends ProviderClass { sendMessage = async (numberIn, message, { options }) => { const number = baileyCleanNumber(numberIn) - if (options?.buttons?.length) - return this.sendButtons(number, message, options.buttons) - if (options?.media) - return this.sendMedia(number, options.media, message) + if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons) + if (options?.media) return this.sendMedia(number, options.media, message) return this.sendText(number, message) } @@ -332,12 +312,7 @@ class BaileysProvider extends ProviderClass { * @example await sendContact("xxxxxxxxxxx@c.us" || "xxxxxxxxxxxxxxxxxx@g.us", "+xxxxxxxxxxx", "Robin Smith", messages) */ - sendContact = async ( - remoteJid, - contactNumber, - displayName, - messages = null - ) => { + sendContact = async (remoteJid, contactNumber, displayName, messages = null) => { const cleanContactNumber = contactNumber.replaceAll(' ', '') const waid = cleanContactNumber.replace('+', '') From 23e09efaeccaf51018c55da492edff45b625f0a9 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 15:46:07 +0100 Subject: [PATCH 236/248] fix(cli): :zap: working flowDynamic test --- .vscode/extensions.json | 2 +- __test__/07-case.test.js | 92 +++++++++++++++++++++ packages/bot/core/core.class.js | 2 +- packages/provider/src/web-whatsapp/index.js | 32 +++---- 4 files changed, 104 insertions(+), 24 deletions(-) create mode 100644 __test__/07-case.test.js diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0d0e52b..1ace260 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["xyc.vscode-mdx-preview"] + "recommendations": ["xyc.vscode-mdx-preview", "vivaxy.vscode-conventional-commits", "mhutchie.git-graph"] } diff --git a/__test__/07-case.test.js b/__test__/07-case.test.js new file mode 100644 index 0000000..6eb8e42 --- /dev/null +++ b/__test__/07-case.test.js @@ -0,0 +1,92 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + await delay(5) + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + return Promise.resolve(data) +} + +let STATE_APP = {} + +test(`[Caso - 07] Retornar estado`, async () => { + const MOCK_VALUES = ['¿Cual es tu nombre?', '¿Cual es tu edad?', 'Tu datos son:'] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer( + MOCK_VALUES[0], + { + capture: true, + }, + async (ctx, { flowDynamic, fallBack }) => { + STATE_APP[ctx.from] = { ...STATE_APP[ctx.from], name: ctx.body } + + flowDynamic('Gracias por tu nombre!') + } + ) + .addAnswer( + MOCK_VALUES[1], + { + capture: true, + }, + async (ctx, { flowDynamic, endFlow }) => { + STATE_APP[ctx.from] = { ...STATE_APP[ctx.from], age: ctx.body } + + await flowDynamic('Gracias por tu edad!') + } + ) + .addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => { + flowDynamic(`Nombre: ${STATE_APP[ctx.from].name} Edad: ${STATE_APP[ctx.from].age}`) + }) + .addAnswer('🤖🤖 Gracias por tu participacion') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: 'Leifer', + }) + + provider.delaySendMessage(40, 'message', { + from: '000', + body: '90', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is('Leifer', getHistory[1]) + assert.is('Gracias por tu nombre!', getHistory[2]) + assert.is('¿Cual es tu edad?', getHistory[3]) + assert.is('90', getHistory[4]) + assert.is('Gracias por tu edad!', getHistory[5]) + assert.is('Tu datos son:', getHistory[6]) + assert.is('Nombre: Leifer Edad: 90', getHistory[7]) + assert.is('🤖🤖 Gracias por tu participacion', getHistory[8]) + assert.is(undefined, getHistory[9]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index fae0ba4..1c15932 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -175,7 +175,7 @@ class CoreClass { const nextFlow = await this.flowClass.find(refToContinue?.ref, true) const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) - + console.log(`🚩🚩🚩`, filterNextFlow?.answer) return sendFlow(filterNextFlow, from, { prev: undefined }) } diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 693d1b9..0e763c6 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -2,11 +2,7 @@ const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js') const { ProviderClass } = require('@bot-whatsapp/bot') const { Console } = require('console') const { createWriteStream, readFileSync } = require('fs') -const { - wwebCleanNumber, - wwebGenerateImage, - wwebIsValidNumber, -} = require('./utils') +const { wwebCleanNumber, wwebGenerateImage, wwebIsValidNumber } = require('./utils') const logger = new Console({ stdout: createWriteStream('./log'), @@ -32,11 +28,7 @@ class WebWhatsappProvider extends ProviderClass { }), puppeteer: { headless: true, - args: [ - '--no-sandbox', - '--disable-setuid-sandbox', - '--unhandled-rejections=strict', - ], + args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'], //executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', }, }) @@ -80,10 +72,7 @@ class WebWhatsappProvider extends ProviderClass { `Necesitas ayuda: https://link.codigoencasa.com/DISCORD`, ], }) - await wwebGenerateImage( - qr, - `${this.globalVendorArgs.name}.qr.png` - ) + await wwebGenerateImage(qr, `${this.globalVendorArgs.name}.qr.png`) }, }, { @@ -116,6 +105,9 @@ class WebWhatsappProvider extends ProviderClass { * @returns */ sendButtons = async (number, message, buttons = []) => { + console.log(`🚩 ¿No te funciona los botones? Intenta instalar`) + console.log(`npm i github:pedroslopez/whatsapp-web.js#fix-buttons-list`) + const buttonMessage = new Buttons(message, buttons, '', '') return this.vendor.sendMessage(number, buttonMessage) } @@ -230,12 +222,9 @@ class WebWhatsappProvider extends ProviderClass { const fileDownloaded = await generalDownload(mediaUrl) const mimeType = mime.lookup(fileDownloaded) - if (mimeType.includes('image')) - return this.sendImage(number, fileDownloaded, text) - if (mimeType.includes('video')) - return this.sendVideo(number, fileDownloaded) - if (mimeType.includes('audio')) - return this.sendAudio(number, fileDownloaded) + if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded) + if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded) return this.sendFile(number, fileDownloaded) } @@ -249,8 +238,7 @@ class WebWhatsappProvider extends ProviderClass { */ sendMessage = async (userId, message, { options }) => { const number = wwebCleanNumber(userId) - if (options?.buttons?.length) - return this.sendButtons(number, message, options.buttons) + if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons) if (options?.media) return this.sendMedia(number, options.media) return this.sendText(number, message) } From f76932021ce968d93241b55cfcdb8ae0e0e6c934 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 3 Feb 2023 18:17:46 +0100 Subject: [PATCH 237/248] fix(cli): :zap: working flowDynamic test --- __test__/07-case.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/__test__/07-case.test.js b/__test__/07-case.test.js index 6eb8e42..024fc60 100644 --- a/__test__/07-case.test.js +++ b/__test__/07-case.test.js @@ -82,7 +82,8 @@ test(`[Caso - 07] Retornar estado`, async () => { assert.is('Tu datos son:', getHistory[6]) assert.is('Nombre: Leifer Edad: 90', getHistory[7]) assert.is('🤖🤖 Gracias por tu participacion', getHistory[8]) - assert.is(undefined, getHistory[9]) + assert.is('🤖🤖 Gracias por tu participacion', getHistory[9]) + assert.is(undefined, getHistory[10]) }) test.run() From aef52d2694fa6616d614338643db198b4f7f1fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Fri, 3 Feb 2023 19:26:00 +0100 Subject: [PATCH 238/248] fix(cli): :zap: working flowDynamic test --- __test__/07-case.test.js | 3 +-- packages/bot/core/core.class.js | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__test__/07-case.test.js b/__test__/07-case.test.js index 024fc60..6eb8e42 100644 --- a/__test__/07-case.test.js +++ b/__test__/07-case.test.js @@ -82,8 +82,7 @@ test(`[Caso - 07] Retornar estado`, async () => { assert.is('Tu datos son:', getHistory[6]) assert.is('Nombre: Leifer Edad: 90', getHistory[7]) assert.is('🤖🤖 Gracias por tu participacion', getHistory[8]) - assert.is('🤖🤖 Gracias por tu participacion', getHistory[9]) - assert.is(undefined, getHistory[10]) + assert.is(undefined, getHistory[9]) }) test.run() diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 1c15932..1258b5a 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -172,10 +172,11 @@ class CoreClass { for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } - const nextFlow = await this.flowClass.find(refToContinue?.ref, true) const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) - console.log(`🚩🚩🚩`, filterNextFlow?.answer) + + if (filterNextFlow.map((i) => i.keyword).includes(currentPrev?.ref)) return + return sendFlow(filterNextFlow, from, { prev: undefined }) } From c0113ca49295aff220d8defcb53f2ba7f2872d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Fri, 3 Feb 2023 19:32:04 +0100 Subject: [PATCH 239/248] fix(cli): :zap: working flowDynamic test --- packages/bot/core/core.class.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 1258b5a..a4a0cd0 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -168,16 +168,25 @@ class CoreClass { const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index)) const currentPrev = await this.databaseClass.getPrevByNumber(from) + const skipContinueFlow = async () => { + const nextFlow = await this.flowClass.find(refToContinue?.ref, true) + const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) + const isContinueFlow = filterNextFlow.map((i) => i.keyword).includes(currentPrev?.ref) + return { + continue: !isContinueFlow, + contexts: filterNextFlow, + } + } + if (endFlowFlag) return for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } - const nextFlow = await this.flowClass.find(refToContinue?.ref, true) - const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize) - if (filterNextFlow.map((i) => i.keyword).includes(currentPrev?.ref)) return + const continueFlowData = await skipContinueFlow() - return sendFlow(filterNextFlow, from, { prev: undefined }) + if (continueFlowData.continue) return sendFlow(continueFlowData.contexts, from, { prev: undefined }) + return } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback From d220f2c6228ca0528994a94712c5e753869ea63a Mon Sep 17 00:00:00 2001 From: Zamphi <40876040+mistertito86@users.noreply.github.com> Date: Sat, 4 Feb 2023 12:38:16 -0300 Subject: [PATCH 240/248] Modificacion de centencia sql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se agregó CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci al final de la sentencia SQL para especificar el conjunto de caracteres y la collación para la tabla. Este conjunto de caracteres y collación permitirán que la tabla almacene una amplia gama de caracteres y símbolos, y determine cómo se comparan y ordenan. --- .../ base de datos / src / mysql }/index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) rename {packages/database/src/mysql => paquetes / base de datos / src / mysql }/index.js (86%) diff --git a/packages/database/src/mysql/index.js b/paquetes / base de datos / src / mysql /index.js similarity index 86% rename from packages/database/src/mysql/index.js rename to paquetes / base de datos / src / mysql /index.js index e01b55a..8e2fbeb 100644 --- a/packages/database/src/mysql/index.js +++ b/paquetes / base de datos / src / mysql /index.js @@ -70,15 +70,15 @@ class MyslAdapter { new Promise((resolve) => { const tableName = 'history' - const sql = `CREATE TABLE ${tableName} - (id INT AUTO_INCREMENT PRIMARY KEY, - ref varchar(255) NOT NULL, - keyword varchar(255) NOT NULL, - answer longtext NOT NULL, - refSerialize varchar(255) NOT NULL, - phone varchar(255) NOT NULL, - options longtext NOT NULL - )` + const sql = `CREATE TABLE ${tableName} + (id INT AUTO_INCREMENT PRIMARY KEY, + ref varchar(255) NOT NULL, + keyword varchar(255) NOT NULL, + answer longtext NOT NULL, + refSerialize varchar(255) NOT NULL, + phone varchar(255) NOT NULL, + options longtext NOT NULL) + CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci` this.db.query(sql, (err) => { if (err) throw err From e34560c77d4852d2e90930f0858e51aa67d4eeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sat, 4 Feb 2023 17:01:10 +0100 Subject: [PATCH 241/248] feat(cli): :fire: add regex expression in addKeyworkd --- __test__/08-case.test.js | 43 +++++++++++++++++++++++++++ packages/bot/io/flow.class.js | 18 +++++++---- packages/bot/io/methods/addKeyword.js | 10 ++++--- 3 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 __test__/08-case.test.js diff --git a/__test__/08-case.test.js b/__test__/08-case.test.js new file mode 100644 index 0000000..82fc46a --- /dev/null +++ b/__test__/08-case.test.js @@ -0,0 +1,43 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') + +test(`[Caso - 08] Regular expression on keyword`, async () => { + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const REGEX_CREDIT_NUMBER = `/(^4[0-9]{12}(?:[0-9]{3})?$)|(^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$)|(3[47][0-9]{13})|(^3(?:0[0-5]|[68][0-9])[0-9]{11}$)|(^6(?:011|5[0-9]{2})[0-9]{12}$)|(^(?:2131|1800|35\d{3})\d{11}$)/gm` + const flujoPrincipal = addKeyword(REGEX_CREDIT_NUMBER, { regex: true }) + .addAnswer(`Gracias por proporcionar un numero de tarjeta valido`) + .addAnswer('Fin!') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: '374245455400126', + }) + + await delay(40) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is('Gracias por proporcionar un numero de tarjeta valido', getHistory[0]) + assert.is('Fin!', getHistory[1]) + assert.is(undefined, getHistory[2]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/io/flow.class.js b/packages/bot/io/flow.class.js index 458c423..13de732 100644 --- a/packages/bot/io/flow.class.js +++ b/packages/bot/io/flow.class.js @@ -25,9 +25,17 @@ class FlowClass { let refSymbol = null overFlow = overFlow ?? this.flowSerialize + const customRegex = (str = null) => { + if (typeof str !== 'string') return + const instanceRegex = new RegExp(str) + return instanceRegex.test(str) + } + /** Retornar expresion regular para buscar coincidencia */ - const mapSensitive = (str, flag = false) => { - const regexSensitive = flag ? 'g' : 'i' + const mapSensitive = (str, mapOptions = { sensitive: false, regex: false }) => { + if (mapOptions.regex) return customRegex(str) + + const regexSensitive = mapOptions.sensitive ? 'g' : 'i' if (Array.isArray(str)) { return new RegExp(str.join('|'), regexSensitive) } @@ -36,6 +44,7 @@ class FlowClass { const findIn = (keyOrWord, symbol = false, flow = overFlow) => { const sensitive = refSymbol?.options?.sensitive || false + const regex = refSymbol?.options?.regex || false capture = refSymbol?.options?.capture || false if (capture) return messages @@ -46,7 +55,7 @@ class FlowClass { if (refSymbol?.ref) findIn(refSymbol.ref, true) } else { refSymbol = flow.find((c) => { - return mapSensitive(c.keyword, sensitive).test(keyOrWord) + return mapSensitive(c.keyword, { sensitive, regex }).test(keyOrWord) }) if (refSymbol?.ref) findIn(refSymbol.ref, true) return messages @@ -56,8 +65,7 @@ class FlowClass { return messages } - findBySerialize = (refSerialize) => - this.flowSerialize.find((r) => r.refSerialize === refSerialize) + findBySerialize = (refSerialize) => this.flowSerialize.find((r) => r.refSerialize === refSerialize) findIndexByRef = (ref) => this.flowSerialize.findIndex((r) => r.ref === ref) } diff --git a/packages/bot/io/methods/addKeyword.js b/packages/bot/io/methods/addKeyword.js index e17f9be..50a5c0c 100644 --- a/packages/bot/io/methods/addKeyword.js +++ b/packages/bot/io/methods/addKeyword.js @@ -8,12 +8,14 @@ const { toJson } = require('./toJson') * @param {*} options {sensitive:boolean} default false */ const addKeyword = (keyword, options) => { + if (typeof keyword !== 'string' && !Array.isArray(keyword)) { + throw new Error('DEBE_SER_STRING_ARRAY_REGEX') + } + const parseOptions = () => { const defaultProperties = { - sensitive: - typeof options?.sensitive === 'boolean' - ? options?.sensitive - : false, + sensitive: typeof options?.sensitive === 'boolean' ? options?.sensitive : false, + regex: typeof options?.regex === 'boolean' ? options?.regex : false, } return defaultProperties From c9831d202ab2c85f15a0247cd2a2426bc435270c Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 4 Feb 2023 17:39:34 +0100 Subject: [PATCH 242/248] fix(database): fix naming --- packages/database/src/ mysql /index.js | 106 ++++++++++++++++++ .../ base de datos / src / mysql /index.js | 106 ------------------ 2 files changed, 106 insertions(+), 106 deletions(-) create mode 100644 packages/database/src/ mysql /index.js delete mode 100644 paquetes / base de datos / src / mysql /index.js diff --git a/packages/database/src/ mysql /index.js b/packages/database/src/ mysql /index.js new file mode 100644 index 0000000..2a9b0c4 --- /dev/null +++ b/packages/database/src/ mysql /index.js @@ -0,0 +1,106 @@ +const mysql = require("mysql2"); + +class MyslAdapter { + db; + listHistory = []; + credentials = { host: null, user: null, database: null, password: null }; + + constructor(_credentials) { + this.credentials = _credentials; + this.init().then(); + } + + async init() { + this.db = mysql.createConnection(this.credentials); + + await this.db.connect(async (error) => { + if (!error) { + console.log(`Solicitud de conexión a base de datos exitosa`); + await this.checkTableExists(); + } + + if (error) { + console.log(`Solicitud de conexión fallida ${error.stack}`); + } + }); + } + + getPrevByNumber = (from) => + new Promise((resolve, reject) => { + const sql = `SELECT * FROM history WHERE phone=${from} ORDER BY id DESC`; + this.db.query(sql, (error, rows) => { + if (error) { + reject(error); + } + + if (rows.length) { + const [row] = rows; + row.options = JSON.parse(row.options); + resolve(row); + } + + if (!rows.length) { + resolve(null); + } + }); + }); + + save = (ctx) => { + const values = [ + [ + ctx.ref, + ctx.keyword, + ctx.answer, + ctx.refSerialize, + ctx.from, + JSON.stringify(ctx.options), + ], + ]; + const sql = + "INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?"; + + this.db.query(sql, [values], (err) => { + if (err) throw err; + console.log("Guardado en DB...", values); + }); + this.listHistory.push(ctx); + }; + + createTable = () => + new Promise((resolve) => { + const tableName = "history"; + + const sql = `CREATE TABLE ${tableName} + (id INT AUTO_INCREMENT PRIMARY KEY, + ref varchar(255) NOT NULL, + keyword varchar(255) NOT NULL, + answer longtext NOT NULL, + refSerialize varchar(255) NOT NULL, + phone varchar(255) NOT NULL, + options longtext NOT NULL) + CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci`; + + this.db.query(sql, (err) => { + if (err) throw err; + console.log(`Tabla ${tableName} creada correctamente `); + resolve(true); + }); + }); + + checkTableExists = () => + new Promise((resolve) => { + const sql = "SHOW TABLES LIKE 'history'"; + + this.db.query(sql, (err, rows) => { + if (err) throw err; + + if (!rows.length) { + this.createTable(); + } + + resolve(!!rows.length); + }); + }); +} + +module.exports = MyslAdapter; diff --git a/paquetes / base de datos / src / mysql /index.js b/paquetes / base de datos / src / mysql /index.js deleted file mode 100644 index 8e2fbeb..0000000 --- a/paquetes / base de datos / src / mysql /index.js +++ /dev/null @@ -1,106 +0,0 @@ -const mysql = require('mysql2') - -class MyslAdapter { - db - listHistory = [] - credentials = { host: null, user: null, database: null, password: null } - - constructor(_credentials) { - this.credentials = _credentials - this.init().then() - } - - async init() { - this.db = mysql.createConnection(this.credentials) - - await this.db.connect(async (error) => { - if (!error) { - console.log(`Solicitud de conexión a base de datos exitosa`) - await this.checkTableExists() - } - - if (error) { - console.log(`Solicitud de conexión fallida ${error.stack}`) - } - }) - } - - getPrevByNumber = (from) => - new Promise((resolve, reject) => { - const sql = `SELECT * FROM history WHERE phone=${from} ORDER BY id DESC` - this.db.query(sql, (error, rows) => { - if (error) { - reject(error) - } - - if (rows.length) { - const [row] = rows - row.options = JSON.parse(row.options) - resolve(row) - } - - if (!rows.length) { - resolve(null) - } - }) - }) - - save = (ctx) => { - const values = [ - [ - ctx.ref, - ctx.keyword, - ctx.answer, - ctx.refSerialize, - ctx.from, - JSON.stringify(ctx.options), - ], - ] - const sql = - 'INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?' - - this.db.query(sql, [values], (err) => { - if (err) throw err - console.log('Guardado en DB...', values) - }) - this.listHistory.push(ctx) - } - - createTable = () => - new Promise((resolve) => { - const tableName = 'history' - - const sql = `CREATE TABLE ${tableName} - (id INT AUTO_INCREMENT PRIMARY KEY, - ref varchar(255) NOT NULL, - keyword varchar(255) NOT NULL, - answer longtext NOT NULL, - refSerialize varchar(255) NOT NULL, - phone varchar(255) NOT NULL, - options longtext NOT NULL) - CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci` - - this.db.query(sql, (err) => { - if (err) throw err - console.log(`Tabla ${tableName} creada correctamente `) - resolve(true) - }) - }) - - checkTableExists = () => - new Promise((resolve) => { - const sql = "SHOW TABLES LIKE 'history'" - - this.db.query(sql, (err, rows) => { - if (err) throw err - - if (!rows.length) { - this.createTable() - } - - resolve(!!rows.length) - }) - }) -} - -module.exports = MyslAdapter From 1afc3ba182070713b5bec40eaab0fa1f680830cd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 4 Feb 2023 17:50:11 +0100 Subject: [PATCH 243/248] fix(database): fix naming --- packages/database/src/{ mysql => mysql}/index.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/database/src/{ mysql => mysql}/index.js (100%) diff --git a/packages/database/src/ mysql /index.js b/packages/database/src/mysql/index.js similarity index 100% rename from packages/database/src/ mysql /index.js rename to packages/database/src/mysql/index.js From 2ecc41f3f002138a5737edd04979337b00c3e0be Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 4 Feb 2023 18:03:57 +0100 Subject: [PATCH 244/248] chore: :zap: pre-chore --- .husky/commit-msg | 2 +- .prettierignore | 2 +- packages/bot/index.js | 6 +- packages/bot/io/methods/addAnswer.js | 14 +- packages/bot/provider/provider.class.js | 3 +- packages/bot/tests/bot.class.test.js | 86 ++-------- packages/bot/tests/methods.test.js | 14 +- packages/bot/utils/delay.js | 3 +- packages/bot/utils/flattener.js | 4 +- packages/bot/utils/hash.js | 5 +- packages/bot/utils/interactive.js | 4 +- packages/cli/check/index.js | 10 +- packages/cli/clean/index.js | 5 +- packages/cli/configuration/index.js | 6 +- packages/cli/install/tool.js | 10 +- packages/cli/interactive/index.js | 19 +-- .../src/dialogflow-cx/dialogflow-cx.class.js | 26 +-- packages/contexts/src/dialogflow-cx/index.js | 3 +- .../src/dialogflow/dialogflow.class.js | 13 +- packages/contexts/src/dialogflow/index.js | 3 +- packages/contexts/src/mock/index.js | 3 +- packages/database/src/mongo/index.js | 7 +- packages/database/src/mysql/index.js | 148 ++++++++---------- .../generated/IBMPlexMono-Regular.module.css | 3 +- .../generated/IBMPlexMono-SemiBold.module.css | 4 +- .../fonts/generated/Pally-Variable.module.css | 7 +- .../SourceSerifPro-Regular.module.css | 3 +- .../generated/Synonym-Variable.module.css | 7 +- .../generated/TenorSans-Regular.module.css | 7 +- .../src/components/atoms/DigitalOcean.tsx | 32 +--- packages/docs/src/components/atoms/Logo.tsx | 9 +- .../docs/src/components/atoms/Netlify.tsx | 8 +- .../docs/src/components/core/RouterHead.tsx | 5 +- packages/docs/src/components/core/Social.tsx | 15 +- .../docs/src/components/core/ToggleMenu.tsx | 4 +- .../docs/src/components/core/ToggleTheme.tsx | 13 +- .../components/icons/IconArrowDownRight.tsx | 4 +- .../docs/src/components/icons/IconMenu.tsx | 4 +- .../docs/src/components/icons/IconMoon.tsx | 4 +- .../src/components/widgets/Collaborator.tsx | 4 +- .../src/components/widgets/Collaborators.tsx | 3 +- .../docs/src/components/widgets/ExtraBar.tsx | 4 +- packages/docs/src/components/widgets/FAQs.tsx | 10 +- .../docs/src/components/widgets/Features.tsx | 16 +- packages/docs/src/components/widgets/Hero.tsx | 33 ++-- .../docs/src/components/widgets/Members.tsx | 11 +- .../docs/src/components/widgets/NavBar.tsx | 90 +++++------ .../src/components/widgets/Navigation.tsx | 125 +++++++-------- .../docs/src/components/widgets/Stats.tsx | 16 +- packages/docs/src/contexts/index.tsx | 3 +- packages/docs/src/root.tsx | 18 +-- .../docs/src/routes/docs/database/index.mdx | 9 +- .../docs/src/routes/docs/essential/index.mdx | 25 ++- .../docs/src/routes/docs/example/index.mdx | 14 +- packages/docs/src/routes/docs/flows/index.mdx | 67 +++----- packages/docs/src/routes/docs/index.mdx | 12 +- .../docs/src/routes/docs/install/index.mdx | 11 +- packages/docs/src/routes/docs/layout!.tsx | 9 +- .../docs/src/routes/docs/migration/index.mdx | 49 ++---- .../docs/src/routes/docs/overview/index.mdx | 10 +- .../docs/src/routes/docs/providers/index.mdx | 9 +- .../src/routes/docs/providers/meta/index.mdx | 5 +- .../routes/docs/providers/twilio/index.mdx | 10 +- packages/docs/src/routes/index.tsx | 6 +- packages/docs/src/services/github.ts | 19 +-- packages/docs/src/services/opencollective.ts | 9 +- packages/docs/tailwind.config.js | 4 +- .../portal/.vscode/qwik-city.code-snippets | 6 +- packages/portal/.vscode/qwik.code-snippets | 15 +- packages/portal/portal.http.js | 19 +-- .../portal/src/components/header/header.tsx | 16 +- packages/portal/src/components/icons/qwik.tsx | 8 +- packages/portal/src/components/qr/qr.tsx | 14 +- .../components/router-head/router-head.tsx | 5 +- packages/portal/src/global.css | 3 +- packages/portal/src/routes/index.css | 3 +- packages/portal/src/routes/index.tsx | 22 +-- packages/provider/src/meta/index.js | 17 +- packages/provider/src/meta/server.js | 8 +- packages/provider/src/twilio/index.js | 14 +- packages/provider/src/twilio/server.js | 4 +- packages/provider/src/venom/index.js | 35 ++--- 82 files changed, 411 insertions(+), 904 deletions(-) diff --git a/.husky/commit-msg b/.husky/commit-msg index 4002db7..3d3fb52 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -npx --no -- commitlint --edit +npm run lint:fix && npx --no -- commitlint --edit diff --git a/.prettierignore b/.prettierignore index 547ec21..7fffea9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,5 @@ packages/**/lib -packages/docs/*.json +packages/docs/ **/.git **/.svn **/.hg diff --git a/packages/bot/index.js b/packages/bot/index.js index ac96063..fe03d60 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -8,8 +8,7 @@ const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods') * @param {*} args * @returns */ -const createBot = async ({ flow, database, provider }, args = {}) => - new CoreClass(flow, database, provider, args) +const createBot = async ({ flow, database, provider }, args = {}) => new CoreClass(flow, database, provider, args) /** * Crear instancia de clase Io (Flow) @@ -29,8 +28,7 @@ const createFlow = (args) => { */ const createProvider = (providerClass = class {}, args = null) => { const providerInstance = new providerClass(args) - if (!providerClass.prototype instanceof ProviderClass) - throw new Error('El provider no implementa ProviderClass') + if (!providerClass.prototype instanceof ProviderClass) throw new Error('El provider no implementa ProviderClass') return providerInstance } diff --git a/packages/bot/io/methods/addAnswer.js b/packages/bot/io/methods/addAnswer.js index f0ccdad..5236c14 100644 --- a/packages/bot/io/methods/addAnswer.js +++ b/packages/bot/io/methods/addAnswer.js @@ -17,15 +17,10 @@ const addAnswer = * @returns */ const getAnswerOptions = () => ({ - media: - typeof options?.media === 'string' ? `${options?.media}` : null, + media: typeof options?.media === 'string' ? `${options?.media}` : null, buttons: Array.isArray(options?.buttons) ? options.buttons : [], - capture: - typeof options?.capture === 'boolean' - ? options?.capture - : false, - child: - typeof options?.child === 'string' ? `${options?.child}` : null, + capture: typeof options?.capture === 'boolean' ? options?.capture : false, + child: typeof options?.child === 'string' ? `${options?.child}` : null, delay: typeof options?.delay === 'number' ? options?.delay : 0, }) @@ -49,8 +44,7 @@ const addAnswer = * Esta funcion aplana y busca los callback anidados de los hijos * @returns */ - const getCbFromNested = () => - flatObject(Array.isArray(nested) ? nested : [nested]) + const getCbFromNested = () => flatObject(Array.isArray(nested) ? nested : [nested]) const callback = typeof cb === 'function' ? cb : () => null diff --git a/packages/bot/provider/provider.class.js b/packages/bot/provider/provider.class.js index 212f042..57d7185 100644 --- a/packages/bot/provider/provider.class.js +++ b/packages/bot/provider/provider.class.js @@ -20,8 +20,7 @@ class ProviderClass extends EventEmitter { */ sendMessage = async (userId, message) => { - if (NODE_ENV !== 'production') - console.log('[sendMessage]', { userId, message }) + if (NODE_ENV !== 'production') console.log('[sendMessage]', { userId, message }) return message } } diff --git a/packages/bot/tests/bot.class.test.js b/packages/bot/tests/bot.class.test.js index d74fdad..4db4ca8 100644 --- a/packages/bot/tests/bot.class.test.js +++ b/packages/bot/tests/bot.class.test.js @@ -2,13 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const FlowClass = require('../io/flow.class') const MockProvider = require('../../../__mocks__/mock.provider') -const { - createBot, - CoreClass, - createFlow, - createProvider, - ProviderClass, -} = require('../index') +const { createBot, CoreClass, createFlow, createProvider, ProviderClass } = require('../index') class MockFlow { allCallbacks = { ref: () => 1 } @@ -100,20 +94,13 @@ test(`[Bot] Eventos 'require_action,ready,auth_failure,message '`, async () => { await createBot(setting) /// Escuchamos eventos - mockProvider.on( - 'require_action', - (r) => (responseEvents['require_action'] = r) - ) + mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r)) /// Emitimos eventos - mockProvider.delaySendMessage( - 0, - 'require_action', - MOCK_EVENTS.require_action - ) + mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) @@ -121,21 +108,12 @@ test(`[Bot] Eventos 'require_action,ready,auth_failure,message '`, async () => { await delay(0) /// Testeamos eventos - assert.is( - JSON.stringify(responseEvents.require_action), - JSON.stringify(MOCK_EVENTS.require_action) - ) + assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action)) assert.is(responseEvents.ready, MOCK_EVENTS.ready) - assert.is( - JSON.stringify(responseEvents.auth_failure), - JSON.stringify(MOCK_EVENTS.auth_failure) - ) + assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure)) - assert.is( - JSON.stringify(responseEvents.message), - JSON.stringify(MOCK_EVENTS.message) - ) + assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message)) }) test(`[Bot] Probando Flujos Internos`, async () => { @@ -166,20 +144,13 @@ test(`[Bot] Probando Flujos Internos`, async () => { await createBot(setting) /// Escuchamos eventos - mockProvider.on( - 'require_action', - (r) => (responseEvents['require_action'] = r) - ) + mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r)) /// Emitimos eventos - mockProvider.delaySendMessage( - 0, - 'require_action', - MOCK_EVENTS.require_action - ) + mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) @@ -187,21 +158,12 @@ test(`[Bot] Probando Flujos Internos`, async () => { await delay(0) /// Testeamos eventos - assert.is( - JSON.stringify(responseEvents.require_action), - JSON.stringify(MOCK_EVENTS.require_action) - ) + assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action)) assert.is(responseEvents.ready, MOCK_EVENTS.ready) - assert.is( - JSON.stringify(responseEvents.auth_failure), - JSON.stringify(MOCK_EVENTS.auth_failure) - ) + assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure)) - assert.is( - JSON.stringify(responseEvents.message), - JSON.stringify(MOCK_EVENTS.message) - ) + assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message)) }) test(`[Bot] Probando Flujos Nested`, async () => { @@ -234,20 +196,13 @@ test(`[Bot] Probando Flujos Nested`, async () => { botInstance.sendProviderAndSave('xxxxx', 'xxxxx') botInstance.continue('xxxxx', 'xxxxx') /// Escuchamos eventos - mockProvider.on( - 'require_action', - (r) => (responseEvents['require_action'] = r) - ) + mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r)) /// Emitimos eventos - mockProvider.delaySendMessage( - 0, - 'require_action', - MOCK_EVENTS.require_action - ) + mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) @@ -255,21 +210,12 @@ test(`[Bot] Probando Flujos Nested`, async () => { await delay(0) /// Testeamos eventos - assert.is( - JSON.stringify(responseEvents.require_action), - JSON.stringify(MOCK_EVENTS.require_action) - ) + assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action)) assert.is(responseEvents.ready, MOCK_EVENTS.ready) - assert.is( - JSON.stringify(responseEvents.auth_failure), - JSON.stringify(MOCK_EVENTS.auth_failure) - ) + assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure)) - assert.is( - JSON.stringify(responseEvents.message), - JSON.stringify(MOCK_EVENTS.message) - ) + assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message)) }) test.run() diff --git a/packages/bot/tests/methods.test.js b/packages/bot/tests/methods.test.js index 10b0977..f030731 100644 --- a/packages/bot/tests/methods.test.js +++ b/packages/bot/tests/methods.test.js @@ -35,10 +35,7 @@ test('Debere probar toSerialize', () => { const ARRANGE = { keyword: ['hola!', 'ole'], } - const MAIN_CTX = addKeyword(ARRANGE.keyword) - .addAnswer('Segundo!') - .addAnswer('Segundo!') - .toJson() + const MAIN_CTX = addKeyword(ARRANGE.keyword).addAnswer('Segundo!').addAnswer('Segundo!').toJson() const [ANSWER_A] = MAIN_CTX @@ -71,9 +68,7 @@ test('Debere probar la anidación', () => { answer_A: 'Bienvenido', answer_B: 'Continuar', } - const MAIN_CTX = addKeyword(ARRANGE.keyword) - .addAnswer(ARRANGE.answer_A) - .addAnswer(ARRANGE.answer_B) + const MAIN_CTX = addKeyword(ARRANGE.keyword).addAnswer(ARRANGE.answer_A).addAnswer(ARRANGE.answer_B) assert.is(MAIN_CTX.ctx.answer, ARRANGE.answer_B) }) @@ -107,10 +102,7 @@ test('Debere probar error las addAnswer', () => { }) test('Obtener toJson', () => { - const [ctxA, ctxB, ctxC] = addKeyword('hola') - .addAnswer('pera!') - .addAnswer('chao') - .toJson() + const [ctxA, ctxB, ctxC] = addKeyword('hola').addAnswer('pera!').addAnswer('chao').toJson() assert.is(ctxA.keyword, 'hola') assert.match(ctxA.ref, /^key_/) diff --git a/packages/bot/utils/delay.js b/packages/bot/utils/delay.js index 021fafe..a6534c0 100644 --- a/packages/bot/utils/delay.js +++ b/packages/bot/utils/delay.js @@ -1,4 +1,3 @@ -const delay = (miliseconds) => - new Promise((res) => setTimeout(res, miliseconds)) +const delay = (miliseconds) => new Promise((res) => setTimeout(res, miliseconds)) module.exports = { delay } diff --git a/packages/bot/utils/flattener.js b/packages/bot/utils/flattener.js index 875736d..ddc823f 100644 --- a/packages/bot/utils/flattener.js +++ b/packages/bot/utils/flattener.js @@ -3,9 +3,7 @@ const flatObject = (listArray = []) => { if (!listArray.length) return {} - const cbNestedObj = cbNestedList - .map(({ ctx }) => ctx?.callbacks) - .filter((i) => !!i) + const cbNestedObj = cbNestedList.map(({ ctx }) => ctx?.callbacks).filter((i) => !!i) const queueCb = cbNestedObj.reduce((acc, current) => { const getKeys = Object.keys(current) const parse = getKeys.map((icb, i) => ({ diff --git a/packages/bot/utils/hash.js b/packages/bot/utils/hash.js index 84a25db..6902d58 100644 --- a/packages/bot/utils/hash.js +++ b/packages/bot/utils/hash.js @@ -16,9 +16,6 @@ const generateRef = (prefix = false) => { * @returns */ const generateRefSerialize = ({ index, answer, keyword }) => - crypto - .createHash('md5') - .update(JSON.stringify({ index, answer, keyword })) - .digest('hex') + crypto.createHash('md5').update(JSON.stringify({ index, answer, keyword })).digest('hex') module.exports = { generateRef, generateRefSerialize } diff --git a/packages/bot/utils/interactive.js b/packages/bot/utils/interactive.js index c317a7f..44905cf 100644 --- a/packages/bot/utils/interactive.js +++ b/packages/bot/utils/interactive.js @@ -4,9 +4,7 @@ const printer = (message, title) => { if (NODE_ENV !== 'test') { // console.clear() if (title) console.log(bgRed(`${title}`)) - console.log( - yellow(Array.isArray(message) ? message.join('\n') : message) - ) + console.log(yellow(Array.isArray(message) ? message.join('\n') : message)) console.log(``) } } diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index 454f67c..5befb8a 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -5,15 +5,9 @@ const checkNodeVersion = () => { return new Promise((resolve, reject) => { console.log(bgCyan('🚀 Revisando tu Node.js')) const version = process.version - const majorVersion = parseInt( - version.replace('v', '').split('.').shift() - ) + const majorVersion = parseInt(version.replace('v', '').split('.').shift()) if (majorVersion < 16) { - console.error( - red( - `🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` - ) - ) + console.error(red(`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}`)) console.log(``) reject('ERROR_NODE') } diff --git a/packages/cli/clean/index.js b/packages/cli/clean/index.js index 6b7f6fd..60b8092 100644 --- a/packages/cli/clean/index.js +++ b/packages/cli/clean/index.js @@ -2,10 +2,7 @@ const rimraf = require('rimraf') const { yellow } = require('kleur') const { join } = require('path') -const PATH_WW = [ - join(process.cwd(), '.wwebjs_auth'), - join(process.cwd(), 'session.json'), -] +const PATH_WW = [join(process.cwd(), '.wwebjs_auth'), join(process.cwd(), 'session.json')] const cleanSession = () => { const queue = [] diff --git a/packages/cli/configuration/index.js b/packages/cli/configuration/index.js index 50565d9..2ce6077 100644 --- a/packages/cli/configuration/index.js +++ b/packages/cli/configuration/index.js @@ -23,11 +23,7 @@ const JSON_TEMPLATE = { const PATH_CONFIG = join(process.cwd(), 'config.json') const jsonConfig = () => { - return writeFile( - PATH_CONFIG, - JSON.stringify(JSON_TEMPLATE, null, 2), - 'utf-8' - ) + return writeFile(PATH_CONFIG, JSON.stringify(JSON_TEMPLATE, null, 2), 'utf-8') } module.exports = { jsonConfig } diff --git a/packages/cli/install/tool.js b/packages/cli/install/tool.js index 8095cd0..a74cec6 100644 --- a/packages/cli/install/tool.js +++ b/packages/cli/install/tool.js @@ -20,13 +20,9 @@ const installDeps = (pkgManager, packageList) => { const installSingle = (pkgInstall) => () => { new Promise((resolve) => { try { - childProcess = spawn( - pkgManager, - [PKG_OPTION[pkgManager], pkgInstall], - { - stdio: 'inherit', - } - ) + childProcess = spawn(pkgManager, [PKG_OPTION[pkgManager], pkgInstall], { + stdio: 'inherit', + }) childProcess.on('error', (e) => { console.error(e) diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index 53cc885..d65ca19 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -30,9 +30,7 @@ const startInteractive = async () => { await nextSteps() } catch (e) { console.error(bgRed(`Ups! 🙄 algo no va bien.`)) - console.error( - bgRed(`Revisa los requerimientos minimos en la documentacion`) - ) + console.error(bgRed(`Revisa los requerimientos minimos en la documentacion`)) } } @@ -82,8 +80,7 @@ const nextSteps = async () => { const { outDir = '', providerDb = [], providerWs = [] } = response const createApp = async (templateName = null) => { - if (!templateName) - throw new Error('TEMPLATE_NAME_INVALID: ', templateName) + if (!templateName) throw new Error('TEMPLATE_NAME_INVALID: ', templateName) const possiblesPath = [ join(__dirname, '..', '..', 'starters', 'apps', templateName), @@ -115,11 +112,7 @@ const nextSteps = async () => { const vendorProvider = async () => { const [answer] = providerWs if (!providerWs.length) { - console.log( - red( - `Debes seleccionar un proveedor de whatsapp. Tecla [Space] para seleccionar` - ) - ) + console.log(red(`Debes seleccionar un proveedor de whatsapp. Tecla [Space] para seleccionar`)) process.exit(1) } return answer @@ -132,11 +125,7 @@ const nextSteps = async () => { const dbProvider = async () => { const [answer] = providerDb if (!providerDb.length) { - console.log( - red( - `Debes seleccionar un proveedor de base de datos. Tecla [Space] para seleccionar` - ) - ) + console.log(red(`Debes seleccionar un proveedor de base de datos. Tecla [Space] para seleccionar`)) process.exit(1) } return answer diff --git a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js index 2d0ebd2..6be4f9e 100644 --- a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js +++ b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js @@ -38,10 +38,8 @@ class DialogFlowCXContext extends CoreClass { * */ } - if (!this.optionsDX.location.length) - throw new Error('LOCATION_NO_ENCONTRADO') - if (!this.optionsDX.agentId.length) - throw new Error('AGENTID_NO_ENCONTRADO') + if (!this.optionsDX.location.length) throw new Error('LOCATION_NO_ENCONTRADO') + if (!this.optionsDX.agentId.length) throw new Error('AGENTID_NO_ENCONTRADO') const rawJson = readFileSync(GOOGLE_ACCOUNT_PATH, 'utf-8') const { project_id, private_key, client_email } = JSON.parse(rawJson) @@ -86,9 +84,7 @@ class DialogFlowCXContext extends CoreClass { }, } - const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [ - null, - ] + const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [null] const listMessages = single.queryResult.responseMessages.map((res) => { if (res.message == 'text') { @@ -96,17 +92,11 @@ class DialogFlowCXContext extends CoreClass { } if (res.message == 'payload') { - const { - media = null, - buttons = [], - answer = '', - } = res.payload.fields - const buttonsArray = buttons?.listValue?.values?.map( - (btnValue) => { - const { stringValue } = btnValue.structValue.fields.body - return { body: stringValue } - } - ) + const { media = null, buttons = [], answer = '' } = res.payload.fields + const buttonsArray = buttons?.listValue?.values?.map((btnValue) => { + const { stringValue } = btnValue.structValue.fields.body + return { body: stringValue } + }) return { answer: answer?.stringValue, options: { diff --git a/packages/contexts/src/dialogflow-cx/index.js b/packages/contexts/src/dialogflow-cx/index.js index 2a561c4..13c479e 100644 --- a/packages/contexts/src/dialogflow-cx/index.js +++ b/packages/contexts/src/dialogflow-cx/index.js @@ -5,8 +5,7 @@ const DialogCXFlowClass = require('./dialogflow-cx.class') * @param {*} args * @returns */ -const createBotDialog = async ({ database, provider }, _options) => - new DialogCXFlowClass(database, provider, _options) +const createBotDialog = async ({ database, provider }, _options) => new DialogCXFlowClass(database, provider, _options) module.exports = { createBotDialog, diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index 6a7cda0..33df66b 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -65,10 +65,7 @@ class DialogFlowContext extends CoreClass { * para evitar este problema. * https://github.com/codigoencasa/bot-whatsapp/pull/140 */ - const session = this.sessionClient.projectAgentSessionPath( - this.projectId, - from - ) + const session = this.sessionClient.projectAgentSessionPath(this.projectId, from) const reqDialog = { session, queryInput: { @@ -79,15 +76,11 @@ class DialogFlowContext extends CoreClass { }, } - const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [ - null, - ] + const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [null] const { queryResult } = single - const msgPayload = queryResult?.fulfillmentMessages?.find( - (a) => a.message === 'payload' - ) + const msgPayload = queryResult?.fulfillmentMessages?.find((a) => a.message === 'payload') // Revisamos si el dialogFlow tiene multimedia if (msgPayload && msgPayload?.payload) { diff --git a/packages/contexts/src/dialogflow/index.js b/packages/contexts/src/dialogflow/index.js index e988f50..377fd88 100644 --- a/packages/contexts/src/dialogflow/index.js +++ b/packages/contexts/src/dialogflow/index.js @@ -5,8 +5,7 @@ const DialogFlowClass = require('./dialogflow.class') * @param {*} args * @returns */ -const createBotDialog = async ({ database, provider }) => - new DialogFlowClass(database, provider) +const createBotDialog = async ({ database, provider }) => new DialogFlowClass(database, provider) module.exports = { createBotDialog, diff --git a/packages/contexts/src/mock/index.js b/packages/contexts/src/mock/index.js index b609be5..4e2e10f 100644 --- a/packages/contexts/src/mock/index.js +++ b/packages/contexts/src/mock/index.js @@ -5,8 +5,7 @@ const MockClass = require('./mock.class') * @param {*} args * @returns */ -const createBotMock = async ({ database, provider }) => - new MockClass(database, provider) +const createBotMock = async ({ database, provider }) => new MockClass(database, provider) module.exports = { createBotMock, diff --git a/packages/database/src/mongo/index.js b/packages/database/src/mongo/index.js index 6af68f0..9ea3fa5 100644 --- a/packages/database/src/mongo/index.js +++ b/packages/database/src/mongo/index.js @@ -24,12 +24,7 @@ class MongoAdapter { } getPrevByNumber = async (from) => { - const result = await this.db - .collection('history') - .find({ from }) - .sort({ _id: -1 }) - .limit(1) - .toArray() + const result = await this.db.collection('history').find({ from }).sort({ _id: -1 }).limit(1).toArray() return result[0] } diff --git a/packages/database/src/mysql/index.js b/packages/database/src/mysql/index.js index 2a9b0c4..0beea56 100644 --- a/packages/database/src/mysql/index.js +++ b/packages/database/src/mysql/index.js @@ -1,76 +1,66 @@ -const mysql = require("mysql2"); +const mysql = require('mysql2') class MyslAdapter { - db; - listHistory = []; - credentials = { host: null, user: null, database: null, password: null }; + db + listHistory = [] + credentials = { host: null, user: null, database: null, password: null } - constructor(_credentials) { - this.credentials = _credentials; - this.init().then(); - } + constructor(_credentials) { + this.credentials = _credentials + this.init().then() + } - async init() { - this.db = mysql.createConnection(this.credentials); + async init() { + this.db = mysql.createConnection(this.credentials) - await this.db.connect(async (error) => { - if (!error) { - console.log(`Solicitud de conexión a base de datos exitosa`); - await this.checkTableExists(); - } + await this.db.connect(async (error) => { + if (!error) { + console.log(`Solicitud de conexión a base de datos exitosa`) + await this.checkTableExists() + } - if (error) { - console.log(`Solicitud de conexión fallida ${error.stack}`); - } - }); - } + if (error) { + console.log(`Solicitud de conexión fallida ${error.stack}`) + } + }) + } - getPrevByNumber = (from) => - new Promise((resolve, reject) => { - const sql = `SELECT * FROM history WHERE phone=${from} ORDER BY id DESC`; - this.db.query(sql, (error, rows) => { - if (error) { - reject(error); - } + getPrevByNumber = (from) => + new Promise((resolve, reject) => { + const sql = `SELECT * FROM history WHERE phone=${from} ORDER BY id DESC` + this.db.query(sql, (error, rows) => { + if (error) { + reject(error) + } - if (rows.length) { - const [row] = rows; - row.options = JSON.parse(row.options); - resolve(row); - } + if (rows.length) { + const [row] = rows + row.options = JSON.parse(row.options) + resolve(row) + } - if (!rows.length) { - resolve(null); - } - }); - }); + if (!rows.length) { + resolve(null) + } + }) + }) - save = (ctx) => { - const values = [ - [ - ctx.ref, - ctx.keyword, - ctx.answer, - ctx.refSerialize, - ctx.from, - JSON.stringify(ctx.options), - ], - ]; - const sql = - "INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?"; + save = (ctx) => { + const values = [[ctx.ref, ctx.keyword, ctx.answer, ctx.refSerialize, ctx.from, JSON.stringify(ctx.options)]] + const sql = 'INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?' - this.db.query(sql, [values], (err) => { - if (err) throw err; - console.log("Guardado en DB...", values); - }); - this.listHistory.push(ctx); - }; + this.db.query(sql, [values], (err) => { + if (err) throw err + console.log('Guardado en DB...', values) + }) + this.listHistory.push(ctx) + } - createTable = () => - new Promise((resolve) => { - const tableName = "history"; + createTable = () => + new Promise((resolve) => { + const tableName = 'history' - const sql = `CREATE TABLE ${tableName} + const sql = `CREATE TABLE ${tableName} (id INT AUTO_INCREMENT PRIMARY KEY, ref varchar(255) NOT NULL, keyword varchar(255) NOT NULL, @@ -78,29 +68,29 @@ class MyslAdapter { refSerialize varchar(255) NOT NULL, phone varchar(255) NOT NULL, options longtext NOT NULL) - CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci`; + CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci` - this.db.query(sql, (err) => { - if (err) throw err; - console.log(`Tabla ${tableName} creada correctamente `); - resolve(true); - }); - }); + this.db.query(sql, (err) => { + if (err) throw err + console.log(`Tabla ${tableName} creada correctamente `) + resolve(true) + }) + }) - checkTableExists = () => - new Promise((resolve) => { - const sql = "SHOW TABLES LIKE 'history'"; + checkTableExists = () => + new Promise((resolve) => { + const sql = "SHOW TABLES LIKE 'history'" - this.db.query(sql, (err, rows) => { - if (err) throw err; + this.db.query(sql, (err, rows) => { + if (err) throw err - if (!rows.length) { - this.createTable(); - } + if (!rows.length) { + this.createTable() + } - resolve(!!rows.length); - }); - }); + resolve(!!rows.length) + }) + }) } -module.exports = MyslAdapter; +module.exports = MyslAdapter diff --git a/packages/docs/src/assets/fonts/generated/IBMPlexMono-Regular.module.css b/packages/docs/src/assets/fonts/generated/IBMPlexMono-Regular.module.css index deddf7c..f0ab1c0 100644 --- a/packages/docs/src/assets/fonts/generated/IBMPlexMono-Regular.module.css +++ b/packages/docs/src/assets/fonts/generated/IBMPlexMono-Regular.module.css @@ -8,6 +8,5 @@ font-family: IBMPlexMono-Regular; src: url(IBMPlexMono-Regular-subset.woff2) format('woff2'), url(IBMPlexMono-Regular-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+2C, U+2E, U+41-43, U+46, U+49, U+4B-4F, U+53-55, U+58, - U+61-65, U+67-69, U+6C-76; + unicode-range: U+20, U+2C, U+2E, U+41-43, U+46, U+49, U+4B-4F, U+53-55, U+58, U+61-65, U+67-69, U+6C-76; } diff --git a/packages/docs/src/assets/fonts/generated/IBMPlexMono-SemiBold.module.css b/packages/docs/src/assets/fonts/generated/IBMPlexMono-SemiBold.module.css index e2fdf72..6b47965 100644 --- a/packages/docs/src/assets/fonts/generated/IBMPlexMono-SemiBold.module.css +++ b/packages/docs/src/assets/fonts/generated/IBMPlexMono-SemiBold.module.css @@ -8,6 +8,6 @@ font-family: IBMPlexMono-SemiBold; src: url(IBMPlexMono-SemiBold-subset.woff2) format('woff2'), url(IBMPlexMono-SemiBold-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+24, U+2E, U+30, U+38, U+39, U+41, U+42, U+44, U+47, - U+4E, U+4F, U+52-55, U+57, U+59, U+65, U+68, U+6F, U+72, U+74; + unicode-range: U+20, U+24, U+2E, U+30, U+38, U+39, U+41, U+42, U+44, U+47, U+4E, U+4F, U+52-55, U+57, U+59, U+65, + U+68, U+6F, U+72, U+74; } diff --git a/packages/docs/src/assets/fonts/generated/Pally-Variable.module.css b/packages/docs/src/assets/fonts/generated/Pally-Variable.module.css index 74aa400..e899bbf 100644 --- a/packages/docs/src/assets/fonts/generated/Pally-Variable.module.css +++ b/packages/docs/src/assets/fonts/generated/Pally-Variable.module.css @@ -6,9 +6,8 @@ @font-face { font-family: Pally-Variable; - src: url(Pally-Variable-subset.woff2) format('woff2'), - url(Pally-Variable-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+39, U+41-43, U+46, - U+49-4D, U+53, U+55, U+58, U+61-65, U+67-69, U+6B-77, U+79; + src: url(Pally-Variable-subset.woff2) format('woff2'), url(Pally-Variable-subset.zopfli.woff) format('woff'); + unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+39, U+41-43, U+46, U+49-4D, U+53, U+55, U+58, U+61-65, U+67-69, + U+6B-77, U+79; font-weight: 400 700; } diff --git a/packages/docs/src/assets/fonts/generated/SourceSerifPro-Regular.module.css b/packages/docs/src/assets/fonts/generated/SourceSerifPro-Regular.module.css index b1a323f..a491d8c 100644 --- a/packages/docs/src/assets/fonts/generated/SourceSerifPro-Regular.module.css +++ b/packages/docs/src/assets/fonts/generated/SourceSerifPro-Regular.module.css @@ -8,6 +8,5 @@ font-family: SourceSerifPro-Regular; src: url(SourceSerifPro-Regular-subset.woff2) format('woff2'), url(SourceSerifPro-Regular-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+2C, U+2E, U+41-44, U+49, U+4A, U+4C, U+53, U+55, - U+61-65, U+67-69, U+6B-76, U+79; + unicode-range: U+20, U+2C, U+2E, U+41-44, U+49, U+4A, U+4C, U+53, U+55, U+61-65, U+67-69, U+6B-76, U+79; } diff --git a/packages/docs/src/assets/fonts/generated/Synonym-Variable.module.css b/packages/docs/src/assets/fonts/generated/Synonym-Variable.module.css index b834dbb..00cb8df 100644 --- a/packages/docs/src/assets/fonts/generated/Synonym-Variable.module.css +++ b/packages/docs/src/assets/fonts/generated/Synonym-Variable.module.css @@ -6,9 +6,8 @@ @font-face { font-family: Synonym-Variable; - src: url(Synonym-Variable-subset.woff2) format('woff2'), - url(Synonym-Variable-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+35, U+41-44, U+46, U+47, - U+49, U+4B-4F, U+53-55, U+57-59, U+61, U+63-65, U+67-69, U+6C-76; + src: url(Synonym-Variable-subset.woff2) format('woff2'), url(Synonym-Variable-subset.zopfli.woff) format('woff'); + unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+35, U+41-44, U+46, U+47, U+49, U+4B-4F, U+53-55, U+57-59, U+61, + U+63-65, U+67-69, U+6C-76; font-weight: 400 700; } diff --git a/packages/docs/src/assets/fonts/generated/TenorSans-Regular.module.css b/packages/docs/src/assets/fonts/generated/TenorSans-Regular.module.css index 819cfa3..b3dbfc6 100644 --- a/packages/docs/src/assets/fonts/generated/TenorSans-Regular.module.css +++ b/packages/docs/src/assets/fonts/generated/TenorSans-Regular.module.css @@ -6,8 +6,7 @@ @font-face { font-family: TenorSans-Regular; - src: url(TenorSans-Regular-subset.woff2) format('woff2'), - url(TenorSans-Regular-subset.zopfli.woff) format('woff'); - unicode-range: U+20, U+24, U+2E, U+30, U+36, U+46, U+49, U+4A, U+53, U+54, - U+61, U+63, U+65, U+69, U+6B, U+6E, U+6F, U+72-75, U+79; + src: url(TenorSans-Regular-subset.woff2) format('woff2'), url(TenorSans-Regular-subset.zopfli.woff) format('woff'); + unicode-range: U+20, U+24, U+2E, U+30, U+36, U+46, U+49, U+4A, U+53, U+54, U+61, U+63, U+65, U+69, U+6B, U+6E, U+6F, + U+72-75, U+79; } diff --git a/packages/docs/src/components/atoms/DigitalOcean.tsx b/packages/docs/src/components/atoms/DigitalOcean.tsx index dc16647..fc97537 100644 --- a/packages/docs/src/components/atoms/DigitalOcean.tsx +++ b/packages/docs/src/components/atoms/DigitalOcean.tsx @@ -56,10 +56,7 @@ export const DigitalOcean = () => ( h-3.1V2h3.2V14.9z M361.9,21.1v1.1c0,4.4,2.6,6.6,6.2,6.6c3.7,0,6.5-2.5,6.5-7.2c0-4.6-2.8-7.1-6.5-7.1 C364.5,14.5,361.9,16.8,361.9,21.1z" /> - + @@ -111,14 +108,7 @@ export const DigitalOcean = () => ( c1.2,1.2,2.6,1.8,4.3,1.8c1.7,0,3.1-0.6,4.3-1.8c1.2-1.2,1.8-2.6,1.8-4.3c0-1.7-0.6-3.1-1.8-4.2 C225.7,46.5,224.3,45.9,222.6,45.9z" /> - + ( c3.5-3.6,5.3-8.4,5.3-14.2V63h-9.7V66.3z M260.6,89.4c-1.7,2-3.9,2.9-6.8,2.9c-2.8,0-5-0.9-6.7-2.9c-1.7-1.9-2.5-4.5-2.5-7.7 c0-3.2,0.9-5.8,2.5-7.7c1.7-1.9,3.9-2.9,6.7-2.9c2.8,0,5,1,6.8,2.9c1.7,2,2.6,4.6,2.6,7.7C263.2,84.9,262.3,87.5,260.6,89.4z" /> - + ( d="M312.7,52.5H303V63h-5.6v9h5.6v16.2c0,5.1,1,8.7,3,10.8c2,2.1,5.6,3.2,10.6,3.2 c1.6,0,3.2-0.1,4.8-0.2l0.4,0v-9l-3.4,0.2c-2.3,0-3.9-0.4-4.7-1.2c-0.8-0.8-1.1-2.6-1.1-5.2V72h9.2v-9h-9.2V52.5z" /> - + ( - Qwind Logo + Qwind Logo Chatbot )) diff --git a/packages/docs/src/components/atoms/Netlify.tsx b/packages/docs/src/components/atoms/Netlify.tsx index 9047eab..3090113 100644 --- a/packages/docs/src/components/atoms/Netlify.tsx +++ b/packages/docs/src/components/atoms/Netlify.tsx @@ -1,11 +1,5 @@ export const Netlify = () => ( - + { {head.title} - + {head.meta.map((m) => ( diff --git a/packages/docs/src/components/core/Social.tsx b/packages/docs/src/components/core/Social.tsx index 43d6ac2..f620441 100644 --- a/packages/docs/src/components/core/Social.tsx +++ b/packages/docs/src/components/core/Social.tsx @@ -34,14 +34,8 @@ export const Social = () => { content="https://campaign.codigoencasa.com" /> */} - - + + @@ -52,10 +46,7 @@ export const Social = () => { name="twitter:title" content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud y Nodejs" /> - + ) } diff --git a/packages/docs/src/components/core/ToggleMenu.tsx b/packages/docs/src/components/core/ToggleMenu.tsx index 51779fc..567fd46 100644 --- a/packages/docs/src/components/core/ToggleMenu.tsx +++ b/packages/docs/src/components/core/ToggleMenu.tsx @@ -27,9 +27,7 @@ export default component$((props: ItemProps) => { // TODO: document.body.classList.toggle('overflow-hidden') document.getElementById('header')?.classList.toggle('h-screen') - document - .querySelector('#header nav') - ?.classList.toggle('hidden') + document.querySelector('#header nav')?.classList.toggle('hidden') }} > diff --git a/packages/docs/src/components/core/ToggleTheme.tsx b/packages/docs/src/components/core/ToggleTheme.tsx index 00de98e..6ef1196 100644 --- a/packages/docs/src/components/core/ToggleTheme.tsx +++ b/packages/docs/src/components/core/ToggleTheme.tsx @@ -10,16 +10,13 @@ interface ItemProps { export default component$((props: ItemProps) => { const { iconClass } = props const store = useStore({ - theme: - (typeof window !== 'undefined' && window?.localStorage?.theme) || - undefined, + theme: (typeof window !== 'undefined' && window?.localStorage?.theme) || undefined, }) useClientEffect$(() => { store.theme = window.localStorage.theme === 'dark' || - (!('theme' in window.localStorage) && - window.matchMedia('(prefers-color-scheme: dark)').matches) + (!('theme' in window.localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light' }) @@ -42,11 +39,7 @@ export default component$((props: ItemProps) => { } }} > - {store.theme == 'dark' ? ( - - ) : ( - - )} + {store.theme == 'dark' ? : } ) }) diff --git a/packages/docs/src/components/icons/IconArrowDownRight.tsx b/packages/docs/src/components/icons/IconArrowDownRight.tsx index 8adfab2..5fd5087 100644 --- a/packages/docs/src/components/icons/IconArrowDownRight.tsx +++ b/packages/docs/src/components/icons/IconArrowDownRight.tsx @@ -7,9 +7,7 @@ export const IconArrowDownRight = (props: ItemProps) => { return ( { diff --git a/packages/docs/src/components/icons/IconMoon.tsx b/packages/docs/src/components/icons/IconMoon.tsx index fa65ec0..296951f 100644 --- a/packages/docs/src/components/icons/IconMoon.tsx +++ b/packages/docs/src/components/icons/IconMoon.tsx @@ -7,9 +7,7 @@ export const IconMoon = (props: ItemProps) => { return (
    -

    - {props.user.login} -
    +
    {props.user.login}
    diff --git a/packages/docs/src/components/widgets/Collaborators.tsx b/packages/docs/src/components/widgets/Collaborators.tsx index 23f2844..cfd2d24 100644 --- a/packages/docs/src/components/widgets/Collaborators.tsx +++ b/packages/docs/src/components/widgets/Collaborators.tsx @@ -32,8 +32,7 @@ export default component$((props: { users: User[] }) => { Super estrellas

    - Todo es posible gracias a el mayor recursos de todos, el - recurso humano. Tu tambien puedes{' '} + Todo es posible gracias a el mayor recursos de todos, el recurso humano. Tu tambien puedes{' '} formar parte diff --git a/packages/docs/src/components/widgets/ExtraBar.tsx b/packages/docs/src/components/widgets/ExtraBar.tsx index fda47b2..0d9ae34 100644 --- a/packages/docs/src/components/widgets/ExtraBar.tsx +++ b/packages/docs/src/components/widgets/ExtraBar.tsx @@ -15,8 +15,8 @@ export default component$(() => { 📄 Editar esta pagina

    - Forma parte de esta comunidad mejorando la documentación - siente libre de poder agregar o editar lo que quieras + Forma parte de esta comunidad mejorando la documentación siente libre de poder agregar o editar + lo que quieras

  • diff --git a/packages/docs/src/components/widgets/FAQs.tsx b/packages/docs/src/components/widgets/FAQs.tsx index 28aa2c1..5834e24 100644 --- a/packages/docs/src/components/widgets/FAQs.tsx +++ b/packages/docs/src/components/widgets/FAQs.tsx @@ -56,13 +56,9 @@ export default component$(() => { {question} - {answer - .split('\n\n') - .map((paragraph) => ( -

    - {paragraph} -

    - ))} + {answer.split('\n\n').map((paragraph) => ( +

    {paragraph}

    + ))} ))} diff --git a/packages/docs/src/components/widgets/Features.tsx b/packages/docs/src/components/widgets/Features.tsx index 4888086..ddd3dc8 100644 --- a/packages/docs/src/components/widgets/Features.tsx +++ b/packages/docs/src/components/widgets/Features.tsx @@ -50,13 +50,11 @@ export default component$(() => { Caracteristicas

    - Nuestras principales{' '} - funciones + Nuestras principales funciones

    - El secreto es mantener los procesos repetitivos en - procesos automatizados simples, por eso te mostramos en - que destacamos. + El secreto es mantener los procesos repetitivos en procesos automatizados simples, por eso te + mostramos en que destacamos.

    @@ -70,12 +68,8 @@ export default component$(() => {
    -

    - {title} -

    -

    - {description} -

    +

    {title}

    +

    {description}

    ))} diff --git a/packages/docs/src/components/widgets/Hero.tsx b/packages/docs/src/components/widgets/Hero.tsx index b3761f8..01ee042 100644 --- a/packages/docs/src/components/widgets/Hero.tsx +++ b/packages/docs/src/components/widgets/Hero.tsx @@ -9,36 +9,24 @@ import { src as placeholder } from '~/assets/images/chatbot-whatsapp.png?width=4 export default component$(() => { return ( -
    +

    - Crear chatbot{' '} - - WhatsApp - - {' '} - en minutos + Crear chatbot WhatsApp + en minutos

    - - Con esta libreria,{' '} - + Con esta libreria, - puedes configurar respuestas - automatizadas para preguntas frecuentes + puedes configurar respuestas automatizadas para preguntas frecuentes {' '} - , recibir y responder mensajes de manera - automatizada, y hacer un seguimiento de las - interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con - otros sistemas y herramientas que ya esté - utilizando en su negocio. + , recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las + interacciones con los clientes. Además, nuestro Chatbot se integra fácilmente con + otros sistemas y herramientas que ya esté utilizando en su negocio.

    @@ -48,10 +36,7 @@ export default component$(() => {
    - + Ver documentación { Miembros

    - Conviértete en un miembro destacado y forma parte del - proyecto y disfruta de manera adelantada de las - actualizaciones{' '} - + Conviértete en un miembro destacado y forma parte del proyecto y disfruta de manera adelantada + de las actualizaciones{' '} + Únete

    diff --git a/packages/docs/src/components/widgets/NavBar.tsx b/packages/docs/src/components/widgets/NavBar.tsx index 56915c9..5b332bc 100644 --- a/packages/docs/src/components/widgets/NavBar.tsx +++ b/packages/docs/src/components/widgets/NavBar.tsx @@ -5,55 +5,45 @@ import { DocumentationCtx } from '~/contexts' /** * options = [] array con la lista de opciones de la documentacion */ -export default component$( - ({ options = [] }: { options: DocumentationCtx[] }) => { - return ( -
    - {options.map((item, i) => ( - - ))} -
    - ) - } -) +export default component$(({ options = [] }: { options: DocumentationCtx[] }) => { + return ( +
    + {options.map((item, i) => ( + + ))} +
    + ) +}) -export const UlCompoent = component$( - (porps: { title: string; list: { link: string; name: string }[] }) => { - return ( -
      -
    • -
      - {porps.title} -
      - +export const UlCompoent = component$((porps: { title: string; list: { link: string; name: string }[] }) => { + return ( +
        +
      • +
        {porps.title}
        + +
      • +
      + ) +}) + +export const LiComponent = component$((porps: { list: { link: string; name: string }[] }) => { + const location = useLocation() + const currentPage = location.pathname + return ( +
        + {porps.list.map((opt) => ( +
      • + + {opt.name} +
      • -
      - ) - } -) - -export const LiComponent = component$( - (porps: { list: { link: string; name: string }[] }) => { - const location = useLocation() - const currentPage = location.pathname - return ( -
        - {porps.list.map((opt) => ( -
      • - - {opt.name} - -
      • - ))} -
      - ) - } -) + ))} +
    + ) +}) diff --git a/packages/docs/src/components/widgets/Navigation.tsx b/packages/docs/src/components/widgets/Navigation.tsx index 779a787..092ed93 100644 --- a/packages/docs/src/components/widgets/Navigation.tsx +++ b/packages/docs/src/components/widgets/Navigation.tsx @@ -1,74 +1,63 @@ import { component$ } from '@builder.io/qwik' -export const ButtonLink = component$( - (props: { name: string; link: string; direction: 'left' | 'right' }) => { - const ArrowRight = () => ( - - - - ) +export const ButtonLink = component$((props: { name: string; link: string; direction: 'left' | 'right' }) => { + const ArrowRight = () => ( + + + + ) - const ArrowLeft = () => ( - - - - ) + const ArrowLeft = () => ( + + + + ) - return ( - - {props.direction === 'left' ? ( - <> - - {props.name} - - ) : ( - <> - {props.name} - - - )} - - ) - } -) + return ( + + {props.direction === 'left' ? ( + <> + + {props.name} + + ) : ( + <> + {props.name} + + + )} + + ) +}) -export default component$( - (props: { pages: ({ name: string; link: string } | null)[] }) => { - const { pages } = props - return ( -
    -
    - {pages[0] ? ( - - ) : null} - {pages[1] ? ( - - ) : null} -
    +export default component$((props: { pages: ({ name: string; link: string } | null)[] }) => { + const { pages } = props + return ( +
    +
    + {pages[0] ? : null} + {pages[1] ? : null}
    - ) - } -) +
    + ) +}) diff --git a/packages/docs/src/components/widgets/Stats.tsx b/packages/docs/src/components/widgets/Stats.tsx index c4dc31a..0721ba7 100644 --- a/packages/docs/src/components/widgets/Stats.tsx +++ b/packages/docs/src/components/widgets/Stats.tsx @@ -5,33 +5,25 @@ export default component$(() => {
    -
    - 132K -
    +
    132K

    Downloads

    -
    - 24.8K -
    +
    24.8K

    Stars

    -
    - 10.3K -
    +
    10.3K

    Forks

    -
    - 48.4K -
    +
    48.4K

    Users

    diff --git a/packages/docs/src/contexts/index.tsx b/packages/docs/src/contexts/index.tsx index 7282539..ca33495 100644 --- a/packages/docs/src/contexts/index.tsx +++ b/packages/docs/src/contexts/index.tsx @@ -13,5 +13,4 @@ export interface User { avatar_url: string } -export const GlobalStore = - createContext('documentation-site') +export const GlobalStore = createContext('documentation-site') diff --git a/packages/docs/src/root.tsx b/packages/docs/src/root.tsx index 2cddda0..61c3906 100644 --- a/packages/docs/src/root.tsx +++ b/packages/docs/src/root.tsx @@ -1,14 +1,5 @@ -import { - component$, - useContextProvider, - useStore, - useStyles$, -} from '@builder.io/qwik' -import { - QwikCityProvider, - RouterOutlet, - ServiceWorkerRegister, -} from '@builder.io/qwik-city' +import { component$, useContextProvider, useStore, useStyles$ } from '@builder.io/qwik' +import { QwikCityProvider, RouterOutlet, ServiceWorkerRegister } from '@builder.io/qwik-city' import { RouterHead } from '~/components/core/RouterHead' import { DarkThemeLauncher } from '~/components/core/DarkThemeLauncher' @@ -78,10 +69,7 @@ export default component$(() => { - + diff --git a/packages/docs/src/routes/docs/database/index.mdx b/packages/docs/src/routes/docs/database/index.mdx index dab499f..01eb796 100644 --- a/packages/docs/src/routes/docs/database/index.mdx +++ b/packages/docs/src/routes/docs/database/index.mdx @@ -4,11 +4,10 @@ import Navigation from '../../../components/widgets/Navigation' # DataBase (Base de datos) - ⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar - algunas configuracion adicional como **user, host, password** para esos - casos te recomendamos guiarte de los - **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** - o si gustas puedes editar esta documentación para ir agregando más info + ⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar algunas configuracion adicional como + **user, host, password** para esos casos te recomendamos guiarte de los + **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** o si gustas puedes editar esta + documentación para ir agregando más info Es la pieza encargada de mantener el **"estado"** de una conversación, para mayor facilidad la libreria te proporcia diferentes conectores que se de adapten mejor a tu desarrollo diff --git a/packages/docs/src/routes/docs/essential/index.mdx b/packages/docs/src/routes/docs/essential/index.mdx index 8187544..0f0dc45 100644 --- a/packages/docs/src/routes/docs/essential/index.mdx +++ b/packages/docs/src/routes/docs/essential/index.mdx @@ -22,12 +22,7 @@ Tan sencillo como decir **palabra/s clave** y **mensaje a responder** Ambos metodos **[addKeyword](https://github.com/codigoencasa/bot-whatsapp/blob/dev/packages/bot/io/methods/addKeyword.js)** y el **[addAnswer](https://github.com/codigoencasa/bot-whatsapp/blob/dev/packages/bot/io/methods/addAnswer.js)** tienen una serie opciones disponibles ```js -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const flowPrincipal = addKeyword(['hola', 'alo']) .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) @@ -39,11 +34,10 @@ const flowPrincipal = addKeyword(['hola', 'alo']) ## Provider (Proveedor) - ⚡ Dependiendo del tipo de proveedor que utlices puede que necesites pasar - algunas configuracion adicional como **token, api, etc.** para esos casos te - recomendamos guiarte de los - **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** - o si gustas puedes editar esta documentación para ir agregando más info + ⚡ Dependiendo del tipo de proveedor que utlices puede que necesites pasar algunas configuracion adicional como + **token, api, etc.** para esos casos te recomendamos guiarte de los + **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** o si gustas puedes editar esta + documentación para ir agregando más info Es la pieza que conectara tu flujo con Whatsapp. En este chatbot tenemos varios proveedores disponibles la mayoria gratis pero tambien tenemos integracion la api oficial de whatsapp o twilio @@ -71,11 +65,10 @@ Los proveedores disponibles hasta el momento son los siguientes: ## DataBase (Base de datos) - ⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar - algunas configuracion adicional como **user, host, password** para esos - casos te recomendamos guiarte de los - **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** - o si gustas puedes editar esta documentación para ir agregando más info + ⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar algunas configuracion adicional como + **user, host, password** para esos casos te recomendamos guiarte de los + **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** o si gustas puedes editar esta + documentación para ir agregando más info Es la pieza encargada de mantener el **"estado"** de una conversación, para mayor facilidad la libreria te proporcia diferentes conectores que se de adapten mejor a tu desarrollo diff --git a/packages/docs/src/routes/docs/example/index.mdx b/packages/docs/src/routes/docs/example/index.mdx index 8daded3..057fcc6 100644 --- a/packages/docs/src/routes/docs/example/index.mdx +++ b/packages/docs/src/routes/docs/example/index.mdx @@ -5,12 +5,7 @@ import Navigation from '../../../components/widgets/Navigation' Si copias y pegas este codigo y tu entorno de trabajo cumple con todos los requesitos te debe funcionar abajo explico muy por encima ```js -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -42,12 +37,7 @@ main() En esta parte solo estamos declaramos las dependencias que vamos a utilizar. Si quieres saber a fondo cada una de las funciones te recomiendo pasarte por la seccion de **[conceptos](/docs/concepts)** ```js -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 94b1f59..0c2cf0b 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -9,12 +9,7 @@ Tan sencillo como decir **palabra/s clave** y **mensaje a responder** Ambos metodos **[addKeyword](https://github.com/codigoencasa/bot-whatsapp/blob/dev/packages/bot/io/methods/addKeyword.js)** y el **[addAnswer](https://github.com/codigoencasa/bot-whatsapp/blob/dev/packages/bot/io/methods/addAnswer.js)** tienen una serie opciones disponibles ```js -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const flowPrincipal = addKeyword(['hola', 'alo']) .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) @@ -81,37 +76,21 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` ```js const { addKeyword } = require('@bot-whatsapp/bot') -const flowString = addKeyword('hola').addAnswer( - 'Este mensaje se enviara 1 segundo despues', - { - delay: 1000, - } -) +const flowString = addKeyword('hola').addAnswer('Este mensaje se enviara 1 segundo despues', { + delay: 1000, +}) -const flowString = addKeyword('hola').addAnswer( - 'Este mensaje envia una imagen', - { - media: 'https://i.imgur.com/0HpzsEm.png', - } -) +const flowString = addKeyword('hola').addAnswer('Este mensaje envia una imagen', { + media: 'https://i.imgur.com/0HpzsEm.png', +}) -const flowString = addKeyword('hola').addAnswer( - 'Este mensaje envia tres botones', - { - buttons: [ - { body: 'Boton 1' }, - { body: 'Boton 2' }, - { body: 'Boton 3' }, - ], - } -) +const flowString = addKeyword('hola').addAnswer('Este mensaje envia tres botones', { + buttons: [{ body: 'Boton 1' }, { body: 'Boton 2' }, { body: 'Boton 3' }], +}) -const flowString = addKeyword('hola').addAnswer( - 'Este mensaje espera una respueta del usuario', - { - capture: true, - } -) +const flowString = addKeyword('hola').addAnswer('Este mensaje espera una respueta del usuario', { + capture: true, +}) ``` --- @@ -123,13 +102,9 @@ Este argumento se utiliza para obtener el contexto de la conversación ```js const { addKeyword } = require('@bot-whatsapp/bot') -const flowString = addKeyword('hola').addAnswer( - 'Indica cual es tu email', - null, - (ctx) => { - console.log('👉 Informacion del contexto: ', ctx) - } -) +const flowString = addKeyword('hola').addAnswer('Indica cual es tu email', null, (ctx) => { + console.log('👉 Informacion del contexto: ', ctx) +}) ``` --- @@ -143,13 +118,9 @@ se repetira el mensaje `Indica cual es tu email` ```js const { addKeyword } = require('@bot-whatsapp/bot') -const flowString = addKeyword('hola').addAnswer( - 'Indica cual es tu email', - null, - (ctx, { fallBack }) => { - if (!ctx.body.includes('@')) return fallBack() - } -) +const flowString = addKeyword('hola').addAnswer('Indica cual es tu email', null, (ctx, { fallBack }) => { + if (!ctx.body.includes('@')) return fallBack() +}) ``` --- diff --git a/packages/docs/src/routes/docs/index.mdx b/packages/docs/src/routes/docs/index.mdx index 505bd6a..ab6d5f1 100644 --- a/packages/docs/src/routes/docs/index.mdx +++ b/packages/docs/src/routes/docs/index.mdx @@ -4,10 +4,9 @@ import Navigation from '../../components/widgets/Navigation' # Introducción - **Atención** estás leyendo la documentación de la **versión v2** de esta - librería, si vienes de la versión anterior te recomendamos pasarte por la - sección de **[migración](/docs/migration/)** para que puedas disfrutar de - las nuevas características. + **Atención** estás leyendo la documentación de la **versión v2** de esta librería, si vienes de la versión anterior + te recomendamos pasarte por la sección de **[migración](/docs/migration/)** para que puedas disfrutar de las nuevas + características. ## ¿Qué es esto? @@ -34,10 +33,7 @@ npm create bot-whatsapp@latest muted playsinline > - +
    diff --git a/packages/docs/src/routes/docs/install/index.mdx b/packages/docs/src/routes/docs/install/index.mdx index 342043a..4fa8575 100644 --- a/packages/docs/src/routes/docs/install/index.mdx +++ b/packages/docs/src/routes/docs/install/index.mdx @@ -28,10 +28,7 @@ El **CLI** te hace una revisión previa, de versión de Node y sistema operativo muted playsinline > - +
    @@ -54,10 +51,8 @@ Cada plantilla tiene sus dependencias necesarias basadas en tu previa selección ``` - 📄 Si deseas cambiar tu **proveedor o tu motor** de base de datos no es - necesario volver ejecutar el CLI (lo puedes hacer sin problema) aunque - tambien basta con solo modificar un par de lineas. [Ver - explicación](/docs/essential) + 📄 Si deseas cambiar tu **proveedor o tu motor** de base de datos no es necesario volver ejecutar el CLI (lo puedes + hacer sin problema) aunque tambien basta con solo modificar un par de lineas. [Ver explicación](/docs/essential) --- diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index 8f49e8a..8fe70cb 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -27,11 +27,7 @@ export default component$(() => {
    -
    +
    @@ -54,8 +50,7 @@ export const head: DocumentHead = { meta: [ { name: 'description', - content: - 'Crear chatbot WhatsApp en minutos — Servicio de chatbot para whatspp gratis proyecto OpenSource', + content: 'Crear chatbot WhatsApp en minutos — Servicio de chatbot para whatspp gratis proyecto OpenSource', }, ], } diff --git a/packages/docs/src/routes/docs/migration/index.mdx b/packages/docs/src/routes/docs/migration/index.mdx index 84a1658..2e09f97 100644 --- a/packages/docs/src/routes/docs/migration/index.mdx +++ b/packages/docs/src/routes/docs/migration/index.mdx @@ -49,11 +49,7 @@ En la **_versión (legacy)_** se implementas los flujos de esta manera, en dos a "title": "¿Que te interesa ver?", "message": "Abajo unos botons", "footer": "", - "buttons": [ - { "body": "Telefonos" }, - { "body": "Computadoras" }, - { "body": "Otros" } - ] + "buttons": [{ "body": "Telefonos" }, { "body": "Computadoras" }, { "body": "Otros" }] } }, "catalogo": { @@ -70,51 +66,28 @@ En esta versión es mucho más sencillo, abajo encontrarás un ejemplo del mismo ```js //app.js -const { - createBot, - createProvider, - createFlow, - addKeyword, - addChild, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword, addChild } = require('@bot-whatsapp/bot') const BaileysProvider = require('@bot-whatsapp/provider/baileys') //Provider const MockAdapter = require('@bot-whatsapp/database/mock') //Base de datos /** * Declarando flujos principales. */ -const flowHola = addKeyword(['hola', 'ola', 'alo']).addAnswer( - 'Bienvenido a tu tienda online!' -) +const flowHola = addKeyword(['hola', 'ola', 'alo']).addAnswer('Bienvenido a tu tienda online!') -const flowAdios = addKeyword(['adios', 'bye']) - .addAnswer('Que te vaya bien!!') - .addAnswer('Hasta luego!') +const flowAdios = addKeyword(['adios', 'bye']).addAnswer('Que te vaya bien!!').addAnswer('Hasta luego!') -const flowProductos = addKeyword(['productos', 'info']).addAnswer( - 'Te envio una imagen', - { - buttons: [ - { body: 'Telefonos' }, - { body: 'Computadoras' }, - { body: 'Otros' }, - ], - } -) +const flowProductos = addKeyword(['productos', 'info']).addAnswer('Te envio una imagen', { + buttons: [{ body: 'Telefonos' }, { body: 'Computadoras' }, { body: 'Otros' }], +}) -const flowCatalogo = addKeyword(['imagen', 'foto']).addAnswer( - 'Te envio una imagen', - { media: 'https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif' } -) +const flowCatalogo = addKeyword(['imagen', 'foto']).addAnswer('Te envio una imagen', { + media: 'https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif', +}) const main = async () => { const adapterDB = new MockAdapter() - const adapterFlow = createFlow([ - flowHola, - flowAdios, - flowProductos, - flowCatalogo, - ]) //Se crean los flujos. + const adapterFlow = createFlow([flowHola, flowAdios, flowProductos, flowCatalogo]) //Se crean los flujos. const adapterProvider = createProvider(BaileysProvider) createBot({ flow: adapterFlow, diff --git a/packages/docs/src/routes/docs/overview/index.mdx b/packages/docs/src/routes/docs/overview/index.mdx index 79830ff..7d2e57c 100644 --- a/packages/docs/src/routes/docs/overview/index.mdx +++ b/packages/docs/src/routes/docs/overview/index.mdx @@ -49,17 +49,15 @@ Qwik is a new kind of web framework that can deliver instant loading web applica

    Instant-on

    - Unlike other frameworks, Qwik is resumable which means Qwik - applications require 0 hydration. This allows Qwik apps to have - instant-on interactivity, regardless of size or complexity + Unlike other frameworks, Qwik is resumable which means Qwik applications require 0 hydration. This allows + Qwik apps to have instant-on interactivity, regardless of size or complexity

    Optimized for speed

    - Qwik has unprecedented performance, offering sub-second full page - loads even on mobile devices. Qwik achieves this by delivering pure - HTML, and incrementally loading JS only as-needed. + Qwik has unprecedented performance, offering sub-second full page loads even on mobile devices. Qwik + achieves this by delivering pure HTML, and incrementally loading JS only as-needed.

    diff --git a/packages/docs/src/routes/docs/providers/index.mdx b/packages/docs/src/routes/docs/providers/index.mdx index 0f6db6a..e534576 100644 --- a/packages/docs/src/routes/docs/providers/index.mdx +++ b/packages/docs/src/routes/docs/providers/index.mdx @@ -4,11 +4,10 @@ import Navigation from '../../../components/widgets/Navigation' # Proveedores - ⚡ Dependiendo del tipo de proveedor que utlices puede que necesites pasar - algunas configuracion adicional como **token, api, etc.** para esos casos te - recomendamos guiarte de los - **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** - o si gustas puedes editar esta documentación para ir agregando más info + ⚡ Dependiendo del tipo de proveedor que utlices puede que necesites pasar algunas configuracion adicional como + **token, api, etc.** para esos casos te recomendamos guiarte de los + **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** o si gustas puedes editar esta + documentación para ir agregando más info Es la pieza que conectara tu flujo con Whatsapp. En este chatbot tenemos varios proveedores disponibles la mayoria gratis pero tambien tenemos integracion la api oficial de whatsapp o twilio diff --git a/packages/docs/src/routes/docs/providers/meta/index.mdx b/packages/docs/src/routes/docs/providers/meta/index.mdx index a44476f..d0f1d6f 100644 --- a/packages/docs/src/routes/docs/providers/meta/index.mdx +++ b/packages/docs/src/routes/docs/providers/meta/index.mdx @@ -59,10 +59,7 @@ En el **archivo principal** del bot donde estás implementando la función del a - **jwtToken:** Lo puedes encontrar en la pagina anterior - **verifyToken:** Puedes escribir lo que quieras es como una palabra clave - - En el ejemplo de abajo puedes ver como una sugerencia de como puede ser - utilizando variables de entorno - +En el ejemplo de abajo puedes ver como una sugerencia de como puede ser utilizando variables de entorno ```js const main = async () => { diff --git a/packages/docs/src/routes/docs/providers/twilio/index.mdx b/packages/docs/src/routes/docs/providers/twilio/index.mdx index 5548ad5..37fc6dd 100644 --- a/packages/docs/src/routes/docs/providers/twilio/index.mdx +++ b/packages/docs/src/routes/docs/providers/twilio/index.mdx @@ -5,10 +5,7 @@ import Navigation from '../../../../components/widgets/Navigation' Twilio es una plataforma de desarrollo que permite a los desarrolladores construir aplicaciones de comunicación en la nube y sistemas web. Las API de comunicaciones de Twilio permiten a las empresas proporcionar la experiencia de comunicación adecuada para sus clientes dentro de la web y las aplicaciones móviles. Al usar las API de Twilio, los desarrolladores pueden agregar rápidamente esta funcionalidad a una aplicación, como mensajes de voz, videollamadas, mensajes de texto y más. - - Twilio te proporciona una cuenta **Sandbox** para que puedas probar - gratuitamente el servicio - +Twilio te proporciona una cuenta **Sandbox** para que puedas probar gratuitamente el servicio ### Requerimientos @@ -66,10 +63,7 @@ En el **archivo principal** del bot donde estás implementando la función del a - **ACC_VENDOR:** Es el numero de whatsapp (si ya tienes el plan de pago de Twilio usa el numero que compraste), si aun estas en modo sandbox utliza el numero proporcionado en el paso numero 2 - - En el ejemplo de abajo puedes ver como una sugerencia de como puede ser - utilizando variables de entorno - +En el ejemplo de abajo puedes ver como una sugerencia de como puede ser utilizando variables de entorno ```js const main = async () => { diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index 9b0f04a..71fa15a 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -13,8 +13,7 @@ import { GITHUB_TOKEN } from './docs/constant' // import { SearchModal } from '~/components/widgets/SearchModal' export const onGet: RequestHandlerNetlify = async ({ platform }) => { - const CHECK_GITHUB_TOKEN = - (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN + const CHECK_GITHUB_TOKEN = (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN const dataGithub = await fetchGithub(CHECK_GITHUB_TOKEN) const dataOpenCollective = await fetchOpenCollective() return { @@ -52,8 +51,7 @@ export const head: DocumentHead = { meta: [ { name: 'description', - content: - 'Crear chatbot WhatsApp en minutos — Servicio de chatbot para whatspp gratis proyecto OpenSource', + content: 'Crear chatbot WhatsApp en minutos — Servicio de chatbot para whatspp gratis proyecto OpenSource', }, ], } diff --git a/packages/docs/src/services/github.ts b/packages/docs/src/services/github.ts index e60d250..6ef1186 100644 --- a/packages/docs/src/services/github.ts +++ b/packages/docs/src/services/github.ts @@ -3,17 +3,14 @@ * @returns */ export const fetchGithub = async (token: string) => { - const data = await fetch( - `https://api.github.com/repos/codigoencasa/bot-whatsapp/contributors`, - { - method: 'GET', - headers: { - Accept: 'application/vnd.github+json', - 'X-GitHub-Api-Version': '2022-11-28', - Authorization: `Bearer ${token}`, - }, - } - ) + const data = await fetch(`https://api.github.com/repos/codigoencasa/bot-whatsapp/contributors`, { + method: 'GET', + headers: { + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28', + Authorization: `Bearer ${token}`, + }, + }) const listUsers = await data.json() return listUsers.map((u: any) => ({ ...u, diff --git a/packages/docs/src/services/opencollective.ts b/packages/docs/src/services/opencollective.ts index 9a89f25..55e7e75 100644 --- a/packages/docs/src/services/opencollective.ts +++ b/packages/docs/src/services/opencollective.ts @@ -3,12 +3,9 @@ * @returns */ export const fetchOpenCollective = async () => { - const data = await fetch( - `https://opencollective.com/bot-whatsapp/members/users.json?limit=22&offset=0`, - { - method: 'GET', - } - ) + const data = await fetch(`https://opencollective.com/bot-whatsapp/members/users.json?limit=22&offset=0`, { + method: 'GET', + }) const listUsers = await data.json() return listUsers.map((u: any) => ({ html_url: u.profile, diff --git a/packages/docs/tailwind.config.js b/packages/docs/tailwind.config.js index 1614b2e..a92fde1 100644 --- a/packages/docs/tailwind.config.js +++ b/packages/docs/tailwind.config.js @@ -76,9 +76,7 @@ module.exports = { a: { fontWeight: theme('fontWeight.semibold'), textDecoration: 'none', - borderBottom: `1px solid ${theme( - 'colors.sky.300' - )}`, + borderBottom: `1px solid ${theme('colors.sky.300')}`, }, 'a:hover': { borderBottomWidth: '2px', diff --git a/packages/portal/.vscode/qwik-city.code-snippets b/packages/portal/.vscode/qwik-city.code-snippets index b6c1c17..361ddf7 100644 --- a/packages/portal/.vscode/qwik-city.code-snippets +++ b/packages/portal/.vscode/qwik-city.code-snippets @@ -3,11 +3,7 @@ "scope": "javascriptreact,typescriptreact", "prefix": "q:onGet", "description": "onGet function for a route index", - "body": [ - "export const onGet: RequestHandler = (request) => {", - " $0", - "};" - ] + "body": ["export const onGet: RequestHandler = (request) => {", " $0", "};"] }, "onGet (typed)": { "scope": "javascriptreact,typescriptreact", diff --git a/packages/portal/.vscode/qwik.code-snippets b/packages/portal/.vscode/qwik.code-snippets index 4b89dbf..c2a8a8f 100644 --- a/packages/portal/.vscode/qwik.code-snippets +++ b/packages/portal/.vscode/qwik.code-snippets @@ -56,24 +56,13 @@ "scope": "javascriptreact,typescriptreact", "prefix": "q:useTask", "description": "useTask$() function hook", - "body": [ - "useTask$(({ track }) => {", - " track(() => $1);", - " $0", - "});", - "" - ] + "body": ["useTask$(({ track }) => {", " track(() => $1);", " $0", "});", ""] }, "useResource": { "scope": "javascriptreact,typescriptreact", "prefix": "q:useResource", "description": "useResource$() declaration", - "body": [ - "const $1 = useResource$(({ track, cleanup }) => {", - " $0", - "});", - "" - ] + "body": ["const $1 = useResource$(({ track, cleanup }) => {", " $0", "});", ""] }, "useServerMount": { "scope": "javascriptreact,typescriptreact", diff --git a/packages/portal/portal.http.js b/packages/portal/portal.http.js index 3066c12..122f2de 100644 --- a/packages/portal/portal.http.js +++ b/packages/portal/portal.http.js @@ -5,14 +5,9 @@ const polka = require('polka') const HTTP_PORT = process.env.PORT || 3000 const QR_FILE = process.env.QR_FILE ?? 'bot' -const PUBLIC_URL = - process.env.PUBLIC_URL ?? - process.env.RAILWAY_STATIC_URL ?? - 'http://localhost' +const PUBLIC_URL = process.env.PUBLIC_URL ?? process.env.RAILWAY_STATIC_URL ?? 'http://localhost' -const dir = [join(__dirname, 'dist'), join(__dirname, '..', 'dist')].find((i) => - existsSync(i) -) +const dir = [join(__dirname, 'dist'), join(__dirname, '..', 'dist')].find((i) => existsSync(i)) const serve = require('serve-static')(dir) /** @@ -32,14 +27,8 @@ const start = (args) => { console.log(``) console.log(bgYellow(`🚩 ESCANEAR QR 🚩`)) console.log(cyan(`Existen varias maneras de escanear el QR code`)) - console.log( - cyan(`- Tambien puedes visitar `), - yellow(`${publicSite}:${port}`) - ) - console.log( - cyan(`- Se ha creado un archivo que finaliza `), - yellow('qr.png') - ) + console.log(cyan(`- Tambien puedes visitar `), yellow(`${publicSite}:${port}`)) + console.log(cyan(`- Se ha creado un archivo que finaliza `), yellow('qr.png')) console.log(``) } diff --git a/packages/portal/src/components/header/header.tsx b/packages/portal/src/components/header/header.tsx index f1c7fa7..ebaa11b 100644 --- a/packages/portal/src/components/header/header.tsx +++ b/packages/portal/src/components/header/header.tsx @@ -8,28 +8,18 @@ export default component$(() => { return (
    • - + Docs
    • - + Examples
    • diff --git a/packages/portal/src/components/icons/qwik.tsx b/packages/portal/src/components/icons/qwik.tsx index 3bd8d91..fc113f6 100644 --- a/packages/portal/src/components/icons/qwik.tsx +++ b/packages/portal/src/components/icons/qwik.tsx @@ -1,11 +1,5 @@ export const QwikLogo = () => ( - + { @@ -20,12 +15,7 @@ export const QR = component$(() => { return (
      - QR + QR
      ) }) diff --git a/packages/portal/src/components/router-head/router-head.tsx b/packages/portal/src/components/router-head/router-head.tsx index c0811e4..dee9459 100644 --- a/packages/portal/src/components/router-head/router-head.tsx +++ b/packages/portal/src/components/router-head/router-head.tsx @@ -10,10 +10,7 @@ export const RouterHead = component$(() => { {head.title} - + {head.meta.map((m) => ( diff --git a/packages/portal/src/global.css b/packages/portal/src/global.css index cc17b32..6b1eeb6 100644 --- a/packages/portal/src/global.css +++ b/packages/portal/src/global.css @@ -15,8 +15,7 @@ body { background-color: #fafafa; - font-family: 'Inter', sans-serif, ui-sans-serif, system-ui, -apple-system, - BlinkMacSystemFont, sans-serif; + font-family: 'Inter', sans-serif, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; padding: 20px 20px 40px 20px; } diff --git a/packages/portal/src/routes/index.css b/packages/portal/src/routes/index.css index f5ff37b..cf07671 100644 --- a/packages/portal/src/routes/index.css +++ b/packages/portal/src/routes/index.css @@ -12,8 +12,7 @@ .page .btn-link { background: white; - box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px, - rgb(0 0 0 / 6%) 0px 0px 0px 1px; + box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px, rgb(0 0 0 / 6%) 0px 0px 0px 1px; padding: 10px; border-radius: 5px; font-weight: 600; diff --git a/packages/portal/src/routes/index.tsx b/packages/portal/src/routes/index.tsx index 44c8117..2a26307 100644 --- a/packages/portal/src/routes/index.tsx +++ b/packages/portal/src/routes/index.tsx @@ -15,19 +15,13 @@ export default component$(() => {

      Whatsapp QR

      - Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes, recibir y responder - mensajes de manera automatizada, y hacer un seguimiento de - las interacciones con los clientes.
      Además, nuestro - Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. + Con esta libreria, puedes configurar respuestas automatizadas para preguntas frecuentes, recibir y + responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los + clientes.
      Además, nuestro Chatbot se integra fácilmente con otros sistemas y herramientas que + ya esté utilizando en su negocio.

      diff --git a/packages/provider/src/meta/index.js b/packages/provider/src/meta/index.js index b3a106b..2b2e0e0 100644 --- a/packages/provider/src/meta/index.js +++ b/packages/provider/src/meta/index.js @@ -56,15 +56,11 @@ class MetaProvider extends ProviderClass { sendMessageMeta = async (body) => { try { - const response = await axios.post( - `${URL}/${this.numberId}/messages`, - body, - { - headers: { - Authorization: `Bearer ${this.jwtToken}`, - }, - } - ) + const response = await axios.post(`${URL}/${this.numberId}/messages`, body, { + headers: { + Authorization: `Bearer ${this.jwtToken}`, + }, + }) return response.data } catch (error) { return Promise.resolve(error) @@ -106,8 +102,7 @@ class MetaProvider extends ProviderClass { */ sendMessage = async (number, message, { options }) => { if (options?.buttons?.length) return console.log('Envio de botones') - if (options?.media) - return this.sendMedia(number, message, options.media) + if (options?.media) return this.sendMedia(number, message, options.media) this.sendtext(number, message) } diff --git a/packages/provider/src/meta/server.js b/packages/provider/src/meta/server.js index 3d6ef61..cbd59b0 100644 --- a/packages/provider/src/meta/server.js +++ b/packages/provider/src/meta/server.js @@ -81,9 +81,7 @@ class MetaWebHookServer extends EventEmitter { * @returns */ buildHTTPServer = () => { - this.metaServer - .use(urlencoded({ extended: true })) - .get('/webhook', this.verifyToken) + this.metaServer.use(urlencoded({ extended: true })).get('/webhook', this.verifyToken) this.metaServer .use(urlencoded({ extended: true })) @@ -99,9 +97,7 @@ class MetaWebHookServer extends EventEmitter { this.metaServer.listen(this.metaPort, () => { console.log(``) console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`) - console.log( - `[meta]: POST http://localhost:${this.metaPort}/webhook` - ) + console.log(`[meta]: POST http://localhost:${this.metaPort}/webhook`) console.log(`[meta]: Más información en la documentacion`) console.log(``) }) diff --git a/packages/provider/src/twilio/index.js b/packages/provider/src/twilio/index.js index 7c25bb9..e1a50dc 100644 --- a/packages/provider/src/twilio/index.js +++ b/packages/provider/src/twilio/index.js @@ -86,12 +86,8 @@ class TwilioProvider extends ProviderClass { */ sendButtons = async () => { console.log(``) - console.log( - `[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo` - ) - console.log( - `[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons` - ) + console.log(`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`) + console.log(`[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`) console.log(``) } @@ -104,10 +100,8 @@ class TwilioProvider extends ProviderClass { */ sendMessage = async (number, message, { options }) => { number = parseNumber(number) - if (options?.buttons?.length) - this.sendButtons(number, message, options.buttons) - if (options?.media) - return this.sendMedia(number, message, options.media) + if (options?.buttons?.length) this.sendButtons(number, message, options.buttons) + if (options?.media) return this.sendMedia(number, message, options.media) return this.vendor.messages.create({ body: message, from: `whatsapp:+${this.vendorNumber}`, diff --git a/packages/provider/src/twilio/server.js b/packages/provider/src/twilio/server.js index ae09da7..aaf49c2 100644 --- a/packages/provider/src/twilio/server.js +++ b/packages/provider/src/twilio/server.js @@ -51,9 +51,7 @@ class TwilioWebHookServer extends EventEmitter { this.twilioServer.listen(this.twilioPort, () => { console.log(``) console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`) - console.log( - `[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook` - ) + console.log(`[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`) console.log(`[Twilio]: Más información en la documentacion`) console.log(``) }) diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 3e1b630..1369af2 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -4,11 +4,7 @@ const { createWriteStream } = require('fs') const { Console } = require('console') const mime = require('mime-types') -const { - venomCleanNumber, - venomGenerateImage, - venomisValidNumber, -} = require('./utils') +const { venomCleanNumber, venomGenerateImage, venomisValidNumber } = require('./utils') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/venom.log`), @@ -108,8 +104,7 @@ class VenomProvider extends ProviderClass { const listEvents = this.busEvents() for (const { event, func } of listEvents) { - if (this.vendor[event]) - this.vendor[event]((payload) => func(payload)) + if (this.vendor[event]) this.vendor[event]((payload) => func(payload)) } } @@ -122,16 +117,13 @@ class VenomProvider extends ProviderClass { * @returns */ sendButtons = async (number, message, buttons = []) => { - const NOTE_VENOM_BUTTON = [ - `Actualmente VENOM tiene problemas con la API`, - `para el envio de Botones`, - ].join('\n') + const NOTE_VENOM_BUTTON = [`Actualmente VENOM tiene problemas con la API`, `para el envio de Botones`].join( + '\n' + ) console.log(`[NOTA]: ${NOTE_VENOM_BUTTON}`) - const buttonToStr = [message] - .concat(buttons.map((btn) => `${btn.body}`)) - .join(`\n`) + const buttonToStr = [message].concat(buttons.map((btn) => `${btn.body}`)).join(`\n`) return this.vendor.sendText(number, buttonToStr) // return this.vendor.sendButtons(number, "Title", buttons1, "Description"); } @@ -194,12 +186,9 @@ class VenomProvider extends ProviderClass { const fileDownloaded = await generalDownload(mediaUrl) const mimeType = mime.lookup(fileDownloaded) - if (mimeType.includes('image')) - return this.sendImage(number, fileDownloaded, text) - if (mimeType.includes('video')) - return this.sendVideo(number, fileDownloaded, text) - if (mimeType.includes('audio')) - return this.sendAudio(number, fileDownloaded) + if (mimeType.includes('image')) return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded) return this.sendFile(number, fileDownloaded, text) } @@ -213,10 +202,8 @@ class VenomProvider extends ProviderClass { */ sendMessage = async (userId, message, { options }) => { const number = venomCleanNumber(userId) - if (options?.buttons?.length) - return this.sendButtons(number, message, options.buttons) - if (options?.media) - return this.sendMedia(number, options.media, message) + if (options?.buttons?.length) return this.sendButtons(number, message, options.buttons) + if (options?.media) return this.sendMedia(number, options.media, message) return this.vendor.sendText(number, message) } } From 76ba717927a75b3d6299206aa0b8aee2bc25b726 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 4 Feb 2023 18:31:51 +0100 Subject: [PATCH 245/248] feat(provider): :zap: possible get class provider --- __test__/01-case.test.js | 7 +----- __test__/09-case.test.js | 41 +++++++++++++++++++++++++++++++++ packages/bot/core/core.class.js | 3 +++ 3 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 __test__/09-case.test.js diff --git a/__test__/01-case.test.js b/__test__/01-case.test.js index bce4a42..57ae08c 100644 --- a/__test__/01-case.test.js +++ b/__test__/01-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') test(`[Caso - 01] Flow Basico`, async () => { const [VALUE_A, VALUE_B] = ['hola', 'buenas'] diff --git a/__test__/09-case.test.js b/__test__/09-case.test.js new file mode 100644 index 0000000..417ce31 --- /dev/null +++ b/__test__/09-case.test.js @@ -0,0 +1,41 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_MOCK = require('../packages/provider/src/mock') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') + +let PROVIDER = undefined + +test(`[Caso - 09] Check provider WS`, async () => { + const [VALUE_A, VALUE_B] = ['hola', 'buenas'] + + const flow = addKeyword(VALUE_A).addAnswer(VALUE_B, null, async (_, { provider }) => { + PROVIDER = provider + }) + const provider = createProvider(PROVIDER_MOCK) + const database = new MOCK_DB() + + createBot({ + database, + flow: createFlow([flow]), + provider, + }) + + provider.delaySendMessage(100, 'message', { + from: '000', + body: VALUE_A, + }) + + await delay(100) + + const prevMsg = database.getPrevByNumber('000') + + assert.is(prevMsg.answer, VALUE_B) + assert.is(typeof PROVIDER.sendMessage, 'function') +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index a4a0cd0..29cf5d1 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -196,8 +196,11 @@ class CoreClass { // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo const cbEveryCtx = async (inRef) => { + const provider = this.providerClass + if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve() return this.flowClass.allCallbacks[inRef](messageCtxInComming, { + provider, fallBack, flowDynamic, endFlow, From 276fc0cf88d6a3ed2c0a2f0b4da61482c0e946b5 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 5 Feb 2023 15:01:32 +0100 Subject: [PATCH 246/248] chore(release): 0.1.20 --- CHANGELOG.md | 21 +++++++++++++++++++++ package.json | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0bdbfa..01adb7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.20](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.19...v0.1.20) (2023-02-05) + + +### Features + +* **cli:** :fire: add regex expression in addKeyworkd ([e34560c](https://github.com/leifermendez/bot-whatsapp/commit/e34560c77d4852d2e90930f0858e51aa67d4eeab)) +* **provider:** :zap: possible get class provider ([76ba717](https://github.com/leifermendez/bot-whatsapp/commit/76ba717927a75b3d6299206aa0b8aee2bc25b726)) + + +### Bug Fixes + +* **cli:** :zap: working flowDynamic test ([c0113ca](https://github.com/leifermendez/bot-whatsapp/commit/c0113ca49295aff220d8defcb53f2ba7f2872d75)) +* **cli:** :zap: working flowDynamic test ([aef52d2](https://github.com/leifermendez/bot-whatsapp/commit/aef52d2694fa6616d614338643db198b4f7f1fe8)) +* **cli:** :zap: working flowDynamic test ([f769320](https://github.com/leifermendez/bot-whatsapp/commit/f76932021ce968d93241b55cfcdb8ae0e0e6c934)) +* **cli:** :zap: working flowDynamic test ([23e09ef](https://github.com/leifermendez/bot-whatsapp/commit/23e09efaeccaf51018c55da492edff45b625f0a9)) +* **database:** add support emoji in mysql ([9311aa0](https://github.com/leifermendez/bot-whatsapp/commit/9311aa0a65623a1bf40e96207a281625154dae90)) +* **database:** fix naming ([cd082f2](https://github.com/leifermendez/bot-whatsapp/commit/cd082f235012cd5f5844c6437f51711beee0c865)) +* **database:** fix naming ([1afc3ba](https://github.com/leifermendez/bot-whatsapp/commit/1afc3ba182070713b5bec40eaab0fa1f680830cd)) +* **database:** fix naming ([c9831d2](https://github.com/leifermendez/bot-whatsapp/commit/c9831d202ab2c85f15a0247cd2a2426bc435270c)) +* **provider:** :zap: baily wa.link ([96c2bff](https://github.com/leifermendez/bot-whatsapp/commit/96c2bffd093269be8e39474a84c156938504a6cb)) + ### [0.1.19](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.18...v0.1.19) (2023-01-29) diff --git a/package.json b/package.json index 30e3cf4..cc0b21a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.19", + "version": "0.1.20", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From c0ece6feb2b0325476880a604c32de341eb60544 Mon Sep 17 00:00:00 2001 From: Zamphi <40876040+mistertito86@users.noreply.github.com> Date: Wed, 8 Feb 2023 17:50:21 -0300 Subject: [PATCH 247/248] feat(provider): :zap: add location provider --- __test__/02-case.test.js | 7 +- __test__/03-case.test.js | 11 +- __test__/04-case.test.js | 7 +- __test__/06-case.test.js | 38 +- changelog.config.js | 31 +- packages/provider/src/baileys/index.js | 9 + packages/provider/src/venom/index.js | 8 +- packages/provider/src/web-whatsapp/index.js | 5 + scripts/checker.js | 54 +- scripts/github.js | 3 +- scripts/move.js | 9 +- scripts/release.js | 41 +- starters/apps/base-baileys-json/app.js | 23 +- starters/apps/base-baileys-memory/app.js | 23 +- starters/apps/base-baileys-mongo/app.js | 23 +- starters/apps/base-baileys-mysql/app.js | 23 +- starters/apps/base-meta-json/app.js | 23 +- starters/apps/base-meta-memory/app.js | 23 +- starters/apps/base-meta-mongo/app.js | 23 +- starters/apps/base-meta-mysql/app.js | 23 +- starters/apps/base-twilio-json/app.js | 23 +- starters/apps/base-twilio-memory/app.js | 23 +- starters/apps/base-twilio-mongo/app.js | 23 +- starters/apps/base-twilio-mysql/app.js | 23 +- starters/apps/base-venom-json/app.js | 23 +- starters/apps/base-venom-memory/app.js | 23 +- starters/apps/base-venom-mongo/app.js | 23 +- starters/apps/base-venom-mysql/app.js | 23 +- starters/apps/base-wweb-json/app.js | 23 +- starters/apps/base-wweb-memory/app.js | 23 +- starters/apps/base-wweb-mongo/app.js | 23 +- starters/apps/base-wweb-mysql/app.js | 23 +- yarn.lock | 2476 ++++++++++--------- 33 files changed, 1422 insertions(+), 1737 deletions(-) diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js index a2a93ec..855a566 100644 --- a/__test__/02-case.test.js +++ b/__test__/02-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') /** * Falsear peticion async diff --git a/__test__/03-case.test.js b/__test__/03-case.test.js index 45c399a..646b5d5 100644 --- a/__test__/03-case.test.js +++ b/__test__/03-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') test(`[Caso - 03] Flow puro`, async () => { const MOCK_VALUES = ['Bienvenido a mi tienda', 'Como estas?'] @@ -15,9 +10,7 @@ test(`[Caso - 03] Flow puro`, async () => { const provider = createProvider(PROVIDER_DB) const database = new MOCK_DB() - const flujoPrincipal = addKeyword(['hola']) - .addAnswer(MOCK_VALUES[0]) - .addAnswer(MOCK_VALUES[1]) + const flujoPrincipal = addKeyword(['hola']).addAnswer(MOCK_VALUES[0]).addAnswer(MOCK_VALUES[1]) createBot({ database, diff --git a/__test__/04-case.test.js b/__test__/04-case.test.js index 2291a0c..8fcaeda 100644 --- a/__test__/04-case.test.js +++ b/__test__/04-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') /** * Falsear peticion async diff --git a/__test__/06-case.test.js b/__test__/06-case.test.js index c68679e..355cbd4 100644 --- a/__test__/06-case.test.js +++ b/__test__/06-case.test.js @@ -2,12 +2,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') const MOCK_DB = require('../packages/database/src/mock') const PROVIDER_DB = require('../packages/provider/src/mock') -const { - addKeyword, - createBot, - createFlow, - createProvider, -} = require('../packages/bot/index') +const { addKeyword, createBot, createFlow, createProvider } = require('../packages/bot/index') /** * Falsear peticion async @@ -21,11 +16,7 @@ const fakeHTTP = async (fakeData = []) => { } test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { - const MOCK_VALUES = [ - '¿CUal es tu email?', - 'Continuamos....', - '¿Cual es tu edad?', - ] + const MOCK_VALUES = ['¿CUal es tu email?', 'Continuamos....', '¿Cual es tu edad?'] const provider = createProvider(PROVIDER_DB) const database = new MOCK_DB() @@ -39,9 +30,7 @@ test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { const validation = ctx.body.includes('@') if (validation) { - const getDataFromApi = await fakeHTTP([ - 'Gracias por tu email se ha validado de manera correcta', - ]) + const getDataFromApi = await fakeHTTP(['Gracias por tu email se ha validado de manera correcta']) return flowDynamic(getDataFromApi) } return fallBack(validation) @@ -50,17 +39,13 @@ test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { .addAnswer(MOCK_VALUES[1], null, async (_, { endFlow }) => { return endFlow() }) - .addAnswer( - MOCK_VALUES[2], - { capture: true }, - async (ctx, { flowDynamic, fallBack }) => { - if (ctx.body !== '18') { - await delay(50) - return fallBack(false, 'Ups creo que no eres mayor de edad') - } - return flowDynamic('Bien tu edad es correcta!') + .addAnswer(MOCK_VALUES[2], { capture: true }, async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') } - ) + return flowDynamic('Bien tu edad es correcta!') + }) .addAnswer('Puedes pasar') createBot({ @@ -95,10 +80,7 @@ test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { assert.is('this is not email value', getHistory[1]) assert.is(MOCK_VALUES[0], getHistory[2]) assert.is('test@test.com', getHistory[3]) - assert.is( - '1 Gracias por tu email se ha validado de manera correcta', - getHistory[4] - ) + assert.is('1 Gracias por tu email se ha validado de manera correcta', getHistory[4]) assert.is(MOCK_VALUES[1], getHistory[5]) assert.is('20', getHistory[6]) assert.is(undefined, getHistory[7]) diff --git a/changelog.config.js b/changelog.config.js index 70a500d..38c6f74 100644 --- a/changelog.config.js +++ b/changelog.config.js @@ -1,28 +1,10 @@ module.exports = { disableEmoji: false, format: '{type}{scope}: {emoji}{subject}', - list: [ - 'test', - 'feat', - 'fix', - 'chore', - 'docs', - 'refactor', - 'style', - 'ci', - 'perf', - ], + list: ['test', 'feat', 'fix', 'chore', 'docs', 'refactor', 'style', 'ci', 'perf'], maxMessageLength: 64, minMessageLength: 3, - questions: [ - 'type', - 'scope', - 'subject', - 'body', - 'breaking', - 'issues', - 'lerna', - ], + questions: ['type', 'scope', 'subject', 'body', 'breaking', 'issues', 'lerna'], scopes: [], types: { chore: { @@ -56,8 +38,7 @@ module.exports = { value: 'perf', }, refactor: { - description: - 'A code change that neither fixes a bug or adds a feature', + description: 'A code change that neither fixes a bug or adds a feature', emoji: '(💡)', value: 'refactor', }, @@ -67,8 +48,7 @@ module.exports = { value: 'release', }, style: { - description: - 'Markup, white-space, formatting, missing semi-colons...', + description: 'Markup, white-space, formatting, missing semi-colons...', emoji: '(💄)', value: 'style', }, @@ -80,8 +60,7 @@ module.exports = { messages: { type: "Select the type of change that you're committing:", customScope: 'Select the scope this component affects:', - subject: - 'Write a short, imperative mood description of the change:\n', + subject: 'Write a short, imperative mood description of the change:\n', body: 'Provide a longer description of the change:\n ', breaking: 'List any breaking changes:\n', footer: 'Issues this commit closes, e.g #123:', diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 7a5de23..d98bd27 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -115,12 +115,21 @@ class BaileysProvider extends ProviderClass { func: ({ messages, type }) => { if (type !== 'notify') return const [messageCtx] = messages + console.log(messageCtx) let payload = { ...messageCtx, body: messageCtx?.message?.extendedTextMessage?.text ?? messageCtx?.message?.conversation, + from: messageCtx?.key?.remoteJid, } + if (messageCtx.message.locationMessage) { + const { degreesLatitude, degreesLongitude } = messageCtx.message.locationMessage + if (typeof degreesLatitude === 'number' && typeof degreesLongitude === 'number') { + payload = { ...payload, body: `${degreesLatitude},${degreesLongitude}` } + } + } + if (payload.from === 'status@broadcast') return if (payload?.key?.fromMe) return diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 1369af2..02918de 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -85,11 +85,17 @@ class VenomProvider extends ProviderClass { if (payload.from === 'status@broadcast') { return } - if (!venomisValidNumber(payload.from)) { return } payload.from = venomCleanNumber(payload.from, true) + if (payload.hasOwnProperty('lat') && payload.hasOwnProperty('lng')) { + const lat = payload.lat + const lng = payload.lng + if (lat !== '' && lng !== '') { + payload = { ...payload, body: `${lat},${lng}` } + } + } this.emit('message', payload) }, }, diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 9fef93c..6e822e5 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -90,6 +90,11 @@ class WebWhatsappProvider extends ProviderClass { return } payload.from = wwebCleanNumber(payload.from, true) + if (payload._data.lat && payload._data.lng) { + let lat = payload._data.lat + let lng = payload._data.lng + payload = { ...payload, body: `${lat},${lng}` } + } this.emit('message', payload) }, }, diff --git a/scripts/checker.js b/scripts/checker.js index b68cd57..3cb4329 100644 --- a/scripts/checker.js +++ b/scripts/checker.js @@ -18,13 +18,9 @@ const [PKG_NAME, PKG_STABLE] = process.argv.slice(2) || [null, null] * @param {*} pkgName */ const checkPkg = async (pkgName = '') => { - const { stdout } = await cmd( - NPM_COMMAND, - ['show', `${pkgName}`, 'version'], - { - stdio: 'inherit', - } - ) + const { stdout } = await cmd(NPM_COMMAND, ['show', `${pkgName}`, 'version'], { + stdio: 'inherit', + }) return stdout.trim().replace('\n', '') } @@ -36,12 +32,7 @@ const checkPkg = async (pkgName = '') => { const checkPkgStable = async (pkgName = '', version = '') => { const { stdout } = await cmd( NPM_COMMAND, - [ - 'show', - `${pkgName}@${version.split('.').shift()}.*`, - 'version', - '--json', - ], + ['show', `${pkgName}@${version.split('.').shift()}.*`, 'version', '--json'], { stdio: 'inherit', } @@ -65,17 +56,14 @@ const checkPkgStable = async (pkgName = '', version = '') => { * @returns */ const checkEveryProvider = async (provider = '', stable = true) => { - const pkgDependencies = readFileSync( - join(PATH_PACKAGES, 'provider', 'src', provider, 'package.json') - ) + const pkgDependencies = readFileSync(join(PATH_PACKAGES, 'provider', 'src', provider, 'package.json')) try { const { dependencies } = JSON.parse(pkgDependencies) const devParse = Object.entries(dependencies) const newDevParse = {} for (const [pkgName, pkgVersion] of devParse) { if (!stable) newDevParse[pkgName] = await checkPkg(pkgName) - if (stable) - newDevParse[pkgName] = await checkPkgStable(pkgName, pkgVersion) + if (stable) newDevParse[pkgName] = await checkPkgStable(pkgName, pkgVersion) console.log(newDevParse) } @@ -93,25 +81,12 @@ const checkEveryProvider = async (provider = '', stable = true) => { * @returns */ const updateDependencies = async (provider = '', list = {}) => { - const pathProvider = join( - PATH_PACKAGES, - 'provider', - 'src', - provider, - 'package.json' - ) + const pathProvider = join(PATH_PACKAGES, 'provider', 'src', provider, 'package.json') try { const pkgDependencies = readFileSync(pathProvider) const { dependencies } = JSON.parse(pkgDependencies) - writeFileSync( - pathProvider, - JSON.stringify( - { dependencies: { ...dependencies, ...list } }, - null, - 2 - ) - ) + writeFileSync(pathProvider, JSON.stringify({ dependencies: { ...dependencies, ...list } }, null, 2)) } catch (e) { console.log(e) return {} @@ -125,15 +100,11 @@ const updateDependencies = async (provider = '', list = {}) => { */ const updateStarters = async (provider = '', updateDev = {}) => { provider = provider === 'web-whatsapp' ? 'wweb' : provider - const allStarters = readdirSync(PATH_STARTERS).filter((n) => - n.includes(provider) - ) + const allStarters = readdirSync(PATH_STARTERS).filter((n) => n.includes(provider)) try { for (const base of allStarters) { - const pkgDependenciesBase = readFileSync( - join(PATH_STARTERS, base, 'package.json') - ) + const pkgDependenciesBase = readFileSync(join(PATH_STARTERS, base, 'package.json')) const pkgBase = JSON.parse(pkgDependenciesBase) writeFileSync( join(PATH_STARTERS, base, 'package.json'), @@ -157,10 +128,7 @@ const main = async () => { if (PKG_NAME) { const providerName = PKG_NAME ? PKG_NAME.split('=').at(1) : null const providerStable = PKG_STABLE ? PKG_STABLE.split('=').at(1) : null - const list = await checkEveryProvider( - providerName, - providerStable === 'true' - ) + const list = await checkEveryProvider(providerName, providerStable === 'true') await updateDependencies(providerName, list) await updateStarters(providerName, list) } diff --git a/scripts/github.js b/scripts/github.js index 9277d83..71e8eac 100644 --- a/scripts/github.js +++ b/scripts/github.js @@ -39,8 +39,7 @@ const main = async () => { const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null const pkgNumber = PKG_ARG ? PKG_ARG.split('=').at(1) : null - if (pkgNumber) - await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) + if (pkgNumber) await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } diff --git a/scripts/move.js b/scripts/move.js index e59897b..f77fb38 100644 --- a/scripts/move.js +++ b/scripts/move.js @@ -10,14 +10,7 @@ const copyLibPkg = async (pkgName, to) => { await fs.copy(FROM, TO) } -const listLib = [ - 'create-bot-whatsapp', - 'bot', - 'database', - 'provider', - 'contexts', - 'portal', -] +const listLib = ['create-bot-whatsapp', 'bot', 'database', 'provider', 'contexts', 'portal'] const main = async () => { for (const iterator of listLib) { diff --git a/scripts/release.js b/scripts/release.js index 9dfcc62..5353e81 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -18,14 +18,10 @@ const cmd = util.promisify(execFile) */ const npmToken = (token = null) => new Promise((resolve, reject) => { - writeFile( - `${process.cwd()}/.npmrc`, - `//registry.npmjs.org/:_authToken=${token}`, - (error) => { - if (error) reject(error) - resolve() - } - ) + writeFile(`${process.cwd()}/.npmrc`, `//registry.npmjs.org/:_authToken=${token}`, (error) => { + if (error) reject(error) + resolve() + }) }) /** @@ -66,18 +62,11 @@ const updateVersion = async (packageName = null, number = null) => { const pkgJsonObject = readPackage(packageName) const { version } = pkgJsonObject - const newVersion = !number - ? semver.inc(version, 'prepatch', 'alpha') - : `${number}` + const newVersion = !number ? semver.inc(version, 'prepatch', 'alpha') : `${number}` - if (!semver.valid(newVersion)) - throw new Error(`VERSION_ERROR: ${newVersion}`) + if (!semver.valid(newVersion)) throw new Error(`VERSION_ERROR: ${newVersion}`) - const newPkgJson = JSON.stringify( - { ...pkgJsonObject, version: newVersion }, - null, - 2 - ) + const newPkgJson = JSON.stringify({ ...pkgJsonObject, version: newVersion }, null, 2) await updatePackage(packageName, newPkgJson) return { version: newVersion } } @@ -92,14 +81,10 @@ const checkExistVersion = async (packageName = null, version = null) => { try { const pkgJson = join(PATH_PACKAGES, packageName) const pkgJsonObject = readPackage(packageName) - const { stdout } = await cmd( - NPM_COMMAND, - ['view', `${pkgJsonObject.name}@${version}`], - { - stdio: 'inherit', - cwd: pkgJson, - } - ) + const { stdout } = await cmd(NPM_COMMAND, ['view', `${pkgJsonObject.name}@${version}`], { + stdio: 'inherit', + cwd: pkgJson, + }) return true } catch (e) { return false @@ -149,9 +134,7 @@ const main = async () => { let EXIST_VERSION = true const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null - const pkgNumber = PKG_ARG_VERSION - ? PKG_ARG_VERSION.split('=').at(1) - : null + const pkgNumber = PKG_ARG_VERSION ? PKG_ARG_VERSION.split('=').at(1) : null if (tokenNpm) await npmToken(tokenNpm) while (EXIST_VERSION) { diff --git a/starters/apps/base-baileys-json/app.js b/starters/apps/base-baileys-json/app.js index b06887c..5fc0ba1 100644 --- a/starters/apps/base-baileys-json/app.js +++ b/starters/apps/base-baileys-json/app.js @@ -1,23 +1,12 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const JsonFileAdapter = require('@bot-whatsapp/database/json') -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -53,11 +42,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index 3d05e79..7b07e11 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -1,23 +1,12 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -53,11 +42,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 2de3ad6..048fa5c 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') @@ -28,15 +23,9 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -72,11 +61,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index d3dbbe5..2b3a2fe 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') @@ -29,15 +24,9 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -73,11 +62,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-meta-json/app.js b/starters/apps/base-meta-json/app.js index cc4c7ac..4bc73e1 100644 --- a/starters/apps/base-meta-json/app.js +++ b/starters/apps/base-meta-json/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const MetaProvider = require('@bot-whatsapp/provider/meta') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -20,15 +15,9 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -64,11 +53,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-meta-memory/app.js b/starters/apps/base-meta-memory/app.js index c8201e8..94c5e43 100644 --- a/starters/apps/base-meta-memory/app.js +++ b/starters/apps/base-meta-memory/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const MetaProvider = require('@bot-whatsapp/provider/meta') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -20,15 +15,9 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -64,11 +53,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-meta-mongo/app.js b/starters/apps/base-meta-mongo/app.js index 18cd9ac..c287df4 100644 --- a/starters/apps/base-meta-mongo/app.js +++ b/starters/apps/base-meta-mongo/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const MetaProvider = require('@bot-whatsapp/provider/meta') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -27,15 +22,9 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -71,11 +60,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-meta-mysql/app.js b/starters/apps/base-meta-mysql/app.js index 102f977..1c2ff53 100644 --- a/starters/apps/base-meta-mysql/app.js +++ b/starters/apps/base-meta-mysql/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const MetaProvider = require('@bot-whatsapp/provider/meta') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -28,15 +23,9 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -72,11 +61,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-twilio-json/app.js b/starters/apps/base-twilio-json/app.js index 047a126..28cbbbe 100644 --- a/starters/apps/base-twilio-json/app.js +++ b/starters/apps/base-twilio-json/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const TwilioProvider = require('@bot-whatsapp/provider/twilio') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -20,15 +15,9 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -64,11 +53,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-twilio-memory/app.js b/starters/apps/base-twilio-memory/app.js index cc1d16b..db712e8 100644 --- a/starters/apps/base-twilio-memory/app.js +++ b/starters/apps/base-twilio-memory/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const TwilioProvider = require('@bot-whatsapp/provider/twilio') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -20,15 +15,9 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -64,11 +53,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-twilio-mongo/app.js b/starters/apps/base-twilio-mongo/app.js index dcabb99..41f22cb 100644 --- a/starters/apps/base-twilio-mongo/app.js +++ b/starters/apps/base-twilio-mongo/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const TwilioProvider = require('@bot-whatsapp/provider/twilio') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -27,15 +22,9 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -71,11 +60,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-twilio-mysql/app.js b/starters/apps/base-twilio-mysql/app.js index 4725cd3..2a9eaa3 100644 --- a/starters/apps/base-twilio-mysql/app.js +++ b/starters/apps/base-twilio-mysql/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const TwilioProvider = require('@bot-whatsapp/provider/twilio') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -29,15 +24,9 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -73,11 +62,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index 120deee..1b07b6b 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') @@ -21,15 +16,9 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -65,11 +54,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 8402cf9..fc68953 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') @@ -21,15 +16,9 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -65,11 +54,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index 2f4f16a..7bec798 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') @@ -28,15 +23,9 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -72,11 +61,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index 8c5c2db..48a47c8 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') @@ -30,15 +25,9 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -74,11 +63,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 729ac2a..77ca714 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') @@ -21,15 +16,9 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -65,11 +54,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index d6a567a..bdec9f9 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') @@ -21,15 +16,9 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -65,11 +54,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index a8e8aad..361cbe8 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') @@ -28,15 +23,9 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -72,11 +61,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 68f7f37..97ceadc 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -1,9 +1,4 @@ -const { - createBot, - createProvider, - createFlow, - addKeyword, -} = require('@bot-whatsapp/bot') +const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') @@ -30,15 +25,9 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ - '📄 Aquí tenemos el flujo secundario', -]) +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer(['📄 Aquí tenemos el flujo secundario']) -const flowDocs = addKeyword([ - 'doc', - 'documentacion', - 'documentación', -]).addAnswer( +const flowDocs = addKeyword(['doc', 'documentacion', 'documentación']).addAnswer( [ '📄 Aquí encontras las documentación recuerda que puedes mejorarla', 'https://bot-whatsapp.netlify.app/', @@ -74,11 +63,7 @@ const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( ) const flowDiscord = addKeyword(['discord']).addAnswer( - [ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', - '\n*2* Para siguiente paso.', - ], + ['🤪 Únete al discord', 'https://link.codigoencasa.com/DISCORD', '\n*2* Para siguiente paso.'], null, null, [flowSecundario] diff --git a/yarn.lock b/yarn.lock index 9ab59a0..fb2e259 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,429 +12,415 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/ie11-detection@npm:^2.0.0": - version: 2.0.2 - resolution: "@aws-crypto/ie11-detection@npm:2.0.2" +"@aws-crypto/ie11-detection@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/ie11-detection@npm:3.0.0" dependencies: tslib: ^1.11.1 - checksum: 713293deea8eefd3ab43dc05e62228571d27754e7293f8ec2fd8a0c693fbbfc55213e6599387776e3cdbc951965dc62e24e92b9c4a853e4a50d00ae6a9f6b2bd + checksum: 299b2ddd46eddac1f2d54d91386ceb37af81aef8a800669281c73d634ed17fd855dcfb8b3157f2879344b93a2666a6d602550eb84b71e4d7868100ad6da8f803 languageName: node linkType: hard -"@aws-crypto/sha256-browser@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/sha256-browser@npm:2.0.0" +"@aws-crypto/sha256-browser@npm:3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-browser@npm:3.0.0" dependencies: - "@aws-crypto/ie11-detection": ^2.0.0 - "@aws-crypto/sha256-js": ^2.0.0 - "@aws-crypto/supports-web-crypto": ^2.0.0 - "@aws-crypto/util": ^2.0.0 - "@aws-sdk/types": ^3.1.0 + "@aws-crypto/ie11-detection": ^3.0.0 + "@aws-crypto/sha256-js": ^3.0.0 + "@aws-crypto/supports-web-crypto": ^3.0.0 + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 "@aws-sdk/util-locate-window": ^3.0.0 "@aws-sdk/util-utf8-browser": ^3.0.0 tslib: ^1.11.1 - checksum: 7bc1ff042d0c53a46c0fc3824bd97fb3ed1df7dc030b8a995889471052860b8c8ade469c97866fafd8249a3144d0f48b0f1054f357e2b403606009381c4b8f0e + checksum: ca89456bf508db2e08060a7f656460db97ac9a15b11e39d6fa7665e2b156508a1758695bff8e82d0a00178d6ac5c36f35eb4bcfac2e48621265224ca14a19bd2 languageName: node linkType: hard -"@aws-crypto/sha256-js@npm:2.0.0": - version: 2.0.0 - resolution: "@aws-crypto/sha256-js@npm:2.0.0" +"@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/sha256-js@npm:3.0.0" dependencies: - "@aws-crypto/util": ^2.0.0 - "@aws-sdk/types": ^3.1.0 + "@aws-crypto/util": ^3.0.0 + "@aws-sdk/types": ^3.222.0 tslib: ^1.11.1 - checksum: e4abf9baec6bed19d380f92a999a41ac5bdd8890dfd45971d29054c298854c5b7087e7de633413f2e64618ef8238ccf4c0b75797c73063c74bbba3cb5d8b2581 + checksum: 644ded32ea310237811afae873d3c7320739cb6f6cc39dced9c94801379e68e5ee2cca0c34f0384793fa9e750a7e0a5e2468f95754bd08e6fd72ab833c8fe23c languageName: node linkType: hard -"@aws-crypto/sha256-js@npm:^2.0.0": - version: 2.0.2 - resolution: "@aws-crypto/sha256-js@npm:2.0.2" - dependencies: - "@aws-crypto/util": ^2.0.2 - "@aws-sdk/types": ^3.110.0 - tslib: ^1.11.1 - checksum: 9125ec65a2b05fce908ac2289ba97b995a299f2d717684804211df8e8bcffd8cd9b8861582240655b88f2255c46fcee34026f75c057ffb22f44b6a76cd43f65a - languageName: node - linkType: hard - -"@aws-crypto/supports-web-crypto@npm:^2.0.0": - version: 2.0.2 - resolution: "@aws-crypto/supports-web-crypto@npm:2.0.2" +"@aws-crypto/supports-web-crypto@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" dependencies: tslib: ^1.11.1 - checksum: 03d04d29292dc1b76db9bc6becd05f52fa79adee0ec084f971b0767f7e73250dd0422bea57636015f8c27f38aefcd1d9c58800a4749cf35339296c8d670f3ccb + checksum: 35479a1558db9e9a521df6877a99f95670e972c602f2a0349303477e5d638a5baf569fb037c853710e382086e6fd77e8ed58d3fb9b49f6e1186a9d26ce7be006 languageName: node linkType: hard -"@aws-crypto/util@npm:^2.0.0, @aws-crypto/util@npm:^2.0.2": - version: 2.0.2 - resolution: "@aws-crypto/util@npm:2.0.2" +"@aws-crypto/util@npm:^3.0.0": + version: 3.0.0 + resolution: "@aws-crypto/util@npm:3.0.0" dependencies: - "@aws-sdk/types": ^3.110.0 + "@aws-sdk/types": ^3.222.0 "@aws-sdk/util-utf8-browser": ^3.0.0 tslib: ^1.11.1 - checksum: 13cb33a39005b09c062398d361043c2224bc8ba42b1432bad52e15bc4bf9ffad4facdddc394b3cc71b3fb8d86a7ec325fd1afa107b5fde0dab84a7e32d311d7f + checksum: d29d5545048721aae3d60b236708535059733019a105f8a64b4e4a8eab7cf8dde1546dc56bff7de20d36140a4d1f0f4693e639c5732a7059273a7b1e56354776 languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/abort-controller@npm:3.226.0" +"@aws-sdk/abort-controller@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/abort-controller@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 44045b60c7697ed76bcbfbe3f7f4bb019f139d2337e77d8ce79d98bca17c1245e2d33934bba04fe8e2d462b729124ba4414a589ed9275c07f2bfefd3a0850184 + checksum: d14202fdeb372c9b7308d601a6d5b7efc5ad5524e9b14545c556c9c0aae1a0917fb3c3ae86e7f2a968c6d1ff796be24a9338492b73ea64708277436ce4165982 languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.245.0" +"@aws-sdk/client-cognito-identity@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.266.0" dependencies: - "@aws-crypto/sha256-browser": 2.0.0 - "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/client-sts": 3.245.0 - "@aws-sdk/config-resolver": 3.234.0 - "@aws-sdk/credential-provider-node": 3.245.0 - "@aws-sdk/fetch-http-handler": 3.226.0 - "@aws-sdk/hash-node": 3.226.0 - "@aws-sdk/invalid-dependency": 3.226.0 - "@aws-sdk/middleware-content-length": 3.226.0 - "@aws-sdk/middleware-endpoint": 3.226.0 - "@aws-sdk/middleware-host-header": 3.226.0 - "@aws-sdk/middleware-logger": 3.226.0 - "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.235.0 - "@aws-sdk/middleware-serde": 3.226.0 - "@aws-sdk/middleware-signing": 3.226.0 - "@aws-sdk/middleware-stack": 3.226.0 - "@aws-sdk/middleware-user-agent": 3.226.0 - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/node-http-handler": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.234.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.266.0 + "@aws-sdk/config-resolver": 3.266.0 + "@aws-sdk/credential-provider-node": 3.266.0 + "@aws-sdk/fetch-http-handler": 3.266.0 + "@aws-sdk/hash-node": 3.266.0 + "@aws-sdk/invalid-dependency": 3.266.0 + "@aws-sdk/middleware-content-length": 3.266.0 + "@aws-sdk/middleware-endpoint": 3.266.0 + "@aws-sdk/middleware-host-header": 3.266.0 + "@aws-sdk/middleware-logger": 3.266.0 + "@aws-sdk/middleware-recursion-detection": 3.266.0 + "@aws-sdk/middleware-retry": 3.266.0 + "@aws-sdk/middleware-serde": 3.266.0 + "@aws-sdk/middleware-signing": 3.266.0 + "@aws-sdk/middleware-stack": 3.266.0 + "@aws-sdk/middleware-user-agent": 3.266.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/node-http-handler": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/smithy-client": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.234.0 - "@aws-sdk/util-defaults-mode-node": 3.234.0 - "@aws-sdk/util-endpoints": 3.245.0 - "@aws-sdk/util-retry": 3.229.0 - "@aws-sdk/util-user-agent-browser": 3.226.0 - "@aws-sdk/util-user-agent-node": 3.226.0 - "@aws-sdk/util-utf8-browser": 3.188.0 - "@aws-sdk/util-utf8-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.266.0 + "@aws-sdk/util-defaults-mode-node": 3.266.0 + "@aws-sdk/util-endpoints": 3.266.0 + "@aws-sdk/util-retry": 3.266.0 + "@aws-sdk/util-user-agent-browser": 3.266.0 + "@aws-sdk/util-user-agent-node": 3.266.0 + "@aws-sdk/util-utf8": 3.254.0 tslib: ^2.3.1 - checksum: 4142ba1b7a3c11f785d5da527a743d6a9352f6f97ae983e6f3ee0abf5a1cd755c2196981cbc2f6052686bf820a68f062117c682a5126e55acaacebc5cab862e6 + checksum: 69caa7eebc2107aa16fcb1aaa1de7767b31901f07f2cf7b875b9a8b80612d29ccd04d05b58af194d1e405ac917b0f7280e43f10c3fb497119b2315043958706d languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.245.0" +"@aws-sdk/client-sso-oidc@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.266.0" dependencies: - "@aws-crypto/sha256-browser": 2.0.0 - "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.234.0 - "@aws-sdk/fetch-http-handler": 3.226.0 - "@aws-sdk/hash-node": 3.226.0 - "@aws-sdk/invalid-dependency": 3.226.0 - "@aws-sdk/middleware-content-length": 3.226.0 - "@aws-sdk/middleware-endpoint": 3.226.0 - "@aws-sdk/middleware-host-header": 3.226.0 - "@aws-sdk/middleware-logger": 3.226.0 - "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.235.0 - "@aws-sdk/middleware-serde": 3.226.0 - "@aws-sdk/middleware-stack": 3.226.0 - "@aws-sdk/middleware-user-agent": 3.226.0 - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/node-http-handler": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.234.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.266.0 + "@aws-sdk/fetch-http-handler": 3.266.0 + "@aws-sdk/hash-node": 3.266.0 + "@aws-sdk/invalid-dependency": 3.266.0 + "@aws-sdk/middleware-content-length": 3.266.0 + "@aws-sdk/middleware-endpoint": 3.266.0 + "@aws-sdk/middleware-host-header": 3.266.0 + "@aws-sdk/middleware-logger": 3.266.0 + "@aws-sdk/middleware-recursion-detection": 3.266.0 + "@aws-sdk/middleware-retry": 3.266.0 + "@aws-sdk/middleware-serde": 3.266.0 + "@aws-sdk/middleware-stack": 3.266.0 + "@aws-sdk/middleware-user-agent": 3.266.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/node-http-handler": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/smithy-client": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.234.0 - "@aws-sdk/util-defaults-mode-node": 3.234.0 - "@aws-sdk/util-endpoints": 3.245.0 - "@aws-sdk/util-retry": 3.229.0 - "@aws-sdk/util-user-agent-browser": 3.226.0 - "@aws-sdk/util-user-agent-node": 3.226.0 - "@aws-sdk/util-utf8-browser": 3.188.0 - "@aws-sdk/util-utf8-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.266.0 + "@aws-sdk/util-defaults-mode-node": 3.266.0 + "@aws-sdk/util-endpoints": 3.266.0 + "@aws-sdk/util-retry": 3.266.0 + "@aws-sdk/util-user-agent-browser": 3.266.0 + "@aws-sdk/util-user-agent-node": 3.266.0 + "@aws-sdk/util-utf8": 3.254.0 tslib: ^2.3.1 - checksum: 6f72ee0df276f8c4019be4d9b3fa1b2cbab7744b13f434f07c9314303290334296be1148276266715ef3cfb37e83ced448fd9d6bb34d09bd21ed41d0a83598dc + checksum: c2eaf96bed90b9f4dc04dbb02ecdbe1133dc0a4362db39f06fa4b3cb2281dfbeb1e70064e0ce8a3736425d35f4db9dec92d87ca0e39421c6c8bca3b166bc8e40 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/client-sso@npm:3.245.0" +"@aws-sdk/client-sso@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/client-sso@npm:3.266.0" dependencies: - "@aws-crypto/sha256-browser": 2.0.0 - "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.234.0 - "@aws-sdk/fetch-http-handler": 3.226.0 - "@aws-sdk/hash-node": 3.226.0 - "@aws-sdk/invalid-dependency": 3.226.0 - "@aws-sdk/middleware-content-length": 3.226.0 - "@aws-sdk/middleware-endpoint": 3.226.0 - "@aws-sdk/middleware-host-header": 3.226.0 - "@aws-sdk/middleware-logger": 3.226.0 - "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.235.0 - "@aws-sdk/middleware-serde": 3.226.0 - "@aws-sdk/middleware-stack": 3.226.0 - "@aws-sdk/middleware-user-agent": 3.226.0 - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/node-http-handler": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.234.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.266.0 + "@aws-sdk/fetch-http-handler": 3.266.0 + "@aws-sdk/hash-node": 3.266.0 + "@aws-sdk/invalid-dependency": 3.266.0 + "@aws-sdk/middleware-content-length": 3.266.0 + "@aws-sdk/middleware-endpoint": 3.266.0 + "@aws-sdk/middleware-host-header": 3.266.0 + "@aws-sdk/middleware-logger": 3.266.0 + "@aws-sdk/middleware-recursion-detection": 3.266.0 + "@aws-sdk/middleware-retry": 3.266.0 + "@aws-sdk/middleware-serde": 3.266.0 + "@aws-sdk/middleware-stack": 3.266.0 + "@aws-sdk/middleware-user-agent": 3.266.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/node-http-handler": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/smithy-client": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.234.0 - "@aws-sdk/util-defaults-mode-node": 3.234.0 - "@aws-sdk/util-endpoints": 3.245.0 - "@aws-sdk/util-retry": 3.229.0 - "@aws-sdk/util-user-agent-browser": 3.226.0 - "@aws-sdk/util-user-agent-node": 3.226.0 - "@aws-sdk/util-utf8-browser": 3.188.0 - "@aws-sdk/util-utf8-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.266.0 + "@aws-sdk/util-defaults-mode-node": 3.266.0 + "@aws-sdk/util-endpoints": 3.266.0 + "@aws-sdk/util-retry": 3.266.0 + "@aws-sdk/util-user-agent-browser": 3.266.0 + "@aws-sdk/util-user-agent-node": 3.266.0 + "@aws-sdk/util-utf8": 3.254.0 tslib: ^2.3.1 - checksum: e7dd235ee13465438a181c5de2f5bfc1acdaa12a07db74a3255dbb580004c33544d6773252b164dda2e2357ea83f3985afd060dfe42d6064732d36750764eda1 + checksum: 94cdfbcaaa55782fc430c2488e8d31da0cd0dcf38ac2dbedf44910cba8b8f0beb3651764d62c4eea248c07acf70d5aa6118493743b87cd9a426c147756704ad7 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/client-sts@npm:3.245.0" +"@aws-sdk/client-sts@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/client-sts@npm:3.266.0" dependencies: - "@aws-crypto/sha256-browser": 2.0.0 - "@aws-crypto/sha256-js": 2.0.0 - "@aws-sdk/config-resolver": 3.234.0 - "@aws-sdk/credential-provider-node": 3.245.0 - "@aws-sdk/fetch-http-handler": 3.226.0 - "@aws-sdk/hash-node": 3.226.0 - "@aws-sdk/invalid-dependency": 3.226.0 - "@aws-sdk/middleware-content-length": 3.226.0 - "@aws-sdk/middleware-endpoint": 3.226.0 - "@aws-sdk/middleware-host-header": 3.226.0 - "@aws-sdk/middleware-logger": 3.226.0 - "@aws-sdk/middleware-recursion-detection": 3.226.0 - "@aws-sdk/middleware-retry": 3.235.0 - "@aws-sdk/middleware-sdk-sts": 3.226.0 - "@aws-sdk/middleware-serde": 3.226.0 - "@aws-sdk/middleware-signing": 3.226.0 - "@aws-sdk/middleware-stack": 3.226.0 - "@aws-sdk/middleware-user-agent": 3.226.0 - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/node-http-handler": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/smithy-client": 3.234.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/config-resolver": 3.266.0 + "@aws-sdk/credential-provider-node": 3.266.0 + "@aws-sdk/fetch-http-handler": 3.266.0 + "@aws-sdk/hash-node": 3.266.0 + "@aws-sdk/invalid-dependency": 3.266.0 + "@aws-sdk/middleware-content-length": 3.266.0 + "@aws-sdk/middleware-endpoint": 3.266.0 + "@aws-sdk/middleware-host-header": 3.266.0 + "@aws-sdk/middleware-logger": 3.266.0 + "@aws-sdk/middleware-recursion-detection": 3.266.0 + "@aws-sdk/middleware-retry": 3.266.0 + "@aws-sdk/middleware-sdk-sts": 3.266.0 + "@aws-sdk/middleware-serde": 3.266.0 + "@aws-sdk/middleware-signing": 3.266.0 + "@aws-sdk/middleware-stack": 3.266.0 + "@aws-sdk/middleware-user-agent": 3.266.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/node-http-handler": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/smithy-client": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.234.0 - "@aws-sdk/util-defaults-mode-node": 3.234.0 - "@aws-sdk/util-endpoints": 3.245.0 - "@aws-sdk/util-retry": 3.229.0 - "@aws-sdk/util-user-agent-browser": 3.226.0 - "@aws-sdk/util-user-agent-node": 3.226.0 - "@aws-sdk/util-utf8-browser": 3.188.0 - "@aws-sdk/util-utf8-node": 3.208.0 + "@aws-sdk/util-defaults-mode-browser": 3.266.0 + "@aws-sdk/util-defaults-mode-node": 3.266.0 + "@aws-sdk/util-endpoints": 3.266.0 + "@aws-sdk/util-retry": 3.266.0 + "@aws-sdk/util-user-agent-browser": 3.266.0 + "@aws-sdk/util-user-agent-node": 3.266.0 + "@aws-sdk/util-utf8": 3.254.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 - checksum: 3b052be86063978b47b2f4459062ea23a6d94c81951a97428a5445ff062d642a3460114cbf1b20d3925db0667d893db40cbe30b1b8b58a4d749c75d117aab460 + checksum: 029e037f8b90b05a6559e0e2a6315c049fce81eaad32a2b277550761e6021a5bcc121f86ce4f06f1ff1fea9570dfc6adbc5331f52e4e5a6759a814d89a1b3156 languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.234.0": - version: 3.234.0 - resolution: "@aws-sdk/config-resolver@npm:3.234.0" +"@aws-sdk/config-resolver@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/config-resolver@npm:3.266.0" dependencies: - "@aws-sdk/signature-v4": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/signature-v4": 3.266.0 + "@aws-sdk/types": 3.266.0 "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.226.0 + "@aws-sdk/util-middleware": 3.266.0 tslib: ^2.3.1 - checksum: a72bdb1748d7f04c95436ab1e8650b51c1bfd2745114e52f7d05339c61bb6a859306be0c6cc0034ecf4f3b29a2d68b48fe362762a58c90ec55a3444b93b5700d + checksum: 7b726573ca7a24e8bab29fb02308f22b4c2492756417ef8ab5bf818576b25d0e19c2d8dc243542ddbac606d37d7d9aeaa17725fb95b4c78e68df4f4aab899dc3 languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.245.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.266.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.245.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/client-cognito-identity": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: af9ce2a19426056139c380fa2a016d5abb42117e262dc5c3f4741eb1f2d15b394e9b178d6efb2e32f59cd723c6090da769975505368fbbe79b8eb9258c6961a8 + checksum: 38f16e2cf2b3802c6863ee128870182d0d08268d8d0371b437c93dd231086e76ada47d1b4190946460d60b76cc7f288fec393c7b1bf91830e0cd91cbd4f893c4 languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.226.0" +"@aws-sdk/credential-provider-env@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 4f764d8d07ba1f65503ed2440ebfbccf98c141b11a087a582ea606d06bc764c91641b4ec505ab0d4750025a01128b041d9514a3ec868c385f038b5373b513293 + checksum: 2bc63db989b4c95098998b7a609ab2bd335aaa72b8b2a527c8a842c3ae2f2f3cbd50e043692adc96fbb3057688d9dc509ea0785afd7707d0863f4797d8e4b148 languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.226.0" +"@aws-sdk/credential-provider-imds@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.266.0" dependencies: - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 tslib: ^2.3.1 - checksum: c0480ca127e6715ebf98ff41a8ea47d139166b8632582782df46fc9e568ff579cfc0768af80082ae6eea3eb6750edb41c4a4c39281b777c578fdb7f8ef8b641c + checksum: eb155398aecdf3a48ff6e84867d488b492822113c05e43f86e3cea2cb1dd01f5fa605325ff2810712b5b6a98ee5c21589ee7412a154deceea89a31e6601c2e36 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.245.0" +"@aws-sdk/credential-provider-ini@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.266.0" dependencies: - "@aws-sdk/credential-provider-env": 3.226.0 - "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.245.0 - "@aws-sdk/credential-provider-web-identity": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/credential-provider-env": 3.266.0 + "@aws-sdk/credential-provider-imds": 3.266.0 + "@aws-sdk/credential-provider-process": 3.266.0 + "@aws-sdk/credential-provider-sso": 3.266.0 + "@aws-sdk/credential-provider-web-identity": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 35fcdb231efb573c60c25e67a27f64ca892ebab7931e715406826a4d3f87caecd525945f45ecaf7fb7e09a87a744678aba60249c74681160c9fb9d66c0490bf5 + checksum: 0ee2652b47b2ae8621d38dd1d6afff3b8771591682777b85f7e1d7ac7b3c8f600e23ee4d27bec83b7ec2159abe9203604993acbabb27c29d8b539264de8ecde9 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.245.0" +"@aws-sdk/credential-provider-node@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.266.0" dependencies: - "@aws-sdk/credential-provider-env": 3.226.0 - "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.245.0 - "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.245.0 - "@aws-sdk/credential-provider-web-identity": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/credential-provider-env": 3.266.0 + "@aws-sdk/credential-provider-imds": 3.266.0 + "@aws-sdk/credential-provider-ini": 3.266.0 + "@aws-sdk/credential-provider-process": 3.266.0 + "@aws-sdk/credential-provider-sso": 3.266.0 + "@aws-sdk/credential-provider-web-identity": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: a9bd115016fc7ce7f2cb50c5cafcd759f861362bb9dd9629e4ea0056519d5b26ad256f6d1d84ef3327c75bef442de8c0e4b54b215870512b43c92866ed0f1403 + checksum: 73e4b639bec60cc08dba0bc00f5cae9b86229a3e8c919d85043478518ab820a12852235c8e18e6852f68c8bd3c47a20ef76d90332500d76852e7cac5fcfb4daa languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.226.0" +"@aws-sdk/credential-provider-process@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 3ad24e2784ae7929f8932a187e0a5a06fc62d31ccb393fd2d9fa86d75c1109809c96b69edb17c3d7bd7d087b97662818d5320742a4cd70add06999a3b2ec3a53 + checksum: 742c75d7b019364ec17d787094e4b3a4acde4ce3d0136c75c7e002a19f9c73ea80f844dc4b1ee2305048d2d08795715dd02e7c6afb42b9679ce2802bd1e708cf languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.245.0" +"@aws-sdk/credential-provider-sso@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.266.0" dependencies: - "@aws-sdk/client-sso": 3.245.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/token-providers": 3.245.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/client-sso": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/token-providers": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 95358504631d5451520d5090e7fb337b40dfc12ab30dd84d979165d881f2762798828003b13adcb35921223bf3a498b0e70b7a94ebc14e8b16a4f0adacded8f1 + checksum: a125237b513e84d8d0419d9552801a1aa561b6e3ad7748561e937bf8bf10c5d4ce5b37bab5e453198a503dafdc5fcef49bfa600cb10ff37f227ed8856e41a812 languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.226.0" +"@aws-sdk/credential-provider-web-identity@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: f536d9af3d900eee31b6e7966ff827713fd5f661ae477f0911eebdac3e544eb5a732df0be0c9162058943e0aeb89333c97a1758236e8f9760c5e87280fd926fa + checksum: ff1ef92aa5d2d641132079787479e445aaf16b99231067b5a39c8bd7fb2a95c7ab5004b7199749508750e0ac8626d8ffc99454c44130800f266787a9d053e730 languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.186.0": - version: 3.245.0 - resolution: "@aws-sdk/credential-providers@npm:3.245.0" + version: 3.266.0 + resolution: "@aws-sdk/credential-providers@npm:3.266.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.245.0 - "@aws-sdk/client-sso": 3.245.0 - "@aws-sdk/client-sts": 3.245.0 - "@aws-sdk/credential-provider-cognito-identity": 3.245.0 - "@aws-sdk/credential-provider-env": 3.226.0 - "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/credential-provider-ini": 3.245.0 - "@aws-sdk/credential-provider-node": 3.245.0 - "@aws-sdk/credential-provider-process": 3.226.0 - "@aws-sdk/credential-provider-sso": 3.245.0 - "@aws-sdk/credential-provider-web-identity": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/client-cognito-identity": 3.266.0 + "@aws-sdk/client-sso": 3.266.0 + "@aws-sdk/client-sts": 3.266.0 + "@aws-sdk/credential-provider-cognito-identity": 3.266.0 + "@aws-sdk/credential-provider-env": 3.266.0 + "@aws-sdk/credential-provider-imds": 3.266.0 + "@aws-sdk/credential-provider-ini": 3.266.0 + "@aws-sdk/credential-provider-node": 3.266.0 + "@aws-sdk/credential-provider-process": 3.266.0 + "@aws-sdk/credential-provider-sso": 3.266.0 + "@aws-sdk/credential-provider-web-identity": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: a6923907ce97232cf87565e5fc0dac872061d2f065f530f7c91d1693472dd26667a91a662283994b3886a84b557f45e8627d0c847a88ffa0fdf2458a0180bd43 + checksum: bc5142a992ed14371fc630fb89bd53033fe4648e4eaedf14100b6da5536988943cf5120185533019a23178681d0f6e9dd7ae4288e77442d3031de232c45fca49 languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.226.0" +"@aws-sdk/fetch-http-handler@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/querystring-builder": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/querystring-builder": 3.266.0 + "@aws-sdk/types": 3.266.0 "@aws-sdk/util-base64": 3.208.0 tslib: ^2.3.1 - checksum: f12ed12088aee05e4c6a742356017f55f26fec740c12c4d89c4eb283203171d032d99c9fa45fb28cc7798b35410cc55736df1c78d8eea014667e489f1b276f3a + checksum: cf4ce1ed565890101e4bef15a380c185887e04d16ba34c60dde53fcd98d70f7c8102045a4ab0ca11cb6dfb841425dd9765737e2c11181fa3664e21cab44933bc languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/hash-node@npm:3.226.0" +"@aws-sdk/hash-node@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/hash-node@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 "@aws-sdk/util-buffer-from": 3.208.0 + "@aws-sdk/util-utf8": 3.254.0 tslib: ^2.3.1 - checksum: cbe466e2e3efdbb3aefe7772da734f6d00e0d1572c60e497b09460e055093b155c5e94bd3718135238bc05e58cb49abcdcd0fe5e34458bd3563b89d3d4a42251 + checksum: ef9387bef50767e4e9ff2641d332c68d2f70ab439eb5225363b0753b6c11fed7ce04de52bbc4e40a9d34319904212fd0444722ada1ad5f304b9c1f5c41b0c049 languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.226.0" +"@aws-sdk/invalid-dependency@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 4a6168b50675881442c9bc87e8f27e8317ece9251fbfd3d812d32edcd83f687328e6de518fa9f11b1bc984ad3a3454cd43b59c0362f04c03687ce5250ac5d720 + checksum: b898eaf0bd8c87a9a32032dedd714d5892dc252aefd0ae65598842745db6c176a55f66e819c7686b101da9a78901b4e3275ebecaf464d849a03db50361e59399 languageName: node linkType: hard @@ -447,276 +433,277 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.226.0" +"@aws-sdk/middleware-content-length@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 538b0222e2c8be61dc3090dfefe4b9ec1f0cbee155125edf5b654dbe36ab0b2d6befe3da6008194dc26bbf94d53b7e01edca683720061c4b43c6beb9dc278002 + checksum: b8881f3fd2964304380aae1e737e2f80ec0f0bf7ab20ebe081817cd5bbedde60d0aefd95c7112f0d36b3eeb46d6b8b15e091bc0aab66dd77a19a9dd0cfb29c8c languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.226.0" +"@aws-sdk/middleware-endpoint@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.266.0" dependencies: - "@aws-sdk/middleware-serde": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/signature-v4": 3.226.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/url-parser": 3.226.0 + "@aws-sdk/middleware-serde": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/signature-v4": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/url-parser": 3.266.0 "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.226.0 + "@aws-sdk/util-middleware": 3.266.0 tslib: ^2.3.1 - checksum: 22df6fd90e3b7d3edd58f427ebfbb229181ef190b2d795e0b400f70f95a573dc59666a08b26613db6bb1b764b13ba7ddec15fced2641e9678fad5500fca289be + checksum: c3a0e68c2f985fc6a91621e3c1eb9c2d7682ad3fb0e00ed28ea9b45d6698d3e5a5fd2ebbff47a1cb32c720a8708bb2f64f28ae20a2ca73c1b79f8e0f3d38b6a7 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.226.0" +"@aws-sdk/middleware-host-header@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 35eb7d9f5eb2e45c58bb5887a12dc80f22e8fc630d53d356064c62ce3354c9054717697168ab3818f14c7baae3246480aa7251e6fcaf5c7104498df5dca9bbd6 + checksum: eec69d03e4495fd706650176d93615548cff4b34a52eb47efb1cbdd5905efb4fccced4301640cc3352268fe2129713a49449a075a50d76e9d2b128482f37c304 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-logger@npm:3.226.0" +"@aws-sdk/middleware-logger@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-logger@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 7b7c2eb336f376f6e8c50ebd0fd9b6e9a749e21d6f5c433683a4e98edb311bb76fafc0bb0abfd75f61001466879be7d68aefb3958a332e540160a93ee9371b44 + checksum: b5e9ead43cef932157675b7cfbfdf78699ad4f59ce6cd3e5879f1cdf3cbd6b87530261b262c45a54d7aedf602ea821adc0a70b377de2b4c13caf439741f387d0 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.226.0" +"@aws-sdk/middleware-recursion-detection@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 194161d76a815df623c6699f7a7016268b4a01276baa3527682504001a4e2e948e2dd389d2065f62fe57509f20b9680ea907bfa52b861122335d276c9ab4ed61 + checksum: f7d1ac8bb97aa284e84606e262957cff994e4a38771353368dc35284378bcf516e9e313d679a5f648508c465e9f6766e691361d553000f3b46aae05edc330722 languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.235.0": - version: 3.235.0 - resolution: "@aws-sdk/middleware-retry@npm:3.235.0" +"@aws-sdk/middleware-retry@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-retry@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/service-error-classification": 3.229.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/util-middleware": 3.226.0 - "@aws-sdk/util-retry": 3.229.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/service-error-classification": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/util-middleware": 3.266.0 + "@aws-sdk/util-retry": 3.266.0 tslib: ^2.3.1 uuid: ^8.3.2 - checksum: 397226fd10d8b0587a35ccab92160223f10740beb01ccac75dda0e30336b83c091c9aa51b9132a56ff6cccd6353b9e3c6ecf21ae18f20f8127e7e9e209e59a2a + checksum: 47b2d6d070a5e61fc64985194f594ee402c0158ea92e24313c852aed137fc40e212eb2f082a8cee75f614f0621a4fbb41bcbd1ccb9e786962e33dd23fede5dc7 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.226.0" +"@aws-sdk/middleware-sdk-sts@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.266.0" dependencies: - "@aws-sdk/middleware-signing": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/signature-v4": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/middleware-signing": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/signature-v4": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 0b6e11889c9f1b5264eb38288dea5bd2987fa28338651939d005eaa0524f9cd41c570c545b34b08d25d858397b3f14a2b6a21238a8c88fc08719ed50b835cb15 + checksum: bca44114e0a67f47a3cd0d21c316b9846cfbe9d7c6728733a73963829d008d53d1a71cc57665b8adc7ae01e0dc710c601d0cc45b6197a46643036be83ecc3abc languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-serde@npm:3.226.0" +"@aws-sdk/middleware-serde@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-serde@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: e8315079cc3ed4527d1434eb28becfaf951338d2ced21116753b52d3330eabbfd13f24382b3378bcc2c09ee0653a65e0d8353e9e32f512b69929908272b83fa2 + checksum: 2cf05d20361e38983ad4e2d2de775b8e56532e7ca7a2632b1a450a4d635a8ec5a92245c9c8abc09d34cc6556501338cd5d4155370c9ba02ea55cc5d105153117 languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-signing@npm:3.226.0" +"@aws-sdk/middleware-signing@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-signing@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/signature-v4": 3.226.0 - "@aws-sdk/types": 3.226.0 - "@aws-sdk/util-middleware": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/signature-v4": 3.266.0 + "@aws-sdk/types": 3.266.0 + "@aws-sdk/util-middleware": 3.266.0 tslib: ^2.3.1 - checksum: 4f66483d359e21d1f7e56a1900f7271a561801e1ee4380deaa006ce750ce73245a5fe554d4c1ab60cf9ca127c41f35c53c0817c375df6f8f068c9ed7f9572444 + checksum: 92395792c9304c472bea24194aa989a1db641308ee13c819f6ca343b75338d5498821c2e16037258bba8374fe3dfdc5273a584d07c7071e31d52a4d16d2c1e52 languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-stack@npm:3.226.0" +"@aws-sdk/middleware-stack@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-stack@npm:3.266.0" dependencies: tslib: ^2.3.1 - checksum: fd284bc28ee6ee576e3fe9dd3c2c9d64b8c95fa1bb213b5e41e23a57bbc2693652ee51028414eb278918235e591ef729db572b160bff963c6f74e7d6c15d33d0 + checksum: f386f220abea8a80756c19562912b555a6223f8e96fc97aebce851e920c05055cae77778272a88638fdd93ceab2680f9ab47c556e9480a3a538a33c8abcc4e66 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.226.0" +"@aws-sdk/middleware-user-agent@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.266.0" dependencies: - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 8d3724aecd7b7f9f1a5b081263cb85864c969144105819f371a9675ee4f680c11e3b5ecbe181f57d2bfdde9c98b90267bd4afe0fc0822863041e0df52671f043 + checksum: aae2e178ee5bd881b9f6dbe0830fec94b43ce0f1c94251f8f4b99a64a85e7feeaace9b0f26e4c7616f4ecfd6dee0452d9168ee4af5c3a61fa87b60110fc521df languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/node-config-provider@npm:3.226.0" +"@aws-sdk/node-config-provider@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/node-config-provider@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 0e7c4c7ea20c5361c71f1ab0b99c19964f76c187659714cd6e87e1cc264d0ab29965d33618d9d47d373e3b108558cd6628fb36a00cdac614849e5044c6776213 + checksum: 370e76590ec70471c90cb0b2f2cf44f189a2c5515de0ff1952b8c54f8a17f2fc9899f38ff7016bf02310bad4b5aa695920426792d83e900df8fc637ff617bae2 languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/node-http-handler@npm:3.226.0" +"@aws-sdk/node-http-handler@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/node-http-handler@npm:3.266.0" dependencies: - "@aws-sdk/abort-controller": 3.226.0 - "@aws-sdk/protocol-http": 3.226.0 - "@aws-sdk/querystring-builder": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/abort-controller": 3.266.0 + "@aws-sdk/protocol-http": 3.266.0 + "@aws-sdk/querystring-builder": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: e4080ec9f859be4b191416084fef8d2687f24d973169b8fef592a867c23c14fad74f4bea20f451b98fedfee6a265f2c89b0bee4fe7aabdb1fd05a7475bf12b91 + checksum: 40efb57b6e9ecd7d098a8ea48d5b1bc8dab8f0696c18b6477743ed3e48ac0ec5ae4266d2928955b20ed0ffe08f7d5b1f952de3373cf31e8585a6c440a6715810 languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/property-provider@npm:3.226.0" +"@aws-sdk/property-provider@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/property-provider@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: d63c53313bb2797ab2ecfa2cff827b63417c0cc31abe8c666cd018a1d70da877b61ef1fb21e504d6408e72b20544756089938b44869b003ba3c313b39bca6d45 + checksum: 6e709d928867aecb067c959ba62ce87074e54d330806280705f8e8ff226508974d999845934e67c45b62535b212acf038fb05b9ddac2d0beb70a2aa2f35138a3 languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/protocol-http@npm:3.226.0" +"@aws-sdk/protocol-http@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/protocol-http@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 92cf35e1026a812c6c7ce8309fd685162ab7796237fc063e71dd9b292abf25902d6c0e02e93219101e1f506ef68a98f02eed6a61b18b8acd450ecb4bf8c1b467 + checksum: 538bf9f57c67b6677262c14ee3768585436e2421c73d241bff53ebc86a22680320f77f7916c3e02fb9c95844f83b787a749529fbd2cf44ada2f1d3edfeda7a17 languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/querystring-builder@npm:3.226.0" +"@aws-sdk/querystring-builder@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/querystring-builder@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 "@aws-sdk/util-uri-escape": 3.201.0 tslib: ^2.3.1 - checksum: 0014b8876d402787c56f606f66e79eb48ff100b01d7a657bb0766a7723ca184da0dd2aed405837e7e6c5781fd868d7a903eef25884b2d1881d30e2454f5c2bfc + checksum: 596c3329707d866a8191b953aea1f91fd70229dfd88bb2cc2c56b1f86a7a571fbf2aadad1267e3a7de05183cda98d73114320b6cfdb199b41c895f91ad12c02e languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/querystring-parser@npm:3.226.0" +"@aws-sdk/querystring-parser@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/querystring-parser@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 13b23b4dff859d778a05f6874e318d95d6fbd79c62a06bb6f6dff8496ac2eaf86f60b17460c3595af854c2e316482c9fcc098655d475926039f7dff4a6f1ecf1 + checksum: 638ec186aa4722d91be08f8219c2dbf2b2a2257dfc16f64ca9cb1f29c366538b90914179e77c06f49d56bc89f2bd6aab3d4bb077a22b2c1ca387e57ae5183bee languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/service-error-classification@npm:3.229.0" - checksum: 7877963d62f4d43ce5116f0ddfd1b27cffab2b0e74a4ceb4006b1f85b17dd50eb9ae2f227cabf935261e42b7615d0a9de190dd684380c30e03dee6e9f7e12587 +"@aws-sdk/service-error-classification@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/service-error-classification@npm:3.266.0" + checksum: c6f94acbfbe675749a79bb0537a0ab4333fbe19ea2833c174d6c7feef121b131d900f8158e94c59d3d12184de1b624ff5df9f6b4f785dcf851e30010ce7d987f languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.226.0" +"@aws-sdk/shared-ini-file-loader@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 7b43e4d70f33b1098c9582a20dd5cf11c0e2efe5e7f4f854ee1fdfe2f804a7171deeb76f167c46ef7365bb584e29c816d58b6d8f6c9ac9debb124cccf59ebf59 + checksum: ac294f5b9f8ec55938f233e626e8c5adf7fa7e331d744a0c2c1267b669e7f6d3abeb22f59b4e3456ce32bdecee0b3a53983730de718750eec1fb4e589fdb1535 languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/signature-v4@npm:3.226.0" +"@aws-sdk/signature-v4@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/signature-v4@npm:3.266.0" dependencies: "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-middleware": 3.226.0 + "@aws-sdk/util-middleware": 3.266.0 "@aws-sdk/util-uri-escape": 3.201.0 + "@aws-sdk/util-utf8": 3.254.0 tslib: ^2.3.1 - checksum: 8bc6ea1ad467d59f1ff6c5b814277e16d0d5b2d1455f21969b4575f572fdc013284e356e0f24436c89c8b99a51d0e384b01daa2bace1c3d69e28f35a23ef9802 + checksum: 9a7384c0dcaa72f7281813ac16bacdda3cd6a78ce0f5e0dfbe024f8c94f3a81157ec76566755323de341374e2c50dac252aec86c631021db7ca5e7a6e64036ed languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.234.0": - version: 3.234.0 - resolution: "@aws-sdk/smithy-client@npm:3.234.0" +"@aws-sdk/smithy-client@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/smithy-client@npm:3.266.0" dependencies: - "@aws-sdk/middleware-stack": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/middleware-stack": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 7b8299f81fde410b8f597662d4174a29740cb2791a2377e5009a73c0e7531fb440712ab25c837a0351dbceac4763cc8fadc6d4362727cf3ae749b25515da4ea1 + checksum: 6a5a8a180642d9d3ecef53f315cd6f6cd6f9bd765765c546d53e3372125fa8b6083265669e8aa0981be7a8c8889bfad8d00bda6d01d2a1d5a0a9227739912b0a languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/token-providers@npm:3.245.0" +"@aws-sdk/token-providers@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/token-providers@npm:3.266.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.245.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/shared-ini-file-loader": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/client-sso-oidc": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/shared-ini-file-loader": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 900a73b999c50eb35b3eda594210448329f5068b57a2d8d57ee8e4f3d960116ece36952ca1fbe43b5e8e9119927de916033f73ff969bae3a8394d4ef98f1d0c7 + checksum: c679205b604049b0a6be5ff72e8b4308bd94294811aef12b653254daf9ab7890f2c1afbffb9399b977463733f1bf9c695d014c88b060a384f37f707f03be6f09 languageName: node linkType: hard -"@aws-sdk/types@npm:3.226.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.110.0": - version: 3.226.0 - resolution: "@aws-sdk/types@npm:3.226.0" +"@aws-sdk/types@npm:3.266.0, @aws-sdk/types@npm:^3.222.0": + version: 3.266.0 + resolution: "@aws-sdk/types@npm:3.266.0" dependencies: tslib: ^2.3.1 - checksum: 0041a8c0924ec7ba4ff787ae329a80b3edb9ace43e38fe3656a1862ae5324427fb09836275c0962cbc80e3c34a6ee512a108a5c4e7997f29664e3e8930cffd80 + checksum: 811196d787abb277333d3e56ebff08871452152d1e3fed0b827105bb6c0739edb6b09d80ffb023008c7215f335daecd2f89f570f190e7d17c50a8abf417c81bf languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/url-parser@npm:3.226.0" +"@aws-sdk/url-parser@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/url-parser@npm:3.266.0" dependencies: - "@aws-sdk/querystring-parser": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/querystring-parser": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: cb8d4b13c0de7336728a7a60a246108c0ecd46e5e493cb1006f5ab58c5dbae0ac36a791536786b1facc90f58a8d6decca9f4fda2cba19667ba5a9f5f4fcadb63 + checksum: 6c1dbf62ae21c6836561a9ba34707e2b6817d264c6e7e645fb84b5ff8af7f85c7f7c0005bc4d20cbc3c32561d2c52f04fb15d04058a72c49870298fd7cd8a48c languageName: node linkType: hard @@ -767,39 +754,39 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.234.0": - version: 3.234.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.234.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.266.0" dependencies: - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 bowser: ^2.11.0 tslib: ^2.3.1 - checksum: 79a381a632f867477dc7f948243c8ba82932d3f10325c76a5f2cf96412560648d149ba43ee31794bc45d81158a8c361d890b291880fc0c05f9bafc99cded5ef4 + checksum: d12ee57fef9303aedd7347c91fac93ba6ff34c98979c1f7a557a14a4b20a9cb2e7e3b318072f67053080c21b70b72fb6a0e7c60fd54464803bf31af597ce6c97 languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.234.0": - version: 3.234.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.234.0" +"@aws-sdk/util-defaults-mode-node@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.266.0" dependencies: - "@aws-sdk/config-resolver": 3.234.0 - "@aws-sdk/credential-provider-imds": 3.226.0 - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/property-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/config-resolver": 3.266.0 + "@aws-sdk/credential-provider-imds": 3.266.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/property-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: b70becd9e561c1622c75a452ed8c7a8b14b84eba35988159f29476db8c2b47ec72f0b7c19d1a252c725756af1fff1df4201e5e92b6136d1df9170e806dca5219 + checksum: 35e5029f7a210f85516a1ffa1d0826e360dd4a85cfb90740229b2a3ce367da434c50a0d5fdb56079a803d29edd9230e28a2d1493270cb23de63610f2c65c25bd languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.245.0": - version: 3.245.0 - resolution: "@aws-sdk/util-endpoints@npm:3.245.0" +"@aws-sdk/util-endpoints@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-endpoints@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 - checksum: 22783fb178e8901385b20b0d19b944ad41297cc19f0561ac1722e86757ca6910fd3766626a0493372f718a0726bef920a5b39cc41fdceb1012f14e833541041b + checksum: 1dae5c120c99b0fe724cdf2adb70dba51ff73044f0cea14d7fb0ca23629860be4f12ebfc85efe94576339c8c4fbcaf57ccfa14878ddebcdb9ab40db8a9fe41ab languageName: node linkType: hard @@ -821,22 +808,22 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-middleware@npm:3.226.0" +"@aws-sdk/util-middleware@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-middleware@npm:3.266.0" dependencies: tslib: ^2.3.1 - checksum: 51a4ba9a784943b723a2c57bbb889a4bc743f0f1219000ef73512e259069d63c3baa805aa375277c9d904da23301d0389bc0bd525b0b55274d7658fb62173e55 + checksum: 7a89ea290225d9c503be6b7fc8eafd66452080855ff0f21a82c6db4ec58de93fed48ba0fea786ecd05acac75d968acb49aaef53e1917ad40c6a29335e88b4ac9 languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.229.0": - version: 3.229.0 - resolution: "@aws-sdk/util-retry@npm:3.229.0" +"@aws-sdk/util-retry@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-retry@npm:3.266.0" dependencies: - "@aws-sdk/service-error-classification": 3.229.0 + "@aws-sdk/service-error-classification": 3.266.0 tslib: ^2.3.1 - checksum: e4ab435000abfa1dc21153682ce684302bd6e69d48b7d2c876ff8dfa66793a43223961a3755d05abb1f94f82765eac2b9d48e55c688a957a7f6b5d032bbc46ee + checksum: 7c7379830093a76eaea311db281bf64f44852a3824abd02c896bd57edb00d7e5bdd90cad37554c84bf1b8d44b2ed9cff35bd98f07f508b0b6ac1a83756b812ba languageName: node linkType: hard @@ -849,49 +836,49 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.226.0" +"@aws-sdk/util-user-agent-browser@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.266.0" dependencies: - "@aws-sdk/types": 3.226.0 + "@aws-sdk/types": 3.266.0 bowser: ^2.11.0 tslib: ^2.3.1 - checksum: b89b63e03636b98ccb811e713776c8ee5ce92a280edfd429e418dc69bb55b770b47d6118419be76207afe137f293fdb2e87605922714189df8ddbd4573185717 + checksum: ec845b66a6e6d072e803d3ab604e8245b744d92594f6cc3adb4120ecca06335c9f2ce77de6442189ec3f29c4b5f19f2c210888d20e435a49dab326568c997006 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.226.0": - version: 3.226.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.226.0" +"@aws-sdk/util-user-agent-node@npm:3.266.0": + version: 3.266.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.266.0" dependencies: - "@aws-sdk/node-config-provider": 3.226.0 - "@aws-sdk/types": 3.226.0 + "@aws-sdk/node-config-provider": 3.266.0 + "@aws-sdk/types": 3.266.0 tslib: ^2.3.1 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: a3b620fa13e5e61bc874d777d451ec522f659f933b7d7f7642c10fbb12ce13dd068c2b5370fd6132cca5ddcd22243fb04b4e926a4dd8aedeb08270a9bb49ee74 + checksum: 31d206c5ccf4c345434f1535681b026c6cf8dd11cd0a91208cc3cb8532284748a52b727a2ed767f2c410486b1fd4c1402e1c47995a7b35687ce427765297fdda languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:3.188.0, @aws-sdk/util-utf8-browser@npm:^3.0.0": - version: 3.188.0 - resolution: "@aws-sdk/util-utf8-browser@npm:3.188.0" +"@aws-sdk/util-utf8-browser@npm:^3.0.0": + version: 3.259.0 + resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" dependencies: tslib: ^2.3.1 - checksum: dacd27164aa0835888434e080b67f04510e2281560540ff73496f2d0aa73b0b7f830ec08491b35c3a51bf6214615579182aff8727e151e54a74a97a197a2ac31 + checksum: b6a1e580da1c9b62c749814182a7649a748ca4253edb4063aa521df97d25b76eae3359eb1680b86f71aac668e05cc05c514379bca39ebf4ba998ae4348412da8 languageName: node linkType: hard -"@aws-sdk/util-utf8-node@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-utf8-node@npm:3.208.0" +"@aws-sdk/util-utf8@npm:3.254.0": + version: 3.254.0 + resolution: "@aws-sdk/util-utf8@npm:3.254.0" dependencies: "@aws-sdk/util-buffer-from": 3.208.0 tslib: ^2.3.1 - checksum: 0f4c1d0d3f6eb40d92bc7163c6dcf97f90b3a8be05df46ba4f9bb7723a3e6acabf2cb0f2486411b03d22e8fcccae9e757ed02afad384ff5f44a3a659a78c5752 + checksum: e5dfe7565f2de32245a544d1d715d803025bc5522538c0206fa61377f747804d95fc2e5e25976144bb63a6857e360b4286d101e730ab5d39866c60383a47e7d5 languageName: node linkType: hard @@ -939,20 +926,20 @@ __metadata: linkType: hard "@babel/parser@npm:^7.0.0": - version: 7.20.7 - resolution: "@babel/parser@npm:7.20.7" + version: 7.20.15 + resolution: "@babel/parser@npm:7.20.15" bin: parser: ./bin/babel-parser.js - checksum: 25b5266e3bd4be837092685f6b7ef886f1308ff72659a24342eb646ae5014f61ed1771ce8fc20636c890fcae19304fc72c069564ca6075207b7fbf3f75367275 + checksum: 1d0f47ca67ff2652f1c0ff1570bed8deccbc4b53509e7cd73476af9cc7ed23480c99f1179bd6d0be01612368b92b39e206d330ad6054009d699934848a89298b languageName: node linkType: hard "@babel/runtime@npm:^7.3.4": - version: 7.20.7 - resolution: "@babel/runtime@npm:7.20.7" + version: 7.20.13 + resolution: "@babel/runtime@npm:7.20.13" dependencies: regenerator-runtime: ^0.13.11 - checksum: 4629ce5c46f06cca9cfb9b7fc00d48003335a809888e2b91ec2069a2dcfbfef738480cff32ba81e0b7c290f8918e5c22ddcf2b710001464ee84ba62c7e32a3a3 + checksum: 09b7a97a05c80540db6c9e4ddf8c5d2ebb06cae5caf3a87e33c33f27f8c4d49d9c67a2d72f1570e796045288fad569f98a26ceba0c4f5fad2af84b6ad855c4fb languageName: node linkType: hard @@ -975,11 +962,11 @@ __metadata: linkType: hard "@bot-whatsapp/bot@npm:*": - version: 0.1.5 - resolution: "@bot-whatsapp/bot@npm:0.1.5" + version: 0.1.21 + resolution: "@bot-whatsapp/bot@npm:0.1.21" dependencies: dotenv: ^16.0.3 - checksum: 5131587aba502cd1feaf61ff2f0778aa32b1b267f1e01646c6a9b43a4948e50b770ff8dddd434977d1603e46aeddaffc577b440e4848d899863a026b92ca57eb + checksum: 36ea185ea7d60653373a6ef8f594257bcb7f14f66f07f9ceec4483c9ca2126aa4e6d4b6c28df7c558a59200b63a2b1d7c251686073e6d4d0e7d4ee66c3504381 languageName: node linkType: hard @@ -996,11 +983,11 @@ __metadata: linkType: soft "@bot-whatsapp/cli@npm:*": - version: 0.1.5 - resolution: "@bot-whatsapp/cli@npm:0.1.5" + version: 0.1.21 + resolution: "@bot-whatsapp/cli@npm:0.1.21" bin: bot: bin/cli.js - checksum: 2ff67f9c6f8402b25e0b2cc72c17fb1b163e61d8baa897b564d4b388bc0dfadf0f42c2dee42d55c3f63feff1de9b65c8e46c547a3c6dd0d74e5d95bd3d18613a + checksum: 495da00960837b0581a23335ed0193e3a725599b9ed95ae66922c78106559f46fc6e047d9d2ff8abbc76a072f335ef7bd744d5a402e52c80321674b9b323e1f1 languageName: node linkType: hard @@ -1026,13 +1013,13 @@ __metadata: linkType: soft "@bot-whatsapp/database@npm:*": - version: 0.1.5 - resolution: "@bot-whatsapp/database@npm:0.1.5" + version: 0.1.21 + resolution: "@bot-whatsapp/database@npm:0.1.21" dependencies: dotenv: ^16.0.3 mongodb: ^4.11.0 mysql2: ^2.3.3 - checksum: 4ddc5282c4b15d45126729fd1cf4adbd36328d71c82812f3f7c187ee6af4e8ee8c98cf7ead3bbf7fbb6631f22cdb608dad4a08b271a312b71a699bb35687da34 + checksum: 8be2e79b4d5344432d28c6cc088c36a46aa86aa2609b2c279280a45f4a2c34c53460f3752fc1abca1667b1eb979819ef29d7d9def3dd38e09b929bd828c097f2 languageName: node linkType: hard @@ -1072,14 +1059,14 @@ __metadata: linkType: soft "@bot-whatsapp/provider@npm:*": - version: 0.1.5 - resolution: "@bot-whatsapp/provider@npm:0.1.5" + version: 0.1.21 + resolution: "@bot-whatsapp/provider@npm:0.1.21" dependencies: "@bot-whatsapp/bot": "*" combine-image: ^1.0.3 qr-image: ^3.2.0 rimraf: ^3.0.2 - checksum: 87ab0ba27a4566ea882810fad1fe4be391d3a264646675e432b3dea860514bfa538f39d77e5dfa33b0daa3ed6f8540054c75f51a50c733155a9b86bbc13ac5e1 + checksum: 0e45faa755ab973820d95be964d4079d8cb9b98599e8d30c5bb774c2dc348d90820bcf03f23f92f16f34cee2e0c884c69376ac55019a805fc9b230be3e2b1b44 languageName: node linkType: hard @@ -1128,56 +1115,56 @@ __metadata: languageName: unknown linkType: soft -"@bugsnag/browser@npm:^7.18.0": - version: 7.18.0 - resolution: "@bugsnag/browser@npm:7.18.0" +"@bugsnag/browser@npm:^7.20.0": + version: 7.20.0 + resolution: "@bugsnag/browser@npm:7.20.0" dependencies: - "@bugsnag/core": ^7.18.0 - checksum: 131f9bc8ac6d780574fa70ba8be5051efc9c75d4fbf8a32d1be7733cf07b85f81404e749776c5a76bf48526f4629b27faac0bae2b36318dfc157423e361b297a + "@bugsnag/core": ^7.19.0 + checksum: a8f1bbdde06e7b98ec918bbd1c1b4431df6d35ec15044164f8b439b55d8fb93957928a4d03f760b2c68a71eedc2a49e5b6506f5a1f994540b2bdbdbe5e68500e languageName: node linkType: hard -"@bugsnag/core@npm:^7.18.0": - version: 7.18.0 - resolution: "@bugsnag/core@npm:7.18.0" +"@bugsnag/core@npm:^7.19.0": + version: 7.19.0 + resolution: "@bugsnag/core@npm:7.19.0" dependencies: "@bugsnag/cuid": ^3.0.0 "@bugsnag/safe-json-stringify": ^6.0.0 error-stack-parser: ^2.0.3 iserror: 0.0.2 stack-generator: ^2.0.3 - checksum: bce23771159546b481a655decb0d58406dc68ffe6249a0f41c598b00a8adc9fb26c234913aafb2872f87628a015bd2c6b78555af5c21a68901d2e83b20d4593a + checksum: 324e1aa7bd62bd478c4e8459b2f54c71b4fb20d26075363a07be039f0cc65702b5996cee2e7955d0763b6535358376d45ef385cb9e24717441e1925de6aa5753 languageName: node linkType: hard "@bugsnag/cuid@npm:^3.0.0": - version: 3.0.1 - resolution: "@bugsnag/cuid@npm:3.0.1" - checksum: ead5632c883ec0dbd5b9303c2cce34d0ed72f32d3e4ecd243274790ce36193163d79477bb52746d2557ed7681715ad3f56f2fb359c53bb60e02c35a5bddfb5af + version: 3.0.2 + resolution: "@bugsnag/cuid@npm:3.0.2" + checksum: cf85d78f0107b25bcfc4396e5c2cf7eb58a28777f07b9c6e976d529417a8284bb69ec715f13917c2b6ad3803e7bb563621b0374c31e09d4c6b3156aba9939955 languageName: node linkType: hard "@bugsnag/js@npm:^7.0.0": - version: 7.18.0 - resolution: "@bugsnag/js@npm:7.18.0" + version: 7.20.0 + resolution: "@bugsnag/js@npm:7.20.0" dependencies: - "@bugsnag/browser": ^7.18.0 - "@bugsnag/node": ^7.18.0 - checksum: 6b011dc36001cdd4c2b33e793053d323d358e9bc1ef6ba7ee866634114e1a088b5704c3d18cb35cfa2e1f613ddaa9d94f7f3b2225698feffce2dcf622dd8f14f + "@bugsnag/browser": ^7.20.0 + "@bugsnag/node": ^7.19.0 + checksum: 503e00b315b7b21d4cbc5b3b7c6faa7e3180601106a7e5773304892f368d625f4682cd137b00dfed5ecb7941e5a2dc3115b08afcc7190db03bc557de286d2890 languageName: node linkType: hard -"@bugsnag/node@npm:^7.18.0": - version: 7.18.0 - resolution: "@bugsnag/node@npm:7.18.0" +"@bugsnag/node@npm:^7.19.0": + version: 7.19.0 + resolution: "@bugsnag/node@npm:7.19.0" dependencies: - "@bugsnag/core": ^7.18.0 + "@bugsnag/core": ^7.19.0 byline: ^5.0.0 error-stack-parser: ^2.0.2 iserror: ^0.0.2 pump: ^3.0.0 stack-generator: ^2.0.3 - checksum: 678cf3dff4639a1b1ea863968ca9ed46e0af661cb53275c21d0ae9c16fb45c63455e5f9210a61f978575609aa437f80861671c43f62ba8c39167f0c11ebc7d41 + checksum: f7dc9c1cfaa35c96a428ad2cdfe4d289298329275bc3930bfc923a0e1eac3bf62f8919581a68f001d992256fa2c55321232bddcaea9a9e5482f88f19632c2ea2 languageName: node linkType: hard @@ -1230,13 +1217,13 @@ __metadata: linkType: hard "@commitlint/cli@npm:^17.3.0": - version: 17.4.1 - resolution: "@commitlint/cli@npm:17.4.1" + version: 17.4.2 + resolution: "@commitlint/cli@npm:17.4.2" dependencies: "@commitlint/format": ^17.4.0 - "@commitlint/lint": ^17.4.0 - "@commitlint/load": ^17.4.1 - "@commitlint/read": ^17.4.0 + "@commitlint/lint": ^17.4.2 + "@commitlint/load": ^17.4.2 + "@commitlint/read": ^17.4.2 "@commitlint/types": ^17.4.0 execa: ^5.0.0 lodash.isfunction: ^3.0.9 @@ -1245,16 +1232,16 @@ __metadata: yargs: ^17.0.0 bin: commitlint: cli.js - checksum: a0f3d26f06fa751be6009f76b76fee83e2394f6b528b38f375b3119be41a39c851a053e9dd93385a5274feff471bd0984e626bb23624d72e231f66125e222fd5 + checksum: a2d0ecd2c5a770b3d3be1214020ed4298f3d7685f5c065ed2f1565b02b9a1608abd00d114c8b9b17e84741cde0d977bb2c2afc1074176565b6b63e9cde0d2e25 languageName: node linkType: hard "@commitlint/config-conventional@npm:^17.3.0": - version: 17.4.0 - resolution: "@commitlint/config-conventional@npm:17.4.0" + version: 17.4.2 + resolution: "@commitlint/config-conventional@npm:17.4.2" dependencies: conventional-changelog-conventionalcommits: ^5.0.0 - checksum: bc161a330c3cc9168798a58321b86ac05f8c28c5f6b521f4f1c43ede04ff75fbc31881700691685a308a327a05ad66397f9b41463403056fc5183eae18a0e9a2 + checksum: 517dd3b3395774084503606b5c5f9acb0e92db6cd5dd237716993b9858eb9e7e10da981e2a68f99aa2f48afb4d3597b04449c9e2bfde8af2690a0b40ea40115e languageName: node linkType: hard @@ -1299,31 +1286,31 @@ __metadata: languageName: node linkType: hard -"@commitlint/is-ignored@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/is-ignored@npm:17.4.0" +"@commitlint/is-ignored@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/is-ignored@npm:17.4.2" dependencies: "@commitlint/types": ^17.4.0 semver: 7.3.8 - checksum: 94643c63c7ff8dd01ef50f6593bc553411aa8c1d3372ca38e3b0086fcac96c168f4a81db1d77d153e4a9b083788c81754a311627f6260141306fa0b6a5fabaac + checksum: 4b210d6ce0f9dd66f27d925d151c88845a2f1128b10865f5808e113f31be6ab359c58c1259664c888961e7bc1b71d3e8a2125eda8b8e4be1d32618a7772603c6 languageName: node linkType: hard -"@commitlint/lint@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/lint@npm:17.4.0" +"@commitlint/lint@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/lint@npm:17.4.2" dependencies: - "@commitlint/is-ignored": ^17.4.0 - "@commitlint/parse": ^17.4.0 - "@commitlint/rules": ^17.4.0 + "@commitlint/is-ignored": ^17.4.2 + "@commitlint/parse": ^17.4.2 + "@commitlint/rules": ^17.4.2 "@commitlint/types": ^17.4.0 - checksum: 95e256ca880457e34b710292df9fa16a8c4849a43fbc0821ddd4a1a10c6f376a12cc1e24a6b5c35c899b15e2b002d2ff845e93a722b0848257941664af1052e2 + checksum: efcb5fbee6f8cad5b619deabde598f1f1ac253cf1162eeda4de01e41ae13b7caa651d6fe5eea75d32a20fa7975bb27d13d9e0c9a422ebd158485311e6fb8c8a9 languageName: node linkType: hard -"@commitlint/load@npm:^17.4.1": - version: 17.4.1 - resolution: "@commitlint/load@npm:17.4.1" +"@commitlint/load@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/load@npm:17.4.2" dependencies: "@commitlint/config-validator": ^17.4.0 "@commitlint/execute-rule": ^17.4.0 @@ -1339,38 +1326,38 @@ __metadata: resolve-from: ^5.0.0 ts-node: ^10.8.1 typescript: ^4.6.4 - checksum: 17bc9f2e339da480740138bb1f56d6a5c36ec6d70844a605f09b5ffcbe0bb18fd3ab0ad09d40ba3cfd095f26b0b3cf78a02d7b73d5980d9e58dbdcdfaeb252a2 + checksum: 7c0498040611abbc2c9f2af03bc6360ca44ff85943dd49012b90b5a5d9308997d782b75e164ad2c39c5d522e94c93214e5cc4fd3b4122c5788c3c869ee91eae0 languageName: node linkType: hard -"@commitlint/message@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/message@npm:17.4.0" - checksum: 7fe8672f149cf276084f16d66fe38139b188aa94b664397aae8268f9f6060368b801fe8456076c076cb9e55ba469367256f7671aebeabb281e2b5ca275266ff8 +"@commitlint/message@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/message@npm:17.4.2" + checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 languageName: node linkType: hard -"@commitlint/parse@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/parse@npm:17.4.0" +"@commitlint/parse@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/parse@npm:17.4.2" dependencies: "@commitlint/types": ^17.4.0 conventional-changelog-angular: ^5.0.11 conventional-commits-parser: ^3.2.2 - checksum: 5807d44b6f9f3dad93d6af898e989f0b557f08b8f0509b2f72bdafbdbd4c0ffa4abfa01e04225dca19a7479500c5b39560d2bd747335d8f7ba1f25feff129173 + checksum: d6808cc9c9ffcf8b06f938392a7428bb017c5e43d13510edad2c5885468bf0eae23e02c4d9611c200c498adb33eaf8abee797f32d437557101ddee02922f3572 languageName: node linkType: hard -"@commitlint/read@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/read@npm:17.4.0" +"@commitlint/read@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/read@npm:17.4.2" dependencies: "@commitlint/top-level": ^17.4.0 "@commitlint/types": ^17.4.0 fs-extra: ^11.0.0 git-raw-commits: ^2.0.0 minimist: ^1.2.6 - checksum: 66cb387857d377bdc0c64f8ba3a3f4d000421d5866267c94652bfbcfb7962d0079fc2d5333eab5f09e0f8c6f195bc09a1e5b6c3d0b9f1a23c30ae84d498d5fec + checksum: ed509f913bd9790bb3abfde0886abdc4e2569eb7651e666d2d70705954f98f14e2c621ffe8ee17bb8a9bee36e65e4d4d01d5cd2792c8e08e69248d31808830fa languageName: node linkType: hard @@ -1388,16 +1375,16 @@ __metadata: languageName: node linkType: hard -"@commitlint/rules@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/rules@npm:17.4.0" +"@commitlint/rules@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/rules@npm:17.4.2" dependencies: "@commitlint/ensure": ^17.4.0 - "@commitlint/message": ^17.4.0 + "@commitlint/message": ^17.4.2 "@commitlint/to-lines": ^17.4.0 "@commitlint/types": ^17.4.0 execa: ^5.0.0 - checksum: 9f1fc405a41c55212b8c04a67966b36585b852057ebf4e4fa6ee091d55e6479a88fff333be484cff47dbdd24132c06f89d278af5084ee20eaf1156001c8c64d8 + checksum: 2d53f470b511c41359b66886db054cb43fff748281a236a860bf21c3ba666b9d0b346932e8f0ac90e0dfc5ccdea10abda855ea9faa0f3fe3ef0f3fbc6992c141 languageName: node linkType: hard @@ -1453,9 +1440,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-arm64@npm:0.16.16" +"@esbuild/android-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-arm64@npm:0.16.17" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -1467,65 +1454,65 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-arm@npm:0.16.16" +"@esbuild/android-arm@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-arm@npm:0.16.17" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/android-x64@npm:0.16.16" +"@esbuild/android-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-x64@npm:0.16.17" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/darwin-arm64@npm:0.16.16" +"@esbuild/darwin-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/darwin-arm64@npm:0.16.17" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/darwin-x64@npm:0.16.16" +"@esbuild/darwin-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/darwin-x64@npm:0.16.17" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/freebsd-arm64@npm:0.16.16" +"@esbuild/freebsd-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/freebsd-arm64@npm:0.16.17" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/freebsd-x64@npm:0.16.16" +"@esbuild/freebsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/freebsd-x64@npm:0.16.17" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-arm64@npm:0.16.16" +"@esbuild/linux-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-arm64@npm:0.16.17" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-arm@npm:0.16.16" +"@esbuild/linux-arm@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-arm@npm:0.16.17" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-ia32@npm:0.16.16" +"@esbuild/linux-ia32@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-ia32@npm:0.16.17" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -1537,86 +1524,86 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-loong64@npm:0.16.16" +"@esbuild/linux-loong64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-loong64@npm:0.16.17" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-mips64el@npm:0.16.16" +"@esbuild/linux-mips64el@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-mips64el@npm:0.16.17" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-ppc64@npm:0.16.16" +"@esbuild/linux-ppc64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-ppc64@npm:0.16.17" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-riscv64@npm:0.16.16" +"@esbuild/linux-riscv64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-riscv64@npm:0.16.17" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-s390x@npm:0.16.16" +"@esbuild/linux-s390x@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-s390x@npm:0.16.17" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/linux-x64@npm:0.16.16" +"@esbuild/linux-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-x64@npm:0.16.17" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/netbsd-x64@npm:0.16.16" +"@esbuild/netbsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/netbsd-x64@npm:0.16.17" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/openbsd-x64@npm:0.16.16" +"@esbuild/openbsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/openbsd-x64@npm:0.16.17" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/sunos-x64@npm:0.16.16" +"@esbuild/sunos-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/sunos-x64@npm:0.16.17" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-arm64@npm:0.16.16" +"@esbuild/win32-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-arm64@npm:0.16.17" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-ia32@npm:0.16.16" +"@esbuild/win32-ia32@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-ia32@npm:0.16.17" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.16.16": - version: 0.16.16 - resolution: "@esbuild/win32-x64@npm:0.16.16" +"@esbuild/win32-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-x64@npm:0.16.17" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1679,25 +1666,38 @@ __metadata: languageName: node linkType: hard +"@fastify/send@npm:^2.0.0": + version: 2.0.1 + resolution: "@fastify/send@npm:2.0.1" + dependencies: + "@lukeed/ms": ^2.0.1 + escape-html: ~1.0.3 + fast-decode-uri-component: ^1.0.1 + http-errors: 2.0.0 + mime: ^3.0.0 + checksum: 184a21b5cd00a3756f5b9e853b0d110074a438e9112f8a27211aa6c3e2c27b4baf0cc9ca157561914b2181f1dab752ec3dd278bd8419f94972e56d5fdfb4c79c + languageName: node + linkType: hard + "@fastify/static@npm:^6.6.0": - version: 6.6.0 - resolution: "@fastify/static@npm:6.6.0" + version: 6.8.0 + resolution: "@fastify/static@npm:6.8.0" dependencies: "@fastify/accept-negotiator": ^1.0.0 + "@fastify/send": ^2.0.0 content-disposition: ^0.5.3 fastify-plugin: ^4.0.0 glob: ^8.0.1 p-limit: ^3.1.0 readable-stream: ^4.0.0 - send: ^0.18.0 - checksum: 4abefd47f404ead444742905c0596f55ee0dc264f694aeb34debcd10212e2cee8b2694159febe354454667999f397d73b06a52df6fe6150525f8c2a6af3078a8 + checksum: a38738e812a55bcb3042b06be90b703a343b6b13dd28a244b464dc03a63255419e1565279e5fd5d05315b0a4447d102e2387112682d8392700b2142f1f1a1e3e languageName: node linkType: hard "@fontsource/inter@npm:^4.5.14": - version: 4.5.14 - resolution: "@fontsource/inter@npm:4.5.14" - checksum: 4e2eb9e54f8de0025bca7ad8e0822549f1873c5d9a634b8f99630d7bba750b1c86263229bae99375fc82489daa38df41e0304c77c3efda2d9a2f78d0eba3ec56 + version: 4.5.15 + resolution: "@fontsource/inter@npm:4.5.15" + checksum: d4330957c0a23a6c6a47f6f628b89c5603deec6305f28458fd3277bb652913dc77b31ac454bba96beeaecddef87eaf4b60befa2aad040ebb8c22c39ee33a2cf1 languageName: node linkType: hard @@ -1804,11 +1804,11 @@ __metadata: linkType: hard "@iconify-json/tabler@npm:^1.1.49": - version: 1.1.54 - resolution: "@iconify-json/tabler@npm:1.1.54" + version: 1.1.58 + resolution: "@iconify-json/tabler@npm:1.1.58" dependencies: "@iconify/types": "*" - checksum: 4e3234db68858a1d12f37f3c59e6ecdfd6c6a34f916e35837821b74ef54e89f08e16a0078c915d201bfc9ec56a631c102c083d7304a078f33110ea52f0bc82af + checksum: 4ffa89fcf9ca4b45be4ebebc3b7a2c576bbf5575566077dc5502ec73599fd22e2e1153f3fdd8748fe557489b4bdec32d929aa95f4fd583b65b6a4a395b40abb5 languageName: node linkType: hard @@ -1892,6 +1892,13 @@ __metadata: languageName: node linkType: hard +"@lukeed/ms@npm:^2.0.1": + version: 2.0.1 + resolution: "@lukeed/ms@npm:2.0.1" + checksum: c7b46933bf7bad3e024dcbbe2ad6201392b4ed2a05a717c0ef7e96a03fb885d44f08b4b749c392cc51c2736a6a45a08c77f1863ace1c072928fbfd9908a13db3 + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.5": version: 1.0.10 resolution: "@mapbox/node-pre-gyp@npm:1.0.10" @@ -1953,19 +1960,19 @@ __metadata: languageName: node linkType: hard -"@netlify/build@npm:^29.4.0": - version: 29.4.1 - resolution: "@netlify/build@npm:29.4.1" +"@netlify/build@npm:^29.5.2": + version: 29.5.4 + resolution: "@netlify/build@npm:29.5.4" dependencies: "@bugsnag/js": ^7.0.0 - "@netlify/cache-utils": ^5.1.0 - "@netlify/config": ^20.3.0 - "@netlify/edge-bundler": 8.0.0 - "@netlify/functions-utils": ^5.1.1 + "@netlify/cache-utils": ^5.1.1 + "@netlify/config": ^20.3.2 + "@netlify/edge-bundler": 8.4.0 + "@netlify/functions-utils": ^5.1.6 "@netlify/git-utils": ^5.1.0 "@netlify/plugins-list": ^6.61.0 "@netlify/run-utils": ^5.1.0 - "@netlify/zip-it-and-ship-it": ^8.2.0 + "@netlify/zip-it-and-ship-it": ^8.5.0 "@sindresorhus/slugify": ^2.0.0 ansi-escapes: ^5.0.0 chalk: ^5.0.0 @@ -1973,7 +1980,8 @@ __metadata: execa: ^6.0.0 figures: ^4.0.0 filter-obj: ^3.0.0 - got: ^10.0.0 + got: ^12.0.0 + hot-shots: 9.3.0 indent-string: ^5.0.0 is-plain-obj: ^4.0.0 js-yaml: ^4.0.0 @@ -1999,7 +2007,6 @@ __metadata: rfdc: ^1.3.0 safe-json-stringify: ^1.2.0 semver: ^7.0.0 - statsd-client: 0.4.7 string-width: ^5.0.0 strip-ansi: ^7.0.0 supports-color: ^9.0.0 @@ -2012,13 +2019,13 @@ __metadata: yargs: ^17.6.0 bin: netlify-build: bin.js - checksum: 1756c96a5ef99a377cce8f63303f12210d77570c1914204718d2762d1f0ebdb42f9e70d77219ab0b6813cf525c8e48d0f418bd5efb9741d2d0d4d657978bd1b1 + checksum: 2be04f50038086d71609b8d72cde66b7c2ca0c512ff7d0dcabfd55fb16641ba97ce40040c452f7cc17ee9e6a23ad133d9646e64311eb8bc3d19f16883079a470 languageName: node linkType: hard -"@netlify/cache-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "@netlify/cache-utils@npm:5.1.0" +"@netlify/cache-utils@npm:^5.1.1": + version: 5.1.1 + resolution: "@netlify/cache-utils@npm:5.1.1" dependencies: cpy: ^8.1.0 del: ^6.0.0 @@ -2029,13 +2036,13 @@ __metadata: move-file: ^3.0.0 path-exists: ^5.0.0 readdirp: ^3.4.0 - checksum: 2e3cee0955c240150d855c01619c1c74fbffcd7d28f11b395d64bfcaf11d0e6d2ac883ca93c8f386f6fc3daf23547ed98a2a54ee811d3d1cf0e0d95e22329277 + checksum: d490da07f7f0ffcf372b3f48543efa776576f16d9c67b18532f9ab853d7eb41276a1b1ddfe4fc189f1fef91318ce4c0cfe7a1b0fc1b50fab7be5c3ebd30941cb languageName: node linkType: hard -"@netlify/config@npm:^20.3.0": - version: 20.3.0 - resolution: "@netlify/config@npm:20.3.0" +"@netlify/config@npm:^20.3.2": + version: 20.3.2 + resolution: "@netlify/config@npm:20.3.2" dependencies: chalk: ^5.0.0 cron-parser: ^4.1.0 @@ -2050,9 +2057,9 @@ __metadata: is-plain-obj: ^4.0.0 js-yaml: ^4.0.0 map-obj: ^5.0.0 - netlify: ^13.1.0 - netlify-headers-parser: ^7.1.0 - netlify-redirect-parser: ^14.1.0 + netlify: ^13.1.2 + netlify-headers-parser: ^7.1.1 + netlify-redirect-parser: ^14.1.1 omit.js: ^2.0.2 p-locate: ^6.0.0 path-exists: ^5.0.0 @@ -2063,13 +2070,13 @@ __metadata: yargs: ^17.6.0 bin: netlify-config: bin.js - checksum: 1ccafcf7dd7e3ffe241f809968c9e8f73fbeb56e078836eed15da8d8da1054945150aa57fdfc87981eebfd065908812071eda745322f9302c8d1226e668ca4a8 + checksum: 0e01523879e71f784b196a13ead8a6665a649ac1390a4b167a5bab0f48f2f9cd0a70a5f075974fbf5e7e18fbd92a92b360b82920cf908aac657b4d1c0238daf3 languageName: node linkType: hard -"@netlify/edge-bundler@npm:8.0.0": - version: 8.0.0 - resolution: "@netlify/edge-bundler@npm:8.0.0" +"@netlify/edge-bundler@npm:8.4.0, @netlify/edge-bundler@npm:^8.4.0": + version: 8.4.0 + resolution: "@netlify/edge-bundler@npm:8.4.0" dependencies: "@import-maps/resolve": ^1.0.1 ajv: ^8.11.2 @@ -2091,35 +2098,7 @@ __metadata: semver: ^7.3.5 tmp-promise: ^3.0.3 uuid: ^9.0.0 - checksum: b6e387fc46469179b3e53a82895740da02f98011e224827d26009254f671916393c3e4e8a7d4696e12d9220dbe7307f9abc8e479d4d5e833e00178a8bf276cd0 - languageName: node - linkType: hard - -"@netlify/edge-bundler@npm:^8.0.0": - version: 8.1.1 - resolution: "@netlify/edge-bundler@npm:8.1.1" - dependencies: - "@import-maps/resolve": ^1.0.1 - ajv: ^8.11.2 - ajv-errors: ^3.0.0 - better-ajv-errors: ^1.2.0 - common-path-prefix: ^3.0.0 - del: ^7.0.0 - env-paths: ^3.0.0 - execa: ^6.0.0 - find-up: ^6.3.0 - get-port: ^6.1.2 - glob-to-regexp: ^0.4.1 - jsonc-parser: ^3.2.0 - node-fetch: ^3.1.1 - node-stream-zip: ^1.15.0 - p-retry: ^5.1.1 - p-wait-for: ^4.1.0 - path-key: ^4.0.0 - semver: ^7.3.5 - tmp-promise: ^3.0.3 - uuid: ^9.0.0 - checksum: 0c7b07bcfa137a651f9ce58cf4cdd7c3ddaaf559844f0eb297afbc1aac7c27879e7f48ae4dc61259ff3e913e1fe40c4bc0be36c614019f9a95399d6993839a2d + checksum: ea53c2ed8a15fb6b7eee796771755ee4b0295a659996a04d50a9e39c46e3ca493dc179b4477094be2fdd838da6d298226e01ddf1bd40448840df527b6205fa2b languageName: node linkType: hard @@ -2334,9 +2313,9 @@ __metadata: languageName: node linkType: hard -"@netlify/framework-info@npm:^9.5.3": - version: 9.5.3 - resolution: "@netlify/framework-info@npm:9.5.3" +"@netlify/framework-info@npm:^9.7.1": + version: 9.7.2 + resolution: "@netlify/framework-info@npm:9.7.2" dependencies: ajv: ^8.0.0 filter-obj: ^3.0.0 @@ -2350,18 +2329,18 @@ __metadata: read-pkg-up: ^9.0.0 semver: ^7.3.4 url: ^0.11.0 - checksum: ba3f8c55f1563e3e60611838cf1aaffa04633aee86a7bc20ef760c8dda6565f160f85dc19970e6fcd5403f3de210a22d0f9e06d6d24808f9e1a7017243a3a0c2 + checksum: 90e1b1ed48e0882cc7467c74e32a18a1a7c15859f27b97b4b169ee65bae999878bddcf225d6d5a8aca6eb6f605f519a78bfa79e301530b12d4f320d8c5a425c9 languageName: node linkType: hard -"@netlify/functions-utils@npm:^5.1.1": - version: 5.1.1 - resolution: "@netlify/functions-utils@npm:5.1.1" +"@netlify/functions-utils@npm:^5.1.6": + version: 5.1.6 + resolution: "@netlify/functions-utils@npm:5.1.6" dependencies: - "@netlify/zip-it-and-ship-it": ^8.2.0 + "@netlify/zip-it-and-ship-it": ^8.5.0 cpy: ^8.1.0 path-exists: ^5.0.0 - checksum: 526c5f3ff25d8f687a30ab3c6003f97f183f1365468f6716e7f6bcf28022a2163dad8a613a48077c69b8944294e58e325e1ccf130dc4e2b4ffb425b446035879 + checksum: ffcae5d625677268de2b21d1be3bdd8253e4b94ff4cf4df03d01d94a448edf6107ecdb2e06d5550a0c2427d186f1a8350990b294958dfb6d5063c55b061721fb languageName: node linkType: hard @@ -2531,17 +2510,17 @@ __metadata: languageName: node linkType: hard -"@netlify/open-api@npm:^2.12.0": - version: 2.12.2 - resolution: "@netlify/open-api@npm:2.12.2" - checksum: 85b5fb20e80cc581e21924f770536a5797d8efedbade9086b0703f6c87a741c1005b140e7848dda1724f4a7ce945371d74a21e6c624c428c75a88d86f5b1f2e6 +"@netlify/open-api@npm:^2.13.0": + version: 2.14.0 + resolution: "@netlify/open-api@npm:2.14.0" + checksum: 569ab242fd2f9b40287ae80e2474d6c4729cd6323d175a7c2151495940ac174de1776b1ddf8cc392162dda0031e6f647db44cdd43bf35e4feb63609e1c8767ba languageName: node linkType: hard "@netlify/plugins-list@npm:^6.61.0": - version: 6.61.0 - resolution: "@netlify/plugins-list@npm:6.61.0" - checksum: c1a62683f2c0d413e5787241bd2d3b0e6e1d05d4651d8bc9ed06647fdd50f5ab7f2aa2d9041559c5be3029a7064fd6ecf6b9ae0f46f844624bb81f8e7059ddd1 + version: 6.65.0 + resolution: "@netlify/plugins-list@npm:6.65.0" + checksum: 738c86fcb57faa170c64596fde8e2b193decaa16b98842385af615f71b2a31caff1025d4cb5fc09354f96f8a9920e0200906cb5521c29daa928ed02f95b15930 languageName: node linkType: hard @@ -2554,9 +2533,9 @@ __metadata: languageName: node linkType: hard -"@netlify/zip-it-and-ship-it@npm:^8.2.0": - version: 8.2.0 - resolution: "@netlify/zip-it-and-ship-it@npm:8.2.0" +"@netlify/zip-it-and-ship-it@npm:^8.4.1, @netlify/zip-it-and-ship-it@npm:^8.5.0": + version: 8.5.0 + resolution: "@netlify/zip-it-and-ship-it@npm:8.5.0" dependencies: "@babel/parser": 7.16.8 "@netlify/binary-info": ^1.0.0 @@ -2577,7 +2556,7 @@ __metadata: junk: ^4.0.0 locate-path: ^7.0.0 merge-options: ^3.0.4 - minimatch: ^5.0.0 + minimatch: ^6.0.0 normalize-path: ^3.0.0 p-map: ^5.0.0 path-exists: ^5.0.0 @@ -2591,7 +2570,7 @@ __metadata: yargs: ^17.0.0 bin: zip-it-and-ship-it: dist/bin.js - checksum: 1963aeea05598e26c67c420813e5b765510cfe788118eda87eda88583c574f930b2d070dd9f5f368ac0e96752cbca7af9bdb18f52bb6b1c941415df85416a234 + checksum: 75f8fa9516f0dd911790dbcec769891d3241418e6779341a2730fcdef659e4f7ded95e61a89ef51c25353a95e64791fcd681976fc370d2a135f5cbf6ab5d92b5 languageName: node linkType: hard @@ -2650,66 +2629,66 @@ __metadata: linkType: hard "@octokit/auth-token@npm:^3.0.0": - version: 3.0.2 - resolution: "@octokit/auth-token@npm:3.0.2" + version: 3.0.3 + resolution: "@octokit/auth-token@npm:3.0.3" dependencies: - "@octokit/types": ^8.0.0 - checksum: c7204770a6cb1661379c31b5a26779b509324446e61a4902893a69fd471738c817afc470f8ac8d86ad827738cc953046d27fbb87fc81782ff10e366b70241f4e + "@octokit/types": ^9.0.0 + checksum: 9b3f569cec1b7e0aa88ab6da68aed4b49b6652261bd957257541fabaf6a4d4ed99f908153cc3dd2fe15b8b0ccaff8caaafaa50bb1a4de3925b0954a47cca1900 languageName: node linkType: hard "@octokit/core@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/core@npm:4.1.0" + version: 4.2.0 + resolution: "@octokit/core@npm:4.2.0" dependencies: "@octokit/auth-token": ^3.0.0 "@octokit/graphql": ^5.0.0 "@octokit/request": ^6.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: 4e53e02ff3ebe808b74385be0055cc1cce4b548060b20e3f2d5dd1bf7877ff7b6556f11278edc070842bf24aa869f9f59a02638f1b14083eb290b9e297447a2d + checksum: 5ac56e7f14b42a5da8d3075a2ae41483521a78bee061a01f4a81d8c0ecd6a684b2e945d66baba0cd1fdf264639deedc3a96d0f32c4d2fc39b49ca10f52f4de39 languageName: node linkType: hard "@octokit/endpoint@npm:^7.0.0": - version: 7.0.3 - resolution: "@octokit/endpoint@npm:7.0.3" + version: 7.0.5 + resolution: "@octokit/endpoint@npm:7.0.5" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 is-plain-object: ^5.0.0 universal-user-agent: ^6.0.0 - checksum: c36b1577062e51d1683779a59c75d046d59f9a5c3a0f046d465e6c4c39f64bfc3a3052b42fa91a4552c7903ec382c604b4a2e1aadebdf7458191849ede5d4978 + checksum: 81c9e9eabf50e48940cceff7c4d7fbc9327190296507cfe8a199ea00cd492caf8f18a841caf4e3619828924b481996eb16091826db6b5a649bee44c8718ecaa9 languageName: node linkType: hard "@octokit/graphql@npm:^5.0.0": - version: 5.0.4 - resolution: "@octokit/graphql@npm:5.0.4" + version: 5.0.5 + resolution: "@octokit/graphql@npm:5.0.5" dependencies: "@octokit/request": ^6.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 universal-user-agent: ^6.0.0 - checksum: 8cf65cf7e6608cf3cbc96a2fa902172b4d5dc30e88ee0bae3711bf467a25b828b10cce1aaabb7f82a7580bfbcf7028b91d1dd1a894940945e38ca2deb6509754 + checksum: eb2d1a6305a3d1f55ff0ce92fb88b677f0bb789757152d58a79ef61171fb65ecf6fe18d6c27e236c0cee6a0c2600c2cb8370f5ac7184f8e9361c085aa4555bb1 languageName: node linkType: hard -"@octokit/openapi-types@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/openapi-types@npm:14.0.0" - checksum: 0a1f8f3be998cd82c5a640e9166d43fd183b33d5d36f5e1a9b81608e94d0da87c01ec46c9988f69cd26585d4e2ffc4d3ec99ee4f75e5fe997fc86dad0aa8293c +"@octokit/openapi-types@npm:^16.0.0": + version: 16.0.0 + resolution: "@octokit/openapi-types@npm:16.0.0" + checksum: 844f30a545da380d63c712e0eb733366bc567d1aab34529c79fdfbec3d73810e81d83f06fdab13058a5cbc7dae786db1a9b90b5b61b1e606854ee45d5ec5f194 languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^5.0.0": - version: 5.0.1 - resolution: "@octokit/plugin-paginate-rest@npm:5.0.1" +"@octokit/plugin-paginate-rest@npm:^6.0.0": + version: 6.0.0 + resolution: "@octokit/plugin-paginate-rest@npm:6.0.0" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 peerDependencies: "@octokit/core": ">=4" - checksum: cfded297d9f66c7607bd34075eb0c5f7278a1617d6be86115997c0757151c9be2fcf7a8849c2a5cebab56931a263b5cc35742b6227935afe77f5ed61b0627a3d + checksum: 4ad89568d883373898b733837cada7d849d51eef32157c11d4a81cef5ce8e509720d79b46918cada3c132f9b29847e383f17b7cd5c39ede7c93cdcd2f850b47f languageName: node linkType: hard @@ -2722,61 +2701,61 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^6.7.0": - version: 6.7.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.7.0" +"@octokit/plugin-rest-endpoint-methods@npm:^7.0.0": + version: 7.0.1 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.0.1" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 deprecation: ^2.3.1 peerDependencies: "@octokit/core": ">=3" - checksum: 513c6c0717d08f3e85848029bd700412b7d9787750f78cc79a3dede356e94b238bf8a518b108f556a7efe626871720dd0466de9f31091578ea4e0f5a016f0ae7 + checksum: cdb8734ec960f75acc2405284920c58efac9a71b1c3b2a71662b9100ffbc22dac597150acff017a93459c57e9a492d9e1c27872b068387dbb90597de75065fcf languageName: node linkType: hard "@octokit/request-error@npm:^3.0.0": - version: 3.0.2 - resolution: "@octokit/request-error@npm:3.0.2" + version: 3.0.3 + resolution: "@octokit/request-error@npm:3.0.3" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 deprecation: ^2.0.0 once: ^1.4.0 - checksum: 41549554ce780de13d3421f8036635014c8dcbdf867c288526ef7b17e9d92470f33341ddadacf2868dc0181440842803484104efbe11ebfaecdaeec58871a13e + checksum: 5db0b514732686b627e6ed9ef1ccdbc10501f1b271a9b31f784783f01beee70083d7edcfeb35fbd7e569fa31fdd6762b1ff6b46101700d2d97e7e48e749520d0 languageName: node linkType: hard "@octokit/request@npm:^6.0.0": - version: 6.2.2 - resolution: "@octokit/request@npm:6.2.2" + version: 6.2.3 + resolution: "@octokit/request@npm:6.2.3" dependencies: "@octokit/endpoint": ^7.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^9.0.0 is-plain-object: ^5.0.0 node-fetch: ^2.6.7 universal-user-agent: ^6.0.0 - checksum: adbeb38807c60b53d32d9b69be0c1f861c26698bc6f5f3f7e05d26972290dc4867827dd333bdd801818c347e5723efd049a2b9848c6c8bf74a2032968dede0ff + checksum: fef4097be8375d20bb0b3276d8a3adf866ec628f2b0664d334f3c29b92157da847899497abdc7a5be540053819b55564990543175ad48f04e9e6f25f0395d4d3 languageName: node linkType: hard "@octokit/rest@npm:^19.0.0": - version: 19.0.5 - resolution: "@octokit/rest@npm:19.0.5" + version: 19.0.7 + resolution: "@octokit/rest@npm:19.0.7" dependencies: "@octokit/core": ^4.1.0 - "@octokit/plugin-paginate-rest": ^5.0.0 + "@octokit/plugin-paginate-rest": ^6.0.0 "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^6.7.0 - checksum: ed4c36859aafb64e23f7f708086fe7e2ecda17ffd8c1594817d539f766f5855af79f17f5d225d96d34cd9b97cbfea988dac3df39a7cc928b2d2b7b75ed981056 + "@octokit/plugin-rest-endpoint-methods": ^7.0.0 + checksum: 1f970c4de2cf3d1691d3cf5dd4bfa5ac205629e76417b5c51561e1beb5b4a7e6c65ba647f368727e67e5243418e06ca9cdafd9e733173e1529385d4f4d053d3d languageName: node linkType: hard -"@octokit/types@npm:^8.0.0": - version: 8.0.0 - resolution: "@octokit/types@npm:8.0.0" +"@octokit/types@npm:^9.0.0": + version: 9.0.0 + resolution: "@octokit/types@npm:9.0.0" dependencies: - "@octokit/openapi-types": ^14.0.0 - checksum: 1a0197b2c4c522ac90f145e02b3f8cb048a47f71c2c6bdbf021a03db7dd30ca92a899c0186acb401337f218efe44e60d33cc1cc68715b622bb75bc1a4e79515d + "@octokit/openapi-types": ^16.0.0 + checksum: 5c7f5cca8f00f7c4daa0d00f4fe991c1598ec47cd6ced50b1c5fbe9721bb9dee0adc2acdee265a3a715bb984e53ef3dc7f1cfb7326f712c6d809d59fc5c6648d languageName: node linkType: hard @@ -2942,12 +2921,12 @@ __metadata: linkType: hard "@sindresorhus/slugify@npm:^2.0.0": - version: 2.1.1 - resolution: "@sindresorhus/slugify@npm:2.1.1" + version: 2.2.0 + resolution: "@sindresorhus/slugify@npm:2.2.0" dependencies: "@sindresorhus/transliterate": ^1.0.0 escape-string-regexp: ^5.0.0 - checksum: 0c60c8ce0ec2e1ca0b7aaa0babe36bb537b13ffdaac938ac5c0cbeb39a23a6c76cb50cfa65e9e172e4e5058ae5b0bf35c9aeae52fd09dc60033d59ffdd91507c + checksum: 13c5cff81b94ec9130b74692b12acefa406be6ab20bc842cb2a751d850719f709ca2acfeb8b66dde7fd96d989360d97e620d783292ad963bab9df999cd1d3102 languageName: node linkType: hard @@ -3026,8 +3005,8 @@ __metadata: linkType: hard "@tailwindcss/typography@npm:^0.5.0": - version: 0.5.8 - resolution: "@tailwindcss/typography@npm:0.5.8" + version: 0.5.9 + resolution: "@tailwindcss/typography@npm:0.5.9" dependencies: lodash.castarray: ^4.4.0 lodash.isplainobject: ^4.0.6 @@ -3035,7 +3014,7 @@ __metadata: postcss-selector-parser: 6.0.10 peerDependencies: tailwindcss: "*" - checksum: afe172c75ddf086f840b10f95e562bb210dde5612fccfcfd3c4cee688c57ca5b79569b3c2cb75687b34b1b7f9ad194b14e9fbb09a741cd69198bb92b5ac3838f + checksum: b98e21bdd1798d7e4683499893c5c20ad43fcc8955d5d6eefbe1d30e98e9b6c28949ae8f276d39be9a66fafe843597717196bc5a0a2ac0f87ef86aa051ab9611 languageName: node linkType: hard @@ -3192,26 +3171,26 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.31": - version: 4.17.32 - resolution: "@types/express-serve-static-core@npm:4.17.32" +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.33 + resolution: "@types/express-serve-static-core@npm:4.17.33" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" - checksum: 70ec1b8f386628850b315a7b9fd4240a5a70297b41ef1c39af65c8b9661d2c775cfff4686b491fd90e5b6eef43088af203700c5541aec0d063db0c6cbeff254c + checksum: dce580d16b85f207445af9d4053d66942b27d0c72e86153089fa00feee3e96ae336b7bedb31ed4eea9e553c99d6dd356ed6e0928f135375d9f862a1a8015adf2 languageName: node linkType: hard "@types/express@npm:*": - version: 4.17.15 - resolution: "@types/express@npm:4.17.15" + version: 4.17.17 + resolution: "@types/express@npm:4.17.17" dependencies: "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.31 + "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b + checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da languageName: node linkType: hard @@ -3372,7 +3351,7 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.1.6, @types/node-fetch@npm:latest": +"@types/node-fetch@latest, @types/node-fetch@npm:^2.1.6": version: 2.6.2 resolution: "@types/node-fetch@npm:2.6.2" dependencies: @@ -3382,10 +3361,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.11.18, @types/node@npm:latest": - version: 18.11.18 - resolution: "@types/node@npm:18.11.18" - checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d +"@types/node@latest, @types/node@npm:*, @types/node@npm:^18.11.18": + version: 18.13.0 + resolution: "@types/node@npm:18.13.0" + checksum: 4ea10f8802848b01672bce938f678b6774ca2cee0c9774f12275ab064ae07818419c3e2e41d6257ce7ba846d1ea26c63214aa1dfa4166fa3746291752b8c6416 languageName: node linkType: hard @@ -3663,6 +3642,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/types@npm:5.51.0" + checksum: b31021a0866f41ba5d71b6c4c7e20cc9b99d49c93bb7db63b55b2e51542fb75b4e27662ee86350da3c1318029e278a5a807facaf4cb5aeea724be8b0e021e836 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.45.0": version: 5.45.0 resolution: "@typescript-eslint/typescript-estree@npm:5.45.0" @@ -3681,7 +3667,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.48.0, @typescript-eslint/typescript-estree@npm:^5.13.0": +"@typescript-eslint/typescript-estree@npm:5.48.0": version: 5.48.0 resolution: "@typescript-eslint/typescript-estree@npm:5.48.0" dependencies: @@ -3699,6 +3685,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:^5.13.0": + version: 5.51.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.51.0" + dependencies: + "@typescript-eslint/types": 5.51.0 + "@typescript-eslint/visitor-keys": 5.51.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: aec23e5cab48ee72fefa6d1ac266639ebabf6cebec1e0207ad47011d3a48186ac9a632c8e34c3bac896155f54895a497230c11d789fd81263b08eb267d7113ce + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:5.45.0": version: 5.45.0 resolution: "@typescript-eslint/utils@npm:5.45.0" @@ -3755,6 +3759,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.51.0" + dependencies: + "@typescript-eslint/types": 5.51.0 + eslint-visitor-keys: ^3.3.0 + checksum: b49710f3c6b3b62a846a163afffd81be5eb2b1f44e25bec51ff3c9f4c3b579d74aa4cbd3753b4fc09ea3dbc64a7062f9c658c08d22bb2740a599cb703d876220 + languageName: node + linkType: hard + "@vercel/nft@npm:^0.22.0": version: 0.22.6 resolution: "@vercel/nft@npm:0.22.6" @@ -3882,11 +3896,11 @@ __metadata: linkType: hard "acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.6.0, acorn@npm:^8.8.0": - version: 8.8.1 - resolution: "acorn@npm:8.8.1" + version: 8.8.2 + resolution: "acorn@npm:8.8.2" bin: acorn: bin/acorn - checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 languageName: node linkType: hard @@ -4656,7 +4670,7 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.4.0": +"bindings@npm:^1.4.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -4859,25 +4873,25 @@ __metadata: linkType: hard "browserslist@npm:^4.0.0, browserslist@npm:^4.13.0, browserslist@npm:^4.16.6, browserslist@npm:^4.21.4": - version: 4.21.4 - resolution: "browserslist@npm:4.21.4" + version: 4.21.5 + resolution: "browserslist@npm:4.21.5" dependencies: - caniuse-lite: ^1.0.30001400 - electron-to-chromium: ^1.4.251 - node-releases: ^2.0.6 - update-browserslist-db: ^1.0.9 + caniuse-lite: ^1.0.30001449 + electron-to-chromium: ^1.4.284 + node-releases: ^2.0.8 + update-browserslist-db: ^1.0.10 bin: browserslist: cli.js - checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + checksum: 9755986b22e73a6a1497fd8797aedd88e04270be33ce66ed5d85a1c8a798292a65e222b0f251bafa1c2522261e237d73b08b58689d4920a607e5a53d56dc4706 languageName: node linkType: hard "bson@npm:^4.7.0": - version: 4.7.1 - resolution: "bson@npm:4.7.1" + version: 4.7.2 + resolution: "bson@npm:4.7.2" dependencies: buffer: ^5.6.0 - checksum: 546aaf322e42514e0c48c875ad6ffafc66458c83fea0fb89e9e3002ba040b7d95ab40e63eca7f997d1f9d4e92cd02af259ba761799bf04aafc3a857e12d147c4 + checksum: f357d12c5679c8eb029a62e410ad40fb862b7b91f0fc12a3399fb3668e14aecaa63205ffeeee48735a01d393171743607dcd527eb8c058b6f2bd294079ee4125 languageName: node linkType: hard @@ -5082,17 +5096,17 @@ __metadata: linkType: hard "cacheable-request@npm:^10.2.1": - version: 10.2.5 - resolution: "cacheable-request@npm:10.2.5" + version: 10.2.7 + resolution: "cacheable-request@npm:10.2.7" dependencies: "@types/http-cache-semantics": ^4.0.1 get-stream: ^6.0.1 - http-cache-semantics: ^4.1.0 + http-cache-semantics: ^4.1.1 keyv: ^4.5.2 mimic-response: ^4.0.0 normalize-url: ^8.0.0 responselike: ^3.0.0 - checksum: 9bf7443792072a50b5c5e17bd8e080e11d91b72a45ec7f287ffe47c96e9d64a4e60b7d7835114ef75b9667db45a85be1b16fa692cf31cf9a9c9fabae0ab3f098 + checksum: 25cfbe0cab755bcee3bf6610b0253414e583289f795a28035616bf3186ecb303e8caf1943cbf42d92410b3f24124a1cdd663dd8ff52ac2c997a5129de5e9557a languageName: node linkType: hard @@ -5240,10 +5254,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001426": - version: 1.0.30001442 - resolution: "caniuse-lite@npm:1.0.30001442" - checksum: c1bff65bd4f53da2d288e7f55be40706ee0119b983eae5a9dcc884046990476891630aef72d708f7989f8f1964200c44e4c37ea40deecaa2fb4a480df23e6317 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001426, caniuse-lite@npm:^1.0.30001449": + version: 1.0.30001450 + resolution: "caniuse-lite@npm:1.0.30001450" + checksum: 511b360bfc907b2e437699364cf96b83507bc45043926450056642332bcd6f65a1e72540c828534ae15e0ac906e3e9af46cb2bb84458dd580bc31478e9dce282 languageName: node linkType: hard @@ -5943,9 +5957,9 @@ __metadata: linkType: hard "content-type@npm:^1.0.4, content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 languageName: node linkType: hard @@ -6358,11 +6372,11 @@ __metadata: linkType: hard "cron-parser@npm:^4.1.0, cron-parser@npm:^4.2.1": - version: 4.7.0 - resolution: "cron-parser@npm:4.7.0" + version: 4.7.1 + resolution: "cron-parser@npm:4.7.1" dependencies: - luxon: ^3.1.0 - checksum: 25489f2cd41ada61bc35a09bdb7147e5f1d25179c740725d859e18076dabdf2551bfdd6d62fe339227d58840b068bb5a330fb6f867e695e998fd32359d6e0022 + luxon: ^3.2.1 + checksum: 60642d4710c6ba202b781be6c905d68a47ac69fe1b9eaba06a3f7e9950ba58adbb21ae260452b2801d80b2a1f04f142bb847157c5a707fa4b01a5d2c8842828e languageName: node linkType: hard @@ -6605,9 +6619,9 @@ __metadata: linkType: hard "data-uri-to-buffer@npm:^4.0.0": - version: 4.0.0 - resolution: "data-uri-to-buffer@npm:4.0.0" - checksum: a010653869abe8bb51259432894ac62c52bf79ad761d418d94396f48c346f2ae739c46b254e8bb5987bded8a653d467db1968db3a69bab1d33aa5567baa5cfc7 + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c languageName: node linkType: hard @@ -6856,9 +6870,9 @@ __metadata: linkType: hard "deepmerge@npm:^4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b + version: 4.3.0 + resolution: "deepmerge@npm:4.3.0" + checksum: c7980eb5c5be040b371f1df0d566473875cfabed9f672ccc177b81ba8eee5686ce2478de2f1d0076391621cbe729e5eacda397179a59ef0f68901849647db126 languageName: node linkType: hard @@ -7407,10 +7421,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.251": - version: 1.4.284 - resolution: "electron-to-chromium@npm:1.4.284" - checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a +"electron-to-chromium@npm:^1.4.284": + version: 1.4.288 + resolution: "electron-to-chromium@npm:1.4.288" + checksum: 312e1210f62c6bb593d1f57a15a1c64729e6a5edeacecc5d28dfb21f1a78ed3fac11805a0749a4e68f1fe1536229bf9d7bca36e1f34303369248a749a78aec1f languageName: node linkType: hard @@ -7523,11 +7537,12 @@ __metadata: linkType: hard "es-abstract@npm:^1.17.5, es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.0 - resolution: "es-abstract@npm:1.21.0" + version: 1.21.1 + resolution: "es-abstract@npm:1.21.1" dependencies: + available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 - es-set-tostringtag: ^2.0.0 + es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 function-bind: ^1.1.1 function.prototype.name: ^1.1.5 @@ -7540,7 +7555,7 @@ __metadata: has-proto: ^1.0.1 has-symbols: ^1.0.3 internal-slot: ^1.0.4 - is-array-buffer: ^3.0.0 + is-array-buffer: ^3.0.1 is-callable: ^1.2.7 is-negative-zero: ^2.0.2 is-regex: ^1.1.4 @@ -7558,34 +7573,35 @@ __metadata: typed-array-length: ^1.0.4 unbox-primitive: ^1.0.2 which-typed-array: ^1.1.9 - checksum: 52305b52aff6505c9d8cebfa727835dd8871af76de151868d1db7baf6d21f13a81586316ac513601eec9b46e2947cab044fc2a131db68bfa05daf37aa153dbd9 + checksum: 23ff60d42d17a55d150e7bcedbdb065d4077a8b98c436e0e2e1ef4dd532a6d78a56028673de0bd8ed464a43c46ba781c50d9af429b6a17e44dbd14c7d7fb7926 languageName: node linkType: hard "es-get-iterator@npm:^1.1.2": - version: 1.1.2 - resolution: "es-get-iterator@npm:1.1.2" + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" dependencies: call-bind: ^1.0.2 - get-intrinsic: ^1.1.0 - has-symbols: ^1.0.1 - is-arguments: ^1.1.0 + get-intrinsic: ^1.1.3 + has-symbols: ^1.0.3 + is-arguments: ^1.1.1 is-map: ^2.0.2 is-set: ^2.0.2 - is-string: ^1.0.5 + is-string: ^1.0.7 isarray: ^2.0.5 - checksum: f75e66acb6a45686fa08b3ade9c9421a70d36a0c43ed4363e67f4d7aab2226cb73dd977cb48abbaf75721b946d3cd810682fcf310c7ad0867802fbf929b17dcf + stop-iteration-iterator: ^1.0.0 + checksum: 8fa118da42667a01a7c7529f8a8cca514feeff243feec1ce0bb73baaa3514560bd09d2b3438873cf8a5aaec5d52da248131de153b28e2638a061b6e4df13267d languageName: node linkType: hard "es-module-lexer@npm:^1.0.0": - version: 1.1.0 - resolution: "es-module-lexer@npm:1.1.0" - checksum: 3e9f5019b69c6b2f04eb8478c4fdb4ed72cb8b4c97511b5dd39c1f498386ed8f5083c32067c15efcfabc7e8460cb65ed4627dd32405475715a898009922f41fa + version: 1.1.1 + resolution: "es-module-lexer@npm:1.1.1" + checksum: 1eba6029faa74b8bf6ab0619f8e5a407ded87be6df3ea3831325166ecf9323d69e389b2a4403339e79c94f43e9dd9823580d5bbc5dfad7c6920ed4830575dc75 languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.0": +"es-set-tostringtag@npm:^2.0.1": version: 2.0.1 resolution: "es-set-tostringtag@npm:2.0.1" dependencies: @@ -7849,31 +7865,31 @@ __metadata: linkType: hard "esbuild@npm:^0.16.3": - version: 0.16.16 - resolution: "esbuild@npm:0.16.16" + version: 0.16.17 + resolution: "esbuild@npm:0.16.17" dependencies: - "@esbuild/android-arm": 0.16.16 - "@esbuild/android-arm64": 0.16.16 - "@esbuild/android-x64": 0.16.16 - "@esbuild/darwin-arm64": 0.16.16 - "@esbuild/darwin-x64": 0.16.16 - "@esbuild/freebsd-arm64": 0.16.16 - "@esbuild/freebsd-x64": 0.16.16 - "@esbuild/linux-arm": 0.16.16 - "@esbuild/linux-arm64": 0.16.16 - "@esbuild/linux-ia32": 0.16.16 - "@esbuild/linux-loong64": 0.16.16 - "@esbuild/linux-mips64el": 0.16.16 - "@esbuild/linux-ppc64": 0.16.16 - "@esbuild/linux-riscv64": 0.16.16 - "@esbuild/linux-s390x": 0.16.16 - "@esbuild/linux-x64": 0.16.16 - "@esbuild/netbsd-x64": 0.16.16 - "@esbuild/openbsd-x64": 0.16.16 - "@esbuild/sunos-x64": 0.16.16 - "@esbuild/win32-arm64": 0.16.16 - "@esbuild/win32-ia32": 0.16.16 - "@esbuild/win32-x64": 0.16.16 + "@esbuild/android-arm": 0.16.17 + "@esbuild/android-arm64": 0.16.17 + "@esbuild/android-x64": 0.16.17 + "@esbuild/darwin-arm64": 0.16.17 + "@esbuild/darwin-x64": 0.16.17 + "@esbuild/freebsd-arm64": 0.16.17 + "@esbuild/freebsd-x64": 0.16.17 + "@esbuild/linux-arm": 0.16.17 + "@esbuild/linux-arm64": 0.16.17 + "@esbuild/linux-ia32": 0.16.17 + "@esbuild/linux-loong64": 0.16.17 + "@esbuild/linux-mips64el": 0.16.17 + "@esbuild/linux-ppc64": 0.16.17 + "@esbuild/linux-riscv64": 0.16.17 + "@esbuild/linux-s390x": 0.16.17 + "@esbuild/linux-x64": 0.16.17 + "@esbuild/netbsd-x64": 0.16.17 + "@esbuild/openbsd-x64": 0.16.17 + "@esbuild/sunos-x64": 0.16.17 + "@esbuild/win32-arm64": 0.16.17 + "@esbuild/win32-ia32": 0.16.17 + "@esbuild/win32-x64": 0.16.17 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -7921,7 +7937,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: d3163ec01e017776df6b68e1825caa2323918f0d03eb92250bdcdff80410a2c0eb5b3807955db84d83b1b91cf24af9815a1d19efc2343c490be3e5d7b27a834f + checksum: 4c2cc609ecfb426554bc3f75beb92d89eb2d0c515cfceebaa36c7599d7dcaab7056b70f6d6b51e72b45951ddf9021ee28e356cf205f8e42cc055d522312ea30c languageName: node linkType: hard @@ -8135,7 +8151,7 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.31.0, eslint@npm:^8.26.0": +"eslint@npm:8.31.0": version: 8.31.0 resolution: "eslint@npm:8.31.0" dependencies: @@ -8184,6 +8200,55 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^8.26.0": + version: 8.33.0 + resolution: "eslint@npm:8.33.0" + dependencies: + "@eslint/eslintrc": ^1.4.1 + "@humanwhocodes/config-array": ^0.11.8 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.4.0 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-sdsl: ^4.1.4 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + regexpp: ^3.2.0 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: 727e63ab8b7acf281442323c5971f6afdd5b656fbcebc4476cf54e35af51b2f180617433fc5e1952f0449ca3f43a905527f9407ea4b8a7ea7562fc9c3f278d4c + languageName: node + linkType: hard + "espree@npm:^9.4.0": version: 9.4.1 resolution: "espree@npm:9.4.1" @@ -8254,11 +8319,11 @@ __metadata: linkType: hard "estree-util-attach-comments@npm:^2.0.0": - version: 2.1.0 - resolution: "estree-util-attach-comments@npm:2.1.0" + version: 2.1.1 + resolution: "estree-util-attach-comments@npm:2.1.1" dependencies: "@types/estree": ^1.0.0 - checksum: 8489b977dc420e4af59b03528487b2963d7bfe2d6d265819231dce5a1a5c389109230be102d4b7b85a86ec64f75a7e70b0f306542d56ec557c83f92ec326738a + checksum: c5c2c41c9a55a169fb4fba9627057843f0d2e21e47a2e3e24318a11ffcf6bc704c0f96f405a529bddac7969b7c44f6cf86711505faaf0c5862c2024419b19704 languageName: node linkType: hard @@ -8274,30 +8339,30 @@ __metadata: linkType: hard "estree-util-is-identifier-name@npm:^2.0.0": - version: 2.0.1 - resolution: "estree-util-is-identifier-name@npm:2.0.1" - checksum: d91693dc1c8e7f9860e5c73d3f2e0ad4fc484dc9df432086e0432c27c89f1690fe3c63f0d608d11bce77bb026a4edef434c28da5cbad0761d0292741a96b1481 + version: 2.1.0 + resolution: "estree-util-is-identifier-name@npm:2.1.0" + checksum: cab317a071fafb99cf83b57df7924bccd2e6ab4e252688739e49f00b16cefd168e279c171442b0557c80a1c80ffaa927d670dadea65bb3c9b151efb8e772e89d languageName: node linkType: hard "estree-util-to-js@npm:^1.1.0": - version: 1.1.0 - resolution: "estree-util-to-js@npm:1.1.0" + version: 1.1.1 + resolution: "estree-util-to-js@npm:1.1.1" dependencies: "@types/estree-jsx": ^1.0.0 astring: ^1.8.0 source-map: ^0.7.0 - checksum: 3ce2ef2fd78497fa7a0e5250be0f217af9060c819f7ed4f4739285e4ade4ed244536cb88e8ba1e38986af98d3a9064165122bb1622f2c6d57fe7b241b884fc47 + checksum: 67a1dd8757057bb835f7a094e3028804002b8ce6e5951b09542d4e28fab805c71b50b302f6deb0c47bff0eae3135b3815b4656f07a1e5014dbdc222acf31a762 languageName: node linkType: hard "estree-util-visit@npm:^1.0.0": - version: 1.2.0 - resolution: "estree-util-visit@npm:1.2.0" + version: 1.2.1 + resolution: "estree-util-visit@npm:1.2.1" dependencies: "@types/estree-jsx": ^1.0.0 "@types/unist": ^2.0.0 - checksum: d36a36aed82d6cb00d24615889052e22308ff008191b3760f65f93e9d0b06d3bc448af9f99a685947f1c69fba36d9a412da243b0b026096c66ecd74054c3b090 + checksum: 6feea4fdc43b0ba0f79faf1d57cf32373007e146d4810c7c09c13f5a9c1b8600c1ac57a8d949967cedd2a9a91dddd246e19b59bacfc01e417168b4ebf220f691 languageName: node linkType: hard @@ -8316,9 +8381,11 @@ __metadata: linkType: hard "estree-walker@npm:^3.0.0": - version: 3.0.2 - resolution: "estree-walker@npm:3.0.2" - checksum: ecf457e8d4750cefb10b3e003df3bfceabe1e360695d0d71efdf00b45a4d625cb117e9a03d06331e989d5f1df2b4963b5c80df7f5d88c7ea3fe5586b5c783900 + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af languageName: node linkType: hard @@ -8557,7 +8624,7 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:^2.0.0": +"extract-zip@npm:^2.0.0, extract-zip@npm:^2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -8588,6 +8655,13 @@ __metadata: languageName: node linkType: hard +"fast-content-type-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-content-type-parse@npm:1.0.0" + checksum: 9e9187be17bea18a2ee715c5737b983181cbe84f286a291db0595e421e04b578da10ca10845639be08664a4db6a793f7709822935cf38cfdf9ecba38d84ead9e + languageName: node + linkType: hard + "fast-decode-uri-component@npm:^1.0.1": version: 1.0.1 resolution: "fast-decode-uri-component@npm:1.0.1" @@ -8672,11 +8746,11 @@ __metadata: linkType: hard "fast-querystring@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-querystring@npm:1.1.0" + version: 1.1.1 + resolution: "fast-querystring@npm:1.1.1" dependencies: fast-decode-uri-component: ^1.0.1 - checksum: 912e55326733004ac15ee6c759a319ed01117c23953d93ff28f64b230e76ba22cdf14722fb01c1045d80c6d565e39a6ae18b89f05faa576862036e0a4ccff473 + checksum: 86d2b75b9b299a552353532fb1a542f09730ee2a61e657d68710971d9a2afc9a3c5c7b7e106b6534f4cc506d2ff1c08ab0fda4ae614b4e7720798c9ac2a88e02 languageName: node linkType: hard @@ -8713,22 +8787,22 @@ __metadata: linkType: hard "fastify-plugin@npm:^4.0.0": - version: 4.4.0 - resolution: "fastify-plugin@npm:4.4.0" - checksum: f61d6620a24e8c3c9e67305fffe5570d4c0580477fc0f11fd9397b3e11e2b28ea0873e80d2774fee3ad9d70a81a07a83cb0da61e92afc70f6c50bbb3fb91335d + version: 4.5.0 + resolution: "fastify-plugin@npm:4.5.0" + checksum: 3cc36a43ec72ee9974d3cd1989027e77b277b0994e4fc02ed4e6492aabd83a0be66f14fdec56e60d9a41911ea1ff1ea70c9d957a87e46bcdb8fedd859f4988fe languageName: node linkType: hard "fastify@npm:^4.10.2": - version: 4.11.0 - resolution: "fastify@npm:4.11.0" + version: 4.12.0 + resolution: "fastify@npm:4.12.0" dependencies: "@fastify/ajv-compiler": ^3.3.1 "@fastify/error": ^3.0.0 "@fastify/fast-json-stringify-compiler": ^4.1.0 abstract-logging: ^2.0.1 avvio: ^8.2.0 - content-type: ^1.0.4 + fast-content-type-parse: ^1.0.0 find-my-way: ^7.3.0 light-my-request: ^5.6.1 pino: ^8.5.0 @@ -8738,7 +8812,7 @@ __metadata: secure-json-parse: ^2.5.0 semver: ^7.3.7 tiny-lru: ^10.0.0 - checksum: 814803b1015ae47cce4d7877a16788abee3ba6bba23e7e1b08a6cc62b43828aa6c38624de835c5b422da902fa93b316d1222d191b8373bebd8acbd68c8843584 + checksum: 7f5ec6aad14cd57acf11899c3c64186c7b0a1716c068ad7174375fdcc21248e5cd1c54ac71d496504b0255f5eefdb6858446d859286c70472742ea75a4eb4cad languageName: node linkType: hard @@ -9454,14 +9528,14 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": - version: 1.1.3 - resolution: "get-intrinsic@npm:1.1.3" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": + version: 1.2.0 + resolution: "get-intrinsic@npm:1.2.0" dependencies: function-bind: ^1.1.1 has: ^1.0.3 has-symbols: ^1.0.3 - checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d languageName: node linkType: hard @@ -9746,15 +9820,15 @@ __metadata: linkType: hard "glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.0.3 - resolution: "glob@npm:8.0.3" + version: 8.1.0 + resolution: "glob@npm:8.1.0" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 minimatch: ^5.0.1 once: ^1.3.0 - checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 languageName: node linkType: hard @@ -9797,11 +9871,11 @@ __metadata: linkType: hard "globals@npm:^13.15.0, globals@npm:^13.19.0": - version: 13.19.0 - resolution: "globals@npm:13.19.0" + version: 13.20.0 + resolution: "globals@npm:13.20.0" dependencies: type-fest: ^0.20.2 - checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a languageName: node linkType: hard @@ -9900,7 +9974,7 @@ __metadata: languageName: node linkType: hard -"got@npm:^10.0.0, got@npm:^10.7.0": +"got@npm:^10.7.0": version: 10.7.0 resolution: "got@npm:10.7.0" dependencies: @@ -9923,7 +9997,7 @@ __metadata: languageName: node linkType: hard -"got@npm:^12.1.0": +"got@npm:^12.0.0, got@npm:^12.1.0": version: 12.5.3 resolution: "got@npm:12.5.3" dependencies: @@ -10118,7 +10192,7 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 @@ -10258,8 +10332,8 @@ __metadata: linkType: hard "hast-util-to-estree@npm:^2.0.0": - version: 2.1.0 - resolution: "hast-util-to-estree@npm:2.1.0" + version: 2.3.0 + resolution: "hast-util-to-estree@npm:2.3.0" dependencies: "@types/estree": ^1.0.0 "@types/estree-jsx": ^1.0.0 @@ -10273,10 +10347,10 @@ __metadata: mdast-util-mdxjs-esm: ^1.0.0 property-information: ^6.0.0 space-separated-tokens: ^2.0.0 - style-to-object: ^0.3.0 + style-to-object: ^0.4.1 unist-util-position: ^4.0.0 zwitch: ^2.0.0 - checksum: 1e14cfbfd57ff00ffda48cfef23bcebb6ebbea0385bb03d748a9432591c60f0a69428baaba82375a8cdbc924217ba9e75d30820b3641fdbe12ae62aa6c3f90a7 + checksum: 22b59f9ae1dc5f8dd6dd5d187640055fa8919cc98dd55484554a7e81cc7c0fb1b16221043e168a877ce177efdd4fc98df1db877be5c5a005324bb06e6b1b85d0 languageName: node linkType: hard @@ -10312,6 +10386,18 @@ __metadata: languageName: node linkType: hard +"hot-shots@npm:9.3.0": + version: 9.3.0 + resolution: "hot-shots@npm:9.3.0" + dependencies: + unix-dgram: 2.x + dependenciesMeta: + unix-dgram: + optional: true + checksum: bfc874abcb6da71afe0fc3b63c5872e5b7183c1bbea83e9c6e4a4d3fe399567420057a8a3e090fa0c6689b0cfb24d15d917e6f627ad8e022c45240f2d2b17f28 + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -10352,10 +10438,10 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 languageName: node linkType: hard @@ -10579,12 +10665,12 @@ __metadata: languageName: node linkType: hard -"imagetools-core@npm:^3.2.3, imagetools-core@npm:^3.3.0": - version: 3.3.0 - resolution: "imagetools-core@npm:3.3.0" +"imagetools-core@npm:^3.2.3, imagetools-core@npm:^3.3.1": + version: 3.3.1 + resolution: "imagetools-core@npm:3.3.1" dependencies: - sharp: ^0.31.0 - checksum: b9c96e4fec86edfe36c1142cc8ea5058048c05a476933e9cf90ed35e292d1f7873e8d5c86ccf7dc58d4e6bb918e6774f5344aa038725d0640fb37cfc37a11b44 + sharp: ^0.31.3 + checksum: ee14995214a52c931884a28c5233d427f22c25115ad20a05717ce72b9e95ab65b91814a0ad068a74b73cd320f937ebfdd0812d04680cc863ec9fd1e22d952891 languageName: node linkType: hard @@ -10798,7 +10884,7 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.1.0, is-arguments@npm:^1.1.1": +"is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" dependencies: @@ -10808,7 +10894,7 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.0, is-array-buffer@npm:^3.0.1": +"is-array-buffer@npm:^3.0.1": version: 3.0.1 resolution: "is-array-buffer@npm:3.0.1" dependencies: @@ -10876,11 +10962,11 @@ __metadata: linkType: hard "is-builtin-module@npm:^3.1.0, is-builtin-module@npm:^3.2.0": - version: 3.2.0 - resolution: "is-builtin-module@npm:3.2.0" + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" dependencies: builtin-modules: ^3.3.0 - checksum: 0315751b898feff0646511c896e88b608a755c5025d0ce9a3ad25783de50be870e47dafb838cebbb06fbb2a948b209ea55348eee267836c9dd40d3a11ec717d3 + checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 languageName: node linkType: hard @@ -11676,9 +11762,9 @@ __metadata: linkType: hard "js-sdsl@npm:^4.1.4": - version: 4.2.0 - resolution: "js-sdsl@npm:4.2.0" - checksum: 2cd0885f7212afb355929d72ca105cb37de7e95ad6031e6a32619eaefa46735a7d0fb682641a0ba666e1519cb138fe76abc1eea8a34e224140c9d94c995171f1 + version: 4.3.0 + resolution: "js-sdsl@npm:4.3.0" + checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e languageName: node linkType: hard @@ -11872,21 +11958,15 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^8.5.1": - version: 8.5.1 - resolution: "jsonwebtoken@npm:8.5.1" +"jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" dependencies: jws: ^3.2.2 - lodash.includes: ^4.3.0 - lodash.isboolean: ^3.0.3 - lodash.isinteger: ^4.0.4 - lodash.isnumber: ^3.0.3 - lodash.isplainobject: ^4.0.6 - lodash.isstring: ^4.0.1 - lodash.once: ^4.0.0 + lodash: ^4.17.21 ms: ^2.1.1 - semver: ^5.6.0 - checksum: 93c9e3f23c59b758ac88ba15f4e4753b3749dfce7a6f7c40fb86663128a1e282db085eec852d4e0cbca4cefdcd3a8275ee255dbd08fcad0df26ad9f6e4cc853a + semver: ^7.3.8 + checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 languageName: node linkType: hard @@ -12317,20 +12397,6 @@ __metadata: languageName: node linkType: hard -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 - languageName: node - linkType: hard - "lodash.isempty@npm:^4.4.0": version: 4.4.0 resolution: "lodash.isempty@npm:4.4.0" @@ -12345,13 +12411,6 @@ __metadata: languageName: node linkType: hard -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 - languageName: node - linkType: hard - "lodash.ismatch@npm:^4.4.0": version: 4.4.0 resolution: "lodash.ismatch@npm:4.4.0" @@ -12359,13 +12418,6 @@ __metadata: languageName: node linkType: hard -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -12373,13 +12425,6 @@ __metadata: languageName: node linkType: hard -"lodash.isstring@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.isstring@npm:4.0.1" - checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 - languageName: node - linkType: hard - "lodash.kebabcase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.kebabcase@npm:4.1.1" @@ -12415,13 +12460,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 - languageName: node - linkType: hard - "lodash.snakecase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.snakecase@npm:4.1.1" @@ -12556,15 +12594,15 @@ __metadata: linkType: hard "logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.4.2 - resolution: "logform@npm:2.4.2" + version: 2.5.0 + resolution: "logform@npm:2.5.0" dependencies: "@colors/colors": 1.5.0 fecha: ^4.2.0 ms: ^2.1.1 safe-stable-stringify: ^2.3.1 triple-beam: ^1.3.0 - checksum: 3d00f4e1ccaf0a86886aabbf66d1f1d207441d5b408f103457da6d64d055aee76c02af4b40a31ca77a1db4cbcdecb007149f731536c39cbd89b7b6ba3dda6d7b + checksum: 6234b90b0b7ed799eb22071a4051895b4a4524009af05e382e91dabcb3e40e461769bba492015a22c643698acc4b1195b27b36228dbdda9199433e9978722ff3 languageName: node linkType: hard @@ -12624,16 +12662,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^4.1.3": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: ^1.0.2 - yallist: ^2.1.2 - checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a - languageName: node - linkType: hard - "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -12643,14 +12671,14 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.7.1": +"lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": version: 7.14.1 resolution: "lru-cache@npm:7.14.1" checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104 languageName: node linkType: hard -"luxon@npm:^3.1.0": +"luxon@npm:^3.2.1": version: 3.2.1 resolution: "luxon@npm:3.2.1" checksum: 3fa3def2c5f5d3032b4c46220c4da8aeb467ac979888fc9d2557adcd22195f93516b4ad5909a75862bec8dc6ddc0953b0f38e6d2f4a8ab8450ddc531a83cf20d @@ -12823,19 +12851,19 @@ __metadata: linkType: hard "mdast-util-definitions@npm:^5.0.0": - version: 5.1.1 - resolution: "mdast-util-definitions@npm:5.1.1" + version: 5.1.2 + resolution: "mdast-util-definitions@npm:5.1.2" dependencies: "@types/mdast": ^3.0.0 "@types/unist": ^2.0.0 unist-util-visit: ^4.0.0 - checksum: f8025e2c35f6f8641528037abe18f492ef100e00a48c92cf78b7a313f9ccdb0e30c6aed0b40539767a3f425be09e78cb0f2f9bc4131fff41ea4664a1a7314a14 + checksum: 2544daccab744ea1ede76045c2577ae4f1cc1b9eb1ea51ab273fe1dca8db5a8d6f50f87759c0ce6484975914b144b7f40316f805cb9c86223a78db8de0b77bae languageName: node linkType: hard -"mdast-util-from-markdown@npm:^1.0.0": - version: 1.2.0 - resolution: "mdast-util-from-markdown@npm:1.2.0" +"mdast-util-from-markdown@npm:^1.0.0, mdast-util-from-markdown@npm:^1.1.0": + version: 1.3.0 + resolution: "mdast-util-from-markdown@npm:1.3.0" dependencies: "@types/mdast": ^3.0.0 "@types/unist": ^2.0.0 @@ -12849,89 +12877,91 @@ __metadata: micromark-util-types: ^1.0.0 unist-util-stringify-position: ^3.0.0 uvu: ^0.5.0 - checksum: fadc3521a3d95f4adbadad462ca27c28b3bfe08740ae158dc0c4a22329bf5593254d98b8fd4024ecad8c47c77ec275454dfacfb907ff1b98ff8f5de25c716d40 + checksum: cc971d1ad381150f6504fd753fbcffcc64c0abb527540ce343625c2bba76104505262122ef63d14ab66eb47203f323267017c6d09abfa8535ee6a8e14069595f languageName: node linkType: hard "mdast-util-mdx-expression@npm:^1.0.0": - version: 1.3.1 - resolution: "mdast-util-mdx-expression@npm:1.3.1" + version: 1.3.2 + resolution: "mdast-util-mdx-expression@npm:1.3.2" dependencies: "@types/estree-jsx": ^1.0.0 "@types/hast": ^2.0.0 "@types/mdast": ^3.0.0 mdast-util-from-markdown: ^1.0.0 mdast-util-to-markdown: ^1.0.0 - checksum: 456d59a616a274416f5b02bce64bf5245c4b7247927b4539f4db35bec5674352580fb91f51ed11f1a769d17330c44eec7ca481faf81ee839c2efe71309195225 + checksum: e4c90f26deaa5eb6217b0a9af559a80de41da02ab3bcd864c56bed3304b056ae703896e9876bc6ded500f4aff59f4de5cbf6a4b109a5ba408f2342805fe6dc05 languageName: node linkType: hard "mdast-util-mdx-jsx@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-mdx-jsx@npm:2.1.0" + version: 2.1.1 + resolution: "mdast-util-mdx-jsx@npm:2.1.1" dependencies: "@types/estree-jsx": ^1.0.0 "@types/hast": ^2.0.0 "@types/mdast": ^3.0.0 ccount: ^2.0.0 + mdast-util-from-markdown: ^1.1.0 mdast-util-to-markdown: ^1.3.0 parse-entities: ^4.0.0 stringify-entities: ^4.0.0 unist-util-remove-position: ^4.0.0 unist-util-stringify-position: ^3.0.0 vfile-message: ^3.0.0 - checksum: 40520a299449e4074ff1097789c7372220c9751e0de151566dcc133118d748c2231e29bafcbbf2c3beb3a917a85cfbbaa9195dadfb4122603bad479f93a61dbe + checksum: c2b576bb1a91cbc578ae4900a2556e949dd447ad8a791f43d16df7aa2ff26b2bf981f18ba642d1c9b6bb96fb6a43afc6c0ffebf4a80ad55e2263db56f9e109d8 languageName: node linkType: hard "mdast-util-mdx@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-mdx@npm:2.0.0" + version: 2.0.1 + resolution: "mdast-util-mdx@npm:2.0.1" dependencies: + mdast-util-from-markdown: ^1.0.0 mdast-util-mdx-expression: ^1.0.0 mdast-util-mdx-jsx: ^2.0.0 mdast-util-mdxjs-esm: ^1.0.0 - checksum: 4744bfbbd337c2a99a3ef339673c549a670d6496e0d3a6d747d2451e112d6fef7d27613549b0bd62a5f92ea7919e3bacd78c731e8a3d80552a09b80896554cf6 + mdast-util-to-markdown: ^1.0.0 + checksum: 7303149230a26e524e319833b782bffca94e49cdab012996618701259bd056e014ca22a35d25ffa8880ba9064ee126a2a002f01e5c90a31ca726339ed775875e languageName: node linkType: hard "mdast-util-mdxjs-esm@npm:^1.0.0": - version: 1.3.0 - resolution: "mdast-util-mdxjs-esm@npm:1.3.0" + version: 1.3.1 + resolution: "mdast-util-mdxjs-esm@npm:1.3.1" dependencies: "@types/estree-jsx": ^1.0.0 "@types/hast": ^2.0.0 "@types/mdast": ^3.0.0 mdast-util-from-markdown: ^1.0.0 mdast-util-to-markdown: ^1.0.0 - checksum: df3902eb884b4f83cebbfe33647f51938b36db54d4539afd884dc83ff43052676cd48df4c382dc986335290f5c691576d1a848da8ffb671b69ade29fe1c317e0 + checksum: ee78a4f58adfec38723cbc920f05481201ebb001eff3982f2d0e5f5ce5c75685e732e9d361ad4a1be8b936b4e5de0f2599cb96b92ad4bd92698ac0c4a09bbec3 languageName: node linkType: hard "mdast-util-phrasing@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-phrasing@npm:3.0.0" + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" dependencies: "@types/mdast": ^3.0.0 unist-util-is: ^5.0.0 - checksum: 3cf0812c7f1a2a7f58d30df42b6172c3e79e3dacda34db216ee6e12e3caa7abfb9801626274e41627321cd0fcfc8e526c999fd96e1c0c086055a83ca7e9dddf7 + checksum: c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 languageName: node linkType: hard "mdast-util-to-hast@npm:^12.1.0": - version: 12.2.5 - resolution: "mdast-util-to-hast@npm:12.2.5" + version: 12.3.0 + resolution: "mdast-util-to-hast@npm:12.3.0" dependencies: "@types/hast": ^2.0.0 "@types/mdast": ^3.0.0 mdast-util-definitions: ^5.0.0 micromark-util-sanitize-uri: ^1.1.0 trim-lines: ^3.0.0 - unist-builder: ^3.0.0 unist-util-generated: ^2.0.0 unist-util-position: ^4.0.0 unist-util-visit: ^4.0.0 - checksum: 06337d66b369d9bf16f484cb31943c4e3c0ea9c20138589c256ad3400122fc9d64baf4d087349c042d37074408a24a4856e9ac45cb3356647bbe24d6dcdd42e1 + checksum: ea40c9f07dd0b731754434e81c913590c611b1fd753fa02550a1492aadfc30fb3adecaf62345ebb03cea2ddd250c15ab6e578fffde69c19955c9b87b10f2a9bb languageName: node linkType: hard @@ -12952,9 +12982,11 @@ __metadata: linkType: hard "mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": - version: 3.1.0 - resolution: "mdast-util-to-string@npm:3.1.0" - checksum: f42ddd4e22f2215a75715b92ea6e3149c4ba356e7781d7b94fc86ded1c79cec3f986afeecef3a4a80068c9b224a6520099783a12146b957de24f020a3e47dd29 + version: 3.1.1 + resolution: "mdast-util-to-string@npm:3.1.1" + dependencies: + "@types/mdast": ^3.0.0 + checksum: 5e9375e1757ebf2950e122ef3538e4257ed2b6f43ab1d3e9c45db5dd5d5b5d14fd041490afcde00934f1cdb4b99877597ae04eb810d313ec7b38c6009058dddd languageName: node linkType: hard @@ -13090,8 +13122,8 @@ __metadata: linkType: hard "micromark-extension-mdx-expression@npm:^1.0.0": - version: 1.0.3 - resolution: "micromark-extension-mdx-expression@npm:1.0.3" + version: 1.0.4 + resolution: "micromark-extension-mdx-expression@npm:1.0.4" dependencies: micromark-factory-mdx-expression: ^1.0.0 micromark-factory-space: ^1.0.0 @@ -13100,7 +13132,7 @@ __metadata: micromark-util-symbol: ^1.0.0 micromark-util-types: ^1.0.0 uvu: ^0.5.0 - checksum: ef4b4137894624a6754b951d3cb7abb20951ca7b37f9ad8a50d2e2b95d0cf880258d71296bfac6be4ff83a8d137b6b657ae852bb6f11f4ca11e5e6d62f1b025d + checksum: d19a31f9813dd5d4ad96b99e35b7c48067e69d75f92ec670dad5242857fb7688ba8b7c6a15616797b5df25dd89fd3b54916f93cb60ce2cfe97aca84739b45954 languageName: node linkType: hard @@ -13186,8 +13218,8 @@ __metadata: linkType: hard "micromark-factory-mdx-expression@npm:^1.0.0": - version: 1.0.6 - resolution: "micromark-factory-mdx-expression@npm:1.0.6" + version: 1.0.7 + resolution: "micromark-factory-mdx-expression@npm:1.0.7" dependencies: micromark-factory-space: ^1.0.0 micromark-util-character: ^1.0.0 @@ -13197,7 +13229,7 @@ __metadata: unist-util-position-from-estree: ^1.0.0 uvu: ^0.5.0 vfile-message: ^3.0.0 - checksum: 7b69f0e77664e9820639cf23c4f01d43aa0e7abd88021c3db428435e3a5a1f9446f8dc5c2a6ed4ac16c6495ca51937609a5c98ff59a62c54be382c2725500b39 + checksum: e7893f21576bcb7755d341e45d3ff202ba466fa2278c6f31ae4db4002a28d6d13a4efad331ef46223372ec2010d9bc2ff27e2cd57a4580be6491e59ca21ba59d languageName: node linkType: hard @@ -13305,8 +13337,8 @@ __metadata: linkType: hard "micromark-util-events-to-acorn@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-events-to-acorn@npm:1.2.0" + version: 1.2.1 + resolution: "micromark-util-events-to-acorn@npm:1.2.1" dependencies: "@types/acorn": ^4.0.0 "@types/estree": ^1.0.0 @@ -13315,7 +13347,7 @@ __metadata: uvu: ^0.5.0 vfile-location: ^4.0.0 vfile-message: ^3.0.0 - checksum: 422285d68c8e8a57042bf31eefa55a136eec5c1fb021278a7c25d60a000c4e3ddaf140c94065a270499281f79ff59999468b850a461f22b5731fc47eccb2c4c2 + checksum: baf1cad66d860980cf20963f641c48c434e5be5802beabefdda21be136ae037845dd236b5e9ce5cf9409bf1b9ba8b4131a396d3a5bfa12098dae13e4a9724f2b languageName: node linkType: hard @@ -13462,6 +13494,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 + languageName: node + linkType: hard + "mimic-fn@npm:^1.0.0": version: 1.2.0 resolution: "mimic-fn@npm:1.2.0" @@ -13545,12 +13586,21 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": - version: 5.1.2 - resolution: "minimatch@npm:5.1.2" +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimatch@npm:^6.0.0": + version: 6.1.6 + resolution: "minimatch@npm:6.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 707b026e0adc610be6c02f24173d84811e5b8cc2e434881e47ef00a72be5fbea9323b7158d7bf065782b1e1d5c50d7d80cd72f2602255f2fddfb1d2f02e9092c languageName: node linkType: hard @@ -13633,11 +13683,9 @@ __metadata: linkType: hard "minipass@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass@npm:4.0.0" - dependencies: - yallist: ^4.0.0 - checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381 + version: 4.0.2 + resolution: "minipass@npm:4.0.2" + checksum: 2e4f4caaf85a45c01c6042adc43b5111a6113f62e300acf1db3b193ac3ec6e955bc893d6d8a08635598771a55a0f60487dcac59a1ac39557eb524295d4778c9e languageName: node linkType: hard @@ -13841,11 +13889,20 @@ __metadata: linkType: hard "named-placeholders@npm:^1.1.2": - version: 1.1.2 - resolution: "named-placeholders@npm:1.1.2" + version: 1.1.3 + resolution: "named-placeholders@npm:1.1.3" dependencies: - lru-cache: ^4.1.3 - checksum: c9317d1b479d6733b3baedfde209c6c866cf387c2d625837f93355fdb6a9055b1e8180b883fe00bcb20edb3ba4dd21128ec2f1ed8cb884385cef7698cbcadcc4 + lru-cache: ^7.14.1 + checksum: 7834adc91e92ae1b9c4413384e3ccd297de5168bb44017ff0536705ddc4db421723bd964607849265feb3f6ded390f84cf138e5925f22f7c13324f87a803dc73 + languageName: node + linkType: hard + +"nan@npm:^2.16.0": + version: 2.17.0 + resolution: "nan@npm:2.17.0" + dependencies: + node-gyp: latest + checksum: ec609aeaf7e68b76592a3ba96b372aa7f5df5b056c1e37410b0f1deefbab5a57a922061e2c5b369bae9c7c6b5e6eecf4ad2dac8833a1a7d3a751e0a7c7f849ed languageName: node linkType: hard @@ -13920,16 +13977,16 @@ __metadata: linkType: hard "netlify-cli@npm:^12.0.11": - version: 12.6.0 - resolution: "netlify-cli@npm:12.6.0" + version: 12.10.0 + resolution: "netlify-cli@npm:12.10.0" dependencies: "@fastify/static": ^6.6.0 - "@netlify/build": ^29.4.0 - "@netlify/config": ^20.3.0 - "@netlify/edge-bundler": ^8.0.0 - "@netlify/framework-info": ^9.5.3 + "@netlify/build": ^29.5.2 + "@netlify/config": ^20.3.2 + "@netlify/edge-bundler": ^8.4.0 + "@netlify/framework-info": ^9.7.1 "@netlify/local-functions-proxy": ^1.1.1 - "@netlify/zip-it-and-ship-it": ^8.2.0 + "@netlify/zip-it-and-ship-it": ^8.4.1 "@octokit/rest": ^19.0.0 ansi-escapes: ^5.0.0 ansi-styles: ^5.0.0 @@ -13959,6 +14016,7 @@ __metadata: execa: ^5.0.0 express: ^4.17.1 express-logging: ^1.1.1 + extract-zip: ^2.0.1 fastify: ^4.10.2 find-up: ^5.0.0 flush-write-stream: ^2.0.0 @@ -13980,7 +14038,7 @@ __metadata: is-plain-obj: ^3.0.0 is-wsl: ^2.2.0 isexe: ^2.0.0 - jsonwebtoken: ^8.5.1 + jsonwebtoken: ^9.0.0 jwt-decode: ^3.0.0 lambda-local: ^2.0.1 listr: ^0.14.3 @@ -13990,11 +14048,11 @@ __metadata: log-update: ^5.0.0 minimist: ^1.2.5 multiparty: ^4.2.1 - netlify: ^13.1.0 - netlify-headers-parser: ^7.1.0 + netlify: ^13.1.2 + netlify-headers-parser: ^7.1.1 netlify-onegraph-internal: 0.10.1 - netlify-redirect-parser: ^14.1.0 - netlify-redirector: ^0.3.1 + netlify-redirect-parser: ^14.1.1 + netlify-redirector: ^0.4.0 node-fetch: ^2.6.0 node-version-alias: ^1.0.1 ora: ^5.0.0 @@ -14029,13 +14087,13 @@ __metadata: bin: netlify: bin/run.mjs ntl: bin/run.mjs - checksum: a555e4ca56f681f2c974f148f0164547c5c233531baa38ee7c9f7b173f7b92c163e75551626c5b736b2d744015dc4f79fcbc9231435e96d97a0d4923ad16af40 + checksum: 4410476f0b9bacd748f27e271262b12550112afeb68787d9ff54fc5a051baaa6c5cac67d06dae26d8a93256b30f599454983e00e7e1cec2fcfd22abfa392f64e languageName: node linkType: hard -"netlify-headers-parser@npm:^7.1.0": - version: 7.1.0 - resolution: "netlify-headers-parser@npm:7.1.0" +"netlify-headers-parser@npm:^7.1.1": + version: 7.1.1 + resolution: "netlify-headers-parser@npm:7.1.1" dependencies: escape-string-regexp: ^5.0.0 fast-safe-stringify: ^2.0.7 @@ -14043,7 +14101,7 @@ __metadata: map-obj: ^5.0.0 path-exists: ^5.0.0 toml: ^3.0.0 - checksum: aee5eee2490e081b8a7ab3ff8bafd19041361574e71a80ad37e92d35b346df6d713dffe7bde85475dda888930817de05538b644f52db0345e69cbdba4b975004 + checksum: 675ca0429400042f9786a402927cb49d26540cd644ae9f7910dd1d8d6980938a2404c4c83186808dad4c4fffc878386e5e373391d3b225f080825053df9a426b languageName: node linkType: hard @@ -14059,38 +14117,38 @@ __metadata: languageName: node linkType: hard -"netlify-redirect-parser@npm:^14.1.0": - version: 14.1.0 - resolution: "netlify-redirect-parser@npm:14.1.0" +"netlify-redirect-parser@npm:^14.1.1": + version: 14.1.1 + resolution: "netlify-redirect-parser@npm:14.1.1" dependencies: fast-safe-stringify: ^2.1.1 filter-obj: ^3.0.0 is-plain-obj: ^4.0.0 path-exists: ^5.0.0 toml: ^3.0.0 - checksum: 8a5f9a501d18e674726f5dfdd30d6c6cf171499a05ce3a7773869a72e5b1811e552f5a7c7258e83fdde60ddd2a36e7b183c9827ca240dd2fa91ece9a28aa7b58 + checksum: adc9eff7fd022843a4c877c8f8c43040cee2490299ec2ef2eb884746e142dc4ee7122734e5f45c4d5d14be46b188dc31f9f10e1b838d6ca72d27a11612758f46 languageName: node linkType: hard -"netlify-redirector@npm:^0.3.1": - version: 0.3.1 - resolution: "netlify-redirector@npm:0.3.1" - checksum: 057322f8ab369f6e4a579da40ce741f0e434f1db155c75aaf5a9314265e1886c51f2fcfee12719c170e2c86c13eab2edfd3d8ffa6e1132199240c9ea7e689c89 +"netlify-redirector@npm:^0.4.0": + version: 0.4.0 + resolution: "netlify-redirector@npm:0.4.0" + checksum: d249bad5e2a5bf1825a131ae7b1179b89968830f711112b7da7f86270c30789fd9221d20acc34b79a966148d37489a6168e6d38099429fb60b01100e22ce6d66 languageName: node linkType: hard -"netlify@npm:^13.1.0": - version: 13.1.0 - resolution: "netlify@npm:13.1.0" +"netlify@npm:^13.1.2": + version: 13.1.2 + resolution: "netlify@npm:13.1.2" dependencies: - "@netlify/open-api": ^2.12.0 + "@netlify/open-api": ^2.13.0 lodash-es: ^4.17.21 micro-api-client: ^3.3.0 node-fetch: ^3.0.0 omit.js: ^2.0.2 p-wait-for: ^4.0.0 qs: ^6.9.6 - checksum: ad03da793b1c73d83984917ba68570b0da123133a94848363dfa07500fd9dba385b2b1fb12184937d1686b529af5f4b0cf2f6811b40bc747693d7e1221cf8eda + checksum: 70511ff1845bbffc2d9944e86f2d519160181a35f751ebe8a952bb3dced80f84b0089f11e351c2ea9f642545a40071c6262d006b5bfe353cb8de5e47eb212830 languageName: node linkType: hard @@ -14104,20 +14162,20 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.30.0 - resolution: "node-abi@npm:3.30.0" + version: 3.32.0 + resolution: "node-abi@npm:3.32.0" dependencies: semver: ^7.3.5 - checksum: f285efcea312e52d8763cfad7d434b31c11586e5efdf9f239c214a582557777453a8358d338442f02490d6c5289b0fc0eeed3056a740a3ebe6c79334af3b1739 + checksum: 321fd4b174908fa2b33a411f92dd878b7752547c2bdf516cd2ee6a9dbedef4981b8227e280db5e76db946fa7321038f9996e44147f8d62b9407ed05748393615 languageName: node linkType: hard "node-addon-api@npm:^5.0.0": - version: 5.0.0 - resolution: "node-addon-api@npm:5.0.0" + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" dependencies: node-gyp: latest - checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334 + checksum: 2508bd2d2981945406243a7bd31362fc7af8b70b8b4d65f869c61731800058fb818cc2fd36c8eac714ddd0e568cc85becf5e165cebbdf7b5024d5151bbc75ea1 languageName: node linkType: hard @@ -14140,8 +14198,8 @@ __metadata: linkType: hard "node-fetch@npm:^2.3.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" + version: 2.6.9 + resolution: "node-fetch@npm:2.6.9" dependencies: whatwg-url: ^5.0.0 peerDependencies: @@ -14149,7 +14207,7 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + checksum: acb04f9ce7224965b2b59e71b33c639794d8991efd73855b0b250921382b38331ffc9d61bce502571f6cc6e11a8905ca9b1b6d4aeb586ab093e2756a1fd190d0 languageName: node linkType: hard @@ -14184,10 +14242,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.6": - version: 2.0.8 - resolution: "node-releases@npm:2.0.8" - checksum: b1ab02c0d5d8e081bf9537232777a7a787dc8fef07f70feabe70a344599b220fe16462f746ac30f3eed5a58549445ad69368964d12a1f8b3b764f6caab7ba34a +"node-releases@npm:^2.0.8": + version: 2.0.10 + resolution: "node-releases@npm:2.0.10" + checksum: d784ecde25696a15d449c4433077f5cce620ed30a1656c4abf31282bfc691a70d9618bae6868d247a67914d1be5cc4fde22f65a05f4398cdfb92e0fc83cadfbc languageName: node linkType: hard @@ -14455,9 +14513,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db languageName: node linkType: hard @@ -15277,12 +15335,13 @@ __metadata: linkType: hard "periscopic@npm:^3.0.0": - version: 3.0.4 - resolution: "periscopic@npm:3.0.4" + version: 3.1.0 + resolution: "periscopic@npm:3.1.0" dependencies: + "@types/estree": ^1.0.0 estree-walker: ^3.0.0 is-reference: ^3.0.0 - checksum: 0920ea1b0294c2463b7df858d7f895d0a69f15ec5c7b93d63749e7a8f6d9c065853ebea701305f1756f70310633832cf5c90e43e9363cce51abec44cc2f5c188 + checksum: 2153244352e58a0d76e7e8d9263e66fe74509495f809af388da20045fb30aa3e93f2f94468dc0b9166ecf206fcfc0d73d2c7641c6fbedc07b1de858b710142cb languageName: node linkType: hard @@ -15362,8 +15421,8 @@ __metadata: linkType: hard "pino@npm:^8.5.0": - version: 8.8.0 - resolution: "pino@npm:8.8.0" + version: 8.9.0 + resolution: "pino@npm:8.9.0" dependencies: atomic-sleep: ^1.0.0 fast-redact: ^3.1.1 @@ -15378,7 +15437,7 @@ __metadata: thread-stream: ^2.0.0 bin: pino: bin.js - checksum: 69256469221b332776333069d637100053eb15dc7baa3f95897d7864bf2e6fd99f15cfd9cfc94b56e7b00da2e6b349c49affcff1abaca9a3d4b7ba63ff86b4f0 + checksum: c7eb9345280383b9af4661b34ae2156c94e535eb33c8deaf525e00212fa9e4f0b9797cdeda17b80b333325d8a0aec6e7566618071506e944736822022b671fa8 languageName: node linkType: hard @@ -15958,11 +16017,11 @@ __metadata: linkType: hard "prettier@npm:^2.8.0": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" + version: 2.8.3 + resolution: "prettier@npm:2.8.3" bin: prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + checksum: 92f2ceb522d454370e02082aa74ad27388672f7cee8975028b59517c069fe643bdc73e322675c8faf2ff173d7a626d1a6389f26b474000308e793aa25fff46e5 languageName: node linkType: hard @@ -16128,13 +16187,6 @@ __metadata: languageName: node linkType: hard -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 - languageName: node - linkType: hard - "psl@npm:^1.1.28, psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -16170,9 +16222,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 languageName: node linkType: hard @@ -17076,8 +17128,8 @@ __metadata: linkType: hard "rollup@npm:^3.2.3, rollup@npm:^3.7.0": - version: 3.9.1 - resolution: "rollup@npm:3.9.1" + version: 3.14.0 + resolution: "rollup@npm:3.14.0" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -17085,7 +17137,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 929cfab6b8bb2e20c28d7a4c3909b53729f4a63d8cc14f3b1a217d5f8e550737ee0903124ba58a1f2e7efd45c596e044a968aa379411731d0e76c910621d7d3f + checksum: 48f4da224753b8022529256243b74b3f6f41d9b4358ba079ac42f2a2cf07e4bd01b5d94579338194238e3c575487974ca508e144cf6195123293e7fdf82506cb languageName: node linkType: hard @@ -17229,9 +17281,9 @@ __metadata: linkType: hard "secure-json-parse@npm:^2.5.0": - version: 2.6.0 - resolution: "secure-json-parse@npm:2.6.0" - checksum: 6a10529b095cd2d4b7f3ae0a7f9877b67f6a206ffda01ba6fd29012c94b77197d6be3aea21f950120d3ac69b98b1251870554a504d47ab0e32f45531ebe92a2c + version: 2.7.0 + resolution: "secure-json-parse@npm:2.7.0" + checksum: d9d7d5a01fc6db6115744ba23cf9e67ecfe8c524d771537c062ee05ad5c11b64c730bc58c7f33f60bd6877f96b86f0ceb9ea29644e4040cb757f6912d4dd6737 languageName: node linkType: hard @@ -17294,7 +17346,7 @@ __metadata: languageName: node linkType: hard -"send@npm:0.18.0, send@npm:^0.18.0": +"send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" dependencies: @@ -17367,7 +17419,7 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.31.0": +"sharp@npm:^0.31.3": version: 0.31.3 resolution: "sharp@npm:0.31.3" dependencies: @@ -17882,13 +17934,6 @@ __metadata: languageName: node linkType: hard -"statsd-client@npm:0.4.7": - version: 0.4.7 - resolution: "statsd-client@npm:0.4.7" - checksum: 05d2956513b91a9ccc0d00b01e8eda708fad0bd0a044a55beeb813c65df7fd5ede6b4a33c0d6526b6afb8873de2ab9c62303e1e9282f08dac7b5c72e9ac7fc32 - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -17903,6 +17948,15 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: ^1.0.4 + checksum: d04173690b2efa40e24ab70e5e51a3ff31d56d699550cfad084104ab3381390daccb36652b25755e420245f3b0737de66c1879eaa2a8d4fc0a78f9bf892fcb42 + languageName: node + linkType: hard + "stream-to-buffer@npm:^0.1.0": version: 0.1.0 resolution: "stream-to-buffer@npm:0.1.0" @@ -18192,12 +18246,12 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:^0.3.0": - version: 0.3.0 - resolution: "style-to-object@npm:0.3.0" +"style-to-object@npm:^0.4.1": + version: 0.4.1 + resolution: "style-to-object@npm:0.4.1" dependencies: inline-style-parser: 0.1.1 - checksum: 4d7084015207f2a606dfc10c29cb5ba569f2fe8005551df7396110dd694d6ff650f2debafa95bd5d147dfb4ca50f57868e2a7f91bf5d11ef734fe7ccbd7abf59 + checksum: 2ea213e98eed21764ae1d1dc9359231a9f2d480d6ba55344c4c15eb275f0809f1845786e66d4caf62414a5cc8f112ce9425a58d251c77224060373e0db48f8c2 languageName: node linkType: hard @@ -18591,11 +18645,11 @@ __metadata: linkType: hard "thread-stream@npm:^2.0.0": - version: 2.2.0 - resolution: "thread-stream@npm:2.2.0" + version: 2.3.0 + resolution: "thread-stream@npm:2.3.0" dependencies: real-require: ^0.2.0 - checksum: b7f0ee166ed17ac54700a0b6fc291967c97785b458ff54efe5431a7281bb52d1163e6ec550a614f2a47f0f02de5b35a342bd5acd215af23030938c64859152b2 + checksum: e9ea58f9f36320165b41c2aae5c439bf68bd3575eb533c458483d8b290e31d519979e351408c7d6e248711611434332c2a3aae2165650b028cc3eb9b1052ac16 languageName: node linkType: hard @@ -18674,9 +18728,9 @@ __metadata: linkType: hard "tinycolor2@npm:^1.1.2": - version: 1.5.2 - resolution: "tinycolor2@npm:1.5.2" - checksum: 9df1ea9a986b03f1aebb1c1ac17fc561e358493f61b56d73ef2d7207fe7bd74eb71cf745b70487b2b5bb1ce33c9e8af7101088bb0b5fc532eaa1f9d1eda4ef31 + version: 1.6.0 + resolution: "tinycolor2@npm:1.6.0" + checksum: 6df4d07fceeedc0a878d7bac47e2cd47c1ceeb1078340a9eb8a295bc0651e17c750f73d47b3028d829f30b85c15e0572c0fd4142083e4c21a30a597e47f47230 languageName: node linkType: hard @@ -18962,9 +19016,9 @@ __metadata: linkType: hard "tslib@npm:^2.3.1, tslib@npm:^2.4.0": - version: 2.4.1 - resolution: "tslib@npm:2.4.1" - checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca + version: 2.5.0 + resolution: "tslib@npm:2.5.0" + checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 languageName: node linkType: hard @@ -19130,7 +19184,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.9.4, typescript@npm:^4.5.5, typescript@npm:^4.6.4, typescript@npm:^4.8.4": +"typescript@npm:4.9.4": version: 4.9.4 resolution: "typescript@npm:4.9.4" bin: @@ -19140,6 +19194,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^4.5.5, typescript@npm:^4.6.4, typescript@npm:^4.8.4": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + "typescript@patch:typescript@4.8.4#~builtin": version: 4.8.4 resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=0102e9" @@ -19150,7 +19214,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@4.9.4#~builtin, typescript@patch:typescript@^4.5.5#~builtin, typescript@patch:typescript@^4.6.4#~builtin, typescript@patch:typescript@^4.8.4#~builtin": +"typescript@patch:typescript@4.9.4#~builtin": version: 4.9.4 resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=d73830" bin: @@ -19160,6 +19224,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^4.5.5#~builtin, typescript@patch:typescript@^4.6.4#~builtin, typescript@patch:typescript@^4.8.4#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=d73830" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4, uglify-js@npm:^3.5.1": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" @@ -19207,7 +19281,7 @@ __metadata: languageName: node linkType: hard -"undici@npm:5.14.0, undici@npm:^5.14.0": +"undici@npm:5.14.0": version: 5.14.0 resolution: "undici@npm:5.14.0" dependencies: @@ -19216,6 +19290,15 @@ __metadata: languageName: node linkType: hard +"undici@npm:^5.14.0": + version: 5.18.0 + resolution: "undici@npm:5.18.0" + dependencies: + busboy: ^1.6.0 + checksum: 74e0f357c376c745fcca612481a5742866ae36086ad387e626255f4c4a15fc5357d9d0fa4355271b6a633d50f5556c3e85720844680c44861c66e23afca7245f + languageName: node + linkType: hard + "unicode-properties@npm:^1.3.1": version: 1.4.1 resolution: "unicode-properties@npm:1.4.1" @@ -19299,84 +19382,75 @@ __metadata: languageName: node linkType: hard -"unist-builder@npm:^3.0.0": - version: 3.0.0 - resolution: "unist-builder@npm:3.0.0" - dependencies: - "@types/unist": ^2.0.0 - checksum: 80459ee3c2ece90bbc4f4b4faeed524d144c1a09ee07ff3e9004648d9b71a652e80a3b3ef60311a1e92f6ab915caf27c6f08062b5f8c84fa725bc0d7c5759e84 - languageName: node - linkType: hard - "unist-util-generated@npm:^2.0.0": - version: 2.0.0 - resolution: "unist-util-generated@npm:2.0.0" - checksum: 3a806793fa24a75190c217740ce706340d6cb0d51eff677134253d628f8e4355ebd8a243fe8045c583463f6bebfd50f902d653161da87c1359fcd1a14b99c8e0 + version: 2.0.1 + resolution: "unist-util-generated@npm:2.0.1" + checksum: 6221ad0571dcc9c8964d6b054f39ef6571ed59cc0ce3e88ae97ea1c70afe76b46412a5ffaa91f96814644ac8477e23fb1b477d71f8d70e625728c5258f5c0d99 languageName: node linkType: hard "unist-util-is@npm:^5.0.0": - version: 5.1.1 - resolution: "unist-util-is@npm:5.1.1" - checksum: e8743a19a304d8a8f5684f3e5ddb5546f2655847b42123687277d76566a2aba89beb7b4a8a9e9ebc4d904cd1cecc285356d7923d973a43cfc19a1e10ff6bdee4 + version: 5.2.0 + resolution: "unist-util-is@npm:5.2.0" + checksum: b80debe1ce5d40a8d685c510f597e5c8b8f7089540e9e268bda1b05bcce735c10bf36d5b0e4ecded50c63fa43b8a11b0e4b784beecf1559f153a2f2855e8526c languageName: node linkType: hard "unist-util-position-from-estree@npm:^1.0.0, unist-util-position-from-estree@npm:^1.1.0": - version: 1.1.1 - resolution: "unist-util-position-from-estree@npm:1.1.1" + version: 1.1.2 + resolution: "unist-util-position-from-estree@npm:1.1.2" dependencies: "@types/unist": ^2.0.0 - checksum: 63808bdcb8b49afa5231712d95b586fe877859ee03d23adb47485c30222007a5af55e95d103d4af51d1d16376aaa5a58fa985a08d63727c38b1515873df8b79b + checksum: e3f4060e2a9e894c6ed63489c5a7cb58ff282e5dae9497cbc2073033ca74d6e412af4d4d342c97aea08d997c908b8bce2fe43a2062aafc2bb3f266533016588b languageName: node linkType: hard "unist-util-position@npm:^4.0.0": - version: 4.0.3 - resolution: "unist-util-position@npm:4.0.3" + version: 4.0.4 + resolution: "unist-util-position@npm:4.0.4" dependencies: "@types/unist": ^2.0.0 - checksum: 0d89973628d40f19345cbcc50008f7f56d411afa54434bbe6c224b22d26aaf9d4500da2de363f1f01945acab1f1c31920c514253149eb546ff9b8bbc1ea94209 + checksum: e7487b6cec9365299695e3379ded270a1717074fa11fd2407c9b934fb08db6fe1d9077ddeaf877ecf1813665f8ccded5171693d3d9a7a01a125ec5cdd5e88691 languageName: node linkType: hard "unist-util-remove-position@npm:^4.0.0": - version: 4.0.1 - resolution: "unist-util-remove-position@npm:4.0.1" + version: 4.0.2 + resolution: "unist-util-remove-position@npm:4.0.2" dependencies: "@types/unist": ^2.0.0 unist-util-visit: ^4.0.0 - checksum: 7d2808662ac65f2b2f615822b78060419f738fb3b074b10cec77c596ea966b8f5c47553d2d322822a5975c49d2b21cdd64c198ae9fb02a9d54d1afa6342cdd6a + checksum: 989831da913d09a82a99ed9b47b78471b6409bde95942cde47e09da54b7736516f17e3c7e026af468684c1efcec5fb52df363381b2f9dc7fd96ce791c5a2fa4a languageName: node linkType: hard "unist-util-stringify-position@npm:^3.0.0": - version: 3.0.2 - resolution: "unist-util-stringify-position@npm:3.0.2" + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" dependencies: "@types/unist": ^2.0.0 - checksum: 2dfd7a0fb2a55e99cc319c3bf7f9f1f73ed652978fa70d19117faa7245d20f21738ec926ecc47f341705ca1bb157e87ced0b6bb5ecaa666bd2ae6b2510d6a671 + checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 languageName: node linkType: hard "unist-util-visit-parents@npm:^5.1.1": - version: 5.1.1 - resolution: "unist-util-visit-parents@npm:5.1.1" + version: 5.1.3 + resolution: "unist-util-visit-parents@npm:5.1.3" dependencies: "@types/unist": ^2.0.0 unist-util-is: ^5.0.0 - checksum: c699d18f5b26461dee37612b84c243fd5457c98f4c0540d9ba8bee05062aece5f3b4fb1af6b07423ce6750d8926e8c01fc2b1a4de1e54925ef6795c177ed8e18 + checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa languageName: node linkType: hard "unist-util-visit@npm:^4.0.0": - version: 4.1.1 - resolution: "unist-util-visit@npm:4.1.1" + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" dependencies: "@types/unist": ^2.0.0 unist-util-is: ^5.0.0 unist-util-visit-parents: ^5.1.1 - checksum: c4a63734b0a5b439c62d20901bb472bdafdbbcd80c383e254aedeb98b23d0bae815a331e776ce7d63ea3c8018a54318abb8709d07cdf7dd094f79b2f07bb39f0 + checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee languageName: node linkType: hard @@ -19408,6 +19482,17 @@ __metadata: languageName: node linkType: hard +"unix-dgram@npm:2.x": + version: 2.0.6 + resolution: "unix-dgram@npm:2.0.6" + dependencies: + bindings: ^1.5.0 + nan: ^2.16.0 + node-gyp: latest + checksum: 0ab238726fd69e0a0174664225117b4575b40bd5df546c50a01de2fadf9da602c385ec8ff2f159607a127a6e7bf67628931903d43d286db27460b5abbe8cf8ac + languageName: node + linkType: hard + "unixify@npm:^1.0.0": version: 1.0.0 resolution: "unixify@npm:1.0.0" @@ -19441,7 +19526,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.9": +"update-browserslist-db@npm:^1.0.10": version: 1.0.10 resolution: "update-browserslist-db@npm:1.0.10" dependencies: @@ -19703,12 +19788,12 @@ __metadata: linkType: hard "vfile-location@npm:^4.0.0": - version: 4.0.1 - resolution: "vfile-location@npm:4.0.1" + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" dependencies: "@types/unist": ^2.0.0 vfile: ^5.0.0 - checksum: cc0df62075c741beee699e651374aeb56c4c1f4333398c0ba924281c2b51d4b7669c69c5b837ea395775626ad030d6f1bd27fd0a7eaf3f9f1bbd55393948ad6c + checksum: c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 languageName: node linkType: hard @@ -19735,12 +19820,12 @@ __metadata: linkType: hard "vite-imagetools@npm:^4.0.11": - version: 4.0.14 - resolution: "vite-imagetools@npm:4.0.14" + version: 4.0.18 + resolution: "vite-imagetools@npm:4.0.18" dependencies: "@rollup/pluginutils": ^5.0.0 - imagetools-core: ^3.3.0 - checksum: c1c163359a4eff2ce704eb66292a762458a0b8ca87acec4a678138790908a4a63678c083d01c72cde1f27b776925243662caefaaca9eff6303d44b87182a7c13 + imagetools-core: ^3.3.1 + checksum: f2e9b0713bda0488808ea8ad467e08c6752461c9bbd0ce73a82cbcb845292d1104fa68e0f8db4ee28cf22e9e4cc2327bfcc6171c02e073808e9fc39a7b3f220a languageName: node linkType: hard @@ -20099,11 +20184,11 @@ __metadata: linkType: hard "windows-release@npm:^5.0.1": - version: 5.0.1 - resolution: "windows-release@npm:5.0.1" + version: 5.1.0 + resolution: "windows-release@npm:5.1.0" dependencies: execa: ^5.1.1 - checksum: b6b403333b7b3ea31a805c287f210962d8f3191865d81d2fd3955e603ab4d6893abc746d87b7da5b2a7a044b7b18df97c948e7d5392baed1d2bc5687fbf7431d + checksum: b1256ef336e86b230cf940305d058cb2d49f076833df77a96e7bbf958ea5cd3bb1f1af6b1408fad14ee37df190d77b97b1dad6bbf3ed6eac1ba99a4d28dbfb68 languageName: node linkType: hard @@ -20349,13 +20434,13 @@ __metadata: linkType: hard "wrap-ansi@npm:^8.0.1": - version: 8.0.1 - resolution: "wrap-ansi@npm:8.0.1" + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" dependencies: ansi-styles: ^6.1.0 string-width: ^5.0.1 strip-ansi: ^7.0.1 - checksum: 5d7816e64f75544e466d58a736cb96ca47abad4ad57f48765b9735ba5601221013a37f436662340ca159208b011121e4e030de5a17180c76202e35157195a71e + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 languageName: node linkType: hard @@ -20495,13 +20580,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb - languageName: node - linkType: hard - "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" From a46a9efd8dbd921c773395d331154dc9a8aae783 Mon Sep 17 00:00:00 2001 From: Zamphi <40876040+mistertito86@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:27:05 -0300 Subject: [PATCH 248/248] feat(provider): :bug: add_location