extends conditional class

This commit is contained in:
Leifer Mendez
2022-11-09 12:28:20 +01:00
parent 24484015b3
commit 39e2356feb
15 changed files with 137 additions and 75 deletions

View File

@@ -1,77 +1,43 @@
const { test } = require('uvu') const { test } = require('uvu')
const assert = require('uvu/assert') const assert = require('uvu/assert')
/**
* require('@bot-whatsapp')
*/
const { inout, provider, bot } = require('../lib/index.cjs')
/** // const { inout, provider, database, botcore } = require('../lib/index.cjs')
* MockDB const { inout, provider, database, botcore } = require('../packages/index')
*/
class DatabaseClass {
constructor() {}
saveLog = (ctx) => { const adapterDB = database.create({
return ctx engine: 'json', // 'mysql / pg / mongo / json (json-default)',
} credentials: {},
} })
const adapterDB = new DatabaseClass() const adapterProvider = provider.create({
vendor: 'web', //'twilio / web / meta',
credentials: {},
})
const adapterFlow = new inout.instance( const makeFlow = () => {
(() => {
const flowA = inout const flowA = inout
.addKeyword('hola') .addKeyword('hola')
.addAnswer('Bienvenido a tu tienda 🥲') .addAnswer('Bienvenido a tu tienda 🥲')
.addAnswer('escribe *catalogo* o *ofertas*') .addAnswer('escribe *catalogo* o *ofertas*')
.toJson() .toJson()
const flowB = inout return [...flowA]
.addKeyword(['catalogo', 'ofertas']) }
.addAnswer('Este es nuestro CATALOGO mas reciente!', {
buttons: [{ body: 'Xiaomi' }, { body: 'Samsung' }],
})
.toJson()
const flowC = inout const adapterFlow = inout.create(makeFlow())
.addKeyword('Xiaomi')
.addAnswer('Estos son nuestro productos XIAOMI ....', {
media: 'https://....',
})
.addAnswer('Si quieres mas info escrbie *info*')
.toJson()
const flowD = inout test(`[BotClass]: recibe los mensajes entrantes del provider`, () => {
.addKeyword('chao!')
.addAnswer('bye!')
.addAnswer('Recuerda que tengo esta promo', {
media: 'https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif',
})
.toJson()
const flowE = inout
.addKeyword('Modelo C', { sensitive: false })
.addAnswer('100USD', { media: 'http//:...' })
.toJson()
return [...flowA, ...flowB, ...flowC, ...flowC, ...flowD, ...flowE]
})()
)
const adapterProvider = new provider.instance()
test(`[Flow Basico]: BotClass`, () => {
let messages = [] let messages = []
const flows = adapterFlow const bot = botcore.create({
const databases = adapterDB flow: adapterFlow,
const providers = adapterProvider database: adapterDB,
provider: adapterProvider,
})
const botBasic = new bot.instance(flows, databases, providers) bot.on('message', (ctx) => messages.push(ctx.body))
bot.emit('message', { body: 'hola' })
botBasic.on('message', (ctx) => messages.push(ctx.body)) bot.emit('message', { body: 'otro' })
botBasic.emit('message', { body: 'hola' })
botBasic.emit('message', { body: 'otro' })
assert.is(messages.join(','), ['hola', 'otro'].join(',')) assert.is(messages.join(','), ['hola', 'otro'].join(','))
}) })

View File

@@ -8,6 +8,7 @@
"io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js", "io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js",
"core:rollup": "rollup ./packages/core/index.js --config ./packages/core/rollup-cli.config.js", "core:rollup": "rollup ./packages/core/index.js --config ./packages/core/rollup-cli.config.js",
"provider:rollup": "rollup ./packages/provider/index.js --config ./packages/provider/rollup-cli.config.js", "provider:rollup": "rollup ./packages/provider/index.js --config ./packages/provider/rollup-cli.config.js",
"database:rollup": "rollup ./packages/database/index.js --config ./packages/database/rollup-cli.config.js",
"all:rollup": "rollup ./packages/index.js --config ./packages/rollup-cli.config.js", "all:rollup": "rollup ./packages/index.js --config ./packages/rollup-cli.config.js",
"format:check": "prettier --check ./packages", "format:check": "prettier --check ./packages",
"format:write": "prettier --write ./packages", "format:write": "prettier --write ./packages",

View File

@@ -1,19 +1,18 @@
const { EventEmitter } = require('node:events')
/** /**
* Clase principal del BOT * Clase principal del BOT
*/ */
class BotClass extends EventEmitter { class BotClass {
flowClass flowClass
databaseClass databaseClass
providerClass providerClass
constructor(_flow, _database, _provider) { constructor(_flow, _database, _provider) {
super()
this.flowClass = _flow this.flowClass = _flow
this.databaseClass = _database this.databaseClass = _database
this.providerClass = _provider this.providerClass = _provider
this.on('message', (ctxMessage) => this.handleOnMessage(ctxMessage)) this.providerClass.on('message', (ctxMessage) =>
this.handleOnMessage(ctxMessage)
)
} }
handleOnMessage = (ctxMessage) => { handleOnMessage = (ctxMessage) => {

View File

@@ -1,2 +1,15 @@
const BotClass = require('./classes/bot.class') const BotClass = require('./classes/bot.class')
module.exports = { instance: BotClass }
/**
* Crear instancia de clase
* @param {*} args
* @returns
*/
const create = ({ flow, database, provider }) => {
return Object.setPrototypeOf(
new BotClass(flow, database, provider),
provider
)
}
module.exports = { create }

View File

@@ -0,0 +1,9 @@
class DatabaseClass {
constructor() {}
saveLog = (ctx) => {
return ctx
}
}
module.exports = DatabaseClass

View File

@@ -0,0 +1,12 @@
const DatabaseClass = require('./classes/database.class')
/**
* Crear instancia de clase
* @param {*} args
* @returns
*/
const create = (args) => {
return new DatabaseClass(args)
}
module.exports = { create }

View File

@@ -0,0 +1,11 @@
{
"name": "@bot-whatsapp/database",
"version": "0.0.1",
"description": "Esto es el conector a mysql, pg, mongo",
"main": "index.js",
"private": true,
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {}
}

View File

@@ -0,0 +1,10 @@
const commonjs = require('@rollup/plugin-commonjs')
module.exports = {
input: 'index.js',
output: {
file: 'lib/database/bundle.database.cjs',
format: 'cjs',
},
plugins: [commonjs()],
}

View File

@@ -1,5 +1,6 @@
const inout = require('./io') const inout = require('./io')
const provider = require('./provider') const provider = require('./provider')
const bot = require('./core') const botcore = require('./core')
const database = require('./database')
module.exports = { inout, provider, bot } module.exports = { inout, provider, botcore, database }

View File

@@ -1,3 +1,13 @@
const { addKeyword, addAnswer } = require('./methods') const { addKeyword, addAnswer } = require('./methods')
const FlowClass = require('./classes/flow.class') const FlowClass = require('./classes/flow.class')
module.exports = { addKeyword, addAnswer, instance: FlowClass }
/**
* Crear instancia de clase
* @param {*} args
* @returns
*/
const create = (args) => {
return new FlowClass(args)
}
module.exports = { addKeyword, addAnswer, create }

View File

@@ -0,0 +1,5 @@
const { EventEmitter } = require('node:events')
class MockProvider extends EventEmitter {}
module.exports = MockProvider

View File

@@ -0,0 +1 @@
class TwilioProvider {}

View File

@@ -1,4 +1,8 @@
class ProviderClass { class ProviderClass {
/**
* events: message | auth | auth_error | ...
*
*/
constructor() {} constructor() {}
sendMessage = (message) => { sendMessage = (message) => {

View File

@@ -1,2 +1,22 @@
const ProviderClass = require('./classes/provider.class') const ProviderClass = require('./classes/provider.class')
module.exports = { instance: ProviderClass } const TwilioProvider = require('./adapters/twilio')
const MockProvider = require('./adapters/mock')
const prepareVendor = ({ vendor, credentials }) => {
if (vendor === 'twilio') return new TwilioProvider(credentials)
// if (vendor === 'meta') return new TwilioProvider(credentials)
// if (vendor === 'wev') return new TwilioProvider(credentials)
return new MockProvider()
}
/**
* Crear instancia de clase
* @param {*} args
* @returns
*/
const create = (args) => {
const vendor = prepareVendor(args)
return Object.setPrototypeOf(new ProviderClass(), vendor)
}
module.exports = { create }

View File

@@ -1,7 +1,7 @@
{ {
"name": "@bot-whatsapp/provider", "name": "@bot-whatsapp/provider",
"version": "0.0.1", "version": "0.0.1",
"description": "", "description": "Esto es el conector a Twilio, Meta, etc...",
"main": "index.js", "main": "index.js",
"private": true, "private": true,
"keywords": [], "keywords": [],