diff --git a/.husky/commit-msg b/.husky/commit-msg old mode 100644 new mode 100755 diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755 diff --git a/.husky/pre-push b/.husky/pre-push old mode 100644 new mode 100755 diff --git a/__test__/0.0.0-case.test.js b/__test__/0.0.0-flow-simple.test.js similarity index 63% rename from __test__/0.0.0-case.test.js rename to __test__/0.0.0-flow-simple.test.js index cb6a9529a..d530b6274 100644 --- a/__test__/0.0.0-case.test.js +++ b/__test__/0.0.0-flow-simple.test.js @@ -3,18 +3,18 @@ const assert = require('uvu/assert') const { addKeyword, createBot, createFlow } = require('../packages/bot/index') const { setup, clear, delay } = require('../__mocks__/env') -const suiteCase = suite('Flujo: Simple') +const testSuite = suite('Flujo: Simple') -suiteCase.before.each(setup) -suiteCase.after.each(clear) +testSuite.before.each(setup) +testSuite.after.each(clear) -suiteCase(`Responder a "hola"`, async ({ database, provider }) => { - const flow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!') +testSuite(`Responder a "hola"`, async ({ database, provider }) => { + const helloFlow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!') await createBot({ database, provider, - flow: createFlow([flow]), + flow: createFlow([helloFlow]), }) await provider.delaySendMessage(0, 'message', { @@ -23,18 +23,19 @@ suiteCase(`Responder a "hola"`, async ({ database, provider }) => { }) await delay(50) + assert.is('Buenas!', database.listHistory[0].answer) assert.is('Como vamos!', database.listHistory[1].answer) assert.is(undefined, database.listHistory[2]) }) -suiteCase(`NO reponder a "pepe"`, async ({ database, provider }) => { - const flow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!') +testSuite(`NO responder a "pepe"`, async ({ database, provider }) => { + const helloFlow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!') await createBot({ database, provider, - flow: createFlow([flow]), + flow: createFlow([helloFlow]), }) await provider.delaySendMessage(0, 'message', { @@ -48,4 +49,4 @@ suiteCase(`NO reponder a "pepe"`, async ({ database, provider }) => { assert.is(undefined, database.listHistory[1]) }) -suiteCase.run() +testSuite.run() diff --git a/__test__/0.0.1-case.test.js b/__test__/0.0.1-case.test.js deleted file mode 100644 index 83695cf82..000000000 --- a/__test__/0.0.1-case.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { suite } = require('uvu') -const assert = require('uvu/assert') -const { addKeyword, createBot, createFlow, EVENTS } = require('../packages/bot/index') -const { setup, clear, delay } = require('../__mocks__/env') - -const suiteCase = suite('Flujo: enviando eventos') - -suiteCase.before.each(setup) -suiteCase.after.each(clear) - -suiteCase(`Responder a "EVENTS.LOCATION"`, async ({ database, provider }) => { - const flow = addKeyword(EVENTS.LOCATION).addAnswer('Gracias por tu location') - - await createBot({ - database, - provider, - flow: createFlow([flow]), - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: '_event_location__f405d946-cf07-uutt-l7e0-b6d475bc7f81', - }) - - await delay(200) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Gracias por tu location', getHistory[0]) - assert.is(undefined, getHistory[1]) -}) - -suiteCase(`Responder a "EVENTS.DOCUMENT"`, async ({ database, provider }) => { - const flow = addKeyword(EVENTS.DOCUMENT).addAnswer('Gracias por tu documento') - - createBot({ - database, - provider, - flow: createFlow([flow]), - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: '_event_document__f405d946-cf07-uutt-l7e0-b6d475bc7f81', - }) - - await delay(200) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Gracias por tu documento', getHistory[0]) - assert.is(undefined, getHistory[1]) -}) - -suiteCase(`Responder a "EVENTS.WELCOME"`, async ({ database, provider }) => { - const flow = addKeyword(EVENTS.WELCOME).addAnswer('Bienvenido!') - - await createBot({ - database, - provider, - flow: createFlow([flow]), - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: '_event_welcome__f405d946-cf07-uutt-l7e0-b6d475bc7f81', - }) - - await delay(200) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Bienvenido!', getHistory[0]) - assert.is(undefined, getHistory[1]) -}) - -suiteCase(`Responder a "EVENTS.MEDIA"`, async ({ database, provider }) => { - const flow = addKeyword(EVENTS.MEDIA).addAnswer('gracias por la imagen o video!') - - await createBot({ - database, - provider, - flow: createFlow([flow]), - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: '_event_media__f405d946-cf07-uutt-l7e0-b6d475bc7f81', - }) - - await delay(200) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('gracias por la imagen o video!', getHistory[0]) - assert.is(undefined, getHistory[1]) -}) - -suiteCase(`Responder a "EVENTS.VOICE_NOTE"`, async ({ database, provider }) => { - const flow = addKeyword(EVENTS.VOICE_NOTE).addAnswer('gracias por la nota de voz!') - - await createBot({ - database, - provider, - flow: createFlow([flow]), - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: '_event_voice_note__f405d946-cf07-uutt-l7e0-b6d475bc7f81', - }) - - await delay(200) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('gracias por la nota de voz!', getHistory[0]) - assert.is(undefined, getHistory[1]) -}) - -suiteCase.run() diff --git a/__test__/0.0.1-flow-events.test.js b/__test__/0.0.1-flow-events.test.js new file mode 100644 index 000000000..2154ed153 --- /dev/null +++ b/__test__/0.0.1-flow-events.test.js @@ -0,0 +1,111 @@ +const { suite } = require('uvu') +const assert = require('uvu/assert') +const { addKeyword, createBot, createFlow, EVENTS } = require('../packages/bot/index') +const { setup, clear, delay } = require('../__mocks__/env') + +const testSuite = suite('Flujo: enviando eventos') + +testSuite.before.each(setup) +testSuite.after.each(clear) + +testSuite(`Responder a "EVENTS.LOCATION"`, async ({ database, provider }) => { + const locationFlow = addKeyword(EVENTS.LOCATION).addAnswer('Gracias por tu location') + + await createBot({ + database, + provider, + flow: createFlow([locationFlow]), + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: '_event_location__f405d946-cf07-uutt-l7e0-b6d475bc7f81', + }) + + await delay(200) + const history = database.listHistory.map((item) => item.answer) + assert.is('Gracias por tu location', history[0]) + assert.is(undefined, history[1]) +}) + +testSuite(`Responder a "EVENTS.DOCUMENT"`, async ({ database, provider }) => { + const documentFlow = addKeyword(EVENTS.DOCUMENT).addAnswer('Gracias por tu documento') + + createBot({ + database, + provider, + flow: createFlow([documentFlow]), + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: '_event_document__f405d946-cf07-uutt-l7e0-b6d475bc7f81', + }) + + await delay(200) + const history = database.listHistory.map((item) => item.answer) + assert.is('Gracias por tu documento', history[0]) + assert.is(undefined, history[1]) +}) + +testSuite(`Responder a "EVENTS.WELCOME"`, async ({ database, provider }) => { + const welcomeFlow = addKeyword(EVENTS.WELCOME).addAnswer('Bienvenido!') + + await createBot({ + database, + provider, + flow: createFlow([welcomeFlow]), + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: '_event_welcome__f405d946-cf07-uutt-l7e0-b6d475bc7f81', + }) + + await delay(200) + const history = database.listHistory.map((item) => item.answer) + assert.is('Bienvenido!', history[0]) + assert.is(undefined, history[1]) +}) + +testSuite(`Responder a "EVENTS.MEDIA"`, async ({ database, provider }) => { + const mediaFlow = addKeyword(EVENTS.MEDIA).addAnswer('gracias por la imagen o video!') + + await createBot({ + database, + provider, + flow: createFlow([mediaFlow]), + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: '_event_media__f405d946-cf07-uutt-l7e0-b6d475bc7f81', + }) + + await delay(200) + const history = database.listHistory.map((item) => item.answer) + assert.is('gracias por la imagen o video!', history[0]) + assert.is(undefined, history[1]) +}) + +testSuite(`Responder a "EVENTS.VOICE_NOTE"`, async ({ database, provider }) => { + const voiceNoteFlow = addKeyword(EVENTS.VOICE_NOTE).addAnswer('gracias por la nota de voz!') + + await createBot({ + database, + provider, + flow: createFlow([voiceNoteFlow]), + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: '_event_voice_note__f405d946-cf07-uutt-l7e0-b6d475bc7f81', + }) + + await delay(200) + const history = database.listHistory.map((item) => item.answer) + assert.is('gracias por la nota de voz!', history[0]) + assert.is(undefined, history[1]) +}) + +testSuite.run() diff --git a/__test__/0.0.2-case.test.js b/__test__/0.0.2-case.test.js deleted file mode 100644 index 03ffba774..000000000 --- a/__test__/0.0.2-case.test.js +++ /dev/null @@ -1,119 +0,0 @@ -const { suite } = require('uvu') -const assert = require('uvu/assert') -const { addKeyword, createBot, createFlow } = require('../packages/bot/index') -const { setup, clear, delay } = require('../__mocks__/env') - -const suiteCase = suite('Flujo: manejo de goto') - -suiteCase.before.each(setup) -suiteCase.after.each(clear) - -suiteCase(`Debe saltar de flujo`, async ({ database, provider }) => { - const flujoUsuarioRegistrado = addKeyword(['user_register']) - .addAnswer('Hola usuario registrado') - .addAnswer('como estas usuario registrado') - - const flujoBienvenida = addKeyword(['hola']) - .addAnswer('Buenas', null, async (_, { gotoFlow, flowDynamic }) => { - await delay(10) - await flowDynamic('Usuario registrado DEMO') - await gotoFlow(flujoUsuarioRegistrado) - }) - .addAnswer('este mensaje no deberia existir') - - await createBot({ - database, - flow: createFlow([flujoBienvenida]), - provider, - }) - - await provider.delaySendMessage(50, 'message', { - from: '000', - body: 'hola', - }) - - await delay(100) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Buenas', getHistory[0]) - assert.is('Usuario registrado DEMO', getHistory[1]) - assert.is('Hola usuario registrado', getHistory[2]) - assert.is('como estas usuario registrado', getHistory[3]) - assert.is(undefined, getHistory[4]) -}) - -suiteCase(`Debe saltar de flujo con capture sin flowDynamic`, async ({ database, provider }) => { - const flujoUsuarioRegistrado = addKeyword(['user_register']) - .addAnswer('Hola usuario registrado') - .addAnswer('como estas usuario registrado') - - const flujoBienvenida = addKeyword(['hola']) - .addAnswer('Buenas', { capture: true }, async (_, { gotoFlow, flowDynamic, endFlow }) => { - await gotoFlow(flujoUsuarioRegistrado) - }) - .addAnswer('este mensaje no deberia existir') - - await createBot({ - database, - flow: createFlow([flujoBienvenida]), - provider, - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: 'hola', - }) - - await provider.delaySendMessage(10, 'message', { - from: '000', - body: 'ping', - }) - - await delay(50) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Buenas', getHistory[0]) - assert.is('ping', getHistory[1]) - assert.is('Hola usuario registrado', getHistory[2]) - assert.is('como estas usuario registrado', getHistory[3]) - assert.is(undefined, getHistory[4]) -}) - -suiteCase(`Debe saltar de flujo con capture con flowDynamic`, async ({ database, provider }) => { - const flujoUsuarioRegistrado = addKeyword(['user_register']) - .addAnswer('Hola usuario registrado') - .addAnswer('como estas usuario registrado') - - const flujoBienvenida = addKeyword(['hola']) - .addAnswer('Buenas', { capture: true }, async (_, { gotoFlow, flowDynamic, endFlow }) => { - await delay(10) - await flowDynamic('Usuario registrado DEMO', { continue: false }) - await gotoFlow(flujoUsuarioRegistrado) - }) - .addAnswer('este mensaje no deberia existir') - - await createBot({ - database, - flow: createFlow([flujoBienvenida]), - provider, - }) - - await provider.delaySendMessage(0, 'message', { - from: '000', - body: 'hola', - }) - - await provider.delaySendMessage(10, 'message', { - from: '000', - body: 'ping', - }) - - await delay(50) - const getHistory = database.listHistory.map((i) => i.answer) - assert.is('Buenas', getHistory[0]) - assert.is('ping', getHistory[1]) - assert.is('Usuario registrado DEMO', getHistory[2]) - assert.is('Hola usuario registrado', getHistory[3]) - assert.is('como estas usuario registrado', getHistory[4]) - assert.is(undefined, getHistory[5]) -}) - -suiteCase.run() diff --git a/__test__/0.0.2-goto-flow.test.js b/__test__/0.0.2-goto-flow.test.js new file mode 100644 index 000000000..c1875dd01 --- /dev/null +++ b/__test__/0.0.2-goto-flow.test.js @@ -0,0 +1,269 @@ +const { suite } = require('uvu') +const assert = require('uvu/assert') +const { addKeyword, createBot, createFlow, EVENTS } = require('../packages/bot/index') +const { setup, clear, delay } = require('../__mocks__/env') + +const testSuite = suite('Flujo: manejo de goto') + +testSuite.before.each(setup) +testSuite.after.each(clear) + +const fakeHTTP = async (fakeData = [], ms = 50) => { + await delay(ms) + return Promise.resolve(fakeData) +} + +testSuite(`Debe saltar de flujo siguiente`, async ({ database, provider }) => { + const userRegisteredFlow = addKeyword(['user_register']) + .addAnswer('Hola usuario registrado') + .addAnswer('como estas usuario registrado') + + const welcomeFlow = addKeyword(['hola']) + .addAnswer('Buenas', null, async (_, { gotoFlow, flowDynamic }) => { + await delay(10) + await flowDynamic('Usuario registrado DEMO') + await gotoFlow(userRegisteredFlow) + }) + .addAnswer('este mensaje no debería existir') + + await createBot({ + database, + flow: createFlow([welcomeFlow]), + provider, + }) + + await provider.delaySendMessage(50, 'message', { + from: '000', + body: 'hola', + }) + + await delay(100) + const history = database.listHistory.map((item) => item.answer) + assert.is('Buenas', history[0]) + assert.is('Usuario registrado DEMO', history[1]) + assert.is('Hola usuario registrado', history[2]) + assert.is('como estas usuario registrado', history[3]) + assert.is(undefined, history[4]) +}) + +testSuite(`Debe saltar de flujo con capture sin flowDynamic`, async ({ database, provider }) => { + const userRegisteredFlow = addKeyword(['user_register']) + .addAnswer('Hola usuario registrado') + .addAnswer('como estas usuario registrado') + + const welcomeFlow = addKeyword(['hola']) + .addAnswer('Buenas', { capture: true }, async (_, { gotoFlow }) => { + await gotoFlow(userRegisteredFlow) + }) + .addAnswer('este mensaje no debería existir') + + await createBot({ + database, + flow: createFlow([welcomeFlow]), + provider, + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await provider.delaySendMessage(10, 'message', { + from: '000', + body: 'ping', + }) + + await delay(50) + const history = database.listHistory.map((item) => item.answer) + assert.is('Buenas', history[0]) + assert.is('ping', history[1]) + assert.is('Hola usuario registrado', history[2]) + assert.is('como estas usuario registrado', history[3]) + assert.is(undefined, history[4]) +}) + +testSuite(`Debe saltar de flujo con capture con flowDynamic`, async ({ database, provider }) => { + const userRegisteredFlow = addKeyword(['user_register']) + .addAnswer('Hola usuario registrado') + .addAnswer('como estas usuario registrado') + + const welcomeFlow = addKeyword(['hola']) + .addAnswer('Buenas', { capture: true }, async (_, { gotoFlow, flowDynamic }) => { + await delay(10) + await flowDynamic('Usuario registrado DEMO', { continue: false }) + await gotoFlow(userRegisteredFlow) + }) + .addAnswer('este mensaje no debería existir') + + await createBot({ + database, + flow: createFlow([welcomeFlow]), + provider, + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await provider.delaySendMessage(10, 'message', { + from: '000', + body: 'ping', + }) + + await delay(50) + const history = database.listHistory.map((item) => item.answer) + assert.is('Buenas', history[0]) + assert.is('ping', history[1]) + assert.is('Usuario registrado DEMO', history[2]) + assert.is('Hola usuario registrado', history[3]) + assert.is('como estas usuario registrado', history[4]) + assert.is(undefined, history[5]) +}) +//Issue https://github.com/codigoencasa/bot-whatsapp/issues/865#issuecomment-1747772797 +testSuite(`Debe de continuar el el encadenamiento`, async ({ database, provider }) => { + const flowBuy = addKeyword(['buy', 'BUY']) + .addAction(async (_, { flowDynamic }) => { + await flowDynamic([{ body: 'Elegir cartera', buttons: [{ body: 'Wallet A' }, { body: 'Wallet B' }] }]) + }) + .addAction({ capture: true }, async (_, { flowDynamic }) => { + return flowDynamic([{ body: 'Comprar con', buttons: [{ body: 'ETH' }, { body: 'USDC' }] }]) + }) + .addAction({ capture: true }, async (_, { flowDynamic }) => { + return flowDynamic([ + { body: 'Comprar cantidad', buttons: [{ body: '0.1' }, { body: '0.5' }, { body: 'CUSTOM' }] }, + ]) + }) + + await createBot({ + database, + flow: createFlow([flowBuy]), + provider, + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: 'buy', + }) + + await provider.delaySendMessage(100, 'message', { + from: '000', + body: 'Wallet A', + }) + await provider.delaySendMessage(100, 'message', { + from: '000', + body: 'USDC', + }) + await provider.delaySendMessage(100, 'message', { + from: '000', + body: '0.1', + }) + + await delay(2000) + const history = database.listHistory.map((item) => item.answer) + assert.is('__call_action__', history[0]) + assert.is('Elegir cartera', history[1]) + assert.is('__capture_only_intended__', history[2]) + assert.is('Wallet A', history[3]) + assert.is('Comprar con', history[4]) + assert.is('__capture_only_intended__', history[5]) + assert.is('USDC', history[6]) + assert.is('Comprar cantidad', history[7]) + assert.is('0.1', history[8]) + assert.is(undefined, history[9]) +}) + +//Issue https://github.com/codigoencasa/bot-whatsapp/issues/910 +testSuite(`Debe de continuar el el encadenamiento con procesos async`, async ({ database, provider }) => { + const flowBienvenida = addKeyword(EVENTS.ACTION).addAnswer('Bienvenido!') + + const flowReserva = addKeyword(EVENTS.ACTION) + .addAction({ ref: '🙌🙌🙌🙌🙌' }, async (_, { flowDynamic }) => { + const expensiveTask = await fakeHTTP({ data: 'datos de json' }, 800) + await flowDynamic(expensiveTask.data) + }) + .addAction({ ref: '🔝🔝🔝🔝' }, async (_, { gotoFlow }) => { + const expensiveTask = await fakeHTTP({ cliente: 'pepe' }, 800) + if (expensiveTask.cliente !== 'goyo') { + return gotoFlow(flowReservaNuevoCliente) + } + }) + + const flowReservaNuevoCliente = addKeyword('12345').addAnswer( + 'Digame su *Nombre y apellidos* para reservar su mesa...', + { capture: true, ref: '🔔🔔🔔' }, + async (ctx, { state }) => { + await state.update({ Nombre: ctx.body, Telefono: ctx.from.slice(2) }) + } + ) + + const flowMain = addKeyword(EVENTS.WELCOME).addAction(async (ctx, ctxFn) => { + try { + const expensiveTask = await fakeHTTP(`reserva`, 800) + switch (expensiveTask) { + case 'reserva': + return ctxFn.gotoFlow(flowReserva) + default: + return ctxFn.gotoFlow(flowBienvenida) + } + } catch (e) { + console.log('Error en el flowMain: ', e) + } + }) + + await createBot({ + database, + flow: createFlow([flowMain, flowBienvenida, flowReserva, flowReservaNuevoCliente]), + provider, + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: 'buenas', + }) + + await provider.delaySendMessage(3000, 'message', { + from: '000', + body: 'leifer', + }) + + await delay(5000) + const history = database.listHistory.map((item) => item.answer) + assert.is('__call_action__', history[0]) + assert.is('__capture_only_intended__', history[1]) + assert.is('__capture_only_intended__', history[2]) + assert.is('datos de json', history[3]) + assert.is('Digame su *Nombre y apellidos* para reservar su mesa...', history[4]) + assert.is('leifer', history[5]) + assert.is(undefined, history[96]) +}) + +//Issue https://github.com/codigoencasa/bot-whatsapp/issues/877 +testSuite(`Debe respectar el delay del node previo`, async ({ database, provider }) => { + const flowPing = addKeyword(['hi']).addAction(async (_, { flowDynamic, gotoFlow }) => { + await flowDynamic('Buenas ping debe espera 1segundo') + return gotoFlow(flowBye) + }) + + const flowBye = addKeyword('ping').addAnswer(`Pong con delay 1 segundo`, { delay: 1000 }) + + await createBot({ + database, + flow: createFlow([flowPing, flowBye]), + provider, + }) + + await provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hi', + }) + + await delay(2000) + const history = database.listHistory.map((item) => item.answer) + assert.is('__call_action__', history[0]) + assert.is('Buenas ping debe espera 1segundo', history[1]) + assert.is('Pong con delay 1 segundo', history[2]) + assert.is(undefined, history[3]) +}) + +testSuite.run() diff --git a/__test__/0.1.0-case.test.js b/__test__/0.1.0-sensitive.test.js similarity index 58% rename from __test__/0.1.0-case.test.js rename to __test__/0.1.0-sensitive.test.js index 7f45cde37..2c3e9373b 100644 --- a/__test__/0.1.0-case.test.js +++ b/__test__/0.1.0-sensitive.test.js @@ -3,18 +3,18 @@ const assert = require('uvu/assert') const { addKeyword, createBot, createFlow } = require('../packages/bot/index') const { setup, clear, delay } = require('../__mocks__/env') -const suiteCase = suite('Flujo: sensitive') +const testSuite = suite('Flujo: sensitive') -suiteCase.before.each(setup) -suiteCase.after.each(clear) +testSuite.before.each(setup) +testSuite.after.each(clear) -suiteCase(`Responder a "ole" en minuscula`, async ({ database, provider }) => { - const flow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA') +testSuite(`Responder a "ole" en minúscula`, async ({ database, provider }) => { + const sensitiveFlow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA') await createBot({ database, provider, - flow: createFlow([flow]), + flow: createFlow([sensitiveFlow]), }) await provider.delaySendMessage(0, 'message', { @@ -28,13 +28,13 @@ suiteCase(`Responder a "ole" en minuscula`, async ({ database, provider }) => { assert.is(undefined, database.listHistory[1]) }) -suiteCase(`NO Responder a "ole" en minuscula`, async ({ database, provider }) => { - const flow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA') +testSuite(`NO Responder a "OLE" en mayúscula`, async ({ database, provider }) => { + const sensitiveFlow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA') await createBot({ database, provider, - flow: createFlow([flow]), + flow: createFlow([sensitiveFlow]), }) await provider.delaySendMessage(0, 'message', { @@ -48,4 +48,4 @@ suiteCase(`NO Responder a "ole" en minuscula`, async ({ database, provider }) => assert.is(undefined, database.listHistory[1]) }) -suiteCase.run() +testSuite.run() diff --git a/__test__/0.1.1-case.test.js b/__test__/0.1.1-children-callback.test.js similarity index 100% rename from __test__/0.1.1-case.test.js rename to __test__/0.1.1-children-callback.test.js diff --git a/__test__/0.1.2-case.test.js b/__test__/0.1.2-regex.test.js similarity index 100% rename from __test__/0.1.2-case.test.js rename to __test__/0.1.2-regex.test.js diff --git a/__test__/0.1.3-case.test.js b/__test__/0.1.3-capture.test.js similarity index 100% rename from __test__/0.1.3-case.test.js rename to __test__/0.1.3-capture.test.js diff --git a/__test__/0.1.4-case.test.js b/__test__/0.1.4-flow-dynamic.test.js similarity index 100% rename from __test__/0.1.4-case.test.js rename to __test__/0.1.4-flow-dynamic.test.js diff --git a/package.json b/package.json index c93907430..9dffa403b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.33", + "version": "0.1.34", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, @@ -21,11 +21,11 @@ "lint:check": "eslint .", "lint:fix": "eslint --fix ./packages", "build:portal-web": "cd ./packages/portal/ && pnpm run build.types && pnpm run build.client && pnpm run build.server && pnpm run lint --fix", - "build:full": "pnpm run build:portal-web && pnpm run cli:rollup && pnpm run bot:rollup && pnpm run provider:rollup && pnpm run database:rollup && pnpm run contexts:rollup && pnpm run create-bot-whatsapp:rollup && pnpm run portal:rollup", + "build:full": "pnpm run build:portal-web && pnpm run cli:rollup && pnpm run bot:rollup && pnpm run provider:rollup && pnpm run database:rollup && pnpm run contexts:rollup && pnpm run create-bot-whatsapp:rollup && pnpm run eslint-plugin:rollup && pnpm run portal:rollup", "build": "pnpm run cli:rollup && pnpm run bot:rollup && pnpm run provider:rollup && pnpm run database:rollup && pnpm run contexts:rollup && pnpm run create-bot-whatsapp:rollup && pnpm run portal:rollup && pnpm run eslint-plugin:rollup", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", - "test.e2e": "node ./node_modules/uvu/bin.js __test__", + "test.e2e": "node ./node_modules/uvu/bin.js __test__ ", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", "test": "npm run test.coverage", "cli": "node ./packages/cli/bin/cli.js", @@ -83,6 +83,7 @@ "rollup-plugin-copy": "^3.5.0", "semver": "^7.5.4", "standard-version": "^9.5.0", + "tree-node-cli": "^1.6.0", "uvu": "^0.5.6" }, "packageManager": "pnpm@8.6.12", diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e69fe5911..8cf266cdc 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -295,7 +295,7 @@ class CoreClass extends EventEmitter { if (!flowInstance?.toJson) { printer([ - `[CIRCULAR_DEPENDENCY]: Se ha detectado una dependencia circular.`, + `[POSSIBLE_CIRCULAR_DEPENDENCY]: Se ha detectado una dependencia circular.`, `Para evitar problemas, te recomendamos utilizar 'require'('./ruta_del_flow')`, `Ejemplo: gotoFlow(helloFlow) --> gotoFlow(require('./flows/helloFlow.js'))`, `[INFO]: https://bot-whatsapp.netlify.app/docs/goto-flow/`, @@ -303,14 +303,12 @@ class CoreClass extends EventEmitter { return } + await delay(flowInstance?.ctx?.options?.delay ?? 0) + const flowTree = flowInstance.toJson() const flowParentId = flowTree[step] - if (endFlowFlag) { - return - } - const parseListMsg = await this.flowClass.find(flowParentId?.ref, true, flowTree) for (const msg of parseListMsg) { diff --git a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js index 6be4f9e40..9f42ef462 100644 --- a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js +++ b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js @@ -3,13 +3,6 @@ const { SessionsClient } = require('@google-cloud/dialogflow-cx').v3beta1 const { existsSync, readFileSync } = require('fs') const { join } = require('path') -/** - * Necesita extender de core.class - * handleMsg(messageInComming) // const { body, from } = messageInComming - */ - -const GOOGLE_ACCOUNT_PATH = join(process.cwd(), 'google-key.json') - class DialogFlowCXContext extends CoreClass { // Opciones del usuario optionsDX = { @@ -18,7 +11,6 @@ class DialogFlowCXContext extends CoreClass { agentId: '', } projectId = null - configuration = null sessionClient = null constructor(_database, _provider, _optionsDX = {}) { @@ -31,27 +23,33 @@ class DialogFlowCXContext extends CoreClass { * Verificar conexión con servicio de DialogFlow */ init = () => { - if (!existsSync(GOOGLE_ACCOUNT_PATH)) { - console.log(`[ERROR]: No se encontro ${GOOGLE_ACCOUNT_PATH}`) - /** - * Emitir evento de error para que se mueste por consola dicinedo que no tiene el json - * */ + let credentials; + const googleKeyFilePath = join(process.cwd(), 'google-key.json'); + + if (existsSync(googleKeyFilePath)) { + const rawJson = readFileSync(googleKeyFilePath, 'utf-8'); + credentials = JSON.parse(rawJson); + } else if (process.env.GOOGLE_KEY_JSON) { + credentials = JSON.parse(process.env.GOOGLE_KEY_JSON); + } else { + throw new Error('Google key configuration not found'); } - 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) + const { project_id, private_key, client_email } = credentials; - this.projectId = project_id + this.projectId = project_id; this.sessionClient = new SessionsClient({ credentials: { private_key, client_email }, apiEndpoint: `${this.optionsDX.location}-dialogflow.googleapis.com`, - }) + }); } + + /** * GLOSSARY.md * @param {*} messageCtxInComming diff --git a/packages/docs/src/routes/docs/example/index.mdx b/packages/docs/src/routes/docs/example/index.mdx index 0d0781d73..4d24ec957 100644 --- a/packages/docs/src/routes/docs/example/index.mdx +++ b/packages/docs/src/routes/docs/example/index.mdx @@ -2,7 +2,7 @@ import Navigation from '../../../components/widgets/Navigation' # Ejemplo -Si copias y pegas este codigo y tu entorno de trabajo cumple con todos los requesitos te debe funcionar abajo explico muy por encima +Si copias y pegas este código (y tu entorno de trabajo cumple con todos los [requesitos](/docs/requirements)) te debe funcionar, abajo explico muy por encima. ```js const { createBot, createProvider, createFlow, addKeyword } = require('@bot-whatsapp/bot') @@ -10,13 +10,12 @@ const { createBot, createProvider, createFlow, addKeyword } = require('@bot-what const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') -const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) +const flowPrincipal = addKeyword(['hola', 'alo']) .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) /** - * Esta es la funcion importante es la que realmente inicia - * el chatbot. + * Esta es la función principal, ¡Importante, es la que realmente inicia el chatbot! */ const main = async () => { const adapterDB = new MockAdapter() @@ -34,7 +33,7 @@ main() ## Explicando -En esta parte solo estamos declarando 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)** +En esta parte sólo estamos declarando 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') @@ -43,11 +42,11 @@ const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') ``` -La siguiente seccion te declaramos las palabras claves que disparan un flujo de conversación. +En la siguiente sección declaramos las palabras claves que disparán un flujo de conversación. **Ejemplo**: -Si un usuario te escribe **👦hola** ó **👦alo** el bot respondera +Si un usuario te escribe cosas como **👦hola**, **👦Hola** o **👦alo** el bot responderá (es insensible a mayúsculas) **🤖Hola, bienvenido a mi tienda, ¿Como puedo ayudarte?** diff --git a/packages/docs/src/routes/docs/join/index.mdx b/packages/docs/src/routes/docs/join/index.mdx index 1060a72a9..cb638123e 100644 --- a/packages/docs/src/routes/docs/join/index.mdx +++ b/packages/docs/src/routes/docs/join/index.mdx @@ -1,27 +1,2 @@ # Unirme -Bienvenido al proyecto! Estamos ciertamente emocionados de tenerte a bordo, colaborando en lo que puedas, y esperamos trabajar y estrechar vínculos contigo. - -Sabemos que el camino para convertirte en un desarrollador profesional no es nada fácil, pero con una cuota de suerte y teniendo contactos puedes abrirte paso. - -Deseamos que te sientas cómodo, pero no tanto como para que te quedes dormido, y que puedas aportar tu valioso granito de arena, y también algún que otro aporte en conocimiento y habilidades. - -Recuerda que si tienes alguna inquietud, o simplemente deseas interactuar con los otros colaboradores, te recomendamos primero leer la documentación oficial. No queremos fomentar la vagancia. Después de hacer eso, puedes intentar unirte a la comunidad. Es un proceso complicado pero tampoco es imposible. Vamos, que el Leicester ganó la premier en 2016. - ---- - -## Ventajas super discretas al unirme - -Participar abiertamente en un proyecto de código abierto, previa capacitación por supuesto, te permite aprender de manera práctica, aunque no tan didáctica, sobre tecnologías y metodologías que se van creando periódicamente en el mundo de desarrollo de software. También puedes, si así lo deseas, aprender de otros desarrolladores que programen en tu lenguaje favorito y contribuir con tu experiencia y dedicación a la comunidad de código abierto. - -Al unirte al canal de discord te estará brindando la oportunidad de **adquirir experiencia en el desarrollo integral y sostenido subsecuentemente en el tiempo de software** y en el trabajo en equipo. Esto puede ser realmente muy valioso para tu currículum y para tu carrera profesional, teniendo en cuenta que el mundo se consume en dinero. - -La visibilidad es uno de los puntos que más se requieren a la hora de rentar un departamento hoy en día, al unirte se te brinda una sola oportunidad de **mayor visibilidad en días nublados en la comunidad de desarrolladores y de demostrar tus habilidades**. Esto puede ayudarte a encontrar oportunidades de trabajo, que de otra manera te serían inaccesibles, o a colaborar con otros proyectos, ya sea de código abierto, entreabierto o herméticamente cerrado. - -Colaboración con otros desarrolladores de todo el mundo conocido y por conocer, y **trabajar juntos para mejorar gradual y consecutivamente el susodicho proyecto** Al trabajar en equipo y colaborar con otros, participando en tareas de integración y desarrollo del lenguaje, así como también del idioma y la cultura, podrás mejorar tu comunicación verbal y escrita, resolución de problemas inmediatos generados por las pésimas condiciones de seguridad del estadio, y liderazgo, habilidades que cada vez son más demandadas en el entorno laboral actual. No sólo eso, diría que son casi fundamentales para el correcto desarrollo de la sociedad europea. Tal es así que el mismo Fernando Torres, apodado cariñosamente como "el niño", lo comentó cuando tuvo la oportunidad en La Resistencia. Este hecho generó graves impactos en la economía sociopolítica del siglo XXI, desembocando en la consecución de cierto equipo portugués en cierta máxima competición europea a nivel clubes. Lógicamente, todo apuntaba a una hazaña épica del gran, y me pongo de pie, José Mourinho. Pero lo cierto es que no se ha demostrado fehacientemente que sea responsabilidad del veterano croata que marcó el gol en la final, en tiempo de descuento. En fin, para gustos colores. - -Contribución al bien común de la comunidad en edad escolar: Participar en un proyecto de código abierto tan prestigioso como este, no solo te permite contribuir a la comunidad y a la sociedad en general, sino que también trae aparejados ciertos cambios en la estructura política del pueblo camerunés, ya que el código abierto es accesible para unos pocos, pero utilizable por cualquier persona con dos dedos de frente. Esto, por supuesto, no aplica a los casos de trillizos o cuatrillizos, pero es un buen punto de partida. **Esto puede ser muy gratificante si se comparte a la medianoche y sentirte parte insignificante de algo un poco más grande de lo que estás acostumbrado**. - -Es una excelente manera de aprender a incrementar tus habilidades socioeconómicas, sociales y económicas, y por sobre todas las cosas tecnológicas y **estar entre uno de los pocos seres humanos en la historia que estuvieron al tanto de las últimas tendencias en el mundo de la moda y de las ventajas de unir la experiencia y los desarrollos en el mundo del software**. Al trabajar con otros desarrolladores principiantes y contribuir a proyectos de código un tanto abierto, tendrás la inolvidable oportunidad de \*\*aprender, tanto como sea posible teniendo en cuenta las inclemencias del clima, y practicar, siempre y cuando estemos en año bisiesto, nuevas tecnologías y metodologías, lo que te ayudará a mejorar tus habilidades intrínsecas y a mantenerte actualizado en el universo en constante cambio de la ciencia que estudia las bondades y los atributos de la tecnología. - -Esperamos que estés listo para **unirte a nosotros y nuestras mascotas en esta emocionante aventura** diff --git a/packages/docs/src/routes/docs/state/index.mdx b/packages/docs/src/routes/docs/state/index.mdx index b453b3240..f0224cf21 100644 --- a/packages/docs/src/routes/docs/state/index.mdx +++ b/packages/docs/src/routes/docs/state/index.mdx @@ -3,7 +3,7 @@ import Navigation from '../../../components/widgets/Navigation' # State Algunas veces queremos mantener un `state` o `contexto` por usuario que nos escribe y poder compartir esta informacion con todos nuestros flujos. -Esto tambien funcion si usas `gotoFlow` +Esto tambien funciona si usas `gotoFlow` ```js @@ -56,7 +56,7 @@ De esta manera puedes recuperar el valor de una propiedad del estado ## GlobalState -De igual manera que el `state` anterior nosotros podemos usar `globalState` para tener un esta general de la app (NO es por usuario), esto es muy util si quieres ejemplo apagar o prener el bot +De igual manera que el `state` anterior nosotros podemos usar `globalState` para tener un esta general de la app (NO es por usuario), esto es muy util si quieres ejemplo apagar o prender el bot ```js diff --git a/packages/provider/package.json b/packages/provider/package.json index c4c6b6805..988374f99 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -18,7 +18,8 @@ "follow-redirects": "^1.15.2", "qr-image": "^3.2.0", "rimraf": "^3.0.2", - "sharp": "^0.30.5" + "sharp": "^0.30.5", + "queue-promise": "^2.2.1" }, "exports": { "./mock": "./lib/mock/index.cjs", diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 49b819ccc..76701c66c 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -394,6 +394,13 @@ class BaileysProvider extends ProviderClass { */ sendButtons = async (number, text, buttons) => { + this.emit( + 'notice', + [ + `[NOTA]: Actualmente enviar botones no esta disponible con este proveedor`, + `[NOTA]: esta funcion esta disponible con Meta o Twilio`, + ].join('\n') + ) const numberClean = baileyCleanNumber(number) const templateButtons = buttons.map((btn, i) => ({ diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json index 4df69217f..2a89790d7 100644 --- a/packages/provider/src/baileys/package.json +++ b/packages/provider/src/baileys/package.json @@ -1,6 +1,7 @@ { "dependencies": { - "@whiskeysockets/baileys": "^6.5.0", - "wa-sticker-formatter": "4.3.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "cache-manager": "5.2.4" } } diff --git a/packages/provider/src/meta/index.js b/packages/provider/src/meta/index.js index 393de9666..f6bb27aaa 100644 --- a/packages/provider/src/meta/index.js +++ b/packages/provider/src/meta/index.js @@ -7,6 +7,7 @@ const { generalDownload } = require('../../common/download') const { convertAudio } = require('../utils/convertAudio') const MetaWebHookServer = require('./server') const URL = `https://graph.facebook.com` +const Queue = require('queue-promise') /** * ⚙️MetaProvider: Es un provedor que te ofrece enviar @@ -38,6 +39,12 @@ class MetaProvider extends ProviderClass { for (const { event, func } of listEvents) { this.metHook.on(event, func) } + + this.queue = new Queue({ + concurrent: 1, // Cantidad de tareas que se ejecutarán en paralelo + interval: 100, // Intervalo entre tareas + start: true, // Iniciar la cola automáticamente + }) } /** @@ -63,11 +70,22 @@ class MetaProvider extends ProviderClass { ] /** - * Enviar directo a META - * @param {*} body - * @returns + * Sends a message with metadata to the API. + * + * @param {Object} body - The body of the message. + * @return {Promise} A Promise that resolves when the message is sent. */ - sendMessageMeta = async (body) => { + sendMessageMeta(body) { + return this.queue.add(() => this.sendMessageToApi(body)) + } + + /** + * Sends a message to the API. + * + * @param {Object} body - The body of the message. + * @return {Object} The response data from the API. + */ + async sendMessageToApi(body) { try { const response = await axios.post(`${URL}/${this.version}/${this.numberId}/messages`, body, { headers: { @@ -76,8 +94,8 @@ class MetaProvider extends ProviderClass { }) return response.data } catch (error) { - console.log(error) - return Promise.resolve(error) + console.error(error) + throw error } } @@ -394,14 +412,14 @@ class MetaProvider extends ProviderClass { text: 'text-string', }, { - type: "currency", + type: 'currency', currency: { - fallback_value: "$100.99", - code: "USD", - amount_1000: 100990 - } + fallback_value: '$100.99', + code: 'USD', + amount_1000: 100990, + }, }, - ] + ], }, { type: 'button', @@ -410,13 +428,13 @@ class MetaProvider extends ProviderClass { parameters: [ { type: 'payload', - payload: 'aGlzIHRoaXMgaXMgY29v' + payload: 'aGlzIHRoaXMgaXMgY29v', }, ], }, - ] + ], }, - }; + } return this.sendMessageMeta(body) } @@ -431,14 +449,40 @@ class MetaProvider extends ProviderClass { const parseContacts = contact.map((contact) => ({ name: { formatted_name: contact.name, + first_name: contact.first_name, + last_name: contact.last_name, + middle_name: contact.middle_name, + suffix: contact.suffix, + prefix: contact.prefix, }, - phone: [ - { - phone: contact.phone, - wa_id: contact.phone, - type: 'MOBILE', - }, - ], + birthday: contact.birthday, + phones: contact.phones.map((phone) => ({ + phone: phone.phone, + wa_id: phone.wa_id, + type: phone.type, + })), + emails: contact.emails.map((email) => ({ + email: email.email, + type: email.type, + })), + org: { + company: contact.company, + department: contact.department, + title: contact.title, + }, + urls: contact.urls.map((url) => ({ + url: url.url, + type: url.type, + })), + addresses: contact.addresses.map((address) => ({ + street: address.street, + city: address.city, + state: address.state, + zip: address.zip, + country: address.country, + country_code: address.counry_code, + type: address.type, + })), })) const body = { @@ -474,10 +518,10 @@ class MetaProvider extends ProviderClass { action: { name: 'catalog_message', parameters: { - "thumbnail_product_retailer_id": itemCatalogId, - } - } - } + thumbnail_product_retailer_id: itemCatalogId, + }, + }, + }, } return this.sendMessageMeta(body) } @@ -495,6 +539,48 @@ class MetaProvider extends ProviderClass { this.sendtext(number, message) } + + /** + * Enviar reacción a un mensaje + * @param {*} number + * @param {*} react + */ + sendReaction = async (number, react) => { + const body = { + messaging_product: 'whatsapp', + recipient_type: 'individual', + to: number, + type: 'reaction', + reaction: { + message_id: react.message_id, + emoji: react.emoji, + }, + } + return this.sendMessageMeta(body) + } + + /** + * Enviar Ubicación + * @param {*} longitude + * @param {*} latitude + * @param {*} name + * @param {*} address + * @returns + */ + sendLocation = async (number, localization) => { + const body = { + messaging_product: 'whatsapp', + to: number, + type: 'location', + location: { + longitude: localization.long_number, + latitude: localization.lat_number, + name: localization.name, + address: localization.address, + }, + } + return this.sendMessageMeta(body) + } } module.exports = MetaProvider diff --git a/packages/provider/src/meta/package.json b/packages/provider/src/meta/package.json index d817dcd94..7776d350d 100644 --- a/packages/provider/src/meta/package.json +++ b/packages/provider/src/meta/package.json @@ -1,5 +1,6 @@ { "dependencies": { - "form-data": "^4.0.0" + "form-data": "4.0.0", + "queue-promise": "2.2.1" } } diff --git a/packages/provider/src/meta/server.js b/packages/provider/src/meta/server.js index ed12e7855..2502da3cf 100644 --- a/packages/provider/src/meta/server.js +++ b/packages/provider/src/meta/server.js @@ -3,6 +3,7 @@ const polka = require('polka') const { urlencoded, json } = require('body-parser') const { generateRefprovider } = require('../../common/hash') const { getMediaUrl } = require('./utils') +const Queue = require('queue-promise') class MetaWebHookServer extends EventEmitter { constructor(jwtToken, numberId, version, token, metaPort = 3000) { @@ -14,6 +15,12 @@ class MetaWebHookServer extends EventEmitter { this.numberId = numberId this.version = version this.metaServer = this.buildHTTPServer() + + this.messageQueue = new Queue({ + concurrent: 1, // Procesa un mensaje a la vez + interval: 50, // Intervalo de 100 milisegundos entre mensajes + start: true, // La cola empieza a procesar tareas inmediatamente + }) } /** @@ -33,187 +40,169 @@ class MetaWebHookServer extends EventEmitter { return } - const [message] = messages - const [contact] = contacts - const to = body.entry[0].changes[0].value?.metadata?.display_phone_number - const pushName = contact?.profile?.name - - if (message.type === 'text') { - const body = message.text?.body - const responseObj = { - type: message.type, - from: message.from, - to, - body, - pushName, - } - this.emit('message', responseObj) - } - - if (message.type === 'interactive') { - const body = message.interactive?.button_reply?.title || message.interactive?.list_reply?.id - const title_button_reply = message.interactive?.button_reply?.title - const title_list_reply = message.interactive?.list_reply?.title - const responseObj = { - type: 'interactive', - from: message.from, - to, - body, - title_button_reply, - title_list_reply, - pushName, - } - this.emit('message', responseObj) - } - - if (message.type === 'button') { - const body = message.button?.text - const payload = message.button?.payload - const title_button_reply = message.button?.payload - const responseObj = { - type: 'button', - from: message.from, - to, - body, - payload, - title_button_reply, - pushName, - } - this.emit('message', responseObj) - } - - if (message.type === 'image') { - const body = generateRefprovider('_event_media_') - const idUrl = message.image?.id - const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken) - const responseObj = { - type: message.type, - from: message.from, - url: resolvedUrl, - to, - body, - pushName, + messages.forEach(async (message) => { + const [contact] = contacts + const to = body.entry[0].changes[0].value?.metadata?.display_phone_number + const pushName = contact?.profile?.name + let responseObj + + switch (message.type) { + case 'text': { + responseObj = { + type: message.type, + from: message.from, + to, + body: message.text?.body, + pushName, + } + break + } + case 'interactive': { + responseObj = { + type: 'interactive', + from: message.from, + to, + body: message.interactive?.button_reply?.title || message.interactive?.list_reply?.id, + title_button_reply: message.interactive?.button_reply?.title, + title_list_reply: message.interactive?.list_reply?.title, + pushName, + } + break + } + case 'button': { + responseObj = { + type: 'button', + from: message.from, + to, + body: message.button?.text, + payload: message.button?.payload, + title_button_reply: message.button?.payload, + pushName, + } + break + } + case 'image': { + const imageUrl = await getMediaUrl(this.version, message.image?.id, this.numberId, this.jwtToken) + responseObj = { + type: message.type, + from: message.from, + url: imageUrl, + to, + body: generateRefprovider('_event_media_'), + pushName, + } + break + } + case 'document': { + const documentUrl = await getMediaUrl( + this.version, + message.document?.id, + this.numberId, + this.jwtToken + ) + responseObj = { + type: message.type, + from: message.from, + url: documentUrl, + to, + body: generateRefprovider('_event_document_'), + pushName, + } + break + } + case 'video': { + const videoUrl = await getMediaUrl(this.version, message.video?.id, this.numberId, this.jwtToken) + responseObj = { + type: message.type, + from: message.from, + url: videoUrl, + to, + body: generateRefprovider('_event_media_'), + pushName, + } + break + } + case 'location': { + responseObj = { + type: message.type, + from: message.from, + to, + latitude: message.location.latitude, + longitude: message.location.longitude, + body: generateRefprovider('_event_location_'), + pushName, + } + break + } + case 'audio': { + const audioUrl = await getMediaUrl(this.version, message.audio?.id, this.numberId, this.jwtToken) + responseObj = { + type: message.type, + from: message.from, + url: audioUrl, + to, + body: generateRefprovider('_event_audio_'), + pushName, + } + break + } + case 'sticker': { + responseObj = { + type: message.type, + from: message.from, + to, + id: message.sticker.id, + body: generateRefprovider('_event_media_'), + pushName, + } + break + } + case 'contacts': { + responseObj = { + type: message.type, + from: message.from, + contacts: [ + { + name: message.contacts[0].name, + phones: message.contacts[0].phones, + }, + ], + to, + body: generateRefprovider('_event_contacts_'), + pushName, + } + break + } + case 'order': { + responseObj = { + type: message.type, + from: message.from, + to, + order: { + catalog_id: message.order.catalog_id, + product_items: message.order.product_items, + }, + body: generateRefprovider('_event_order_'), + pushName, + } + break + } + default: + // Lógica para manejar tipos de mensajes no reconocidos + break } - this.emit('message', responseObj) - } - - if (message.type === 'document') { - const body = generateRefprovider('_event_document_') - const idUrl = message.document?.id - const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken) - const responseObj = { - type: message.type, - from: message.from, - url: resolvedUrl, // Utilizar el valor resuelto de la promesa - to, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'video') { - const body = generateRefprovider('_event_media_') - const idUrl = message.video?.id - - const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken) - - const responseObj = { - type: message.type, - from: message.from, - url: resolvedUrl, // Utilizar el valor resuelto de la promesa - to, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'location') { - const body = generateRefprovider('_event_location_') - - const responseObj = { - type: message.type, - from: message.from, - to, - latitude: message.location.latitude, - longitude: message.location.longitude, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'audio') { - const body = generateRefprovider('_event_audio_') - const idUrl = message.audio?.id - const resolvedUrl = await getMediaUrl(this.version, idUrl, this.numberId, this.jwtToken) - const responseObj = { - type: message.type, - from: message.from, - url: resolvedUrl, // Utilizar el valor resuelto de la promesa - to, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'sticker') { - const body = generateRefprovider('_event_media_') - - const responseObj = { - type: message.type, - from: message.from, - to, - id: message.sticker.id, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'contacts') { - const body = generateRefprovider('_event_contacts_') - - const responseObj = { - type: message.type, - from: message.from, - contacts: [{ name: message.contacts[0].name, phones: message.contacts[0].phones }], - to, - body, - pushName, - } - - this.emit('message', responseObj) - } - - if (message.type === 'order') { - const body = generateRefprovider('_event_order_') - - const responseObj = { - type: message.type, - from: message.from, - to, - order: { - catalog_id: message.order.catalog_id, - product_items: message.order.product_items, - }, - body, - pushName, + if (responseObj) { + this.messageQueue.enqueue(() => this.processMessage(responseObj)) } + }) - this.emit('message', responseObj) - } + res.statusCode = 200 + res.end('Messages enqueued') + } - const json = JSON.stringify({ body }) - res.end(json) + processMessage = (message) => { + this.emit('message', message) } /** diff --git a/packages/provider/src/twilio/package.json b/packages/provider/src/twilio/package.json index e4bb7d467..a9c480a7a 100644 --- a/packages/provider/src/twilio/package.json +++ b/packages/provider/src/twilio/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "twilio": "3.84.1" + "twilio": "4.19.0" } } diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 5e20ca55a..c36b24ea4 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -139,10 +139,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' + this.emit( + 'notice', + [ + `[NOTA]: Actualmente enviar botones no esta disponible con este proveedor`, + `[NOTA]: esta funcion esta disponible con Meta o Twilio`, + ].join('\n') ) - this.emit('notice', NOTE_VENOM_BUTTON) 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"); diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 6fe0d595c..8bbc1fe69 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -127,6 +127,13 @@ class WebWhatsappProvider extends ProviderClass { * @returns */ sendButtons = async (number, message, buttons = []) => { + this.emit( + 'notice', + [ + `[NOTA]: Actualmente enviar botones no esta disponible con este proveedor`, + `[NOTA]: esta funcion esta disponible con Meta o Twilio`, + ].join('\n') + ) const buttonMessage = new Buttons(message, buttons, '', '') return this.vendor.sendMessage(number, buttonMessage) } diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 673aa749c..50e0d44fe 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.22.2-alpha.1" + "whatsapp-web.js": "1.23.0" } } diff --git a/packages/provider/src/wppconnect/index.js b/packages/provider/src/wppconnect/index.js index 37c887224..8d406d301 100644 --- a/packages/provider/src/wppconnect/index.js +++ b/packages/provider/src/wppconnect/index.js @@ -138,6 +138,14 @@ class WPPConnectProviderClass extends ProviderClass { * @example await sendButtons("+XXXXXXXXXXX", "Your Text", [{"body": "Button 1"},{"body": "Button 2"}]) */ sendButtons = async (number, text, buttons) => { + this.emit( + 'notice', + [ + `[NOTA]: Actualmente enviar botones no esta disponible con este proveedor`, + `[NOTA]: esta funcion esta disponible con Meta o Twilio`, + ].join('\n') + ) + const templateButtons = buttons.map((btn, i) => ({ id: `id-btn-${i}`, text: btn.body, diff --git a/packages/provider/src/wppconnect/package.json b/packages/provider/src/wppconnect/package.json index a57b9ad46..921e4a3dd 100644 --- a/packages/provider/src/wppconnect/package.json +++ b/packages/provider/src/wppconnect/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "@wppconnect-team/wppconnect": "^1.28.0" + "@wppconnect-team/wppconnect": "1.28.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7f4bf1df..2d891d5e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,6 +88,9 @@ importers: standard-version: specifier: ^9.5.0 version: 9.5.0 + tree-node-cli: + specifier: ^1.6.0 + version: 1.6.0 uvu: specifier: ^0.5.6 version: 0.5.6 @@ -354,6 +357,9 @@ importers: qr-image: specifier: ^3.2.0 version: 3.2.0 + queue-promise: + specifier: ^2.2.1 + version: 2.2.1 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -845,7 +851,7 @@ packages: dependencies: '@aws-sdk/client-cognito-identity': 3.437.0 '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/types': 2.4.0 tslib: 2.6.2 transitivePeerDependencies: @@ -862,7 +868,7 @@ packages: requiresBuild: true dependencies: '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/types': 2.4.0 tslib: 2.6.2 dev: false @@ -879,7 +885,7 @@ packages: '@aws-sdk/types': 3.433.0 '@smithy/fetch-http-handler': 2.2.4 '@smithy/node-http-handler': 2.1.8 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/protocol-http': 3.0.8 '@smithy/smithy-client': 2.1.12 '@smithy/types': 2.4.0 @@ -901,8 +907,8 @@ packages: '@aws-sdk/credential-provider-sso': 3.437.0 '@aws-sdk/credential-provider-web-identity': 3.433.0 '@aws-sdk/types': 3.433.0 - '@smithy/credential-provider-imds': 2.0.5 - '@smithy/property-provider': 2.0.5 + '@smithy/credential-provider-imds': 2.0.18 + '@smithy/property-provider': 2.0.13 '@smithy/shared-ini-file-loader': 2.2.2 '@smithy/types': 2.4.0 tslib: 2.6.2 @@ -925,8 +931,8 @@ packages: '@aws-sdk/credential-provider-sso': 3.437.0 '@aws-sdk/credential-provider-web-identity': 3.433.0 '@aws-sdk/types': 3.433.0 - '@smithy/credential-provider-imds': 2.0.5 - '@smithy/property-provider': 2.0.5 + '@smithy/credential-provider-imds': 2.0.18 + '@smithy/property-provider': 2.0.13 '@smithy/shared-ini-file-loader': 2.2.2 '@smithy/types': 2.4.0 tslib: 2.6.2 @@ -944,7 +950,7 @@ packages: requiresBuild: true dependencies: '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/shared-ini-file-loader': 2.2.2 '@smithy/types': 2.4.0 tslib: 2.6.2 @@ -962,7 +968,7 @@ packages: '@aws-sdk/client-sso': 3.437.0 '@aws-sdk/token-providers': 3.437.0 '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/shared-ini-file-loader': 2.2.2 '@smithy/types': 2.4.0 tslib: 2.6.2 @@ -980,7 +986,7 @@ packages: requiresBuild: true dependencies: '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/types': 2.4.0 tslib: 2.6.2 dev: false @@ -1006,8 +1012,8 @@ packages: '@aws-sdk/credential-provider-sso': 3.437.0 '@aws-sdk/credential-provider-web-identity': 3.433.0 '@aws-sdk/types': 3.433.0 - '@smithy/credential-provider-imds': 2.0.5 - '@smithy/property-provider': 2.0.5 + '@smithy/credential-provider-imds': 2.0.18 + '@smithy/property-provider': 2.0.13 '@smithy/types': 2.4.0 tslib: 2.6.2 transitivePeerDependencies: @@ -1083,7 +1089,7 @@ packages: requiresBuild: true dependencies: '@aws-sdk/types': 3.433.0 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/protocol-http': 3.0.8 '@smithy/signature-v4': 2.0.12 '@smithy/types': 2.4.0 @@ -1154,7 +1160,7 @@ packages: '@smithy/middleware-stack': 2.0.6 '@smithy/node-config-provider': 2.1.3 '@smithy/node-http-handler': 2.1.8 - '@smithy/property-provider': 2.0.5 + '@smithy/property-provider': 2.0.13 '@smithy/protocol-http': 3.0.8 '@smithy/shared-ini-file-loader': 2.2.2 '@smithy/smithy-client': 2.1.12 @@ -4347,22 +4353,6 @@ packages: dev: false optional: true - /@smithy/credential-provider-imds@2.0.5: - resolution: - { - integrity: sha512-KFcf/e0meFkQNyteJ65f1G19sgUEY1e5zL7hyAEUPz2SEfBmC9B37WyRq87G3MEEsvmAWwCRu7nFFYUKtR3svQ==, - } - engines: { node: '>=14.0.0' } - requiresBuild: true - dependencies: - '@smithy/node-config-provider': 2.0.5 - '@smithy/property-provider': 2.0.5 - '@smithy/types': 2.4.0 - '@smithy/url-parser': 2.0.5 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/eventstream-codec@2.0.12: resolution: { @@ -4508,21 +4498,6 @@ packages: dev: false optional: true - /@smithy/node-config-provider@2.0.5: - resolution: - { - integrity: sha512-LRtjV9WkhONe2lVy+ipB/l1GX60ybzBmFyeRUoLUXWKdnZ3o81jsnbKzMK8hKq8eFSWPk+Lmyx6ZzCQabGeLxg==, - } - engines: { node: '>=14.0.0' } - requiresBuild: true - dependencies: - '@smithy/property-provider': 2.0.5 - '@smithy/shared-ini-file-loader': 2.0.5 - '@smithy/types': 2.4.0 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/node-config-provider@2.1.3: resolution: { @@ -4567,19 +4542,6 @@ packages: dev: false optional: true - /@smithy/property-provider@2.0.5: - resolution: - { - integrity: sha512-cAFSUhX6aiHcmpWfrCLKvwBtgN1F6A0N8qY/8yeSi0LRLmhGqsY1/YTxFE185MCVzYbqBGXVr9TBv4RUcIV4rA==, - } - engines: { node: '>=14.0.0' } - requiresBuild: true - dependencies: - '@smithy/types': 2.4.0 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/protocol-http@3.0.8: resolution: { @@ -4620,19 +4582,6 @@ packages: dev: false optional: true - /@smithy/querystring-parser@2.0.5: - resolution: - { - integrity: sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==, - } - engines: { node: '>=14.0.0' } - requiresBuild: true - dependencies: - '@smithy/types': 2.4.0 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/service-error-classification@2.0.5: resolution: { @@ -4645,19 +4594,6 @@ packages: dev: false optional: true - /@smithy/shared-ini-file-loader@2.0.5: - resolution: - { - integrity: sha512-Mvtk6FwMtfbKRC4YuSsIqRYp9WTxsSUJVVo2djgyhcacKGMqicHDWSAmgy3sDrKv+G/G6xTZCPwm6pJARtdxVg==, - } - engines: { node: '>=14.0.0' } - requiresBuild: true - dependencies: - '@smithy/types': 2.4.0 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/shared-ini-file-loader@2.2.2: resolution: { @@ -4730,19 +4666,6 @@ packages: dev: false optional: true - /@smithy/url-parser@2.0.5: - resolution: - { - integrity: sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==, - } - requiresBuild: true - dependencies: - '@smithy/querystring-parser': 2.0.5 - '@smithy/types': 2.4.0 - tslib: 2.6.2 - dev: false - optional: true - /@smithy/util-base64@2.0.0: resolution: { @@ -5388,6 +5311,7 @@ packages: { integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==, } + dev: true /@types/node@20.8.9: resolution: @@ -5396,7 +5320,6 @@ packages: } dependencies: undici-types: 5.26.5 - dev: true /@types/normalize-package-data@2.4.1: resolution: @@ -5545,7 +5468,7 @@ packages: integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==, } dependencies: - '@types/node': 20.5.7 + '@types/node': 20.8.9 '@types/webidl-conversions': 7.0.0 dev: false @@ -6949,6 +6872,14 @@ packages: open: 8.4.2 dev: true + /big-integer@1.6.51: + resolution: + { + integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, + } + engines: { node: '>=0.6' } + dev: true + /bignumber.js@2.4.0: resolution: { @@ -6964,6 +6895,16 @@ packages: engines: { node: '>=8' } dev: true + /binary@0.3.0: + resolution: + { + integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, + } + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + dev: true + /bindings@1.5.0: resolution: { @@ -7000,6 +6941,13 @@ packages: } dev: true + /bluebird@3.4.7: + resolution: + { + integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, + } + dev: true + /bluebird@3.7.2: resolution: { @@ -7236,6 +7184,14 @@ packages: } dev: true + /buffer-indexof-polyfill@1.0.2: + resolution: + { + integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, + } + engines: { node: '>=0.10' } + dev: true + /buffer-writer@2.0.0: resolution: { @@ -7253,6 +7209,14 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /buffers@0.1.1: + resolution: + { + integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, + } + engines: { node: '>=0.2.0' } + dev: true + /builtin-modules@3.3.0: resolution: { @@ -7440,7 +7404,7 @@ packages: integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, } dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.1 dev: true @@ -7553,6 +7517,15 @@ packages: } dev: true + /chainsaw@0.1.0: + resolution: + { + integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, + } + dependencies: + traverse: 0.3.9 + dev: true + /chalk@0.5.1: resolution: { @@ -8090,6 +8063,14 @@ packages: engines: { node: '>= 6' } dev: true + /commander@5.1.0: + resolution: + { + integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==, + } + engines: { node: '>= 6' } + dev: true + /commander@7.2.0: resolution: { @@ -9941,6 +9922,15 @@ packages: pify: 4.0.1 dev: true + /duplexer2@0.1.4: + resolution: + { + integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, + } + dependencies: + readable-stream: 2.3.8 + dev: true + /duplexer3@0.1.5: resolution: { @@ -11274,6 +11264,17 @@ packages: } dev: true + /fast-folder-size@1.6.1: + resolution: + { + integrity: sha512-F3tRpfkAzb7TT2JNKaJUglyuRjRa+jelQD94s9OSqkfEeytLmupCqQiD+H2KoIXGtp4pB5m4zNmv5m2Ktcr+LA==, + } + hasBin: true + requiresBuild: true + dependencies: + unzipper: 0.10.14 + dev: true + /fast-glob@3.3.1: resolution: { @@ -11994,11 +11995,17 @@ packages: dev: true optional: true - /function-bind@1.1.1: + /fstream@1.0.12: resolution: { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, } + engines: { node: '>=0.6' } + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 dev: true /function-bind@1.1.2: @@ -12106,7 +12113,7 @@ packages: integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, } dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 @@ -12918,7 +12925,7 @@ packages: } engines: { node: '>= 0.4.0' } dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: true /hasbin@1.2.3: @@ -14941,6 +14948,13 @@ packages: } dev: true + /listenercount@1.0.1: + resolution: + { + integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, + } + dev: true + /listr-silent-renderer@1.1.1: resolution: { @@ -19443,6 +19457,14 @@ packages: } dev: true + /queue-promise@2.2.1: + resolution: + { + integrity: sha512-C3eyRwLF9m6dPV4MtqMVFX+Xmc7keZ9Ievm3jJ/wWM5t3uVbFnGsJXwpYzZ4LaIEcX9bss/mdaKzyrO6xheRuA==, + } + engines: { node: '>=8.12.0' } + dev: false + /quick-lru@4.0.1: resolution: { @@ -20189,6 +20211,16 @@ packages: } dev: true + /rimraf@2.7.1: + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rimraf@3.0.2: resolution: { @@ -20587,6 +20619,13 @@ packages: split-string: 3.1.0 dev: true + /setimmediate@1.0.5: + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } + dev: true + /setprototypeof@1.1.0: resolution: { @@ -22210,6 +22249,25 @@ packages: punycode: 2.3.0 dev: false + /traverse@0.3.9: + resolution: + { + integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, + } + dev: true + + /tree-node-cli@1.6.0: + resolution: + { + integrity: sha512-M8um5Lbl76rWU5aC8oOeEhruiCM29lFCKnwpxrwMjpRicHXJx+bb9Cak11G3zYLrMb6Glsrhnn90rHIzDJrjvg==, + } + hasBin: true + dependencies: + commander: 5.1.0 + fast-folder-size: 1.6.1 + pretty-bytes: 5.6.0 + dev: true + /trim-lines@3.0.1: resolution: { @@ -22703,7 +22761,6 @@ packages: { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, } - dev: true /undici@5.14.0: resolution: @@ -22925,6 +22982,24 @@ packages: engines: { node: '>=4' } dev: true + /unzipper@0.10.14: + resolution: + { + integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, + } + dependencies: + big-integer: 1.6.51 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: true + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: { diff --git a/scripts/checker.js b/scripts/checker.js index 351a5ee75..cb2d58950 100644 --- a/scripts/checker.js +++ b/scripts/checker.js @@ -61,6 +61,12 @@ const checkEveryProvider = async (provider = '', stable = true) => { const devParse = Object.entries(dependencies) const newDevParse = {} for (const [pkgName, pkgVersion] of devParse) { + if (!pkgVersion.includes('^')) { + newDevParse[pkgName] = pkgVersion + continue + } + console.log(`[VERSION]:${pkgVersion}`) + if (!stable) newDevParse[pkgName] = await checkPkg(pkgName) if (stable) newDevParse[pkgName] = await checkPkgStable(pkgName, pkgVersion) diff --git a/starters/apps/base-baileys-json/package.json b/starters/apps/base-baileys-json/package.json index 1e5bc2321..074773848 100644 --- a/starters/apps/base-baileys-json/package.json +++ b/starters/apps/base-baileys-json/package.json @@ -15,8 +15,9 @@ "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35", - "@whiskeysockets/baileys": "^6.4.0", - "wa-sticker-formatter": "4.3.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "cache-manager": "5.2.4" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-baileys-memory/package.json b/starters/apps/base-baileys-memory/package.json index 3457bd951..d6294069d 100644 --- a/starters/apps/base-baileys-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint .", "pre-copy": "cd .. && npm run copy.lib base-baileys-memory", "start": "node app.js" }, @@ -14,8 +15,9 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "@whiskeysockets/baileys": "^6.4.0", - "wa-sticker-formatter": "4.3.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "cache-manager": "5.2.4" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index 8faba3f2d..f6317a8dc 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-baileys-mongo", "start": "node app.js" }, @@ -16,8 +17,9 @@ "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35", "mongodb": "^4.12.1", - "@whiskeysockets/baileys": "^6.4.0", - "wa-sticker-formatter": "4.3.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "cache-manager": "5.2.4" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 949b8b65e..60d82f9c1 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-baileys-mysql", "start": "node app.js" }, @@ -15,8 +16,9 @@ "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", "mysql2": "^2.3.3", - "@whiskeysockets/baileys": "^6.4.0", - "wa-sticker-formatter": "4.3.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "cache-manager": "5.2.4" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-baileys-postgres/package.json b/starters/apps/base-baileys-postgres/package.json index 813e2f655..6feb6b016 100644 --- a/starters/apps/base-baileys-postgres/package.json +++ b/starters/apps/base-baileys-postgres/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-baileys-postgres", "start": "node app.js" }, @@ -14,9 +15,10 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "@whiskeysockets/baileys": "^6.4.0", - "wa-sticker-formatter": "4.3.2", - "pg": "^8.11.2" + "@whiskeysockets/baileys": "6.5.0", + "wa-sticker-formatter": "4.4.4", + "pg": "^8.11.2", + "cache-manager": "5.2.4" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-meta-json/package.json b/starters/apps/base-meta-json/package.json index 1e7dc62f7..718a87920 100644 --- a/starters/apps/base-meta-json/package.json +++ b/starters/apps/base-meta-json/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-meta-json", "start": "node app.js" }, @@ -15,7 +16,9 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "axios": "^1.2.1" + "axios": "^1.2.1", + "form-data": "4.0.0", + "queue-promise": "2.2.1" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-meta-memory/package.json b/starters/apps/base-meta-memory/package.json index 666949226..4e558cb17 100644 --- a/starters/apps/base-meta-memory/package.json +++ b/starters/apps/base-meta-memory/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-meta-memory", "start": "node app.js" }, @@ -15,7 +16,9 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", - "axios": "^1.2.1" + "axios": "^1.2.1", + "form-data": "4.0.0", + "queue-promise": "2.2.1" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-meta-mongo/package.json b/starters/apps/base-meta-mongo/package.json index e44b24de0..44d215b05 100644 --- a/starters/apps/base-meta-mongo/package.json +++ b/starters/apps/base-meta-mongo/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-meta-mongo", "start": "node app.js" }, @@ -16,7 +17,9 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "axios": "^1.2.1", - "mongodb": "^4.12.1" + "mongodb": "^4.12.1", + "form-data": "4.0.0", + "queue-promise": "2.2.1" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-meta-mysql/package.json b/starters/apps/base-meta-mysql/package.json index 1b072d92f..43cc01e5e 100644 --- a/starters/apps/base-meta-mysql/package.json +++ b/starters/apps/base-meta-mysql/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-meta-mysql", "start": "node app.js" }, @@ -16,7 +17,9 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "axios": "^1.2.1", - "mysql2": "^2.3.3" + "mysql2": "^2.3.3", + "form-data": "4.0.0", + "queue-promise": "2.2.1" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-meta-postgres/package.json b/starters/apps/base-meta-postgres/package.json index 2c6920276..3e654dc85 100644 --- a/starters/apps/base-meta-postgres/package.json +++ b/starters/apps/base-meta-postgres/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-meta-postgres", "start": "node app.js" }, @@ -16,7 +17,9 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "axios": "^1.2.1", - "pg": "^8.11.2" + "pg": "^8.11.2", + "form-data": "4.0.0", + "queue-promise": "2.2.1" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-twilio-json/package.json b/starters/apps/base-twilio-json/package.json index 18f0c3165..1311d006b 100644 --- a/starters/apps/base-twilio-json/package.json +++ b/starters/apps/base-twilio-json/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-twilio-json", "start": "node app.js" }, @@ -11,7 +12,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.1", + "twilio": "4.19.0", "@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 8c4bdda4c..8d7fec6f7 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-twilio-memory", "start": "node app.js" }, @@ -11,7 +12,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.1", + "twilio": "4.19.0", "@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 6103d7a15..886639b84 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-twilio-mongo", "start": "node app.js" }, @@ -11,7 +12,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.1", + "twilio": "4.19.0", "@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 70c18fe12..d8b89f8c0 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-twilio-mysql", "start": "node app.js" }, @@ -11,7 +12,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.1", + "twilio": "4.19.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-postgres/package.json b/starters/apps/base-twilio-postgres/package.json index 69e457b21..3aeda381b 100644 --- a/starters/apps/base-twilio-postgres/package.json +++ b/starters/apps/base-twilio-postgres/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-twilio-postgres", "start": "node app.js" }, @@ -11,7 +12,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.1", + "twilio": "4.19.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index b25633c77..d926f2d40 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-venom-json", "start": "node app.js" }, "keywords": [], "dependencies": { - "venom-bot": "4.3.7", + "venom-bot": "5.0.21", "mime-types": "2.1.35", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index e7d8d0d71..b53deffe8 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-venom-memory", "start": "node app.js" }, "keywords": [], "dependencies": { - "venom-bot": "4.3.7", + "venom-bot": "5.0.21", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index f765476f6..6b950bb4d 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-venom-mongo", "start": "node app.js" }, "keywords": [], "dependencies": { - "venom-bot": "4.3.7", + "venom-bot": "5.0.21", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index 68c8bfec8..9e7ff8d0c 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-venom-mysql", "start": "node app.js" }, "keywords": [], "dependencies": { - "venom-bot": "4.3.7", + "venom-bot": "5.0.21", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-venom-postgres/package.json b/starters/apps/base-venom-postgres/package.json index 4a9d57a4f..f8485ef5b 100644 --- a/starters/apps/base-venom-postgres/package.json +++ b/starters/apps/base-venom-postgres/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-venom-postgres", "start": "node app.js" }, "keywords": [], "dependencies": { - "venom-bot": "4.3.7", + "venom-bot": "5.0.21", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wppconnect-json/package.json b/starters/apps/base-wppconnect-json/package.json index a963e1a21..cdc8c95e0 100644 --- a/starters/apps/base-wppconnect-json/package.json +++ b/starters/apps/base-wppconnect-json/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wppconnect-json", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/portal": "latest", "@bot-whatsapp/provider": "latest", - "@wppconnect-team/wppconnect": "^1.27.3", + "@wppconnect-team/wppconnect": "1.28.3", "mime-types": "2.1.35" }, "devDependencies": { diff --git a/starters/apps/base-wppconnect-memory/package.json b/starters/apps/base-wppconnect-memory/package.json index 6f6775e0a..28ecbd5a3 100644 --- a/starters/apps/base-wppconnect-memory/package.json +++ b/starters/apps/base-wppconnect-memory/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wppconnect-memory", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/portal": "latest", "@bot-whatsapp/provider": "latest", - "@wppconnect-team/wppconnect": "^1.27.3", + "@wppconnect-team/wppconnect": "1.28.3", "mime-types": "2.1.35" }, "devDependencies": { diff --git a/starters/apps/base-wppconnect-mongo/package.json b/starters/apps/base-wppconnect-mongo/package.json index f75b5510a..73a18fc17 100644 --- a/starters/apps/base-wppconnect-mongo/package.json +++ b/starters/apps/base-wppconnect-mongo/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wppconnect-mongo", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/portal": "latest", "@bot-whatsapp/provider": "latest", - "@wppconnect-team/wppconnect": "^1.27.3", + "@wppconnect-team/wppconnect": "1.28.3", "mime-types": "2.1.35", "mongodb": "4.12.1" }, diff --git a/starters/apps/base-wppconnect-mysql/package.json b/starters/apps/base-wppconnect-mysql/package.json index 7182dada2..02602c22c 100644 --- a/starters/apps/base-wppconnect-mysql/package.json +++ b/starters/apps/base-wppconnect-mysql/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wppconnect-mysql", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/portal": "latest", "@bot-whatsapp/provider": "latest", - "@wppconnect-team/wppconnect": "^1.27.3", + "@wppconnect-team/wppconnect": "1.28.3", "mime-types": "2.1.35", "mysql2": "2.3.3" }, diff --git a/starters/apps/base-wppconnect-postgres/package.json b/starters/apps/base-wppconnect-postgres/package.json index 70d3e10cf..f304193d6 100644 --- a/starters/apps/base-wppconnect-postgres/package.json +++ b/starters/apps/base-wppconnect-postgres/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wppconnect-postgres", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/portal": "latest", "@bot-whatsapp/provider": "latest", - "@wppconnect-team/wppconnect": "1.22.0", + "@wppconnect-team/wppconnect": "1.28.3", "mime-types": "2.1.35", "pg": "^8.11.2" }, diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index ec30aaffa..7ed3e897d 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wweb-json", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "^1.22.1" + "whatsapp-web.js": "1.23.0" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index bf1d817a5..f9361abe1 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wweb-memory", "start": "node app.js" }, @@ -14,7 +15,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "^1.22.1" + "whatsapp-web.js": "1.23.0" }, "devDependencies": { "eslint-plugin-bot-whatsapp": "latest", diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index 256660d88..677667623 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wweb-mongo", "start": "node app.js" }, "keywords": [], "dependencies": { - "whatsapp-web.js": "^1.22.1", + "whatsapp-web.js": "1.23.0", "@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 4b1c32f18..8a4bf9623 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wweb-mysql", "start": "node app.js" }, "keywords": [], "dependencies": { - "whatsapp-web.js": "^1.22.1", + "whatsapp-web.js": "1.23.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wweb-postgres/package.json b/starters/apps/base-wweb-postgres/package.json index 89bde4ad4..8996dc864 100644 --- a/starters/apps/base-wweb-postgres/package.json +++ b/starters/apps/base-wweb-postgres/package.json @@ -4,12 +4,13 @@ "description": "", "main": "app.js", "scripts": { + "prestart": "npx eslint . --no-ignore", "pre-copy": "cd .. && npm run copy.lib base-wweb-postgres", "start": "node app.js" }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.19.4", + "whatsapp-web.js": "1.23.0", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest",