refactor(provider): change PORT options

refactor(provider):  change PORT options
This commit is contained in:
Leifer Mendez
2023-01-01 20:09:49 +01:00
committed by GitHub
48 changed files with 583 additions and 70 deletions

View File

@@ -0,0 +1,44 @@
name: Rev Major Providers
on:
schedule:
- cron: '0 9 * * *'
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=false
- name: Check Venom
run: yarn node ./scripts/checker.js --name=venom --stable=false
- name: Check web-whatsapp
run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=false
- name: Check Meta
run: yarn node ./scripts/checker.js --name=meta --stable=false
- name: Check Twilio
run: yarn node ./scripts/checker.js --name=twilio --stable=false
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: 'ci(providers): 🚩 Check BREAKING CHANGE'

48
.github/workflows/check-providers.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Rev Providers
on:
push:
branches:
- dev
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'

View File

@@ -1,4 +1,4 @@
name: 🤪 Build and Test
name: Build and Test
on:
push:

View File

@@ -1,4 +1,4 @@
name: 🙌 Revisando Colaboradores
name: Revisando Colaboradores
on:
pull_request:
branches:

View File

@@ -1,15 +1,36 @@
[![Test / Coverage](https://github.com/leifermendez/bot-whatsapp/actions/workflows/ci.yml/badge.svg)](https://github.com/leifermendez/bot-whatsapp/actions/workflows/ci.yml)
# 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/)
--------
## Documentacion
[https://bot-whatsapp.netlify.app/](https://bot-whatsapp.netlify.app/)
🐤 Tablero de tareas : [https://github.com/users/leifermendez/projects/4/views/1](https://github.com/users/leifermendez/projects/4/views/1)
🚀 __Roadmap:__ [https://github.com/users/leifermendez/projects/4/views/1](https://github.com/users/leifermendez/projects/4/views/1)
[![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)
**Comunidad**
<p align="center">
<img width="300" src="https://i.imgur.com/Oauef6t.png">
</p>
**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/)**
## Comenzar
```
npm create bot-whatsapp@latest
```
Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
- Instalacion
- Base de datos
- Proveedores
## 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)
## Comunidad
<!-- readme: collaborators,contributors -start -->
<table>
<tr>
@@ -45,7 +66,7 @@
<a href="https://github.com/HKong31">
<img src="https://avatars.githubusercontent.com/u/113340082?v=4" width="50;" alt="HKong31"/>
<br />
<sub><b>Null</b></sub>
<sub><b>HLKong</b></sub>
</a>
</td>
<td align="center">
@@ -94,9 +115,4 @@
</table>
<!-- readme: collaborators,contributors -end -->
> Forma 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)

View File

@@ -10,7 +10,6 @@ class FlowClass {
this.flowRaw = _flow
this.allCallbacks = flatObject(_flow)
console.log('[🙌🙌🙌]', this.allCallbacks)
const mergeToJsonSerialize = Object.keys(_flow)
.map((indexObjectFlow) => _flow[indexObjectFlow].toJson())

View File

@@ -1,6 +1,6 @@
{
"name": "@bot-whatsapp/bot",
"version": "0.0.28-alpha.0",
"version": "0.0.29-alpha.0",
"description": "",
"main": "./lib/bundle.bot.cjs",
"scripts": {

View File

@@ -34,7 +34,7 @@ const startInteractive = async () => {
choices: [
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
{ title: 'Venom (gratis)', value: 'venom' },
{ title: 'Baileys (gratis)', value: 'bailey' },
{ title: 'Baileys (gratis)', value: 'baileys' },
{ title: 'Twilio', value: 'twilio' },
{ title: 'API Oficial (Meta)', value: 'meta' },
],

View File

@@ -1,6 +1,6 @@
{
"name": "@bot-whatsapp/cli",
"version": "0.0.35-alpha.0",
"version": "0.0.36-alpha.0",
"description": "",
"main": "index.js",
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "create-bot-whatsapp",
"version": "0.0.46-alpha.0",
"version": "0.0.47-alpha.0",
"description": "",
"main": "./lib/bundle.create-bot-whatsapp.cjs",
"files": [

View File

@@ -1,6 +1,6 @@
{
"name": "@bot-whatsapp/database",
"version": "0.0.27-alpha.0",
"version": "0.0.28-alpha.0",
"description": "Esto es el conector a mysql, pg, mongo",
"main": "./lib/mock/index.cjs",
"keywords": [],

View File

@@ -47,6 +47,9 @@
@apply p-3 rounded md:w-full max-w-screen-md overflow-x-auto w-fit bg-gray-800 dark:bg-slate-800 ease-in duration-75 text-gray-100 text-xs shadow-xl;
}
.slot iframe {
@apply rounded ease-in duration-75 text-gray-100 text-xs shadow-xl;
}
.slot a {
@apply text-sky-900 font-medium dark:text-sky-400 dark:hover:text-white;
}

View File

@@ -0,0 +1,61 @@
export const Social = () => {
return (
<>
{/* <title>
💻 Conviértete en un Programador Backend aprendiendo todo de
Cloud y Nodejs
</title>
<meta
property="og:site_name"
content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud y Nodejs"
/>
<meta
name="description"
content="🚀 Comienza haciendo tus despliegues directamente a la Nube. 🙌 Qué esperas mejorar tus habilidades en la programación ahora mismo."
/>
<meta property="og:type" content="website" />
<meta
name="keywords"
content="cursos programacion, cursos backend, curso de aws, curso de cloud computing, curso de node, curso de typescript, curso de api rest con node, curso de api rest con mongo, curso de api rest con aws"
/>
<meta
property="og:title"
content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud Computing y Nodejs"
/>
<meta
property="og:description"
content="🚀 Comienza haciendo tus despliegues directamente a la Nube. 🙌 Qué esperas mejorar tus habilidades en la programación ahora mismo."
/>
<meta property="og:type" content="article" />
<meta property="og:locale" content="es_ES" />
<meta
property="og:url"
content="https://campaign.codigoencasa.com"
/>
<meta property="og:site_name" content="campaign.codigoencasa.com" /> */}
<meta
property="og:image"
content="https://i.imgur.com/0HpzsEm.png"
></meta>
<meta
property="og:image:secure_url"
content="https://i.imgur.com/0HpzsEm.png"
/>
<meta property="og:image:type" content="image/png"></meta>
<meta property="og:image:width" content="1200"></meta>
<meta property="og:image:height" content="630"></meta>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@LeiferMendez" />
<meta
name="twitter:title"
content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud y Nodejs"
/>
<meta
name="twitter:image"
content="https://i.imgur.com/0HpzsEm.png"
/>
</>
)
}

View File

@@ -101,7 +101,7 @@ export default component$(() => {
))}
</ul>
<div class="text-sm text-gray-700 mr-4 dark:text-slate-400">
{/* <div class="text-sm text-gray-700 mr-4 dark:text-slate-400">
<span class="w-5 h-5 md:w-6 md:h-6 md:-mt-0.5 bg-cover mr-1.5 float-left rounded-sm bg-[url(https://onwidget.com/favicon/favicon-32x32.png)]"></span>
Made by{' '}
<a
@@ -112,7 +112,7 @@ export default component$(() => {
onWidget
</a>{' '}
· All rights reserved.
</div>
</div> */}
</div>
</div>
</footer>

View File

@@ -45,9 +45,12 @@ export default component$(() => {
>
<ul class="flex flex-col pt-8 md:pt-0 md:flex-row md:self-center w-full md:w-auto text-xl md:text-base">
<li class="dropdown">
<button class="font-medium hover:text-gray-900 dark:hover:text-white px-4 py-3 flex items-center transition duration-150 ease-in-out">
<a
href="/docs"
class="font-medium hover:text-gray-900 dark:hover:text-white px-4 py-3 flex items-center transition duration-150 ease-in-out"
>
Documentación
</button>
</a>
<ul class="dropdown-menu rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white md:min-w-[200px] dark:md:bg-slate-800 drop-shadow-xl">
{store.map((ctx) => {
return ctx.list.map((listCtx) => {

View File

@@ -26,10 +26,10 @@ export default component$(() => {
</h1>
<div class="max-w-3xl mx-auto">
<p class="text-xl text-gray-600 mb-8 dark:text-slate-400">
<span class="font-semibold underline decoration-wavy decoration-1 decoration-secondary-600 underline-offset-2">
<span class="font-semibold ">
Con esta libreria,{' '}
</span>
<span class="font-semibold underline decoration-wavy decoration-1 decoration-secondary-600 underline-offset-2">
<span class="font-semibold ">
puedes configurar respuestas
automatizadas para preguntas frecuentes
</span>{' '}
@@ -52,7 +52,7 @@ export default component$(() => {
href="/docs"
class="btn bg-gray-50 dark:bg-transparent"
>
Más información
Ver documentación
</a>
</div>
</div>

View File

@@ -16,6 +16,7 @@ import { DarkThemeLauncher } from '~/components/core/DarkThemeLauncher'
import fontStyles from '~/assets/styles/fonts.css?inline'
import globalStyles from '~/assets/styles/global.css?inline'
import { DocumentationCtx, GlobalStore } from './contexts'
import { Social } from './components/core/Social'
export default component$(() => {
/**
@@ -57,6 +58,7 @@ export default component$(() => {
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' },
],
@@ -77,6 +79,7 @@ export default component$(() => {
<RouterHead />
<DarkThemeLauncher />
<Social />
</head>
<body class="text-gray-900 dark:text-slate-300 tracking-tight bg-white dark:bg-gray-900 antialiased">
<RouterOutlet />

View File

@@ -1 +0,0 @@
# Personas que quieran unirse

View File

@@ -0,0 +1,121 @@
# Colaboradores
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/Mf9V-dloBfk"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
### 📄 Bienvenido/a
Si deseas colaborar con el proyecto existen varias maneras, la primera de ellas es aportando conocimiento y mejorando el repositorio (actualizando documentación, mejorando código, revisando **[issues](https://github.com/codigoencasa/bot-whatsapp/issues)**, etc).
También es bien recibido los aportes económicos que se utilizaran para diferentes fines **[ver más](https://opencollective.com/bot-whatsapp)**
El lenguaje principal que se utilizó para desarrollar este proyecto fue **JavaScript** con el fin de qué personas que están iniciando en el mundo de la programación puedan entender fácilmente.
### 🤔 Preguntas frecuentes
- ¿Como puedo hacer aportaciones de código en el proyecto?: [Ver Video](https://youtu.be/Lxt8Acob6aU)
- ¿Como ejecutar el entorno de pruebas?: [Ver Video](https://youtu.be/Mf9V-dloBfk)
- ¿Como crear un nuevo proveedor?: [Ver Video](https://youtu.be/cahK9zH3SI8)
- ¿Que son los GithubActions?: [Ver Video](https://youtu.be/nYBEBFKLiqw)
- ¿Canales de comunicación?: [Discord](https://link.codigoencasa.com/DISCORD)
---
![](https://i.giphy.com/media/ntMt6TvalpstTIx7Ak/giphy.webp)
**Requerimientos:**
- Node v16 o superior **[descargar node](https://nodejs.org/es/download/)**
- **[Yarn](https://classic.yarnpkg.com/lang/en/docs/install/#windows-stable)** como gestor de paquetes. En el link conseguirás las intrucciones para instalar yarn.
- **[VSCode](https://code.visualstudio.com/download)** (recomendado): Editor de código con plugins.
- **[Conventional Commits](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits&ssr=false#overview)** (plugin-vscode) este plugin te ayudará a crear commit semántico.
- Se usará la rama **dev** _(https://github.com/leifermendez/bot-whatsapp/tree/dev)_ como rama principal hasta que se haga oficialmente el lanzamiento de la V2.
### 🚀 Iniciando
**Clonar repo rama dev**
```
git clone --branch dev https://github.com/codigoencasa/bot-whatsapp
```
**Instalar dependencias**
```
cd bot-whatsapp
yarn install
```
**Compilar (build)**
Para compilar la aplicación es necesario ejecutar este comando, el cual genera un directorio `lib` dentro de los paquetes del monorepo.
```
yarn build
```
**Example-app**
Se ejecuta el CLI (Command Line Interface) para ayudarte a crear un app-bot de ejemplo.
```
yarn run cli
```
Selecionas (mediante las flechas arriba y abajo) el proveedor que quieras usar y cuando estes sobre el presiona la barra de espacio, igualmente selecciona la base de datos que quieras usar.
Se creó un subdirecorio con el nombre del proveedor y base de datos que seleccionaste, ejemplo: `base-bailey-mysql`
Dentro de ese directorio necesitas editar el archivo package.json y borrar las siguientes lineas:
```
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
```
Cambiate al directorio creado ejemplo: `base-bailey-mysql`
```
cd base-baileys-mysql
```
Ejecuta los comandos:
```
npm install
npm run pre-copy
npm start
```
En el caso de MySql y Mongo es necesario especificar en app.js los datos de la conexión, ejemplo de MySql:
```
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
/**
* Declaramos las conexiones de MySQL
*/
const MYSQL_DB_HOST = 'localhost'
const MYSQL_DB_USER = 'usr'
const MYSQL_DB_PASSWORD = 'pass'
const MYSQL_DB_NAME = 'bot'
```
![](https://i.imgur.com/dC6lEwy.png)
> **NOTA:** [Eres libre de aportar informacion a este documento o arreglar ortografia 🤣](https://github.com/codigoencasa/bot-whatsapp/edit/dev/CONTRIBUTING.md)
---
- [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)

View File

@@ -6,6 +6,14 @@ 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/)**
## ¿Como instalar Node en Windows?
https://youtu.be/xRXHQlqA3Ak?t=376
## ¿Como instalar Node en 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

View File

@@ -1,6 +1,6 @@
{
"name": "@bot-whatsapp/provider",
"version": "0.0.33-alpha.0",
"version": "0.0.34-alpha.0",
"description": "Esto es el conector a Twilio, Meta, etc...",
"main": "./lib/mock/index.cjs",
"keywords": [],

View File

@@ -1,13 +1,16 @@
const { ProviderClass } = require('@bot-whatsapp/bot')
const { Sticker } = require('wa-sticker-formatter')
const pino = require('pino')
const rimraf = require('rimraf')
const mime = require('mime-types')
const { join } = require('path')
const { existsSync, createWriteStream } = require('fs')
const { Console } = require('console')
const {
default: makeWASocket,
useMultiFileAuthState,
Browsers,
DisconnectReason,
} = require('@adiwajshing/baileys')
const {
@@ -21,6 +24,9 @@ const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/baileys.log`),
})
const NAME_DIR_SESSION = `sessions`
const PATH_BASE = join(process.cwd(), NAME_DIR_SESSION)
/**
* ⚙️ BaileysProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
@@ -38,28 +44,35 @@ class BaileysProvider extends ProviderClass {
* Iniciar todo Bailey
*/
initBailey = async () => {
const { state, saveCreds } = await useMultiFileAuthState('sessions')
const { state, saveCreds } = await useMultiFileAuthState(
NAME_DIR_SESSION
)
this.saveCredsGlobal = saveCreds
try {
const sock = makeWASocket({
printQRInTerminal: false,
auth: state,
browser: Browsers.macOS('Desktop'),
syncFullHistory: false,
logger: pino({ level: 'error' }),
})
sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect, qr } = update
if (connection === 'close') {
const shouldReconnect =
lastDisconnect?.error?.output?.statusCode !==
DisconnectReason.loggedOut
const statusCode = lastDisconnect?.error?.output?.statusCode
if (shouldReconnect) {
await saveCreds()
this.initBailey()
}
if (statusCode === DisconnectReason.loggedOut) {
rimraf(PATH_BASE, (err) => {
if (err) return
})
this.initBailey()
}
if (statusCode && statusCode !== DisconnectReason.loggedOut) {
this.initBailey()
}
if (qr) {

View File

@@ -0,0 +1,7 @@
{
"dependencies": {
"@adiwajshing/baileys": "4.4.0",
"mime-types": "2.1.35",
"wa-sticker-formatter": "4.3.2"
}
}

View File

@@ -12,16 +12,17 @@ const URL = `https://graph.facebook.com/v15.0`
* Necesitas las siguientes tokens y valores
* { jwtToken, numberId, vendorNumber, verifyToken }
*/
const PORT = process.env.PORT || 3000
class MetaProvider extends ProviderClass {
metHook
jwtToken
numberId
constructor({ jwtToken, numberId, verifyToken }, _port = 3000) {
constructor({ jwtToken, numberId, verifyToken, port = PORT }) {
super()
this.jwtToken = jwtToken
this.numberId = numberId
this.metHook = new MetaWebHookServer(verifyToken, _port)
this.metHook = new MetaWebHookServer(verifyToken, port)
this.metHook.start()
const listEvents = this.busEvents()

View File

@@ -0,0 +1,3 @@
{
"dependencies": {}
}

View File

@@ -13,14 +13,17 @@ const { parseNumber } = require('./utils')
* Necesitas las siguientes tokens y valores
* { accountSid, authToken, vendorNumber }
*/
const PORT = process.env.PORT || 3000
class TwilioProvider extends ProviderClass {
twilioHook
vendor
vendorNumber
constructor({ accountSid, authToken, vendorNumber }, _port = 3000) {
constructor({ accountSid, authToken, vendorNumber, port = PORT }) {
super()
this.vendor = new twilio(accountSid, authToken)
this.twilioHook = new TwilioWebHookServer(_port)
this.twilioHook = new TwilioWebHookServer(port)
this.vendorNumber = parseNumber(vendorNumber)
this.twilioHook.start()

View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"twilio": "3.84.0"
}
}

View File

@@ -0,0 +1,6 @@
{
"dependencies": {
"venom-bot": "4.3.7",
"mime-types": "2.1.35"
}
}

View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"whatsapp-web.js": "1.18.4"
}
}

163
scripts/checker.js Normal file
View File

@@ -0,0 +1,163 @@
const { execFile } = require('node:child_process')
const { readFileSync, writeFileSync, readdirSync } = require('node:fs')
const { join } = require('path')
const process = require('node:process')
const util = require('node:util')
const semver = require('semver')
const cmd = util.promisify(execFile)
const OS_ENVIROMENT_WIN = process.platform.includes('win32')
const PATH_PACKAGES = join(__dirname, '..', `packages`)
const PATH_STARTERS = join(__dirname, '..', `starters`, `apps`)
const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm'
const [PKG_NAME, PKG_STABLE] = process.argv.slice(2) || [null, null]
/**
* Revisar ultima version de una paquetes
* @param {*} pkgName
*/
const checkPkg = async (pkgName = '') => {
const { stdout } = await cmd(
NPM_COMMAND,
['show', `${pkgName}`, 'version'],
{
stdio: 'inherit',
}
)
return stdout.trim().replace('\n', '')
}
/**
* Revisar ultima version de una paquetes
* @param {*} pkgName
*/
const checkPkgStable = async (pkgName = '', version = '') => {
const { stdout } = await cmd(
NPM_COMMAND,
[
'show',
`${pkgName}@${version.split('.').shift()}.*`,
'version',
'--json',
],
{
stdio: 'inherit',
}
)
const listVersions = JSON.parse(stdout).reverse()
console.log(`[${pkgName}]: `, listVersions)
return listVersions.at(0)
}
/**
* Revisar todas las dependencias del provider
* @param {*} provider
* @param {*} stable
* @returns
*/
const checkEveryProvider = async (provider = '', stable = true) => {
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)
console.log(newDevParse)
}
return newDevParse
} catch (e) {
console.log(e)
return {}
}
}
/**
* Actualizar depedencias con nuevas versiones
* @param {*} provider
* @param {*} list
* @returns
*/
const updateDependencies = async (provider = '', list = {}) => {
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
)
)
} catch (e) {
console.log(e)
return {}
}
}
/**
* Actualizar starters
* @param {*} provider
* @returns
*/
const updateStarters = async (provider = '', updateDev = {}) => {
provider = provider === 'web-whatsapp' ? 'wweb' : 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 pkgBase = JSON.parse(pkgDependenciesBase)
writeFileSync(
join(PATH_STARTERS, base, 'package.json'),
JSON.stringify(
{
...pkgBase,
dependencies: { ...pkgBase.dependencies, ...updateDev },
},
null,
2
)
)
}
} catch (e) {
console.log(e)
return
}
}
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'
)
await updateDependencies(providerName, list)
await updateStarters(providerName, list)
}
}
main()

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-bailey-memory",
"pre-copy": "cd .. && yarn run copy.lib base-baileys-memory",
"start": "node app.js"
},
"keywords": [],
@@ -13,9 +13,9 @@
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0",
"mime-types": "^2.1.35",
"wa-sticker-formatter": "^4.3.2"
"@adiwajshing/baileys": "4.4.0",
"mime-types": "2.1.35",
"wa-sticker-formatter": "4.3.2"
},
"author": "",
"license": "ISC"

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-bailey-mongo",
"pre-copy": "cd .. && yarn run copy.lib base-baileys-mongo",
"start": "node app.js"
},
"keywords": [],
@@ -13,10 +13,10 @@
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0",
"mime-types": "^2.1.35",
"@adiwajshing/baileys": "4.4.0",
"mime-types": "2.1.35",
"mongodb": "^4.12.1",
"wa-sticker-formatter": "^4.3.2"
"wa-sticker-formatter": "4.3.2"
},
"author": "",
"license": "ISC"

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-bailey-mysql",
"pre-copy": "cd .. && yarn run copy.lib base-baileys-mysql",
"start": "node app.js"
},
"keywords": [],
@@ -13,10 +13,10 @@
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "^4.4.0",
"mime-types": "^2.1.35",
"@adiwajshing/baileys": "4.4.0",
"mime-types": "2.1.35",
"mysql2": "^2.3.3",
"wa-sticker-formatter": "^4.3.2"
"wa-sticker-formatter": "4.3.2"
},
"author": "",
"license": "ISC"

View File

@@ -11,7 +11,7 @@
"dependencies": {
"body-parser": "^1.20.1",
"polka": "^0.5.2",
"twilio": "^3.83.4",
"twilio": "3.84.0",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",

View File

@@ -11,7 +11,7 @@
"dependencies": {
"body-parser": "^1.20.1",
"polka": "^0.5.2",
"twilio": "^3.83.4",
"twilio": "3.84.0",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",

View File

@@ -11,7 +11,7 @@
"dependencies": {
"body-parser": "^1.20.1",
"polka": "^0.5.2",
"twilio": "^3.83.4",
"twilio": "3.84.0",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",

View File

@@ -9,11 +9,12 @@
},
"keywords": [],
"dependencies": {
"venom-bot": "^4.3.7",
"venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest"
"@bot-whatsapp/provider": "latest",
"mime-types": "2.1.35"
},
"author": "",
"license": "ISC"

View File

@@ -9,12 +9,12 @@
},
"keywords": [],
"dependencies": {
"venom-bot": "^4.3.7",
"venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"mime-types": "^2.1.35",
"mime-types": "2.1.35",
"mongodb": "^4.12.1"
},
"author": "",

View File

@@ -9,12 +9,13 @@
},
"keywords": [],
"dependencies": {
"venom-bot": "^4.3.7",
"venom-bot": "4.3.7",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"mysql2": "^2.3.3"
"mysql2": "^2.3.3",
"mime-types": "2.1.35"
},
"author": "",
"license": "ISC"

View File

@@ -9,11 +9,11 @@
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.4",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest"
"@bot-whatsapp/provider": "latest",
"whatsapp-web.js": "1.18.4"
},
"author": "",
"license": "ISC"

View File

@@ -9,7 +9,7 @@
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.4",
"whatsapp-web.js": "1.18.4",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",

View File

@@ -9,7 +9,7 @@
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.4",
"whatsapp-web.js": "1.18.4",
"@bot-whatsapp/bot": "latest",
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",