diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa3a7b0..3db9343 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: Test / Coverage on: push: - branches: [feature/monorepo] + branches: [dev] pull_request: branches: [main] diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml new file mode 100644 index 0000000..b62b053 --- /dev/null +++ b/.github/workflows/contributors.yml @@ -0,0 +1,20 @@ +name: Add contributors +on: + schedule: + - cron: '20 20 * * *' + push: + branches: [dev] + pull_request: + branches: [main, dev] + +jobs: + contrib-readme-job: + runs-on: ubuntu-latest + name: A job to automate contrib in readme + steps: + - name: Contribute List + uses: akhilmhdh/contributors-readme-action@v2.3.6 + with: + image_size: 50 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 60be892..d5e4ade 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ config.json coverage/ *.lcov log +log/* +*.log lib tmp/ .yarn/* diff --git a/.yarn/releases/yarn-3.3.0.cjs b/.yarn/releases/yarn-3.3.0.cjs index 47f24f6..aa661fe 100644 --- a/.yarn/releases/yarn-3.3.0.cjs +++ b/.yarn/releases/yarn-3.3.0.cjs @@ -804,4 +804,4 @@ ${a.map(l=>` LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ +*/ \ No newline at end of file diff --git a/GLOSSARY.md b/GLOSSARY.md new file mode 100644 index 0000000..ec85e10 --- /dev/null +++ b/GLOSSARY.md @@ -0,0 +1,2 @@ +CTX: Es el objeto que representa un mensaje, con opciones, id, ref +messageInComming: Objeto entrante del provider {body, from,...} \ No newline at end of file diff --git a/README.md b/README.md index c3a9dac..1285f5f 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,86 @@ Video como hacer PR: https://youtu.be/Lxt8Acob6aU **Comunidad** + + + + + + + + + + + + + + +
+ + vicente1992 +
+ Manuel Vicente Ortiz +
+
+ + leifermendez +
+ Leifer Mendez +
+
+ + leifermendezfroged +
+ Leifer Mendez +
+
+ + Gonzalito87 +
+ Null +
+
+ + aurik3 +
+ Null +
+
+ + jzvi12 +
+ Null +
+
+ + tonyvazgar +
+ Luis Antonio Vázquez García +
+
+ + ulisesvina +
+ Ulises Viña +
+
+ + rrruuuyyy +
+ Rodrigo Mendoza Cabrera +
+
+ + yond1994 +
+ Yonathan Suarez +
+
+ > Forma parte de este proyecto. - [Discord](https://link.codigoencasa.com/DISCORD) - [Twitter](https://twitter.com/leifermendez) - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) -- [Telegram](https://t.me/leifermendez) - - - \ No newline at end of file +- [Telegram](https://t.me/leifermendez) \ No newline at end of file diff --git a/TODO.md b/TODO.md index 4a877fd..553235c 100644 --- a/TODO.md +++ b/TODO.md @@ -2,31 +2,50 @@ - [X] __(doc)__ Video de como colaborar PR - [ ] __(doc)__ Video implementación de test y cobertura - [ ] __(doc)__ Video explicacion de github action +- [ ] Crear packages list externas ### @bot-whatsapp/bot -- [ ] agregar export package +- [X] agregar export package - [X] Posibilidad de en el capture meter todo un nuevo CTX de FLOW .addAnswer('Marca la opcion',{capture:true, join:CTX}) - [X] .addKeyword('1') no funciona con 1 caracter - [X] sensitivy viene activado por defecto -- [ ] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback +- [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback +- [X] Cuando Envian Sticket devuelve mensaje raro +- [x] addAnswer agregar delay - [ ] colocar mensaje esperando conectando whatsapp (provider) -- [ ] Cuando Envian Sticket devuelve mensaje raro - [ ] createDatabase validar implementacion de funciones +- [ ] limitar caracteres de mensajes 4000 +- [X] cuando envias numeros (5 o 1) se dispara el flujo ### @bot-whatsapp/database - [X] agregar export package - [X] __(doc):__ Video para explicar como implementar nuevos database - [X] Mongo adapter -- [ ] MySQL adapter +- [X] MySQL adapter - [ ] JsonFile adapter ### @bot-whatsapp/provider - [X] agregar export package - [ ] __(doc):__ Video para explicar como implementar nuevos providers -- [ ] WhatsappWeb provider enviar imagenes -- [ ] WhatsappWeb provider enviar audio +- [X] WhatsappWeb provider enviar imagenes +- [X] WhatsappWeb provider enviar audio +- [X] WhatsappWeb botones (Tiene truco) github:leifermendez/whatsapp-web.js - [ ] Twilio adapter - [ ] Meta adapter ### @bot-whatsapp/cli -- [ ] Hacer comando para crear `example-app` \ No newline at end of file +- [X] Hacer comando para crear `example-app` + + +### @bot-whatsapp/create-bot +- [ ] + +### Starters +- [X] Base +- [X] Basico +- [ ] Enviando Imagen +- [ ] Enviando Botones +- [ ] Mezclando flujos hijos + +### Extra +- [X] Crear CI mantener fork update https://stackoverflow.com/questions/23793062/can-forks-be-synced-automatically-in-github diff --git a/core.class.log b/core.class.log new file mode 100644 index 0000000..5961e96 --- /dev/null +++ b/core.class.log @@ -0,0 +1,3 @@ +[handleMsg]: { from: 'XXXXXX', body: 'hola', hasMedia: false } +[handleMsg]: { from: 'XXXXXX', body: 'hola', hasMedia: false } +[handleMsg]: { from: 'XXXXXX', body: 'hola', hasMedia: false } diff --git a/package.json b/package.json index 062be61..9515320 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "commit": "git-cz", "cli:rollup": "rollup --config ./packages/cli/rollup-cli.config.js ", + "create-bot:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js ", "bot:rollup": "rollup --config ./packages/bot/rollup-bot.config.js", "provider:rollup": "rollup --config ./packages/provider/rollup-provider.config.js ", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js", @@ -16,12 +17,12 @@ "lint:check": "eslint ./packages", "lint:fix": "eslint --fix ./packages", "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup", - "link.dist": "cd packages/bot && npm link && cd ../provider && npm link && cd ../cli && npm link && cd ../database && npm link && cd ../provider && npm link", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", "test": "npm run test.coverage", "cli": "node ./packages/cli/bin/cli.js", + "create": "node ./packages/create-bot-whatsapp/bin/create.js", "dev:debug": "node --inspect ./example-app/app.js", "dev": "node ./example-app/app.js", "prepare": "npx husky install", @@ -30,6 +31,7 @@ "release": "standard-version" }, "workspaces": [ + "packages/create-bot-whatsapp", "packages/bot", "packages/cli", "packages/database", diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 106b9c9..f7726c8 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -1,6 +1,13 @@ const { toCtx } = require('../io/methods') const { printer } = require('../utils/interactive') +const { delay } = require('../utils/delay') +const Queue = require('../utils/queue') +const { Console } = require('console') +const { createWriteStream } = require('fs') +const logger = new Console({ + stdout: createWriteStream(`${process.cwd()}/core.class.log`), +}) /** * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos * [ ] Guardar historial en db @@ -21,7 +28,14 @@ class CoreClass { } } + /** + * Manejador de eventos + */ listenerBusEvents = () => [ + { + event: 'preinit', + func: () => printer('Iniciando provider espere...'), + }, { event: 'require_action', func: ({ instructions, title = '⚡⚡ ACCION REQUERIDA ⚡⚡' }) => @@ -44,16 +58,19 @@ class CoreClass { ] /** - * @private - * @param {*} ctxMessage + * + * @param {*} messageInComming + * @returns */ handleMsg = async (messageInComming) => { + logger.log(`[handleMsg]: `, messageInComming) const { body, from } = messageInComming let msgToSend = [] + let fallBackFlag = false + + if (!body.length) return - //Consultamos mensaje previo en DB const prevMsg = await this.databaseClass.getPrevByNumber(from) - //Consultamos for refSerializada en el flow actual const refToContinue = this.flowClass.findBySerialize( prevMsg?.refSerialize ) @@ -67,14 +84,24 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } - //Si se tiene un callback se ejecuta - if (refToContinue && prevMsg?.options?.callback) { - const indexFlow = this.flowClass.findIndexByRef(refToContinue?.ref) - this.flowClass.allCallbacks[indexFlow].callback(messageInComming) + // 📄 [options: fallback]: esta funcion se encarga de repetir el ultimo mensaje + const fallBack = () => { + fallBackFlag = true + msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] + this.sendFlow(msgToSend, from) + return refToContinue } - //Si se tiene anidaciones de flows, si tienes anidados obligatoriamente capture:true - if (prevMsg?.options?.nested?.length) { + // 📄 [options: callback]: Si se tiene un callback se ejecuta + if (!fallBackFlag && refToContinue && prevMsg?.options?.callback) { + const indexFlow = this.flowClass.findIndexByRef(refToContinue?.ref) + this.flowClass.allCallbacks[indexFlow].callback(messageInComming, { + fallBack, + }) + } + + // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa + if (!fallBackFlag && prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested const flowStandalone = nestedRef.map((f) => ({ ...nestedRef.find((r) => r.refSerialize === f.refSerialize), @@ -85,28 +112,44 @@ class CoreClass { return } - //Consultamos si se espera respuesta por parte de cliente "Ejemplo: Dime tu nombre" - if (!prevMsg?.options?.nested?.length && prevMsg?.options?.capture) { - msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] - } else { - msgToSend = this.flowClass.find(body) || [] + // 📄🤘(tiene return) [options: capture (boolean)]: Si se tiene option boolean + if (!fallBackFlag && !prevMsg?.options?.nested?.length) { + const typeCapture = typeof prevMsg?.options?.capture + const valueCapture = prevMsg?.options?.capture + + if (['string', 'boolean'].includes(typeCapture) && valueCapture) { + msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] + this.sendFlow(msgToSend, from) + return + } } + msgToSend = this.flowClass.find(body) || [] this.sendFlow(msgToSend, from) } + /** + * Enviar mensaje con contexto atraves del proveedor de whatsapp + * @param {*} numberOrId + * @param {*} ctxMessage ver más en GLOSSARY.md + * @returns + */ sendProviderAndSave = (numberOrId, ctxMessage) => { const { answer } = ctxMessage return Promise.all([ - this.providerClass.sendMessage(numberOrId, answer), + this.providerClass.sendMessage(numberOrId, answer, ctxMessage), this.databaseClass.save({ ...ctxMessage, from: numberOrId }), ]) } - sendFlow = (messageToSend, numberOrId) => { + sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { - queue.push(this.sendProviderAndSave(numberOrId, ctxMessage)) + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + Queue.enqueue(() => + this.sendProviderAndSave(numberOrId, ctxMessage) + ) } return Promise.all(queue) } diff --git a/packages/bot/index.js b/packages/bot/index.js index 5972d61..eb9df24 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -22,11 +22,13 @@ const createFlow = (args) => { /** * Crear instancia de clase Provider + * Depdendiendo del Provider puedes pasar argumentos + * Ver Documentacion * @param {*} args * @returns */ -const createProvider = (providerClass = class {}) => { - const providerInstance = new providerClass() +const createProvider = (providerClass = class {}, args = null) => { + const providerInstance = new providerClass(args) if (!providerClass.prototype instanceof ProviderClass) throw new Error('El provider no implementa ProviderClass') return providerInstance diff --git a/packages/bot/io/flow.class.js b/packages/bot/io/flow.class.js index 5ed8eb4..2c18268 100644 --- a/packages/bot/io/flow.class.js +++ b/packages/bot/io/flow.class.js @@ -21,29 +21,25 @@ class FlowClass { } find = (keyOrWord, symbol = false, overFlow = null) => { + keyOrWord = `${keyOrWord}` let capture = false let messages = [] let refSymbol = null overFlow = overFlow ?? this.flowSerialize - const mapSensitiveString = (str, flag = false) => { - if (!flag && Array.isArray(str)) { - return str.map((c) => c.toLowerCase()) + /** Retornar expresion regular para buscar coincidencia */ + const mapSensitive = (str, flag = false) => { + const regexSensitive = flag ? 'g' : 'i' + if (Array.isArray(str)) { + return new RegExp(str.join('|'), regexSensitive) } - - if (!flag && typeof str === 'string') { - return str.toLowerCase() - } - - return str + return new RegExp(str, regexSensitive) } const findIn = (keyOrWord, symbol = false, flow = overFlow) => { const sensitive = refSymbol?.options?.sensitive || false capture = refSymbol?.options?.capture || false - keyOrWord = mapSensitiveString(keyOrWord, sensitive) - if (capture) return messages if (symbol) { @@ -51,9 +47,9 @@ class FlowClass { if (refSymbol?.answer) messages.push(refSymbol) if (refSymbol?.ref) findIn(refSymbol.ref, true) } else { - refSymbol = flow.find((c) => - mapSensitiveString(c.keyword, sensitive).includes(keyOrWord) - ) + refSymbol = flow.find((c) => { + return mapSensitive(c.keyword, sensitive).test(keyOrWord) + }) if (refSymbol?.ref) findIn(refSymbol.ref, true) return messages } diff --git a/packages/bot/io/methods/addAnswer.js b/packages/bot/io/methods/addAnswer.js index 6f9e862..d5b53e6 100644 --- a/packages/bot/io/methods/addAnswer.js +++ b/packages/bot/io/methods/addAnswer.js @@ -1,10 +1,9 @@ const { generateRef } = require('../../utils/hash') const { toJson } = require('./toJson') -const { toSerialize } = require('./toSerialize') /** * * @param answer string - * @param options {media:string, buttons:[], capture:true default false} + * @param options {media:string, buttons:[{"body":"😎 Cursos"}], delay:ms, capture:true default false} * @returns */ const addAnswer = @@ -25,6 +24,7 @@ const addAnswer = : false, child: typeof options?.child === 'string' ? `${options?.child}` : null, + delay: typeof options?.delay === 'number' ? options?.delay : 0, }) const getNested = () => ({ @@ -79,6 +79,7 @@ const addAnswer = } } + /// Retornar contexto no colocar nada más abajo de esto const ctx = ctxAnswer() return { diff --git a/packages/bot/provider/provider.class.js b/packages/bot/provider/provider.class.js index 212f042..5fc4bb8 100644 --- a/packages/bot/provider/provider.class.js +++ b/packages/bot/provider/provider.class.js @@ -19,7 +19,7 @@ class ProviderClass extends EventEmitter { * */ - sendMessage = async (userId, message) => { + sendMessage = async (userId, message, sendMessage) => { if (NODE_ENV !== 'production') console.log('[sendMessage]', { userId, message }) return message diff --git a/packages/bot/utils/delay.js b/packages/bot/utils/delay.js new file mode 100644 index 0000000..021fafe --- /dev/null +++ b/packages/bot/utils/delay.js @@ -0,0 +1,4 @@ +const delay = (miliseconds) => + new Promise((res) => setTimeout(res, miliseconds)) + +module.exports = { delay } diff --git a/packages/bot/utils/queue.js b/packages/bot/utils/queue.js new file mode 100644 index 0000000..1f610e9 --- /dev/null +++ b/packages/bot/utils/queue.js @@ -0,0 +1,46 @@ +class Queue { + static queue = [] + static pendingPromise = false + + static enqueue(promise) { + return new Promise((resolve, reject) => { + this.queue.push({ + promise, + resolve, + reject, + }) + this.dequeue() + }) + } + + static dequeue() { + if (this.workingOnPromise) { + return false + } + const item = this.queue.shift() + if (!item) { + return false + } + try { + this.workingOnPromise = true + item.promise() + .then((value) => { + this.workingOnPromise = false + item.resolve(value) + this.dequeue() + }) + .catch((err) => { + this.workingOnPromise = false + item.reject(err) + this.dequeue() + }) + } catch (err) { + this.workingOnPromise = false + item.reject(err) + this.dequeue() + } + return true + } +} + +module.exports = Queue diff --git a/packages/create-bot-whatsapp/bin/create.js b/packages/create-bot-whatsapp/bin/create.js new file mode 100644 index 0000000..546eca2 --- /dev/null +++ b/packages/create-bot-whatsapp/bin/create.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +const main = require('../lib/bin/bundle.create.cjs') +main() diff --git a/packages/create-bot-whatsapp/index.js b/packages/create-bot-whatsapp/index.js new file mode 100644 index 0000000..7df7d03 --- /dev/null +++ b/packages/create-bot-whatsapp/index.js @@ -0,0 +1,12 @@ +/** + * Main function + */ +const main = () => { + console.clear() + console.log(``) + console.log(`[PostInstall]: Este es el main function.`) + console.log(`[PostInstall]: 👌 Aqui podrias instalar cosas`) + console.log(``) +} + +module.exports = main diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json new file mode 100644 index 0000000..65926f8 --- /dev/null +++ b/packages/create-bot-whatsapp/package.json @@ -0,0 +1,13 @@ +{ + "name": "create-bot-whatsapp", + "version": "0.0.1", + "description": "", + "main": "./lib/bin/bundle.create.cjs", + "private": true, + "dependencies": { + "@bot-whatsapp/cli": "*" + }, + "bin": { + "bot": "./lib/bin/bundle.create.cjs" + } +} diff --git a/packages/create-bot-whatsapp/rollup-create.config.js b/packages/create-bot-whatsapp/rollup-create.config.js new file mode 100644 index 0000000..54f93f1 --- /dev/null +++ b/packages/create-bot-whatsapp/rollup-create.config.js @@ -0,0 +1,16 @@ +const banner = require('../../config/banner.rollup.json') +const commonjs = require('@rollup/plugin-commonjs') +const { nodeResolve } = require('@rollup/plugin-node-resolve') +const { join } = require('path') + +const PATH = join(__dirname, 'lib', 'bin', 'bundle.create.cjs') + +module.exports = { + input: join(__dirname, 'index.js'), + output: { + banner: banner['banner.output'].join(''), + file: PATH, + format: 'cjs', + }, + plugins: [commonjs(), nodeResolve()], +} diff --git a/packages/database/package.json b/packages/database/package.json index 9f3f11d..801fb96 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -10,11 +10,13 @@ "dependencies": { "dotenv": "^16.0.3", "mongodb": "^4.11.0", - "stormdb": "^0.6.0" + "stormdb": "^0.6.0", + "mysql2": "^2.3.3" }, "exports": { "./mock": "./lib/mock/index.cjs", "./mongo": "./lib/mongo/index.cjs", - "./json-file": "./lib/json-file/index.cjs" + "./json-file": "./lib/json-file/index.cjs", + "./mysql": "./lib/mysql/index.cjs" } } diff --git a/packages/database/rollup-database.config.js b/packages/database/rollup-database.config.js index fa64259..1eecdba 100644 --- a/packages/database/rollup-database.config.js +++ b/packages/database/rollup-database.config.js @@ -22,12 +22,20 @@ module.exports = [ plugins: [commonjs()], }, { - input: join(__dirname, 'src', 'json-file', 'index.js'), + input: join(__dirname, 'src', 'mysql', 'index.js'), output: { banner: banner['banner.output'].join(''), - file: join(__dirname, 'lib', 'json-file', 'index.cjs'), + file: join(__dirname, 'lib', 'mysql', 'index.cjs'), format: 'cjs', }, plugins: [commonjs()], }, + { + input: join(__dirname, 'src', 'json-file', 'index.js'), + output: { + banner: banner['banner.output'].join(''), + file: join(__dirname, 'lib', 'json-file', 'index.cjs'), + }, + plugins: [commonjs()], + }, ] diff --git a/packages/database/src/mysql/index.js b/packages/database/src/mysql/index.js new file mode 100644 index 0000000..63e6e7d --- /dev/null +++ b/packages/database/src/mysql/index.js @@ -0,0 +1,69 @@ +const mysql = require('mysql2') + +class MyslAdapter { + db + listHistory = [] + credentials = { host: null, user: null, database: null } + + constructor(_credentials) { + this.credentials = _credentials + this.init().then() + } + + async init() { + this.db = mysql.createConnection(this.credentials) + + await this.db.connect((error) => { + if (!error) { + console.log(`Solicitud de conexión a base de datos exitosa`) + } + + if (error) { + console.log(`Solicitud de conexión fallida ${error.stack}`) + } + }) + } + + getPrevByNumber = (from) => + new Promise((resolve, reject) => { + const sql = `SELECT * FROM history WHERE phone=${from} ORDER BY id DESC` + this.db.query(sql, (error, rows) => { + if (error) { + reject(error) + } + + if (rows.length) { + const [row] = rows + row.options = JSON.parse(row.options) + resolve(row) + } + + if (!rows.length) { + resolve(null) + } + }) + }) + + save = (ctx) => { + const values = [ + [ + ctx.ref, + ctx.keyword, + ctx.answer, + ctx.refSerialize, + ctx.from, + JSON.stringify(ctx.options), + ], + ] + const sql = + 'INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?' + + this.db.query(sql, [values], (err) => { + if (err) throw err + console.log('Guardado en DB...', values) + }) + this.listHistory.push(ctx) + } +} + +module.exports = MyslAdapter diff --git a/packages/docs/package.json b/packages/docs/package.json index a4425cc..7a94d17 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -29,10 +29,13 @@ "@types/node": "latest", "@typescript-eslint/eslint-plugin": "5.43.0", "@typescript-eslint/parser": "5.43.0", + "autoprefixer": "10.4.11", "eslint": "8.28.0", "eslint-plugin-qwik": "0.14.1", "node-fetch": "3.3.0", + "postcss": "^8.4.16", "prettier": "2.7.1", + "tailwindcss": "^3.1.8", "typescript": "4.9.3", "vite": "3.2.4", "vite-tsconfig-paths": "3.5.0", diff --git a/packages/docs/postcss.config.js b/packages/docs/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/packages/docs/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/docs/src/global.css b/packages/docs/src/global.css index 70012a6..dacc261 100644 --- a/packages/docs/src/global.css +++ b/packages/docs/src/global.css @@ -63,4 +63,4 @@ code { border-radius: 3px; font-size: 0.9em; border-bottom: 2px solid #bfbfbf; -} +} \ No newline at end of file diff --git a/packages/docs/tailwind.config.js b/packages/docs/tailwind.config.js new file mode 100644 index 0000000..26e307b --- /dev/null +++ b/packages/docs/tailwind.config.js @@ -0,0 +1,21 @@ +/** @type {import('tailwindcss').Config} */ + +const defaultTheme = require("tailwindcss/defaultTheme"); +const colors = require("tailwindcss/colors"); + +module.exports = { + content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], + theme: { + extend: { + colors: { + primary: colors.purple, + secondary: colors.sky, + }, + fontFamily: { + sans: ["'Inter'", ...defaultTheme.fontFamily.sans], + }, + }, + }, + plugins: [], + darkMode: "class", +}; \ No newline at end of file diff --git a/packages/provider/TODO.md b/packages/provider/TODO.md deleted file mode 100644 index 1e2b948..0000000 --- a/packages/provider/TODO.md +++ /dev/null @@ -1,13 +0,0 @@ -# @bot-whatsapp/provider - -```js -// bootstrap.js Como iniciar el provider -const { inout, provider, database } = require('@bot-whatsapp') - -provider.start() -provider.close() -``` - -- [ ] whatsapp-web.js _verificar update_ -- [ ] Meta _verificar tokens_ -- [ ] Twilio _verificar tokens_ diff --git a/packages/provider/src/twilio/index.js b/packages/provider/src/twilio/index.js index 41795b1..973cc48 100644 --- a/packages/provider/src/twilio/index.js +++ b/packages/provider/src/twilio/index.js @@ -1,19 +1,59 @@ const twilio = require('twilio') const { ProviderClass } = require('@bot-whatsapp/bot') -const TwilioVendor = new twilio(accountSid, authToken) +const TwilioWebHookServer = require('./server') +const { parseNumber } = require('./utils') +/** + * { accountSid, authToken, vendorNumber } + */ class TwilioProvider extends ProviderClass { - constructor() { - super(TwilioVendor) + twilioHook + vendor + vendorNumber + constructor({ accountSid, authToken, vendorNumber }, _port = 3000) { + super() + this.vendor = new twilio(accountSid, authToken) + this.twilioHook = new TwilioWebHookServer(_port) + this.vendorNumber = vendorNumber + + this.twilioHook.start() + const listEvents = this.busEvents() + + for (const { event, func } of listEvents) { + this.twilioHook.on(event, func) + } } - sendMessage = (message) => - this.vendor.messages.create({ + sendMessage = async (number, message) => { + return this.vendor.messages.create({ body: message, - to: '+12345678901', // Text this number - from: '+12345678901', // From a valid Twilio number + from: ['whatsapp:+', parseNumber(this.vendorNumber)].join(''), + to: ['whatsapp:+', parseNumber(number)].join(''), }) + } + + /** + * Mapeamos los eventos nativos de whatsapp-web.js a los que la clase Provider espera + * para tener un standar de eventos + * @returns + */ + busEvents = () => [ + { + event: 'auth_failure', + func: (payload) => this.emit('error', payload), + }, + { + event: 'ready', + func: () => this.emit('ready', true), + }, + { + event: 'message', + func: (payload) => { + this.emit('message', payload) + }, + }, + ] } module.exports = TwilioProvider diff --git a/packages/provider/src/twilio/server.js b/packages/provider/src/twilio/server.js new file mode 100644 index 0000000..d208232 --- /dev/null +++ b/packages/provider/src/twilio/server.js @@ -0,0 +1,63 @@ +const { EventEmitter } = require('node:events') +const polka = require('polka') +const { urlencoded } = require('body-parser') +const { parseNumber } = require('./utils') + +/** + * Encargado de levantar un servidor HTTP con una hook url + * [POST] /twilio-hook + */ +class TwilioWebHookServer extends EventEmitter { + twilioServer + twilioPort + constructor(_twilioPort) { + this.twilioServer = this.buildHTTPServer() + this.twilioPort = _twilioPort + } + + /** + * Mensaje entrante + * emit: 'message' + * @param {*} req + * @param {*} res + */ + incomingMsg = (req, res) => { + const { body } = req + this.emit('message', { + from: parseNumber(body.From), + to: parseNumber(body.To), + body: body.Body, + }) + const json = JSON.stringify({ body }) + res.end(json) + } + + /** + * Contruir HTTP Server + * @returns + */ + buildHTTPServer = () => { + return polka() + .use(urlencoded({ extended: true })) + .post('/twilio-hook', this.incomingMsg) + } + + /** + * Puerto del HTTP + * @param {*} port default 3000 + */ + start = () => { + this.twilioServer.listen(this.twilioPort, () => { + console.log(``) + console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`) + console.log( + `[Twilio]: http://localhost:${this.twilioPort}/twilio-hook` + ) + console.log(`[Twilio]: Más información en la documentacion`) + console.log(``) + }) + this.emit('ready') + } +} + +module.exports = TwilioWebHookServer diff --git a/packages/provider/src/twilio/utils.js b/packages/provider/src/twilio/utils.js new file mode 100644 index 0000000..e620c4e --- /dev/null +++ b/packages/provider/src/twilio/utils.js @@ -0,0 +1,5 @@ +const parseNumber = (number) => { + return `${number}`.replace('whatsapp:', '').replace('+', '') +} + +module.exports = { parseNumber } diff --git a/packages/provider/COMMON_MISTAKE.md b/packages/provider/src/web-whatsapp/COMMON_MISTAKE.md similarity index 100% rename from packages/provider/COMMON_MISTAKE.md rename to packages/provider/src/web-whatsapp/COMMON_MISTAKE.md diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 293311e..463987c 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -1,13 +1,24 @@ -const { Client, LocalAuth } = require('whatsapp-web.js') +const { + Client, + LocalAuth, + MessageMedia, + Buttons, + List, +} = require('whatsapp-web.js') const { ProviderClass } = require('@bot-whatsapp/bot') const { Console } = require('console') -const { createWriteStream } = require('fs') +const { createWriteStream, existsSync } = require('fs') const { cleanNumber, generateImage, isValidNumber } = require('./utils') const logger = new Console({ stdout: createWriteStream('./log'), }) +/** + * WebWhatsappProvider: Es una clase tipo adaptor + * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) + * https://github.com/pedroslopez/whatsapp-web.js + */ class WebWhatsappProvider extends ProviderClass { vendor constructor() { @@ -21,13 +32,14 @@ class WebWhatsappProvider extends ProviderClass { for (const { event, func } of listEvents) { this.vendor.on(event, func) } - + this.vendor.emit('preinit') this.vendor.initialize().catch((e) => { logger.log(e) this.emit('require_action', { instructions: [ - `Debes eliminar la carpeta .wwebjs_auth`, - `y reiniciar nuevamente el bot `, + `(Opcion 1): Debes eliminar la carpeta .wwebjs_auth y reiniciar nuevamente el bot. `, + `(Opcion 2): Intenta actualizar el paquete [npm install whatsapp-web.js] `, + `(Opcion 3): Ir FORO de discord https://link.codigoencasa.com/DISCORD `, ], }) }) @@ -60,10 +72,6 @@ class WebWhatsappProvider extends ProviderClass { event: 'ready', func: () => this.emit('ready', true), }, - { - event: 'authenticated', - func: () => this.emit('ready', true), - }, { event: 'message', func: (payload) => { @@ -80,10 +88,87 @@ class WebWhatsappProvider extends ProviderClass { }, ] - sendMessage = async (userId, message) => { - const number = cleanNumber(userId) + /** + * Enviar un archivo multimedia + * https://docs.wwebjs.dev/MessageMedia.html + * @private + * @param {*} number + * @param {*} mediaInput + * @returns + */ + sendMedia = async (number, mediaInput = null) => { + if (!existsSync(mediaInput)) + throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) + const media = MessageMedia.fromFilePath(mediaInput) + return this.vendor.sendMessage(number, media, { + sendAudioAsVoice: true, + }) + } + + /** + * Enviar botones + * https://docs.wwebjs.dev/Buttons.html + * @private + * @param {*} number + * @param {*} message + * @param {*} buttons [] + * @returns + */ + sendButtons = async (number, message, buttons = []) => { + const buttonMessage = new Buttons(message, buttons, '', '') + return this.vendor.sendMessage(number, buttonMessage) + } + + /** + * Enviar lista + * https://docs.wwebjs.dev/List.html + * @private + * @alpha No funciona en whatsapp bussines + * @param {*} number + * @param {*} message + * @param {*} buttons [] + * @returns + */ + sendList = async (number, message, listInput = []) => { + let sections = [ + { + title: 'sectionTitle', + rows: [ + { title: 'ListItem1', description: 'desc' }, + { title: 'ListItem2' }, + ], + }, + ] + let list = new List('List body', 'btnText', sections, 'Title', 'footer') + return this.vendor.sendMessage(number, list) + } + + /** + * Enviar un mensaje solo texto + * https://docs.wwebjs.dev/Message.html + * @private + * @param {*} number + * @param {*} message + * @returns + */ + sendText = async (number, message) => { return this.vendor.sendMessage(number, message) } + + /** + * + * @param {*} userId + * @param {*} message + * @param {*} param2 + * @returns + */ + sendMessage = async (userId, message, { options }) => { + const number = cleanNumber(userId) + if (options?.media) return this.sendMedia(number, options.media) + if (options?.buttons?.length) + return this.sendButtons(number, message, options.buttons) + return this.sendText(number, message) + } } module.exports = WebWhatsappProvider diff --git a/scripts/move.js b/scripts/move.js index 46dd625..5a0d8b6 100644 --- a/scripts/move.js +++ b/scripts/move.js @@ -11,6 +11,7 @@ const copyLibPkg = async (pkgName, to) => { } Promise.all([ + copyLibPkg('create-bot-whatsapp', appDir), copyLibPkg('bot', appDir), copyLibPkg('database', appDir), copyLibPkg('provider', appDir), diff --git a/starters/apps/base/app.js b/starters/apps/base/app.js index 64f9100..61a4bb0 100644 --- a/starters/apps/base/app.js +++ b/starters/apps/base/app.js @@ -5,11 +5,6 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -/** - * ATENCION: Si vas a usar el provider whatsapp-web.js - * recuerda ejecutar npm i whatsapp-web.js@latest - */ - const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/basic/app.js b/starters/apps/basic/app.js index e66d350..78d9132 100644 --- a/starters/apps/basic/app.js +++ b/starters/apps/basic/app.js @@ -6,11 +6,6 @@ const { addChild, } = require('@bot-whatsapp/bot') -/** - * ATENCION: Si vas a usar el provider whatsapp-web.js - * recuerda ejecutar npm i whatsapp-web.js@latest - */ - const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/yarn.lock b/yarn.lock index 446c49c..8a41329 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,6 +82,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@aws-sdk/client-cognito-identity@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/client-cognito-identity@npm:3.223.0" @@ -91,6 +92,17 @@ __metadata: "@aws-sdk/client-sts": 3.223.0 "@aws-sdk/config-resolver": 3.222.0 "@aws-sdk/credential-provider-node": 3.223.0 +======= +"@aws-sdk/client-cognito-identity@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.222.0" + dependencies: + "@aws-crypto/sha256-browser": 2.0.0 + "@aws-crypto/sha256-js": 2.0.0 + "@aws-sdk/client-sts": 3.222.0 + "@aws-sdk/config-resolver": 3.222.0 + "@aws-sdk/credential-provider-node": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/fetch-http-handler": 3.222.0 "@aws-sdk/hash-node": 3.222.0 "@aws-sdk/invalid-dependency": 3.222.0 @@ -116,11 +128,16 @@ __metadata: "@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0 +<<<<<<< HEAD +======= + "@aws-sdk/util-retry": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: ada894c3fbe943044617d719dc947af51546dbfea72e5b63f23c6230677c39dc0355248ed1ba119a29f2d4b7bc64e28400880b580a263bcd45d05fdf45007ad7 languageName: node linkType: hard @@ -128,6 +145,15 @@ __metadata: "@aws-sdk/client-sso-oidc@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/client-sso-oidc@npm:3.223.0" +======= + checksum: b733d9bad0232a17967da9b27311cb2adf41acaefc584173e6d74b3b966ed3908b9e9fa65b3a0f3e12709dc305e64b1a5351ea43ac666650a375cb10143368e3 + languageName: node + linkType: hard + +"@aws-sdk/client-sso-oidc@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.222.0" +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 @@ -156,11 +182,16 @@ __metadata: "@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0 +<<<<<<< HEAD +======= + "@aws-sdk/util-retry": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: ab5b6142d897ec48a3bb246577c23d1b6e26ee228c7ce264f826d10f88caa83e03f0dac9d88e361c70b778ceef45f0ebd9712cd03ca5b60ab240a3d4382ecb7c languageName: node linkType: hard @@ -168,6 +199,15 @@ __metadata: "@aws-sdk/client-sso@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/client-sso@npm:3.223.0" +======= + checksum: 40674d89438b689480bdfa10bfb044d90341d87096ae6b0803e6ecc1695d48b1f7a8c513109e92001c380e2b2f5b18aa3e8af1c8ecd3d2f04f63f160cb039611 + languageName: node + linkType: hard + +"@aws-sdk/client-sso@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/client-sso@npm:3.222.0" +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 @@ -196,11 +236,16 @@ __metadata: "@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0 +<<<<<<< HEAD +======= + "@aws-sdk/util-retry": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: 856e3745182906d274dc894baa7d853966b0074f89ea892f29132e1cefdf49f267f1d0fffaa2de3de352d19ff3963d59290602057bd4510731e0156199bed664 languageName: node linkType: hard @@ -208,11 +253,24 @@ __metadata: "@aws-sdk/client-sts@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/client-sts@npm:3.223.0" +======= + checksum: bc0cd1125bc5aa94b3fdec15167ce9539acf4a187da060d51fa8ad7c30d0bf6cfee9e3a0175d65e204aba92efee4087c99d1190e1b43927c01cd7a8b1bbbb93e + languageName: node + linkType: hard + +"@aws-sdk/client-sts@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/client-sts@npm:3.222.0" +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d dependencies: "@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-js": 2.0.0 "@aws-sdk/config-resolver": 3.222.0 +<<<<<<< HEAD "@aws-sdk/credential-provider-node": 3.223.0 +======= + "@aws-sdk/credential-provider-node": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/fetch-http-handler": 3.222.0 "@aws-sdk/hash-node": 3.222.0 "@aws-sdk/invalid-dependency": 3.222.0 @@ -239,13 +297,21 @@ __metadata: "@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0 +<<<<<<< HEAD +======= + "@aws-sdk/util-retry": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-node": 3.208.0 fast-xml-parser: 4.0.11 tslib: ^2.3.1 +<<<<<<< HEAD checksum: 6976345f839b0028a0e83f6d11e3323da68cef103ae5381299c6d75df25a1ef336b83023c79896242fbc4b7d2a27f3deebb1b1922e815e6cc7780f3eee302210 +======= + checksum: 79f18e5b44541673213715e3465a8b000716c03120ea087e6920abba3542683dbd4b881ecb091ef90df34947eec00c82daf70089ea0e5e92cffbb4e57e2d76d7 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -262,6 +328,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@aws-sdk/credential-provider-cognito-identity@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.223.0" @@ -271,6 +338,17 @@ __metadata: "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 checksum: e0f03110b120699ef9c458edd5b1a248f5e3f360931b2e8be7ebb7fc33da51ac1c3fdf96bb05a755a2d303c00c7effee7a582706da2333b4ee43c0040ff551a5 +======= +"@aws-sdk/credential-provider-cognito-identity@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.222.0" + dependencies: + "@aws-sdk/client-cognito-identity": 3.222.0 + "@aws-sdk/property-provider": 3.222.0 + "@aws-sdk/types": 3.222.0 + tslib: ^2.3.1 + checksum: e6a61cf601825907931ed0cc42050b895b150468feb95c1052e053ce00d33e8d225663ca337da1c5825eee7e24438311ba0d28b2a6021868d3e6796aa81fdeeb +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -298,6 +376,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@aws-sdk/credential-provider-ini@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.223.0" @@ -305,11 +384,21 @@ __metadata: "@aws-sdk/credential-provider-env": 3.222.0 "@aws-sdk/credential-provider-imds": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0 +======= +"@aws-sdk/credential-provider-ini@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.222.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.222.0 + "@aws-sdk/credential-provider-imds": 3.222.0 + "@aws-sdk/credential-provider-sso": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/property-provider": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: f407fe591999f1da1d5580b182af261ceeb4455da9a53d18ae871c9cf244e6e72fa10ef28036419790e2b5787d64c5de5b4daf4c7f69acb866894410baa880d0 languageName: node linkType: hard @@ -323,12 +412,31 @@ __metadata: "@aws-sdk/credential-provider-ini": 3.223.0 "@aws-sdk/credential-provider-process": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0 +======= + checksum: eac19a9b52066f76cf23bee102369df7d50097dfee3be14b12c2e178c16868acd1a79b13c00d3e3ac40d2fbc14b4e2b06119d0c51c5d875c6be3606c33514d62 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-node@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.222.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.222.0 + "@aws-sdk/credential-provider-imds": 3.222.0 + "@aws-sdk/credential-provider-ini": 3.222.0 + "@aws-sdk/credential-provider-process": 3.222.0 + "@aws-sdk/credential-provider-sso": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/property-provider": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: 6ce5f88f75a6e879344ea76fa2b390c779d74f1b3657fa15367b15797b09d9713ef0d2f14c95421254a6bc0b8bde1acd2634978a6549e02a74c33160ae6130fd +======= + checksum: f17ce6c9b45d48d9bebd63766b5d85e45f6a1d50b02bea4784d0055269a0f5c05e5ba343c6b138cd29086b94c6bb4511568e9fb59f340f3988526b2d7950cb4c +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -344,6 +452,7 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@aws-sdk/credential-provider-sso@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.223.0" @@ -355,6 +464,19 @@ __metadata: "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 checksum: 4593a94dc86ef7218517061cf875285c2c6087f1d4a1199442055e6165701f11f9921612a04ab3c1b3f29b3132d46a8ce8cd26070fad132509e20eca1b89f217 +======= +"@aws-sdk/credential-provider-sso@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.222.0" + dependencies: + "@aws-sdk/client-sso": 3.222.0 + "@aws-sdk/property-provider": 3.222.0 + "@aws-sdk/shared-ini-file-loader": 3.222.0 + "@aws-sdk/token-providers": 3.222.0 + "@aws-sdk/types": 3.222.0 + tslib: ^2.3.1 + checksum: 8e0a39a722fd6548b9758ab4c711eac9128a64bae1fa9bfce5f0b92c2df34883fdcd544c9a48f501d3a7b695e6d0b51a9b5e1be1b7eac626a1818860cfc86072 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -370,6 +492,7 @@ __metadata: linkType: hard "@aws-sdk/credential-providers@npm:^3.186.0": +<<<<<<< HEAD version: 3.223.0 resolution: "@aws-sdk/credential-providers@npm:3.223.0" dependencies: @@ -383,12 +506,31 @@ __metadata: "@aws-sdk/credential-provider-node": 3.223.0 "@aws-sdk/credential-provider-process": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0 +======= + version: 3.222.0 + resolution: "@aws-sdk/credential-providers@npm:3.222.0" + dependencies: + "@aws-sdk/client-cognito-identity": 3.222.0 + "@aws-sdk/client-sso": 3.222.0 + "@aws-sdk/client-sts": 3.222.0 + "@aws-sdk/credential-provider-cognito-identity": 3.222.0 + "@aws-sdk/credential-provider-env": 3.222.0 + "@aws-sdk/credential-provider-imds": 3.222.0 + "@aws-sdk/credential-provider-ini": 3.222.0 + "@aws-sdk/credential-provider-node": 3.222.0 + "@aws-sdk/credential-provider-process": 3.222.0 + "@aws-sdk/credential-provider-sso": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/property-provider": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: 289d043f41460751e90c3adc323f3a56e517f67c0a7f8889249e0969b3302f19d093eef4a10d3528bdf34f1043f95fa41555ed5c91af4d2ca636cded1775c81c +======= + checksum: a6c159abbc210d62ed7d1153278b423595493583f53ec2a9143b402ee149cc1ae39be41615c76c3b658e1e9f70e89019a594c8e7a6a320cf7ea37443714a79ac +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -674,16 +816,28 @@ __metadata: languageName: node linkType: hard +<<<<<<< HEAD "@aws-sdk/token-providers@npm:3.223.0": version: 3.223.0 resolution: "@aws-sdk/token-providers@npm:3.223.0" dependencies: "@aws-sdk/client-sso-oidc": 3.223.0 +======= +"@aws-sdk/token-providers@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/token-providers@npm:3.222.0" + dependencies: + "@aws-sdk/client-sso-oidc": 3.222.0 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d "@aws-sdk/property-provider": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/types": 3.222.0 tslib: ^2.3.1 +<<<<<<< HEAD checksum: 08d724bc685b90761159b449413c9dddb581cc61cd982ee9a189e8682d1a703acc70663beec2ae31d1ebf6fe9a86480b63fb65da531e35b2e8772a2c3906969f +======= + checksum: e0d2d9af50570ca1e9ae4cfe32889a9146a0e49ce3004dfc4d5305ba0f64b7561da95d09ccaf18927638417d3bd1eb9772cb58256aef242beab03a56e4e68883 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -812,6 +966,19 @@ __metadata: dependencies: tslib: ^2.3.1 checksum: 807dd36731c7aa59658e4eea5747d6d363b5e5715d0d2c5554c265df6729735f31e790e8e6130d5d56b4923e29080a656e19978631a7ff667f969bfdae8c6320 +<<<<<<< HEAD +======= + languageName: node + linkType: hard + +"@aws-sdk/util-retry@npm:3.222.0": + version: 3.222.0 + resolution: "@aws-sdk/util-retry@npm:3.222.0" + dependencies: + "@aws-sdk/service-error-classification": 3.222.0 + tslib: ^2.3.1 + checksum: d4b38a23a310d44d211db2cfb2ae53ef41cf805308d08e56d9ca786fc69fd6b244f331d40ea35023bbc53625c7b2c1f4fab9fabd32d0a10396d4359ac50eff09 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: node linkType: hard @@ -935,7 +1102,11 @@ __metadata: dependencies: dotenv: ^16.0.3 mongodb: ^4.11.0 +<<<<<<< HEAD stormdb: ^0.6.0 +======= + mysql2: ^2.3.3 +>>>>>>> 520145bf7dcce65a6d0363bccd423613e6bde90d languageName: unknown linkType: soft @@ -1243,16 +1414,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.15.16": - version: 0.15.16 - resolution: "@esbuild/android-arm@npm:0.15.16" +"@esbuild/android-arm@npm:0.15.18": + version: 0.15.18 + resolution: "@esbuild/android-arm@npm:0.15.18" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.15.16": - version: 0.15.16 - resolution: "@esbuild/linux-loong64@npm:0.15.16" +"@esbuild/linux-loong64@npm:0.15.18": + version: 0.15.18 + resolution: "@esbuild/linux-loong64@npm:0.15.18" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -2112,6 +2283,24 @@ __metadata: languageName: node linkType: hard +"acorn-node@npm:^1.8.2": + version: 1.8.2 + resolution: "acorn-node@npm:1.8.2" + dependencies: + acorn: ^7.0.0 + acorn-walk: ^7.0.0 + xtend: ^4.0.2 + checksum: 02e1564a1ccf8bd1fcefcd01235398af4a9effaf032c5397994ddd275590a72894cb3e26e4b82579ccdda1e48ade7486aef61e771ddae3563ca452b927f443d8 + languageName: node + linkType: hard + +"acorn-walk@npm:^7.0.0": + version: 7.2.0 + resolution: "acorn-walk@npm:7.2.0" + checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f + languageName: node + linkType: hard + "acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" @@ -2119,6 +2308,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^7.0.0": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 + languageName: node + linkType: hard + "acorn@npm:^8.0.0, acorn@npm:^8.4.1, acorn@npm:^8.8.0": version: 8.8.1 resolution: "acorn@npm:8.8.1" @@ -2264,6 +2462,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^5.0.2": + version: 5.0.2 + resolution: "arg@npm:5.0.2" + checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -2315,6 +2520,24 @@ __metadata: languageName: node linkType: hard +"autoprefixer@npm:10.4.11": + version: 10.4.11 + resolution: "autoprefixer@npm:10.4.11" + dependencies: + browserslist: ^4.21.3 + caniuse-lite: ^1.0.30001399 + fraction.js: ^4.2.0 + normalize-range: ^0.1.2 + picocolors: ^1.0.0 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: fb8b2abbb0ce5e3c6bc957ffb714b84aa2e6a9f24cf9c139bcfec33ba5e3334f61a132c606a621e04097d026c1f653fe1bda2d1c3dc47b87c9f6b00d90732daa + languageName: node + linkType: hard + "bail@npm:^2.0.0": version: 2.0.2 resolution: "bail@npm:2.0.2" @@ -2360,10 +2583,13 @@ __metadata: "@types/node": latest "@typescript-eslint/eslint-plugin": 5.43.0 "@typescript-eslint/parser": 5.43.0 + autoprefixer: 10.4.11 eslint: 8.28.0 eslint-plugin-qwik: 0.14.1 node-fetch: 3.3.0 + postcss: ^8.4.16 prettier: 2.7.1 + tailwindcss: ^3.1.8 typescript: 4.9.3 vite: 3.2.4 vite-tsconfig-paths: 3.5.0 @@ -2422,6 +2648,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.21.3": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" + dependencies: + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 + node-releases: ^2.0.6 + update-browserslist-db: ^1.0.9 + bin: + browserslist: cli.js + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + languageName: node + linkType: hard + "bson@npm:^4.7.0": version: 4.7.0 resolution: "bson@npm:4.7.0" @@ -2528,6 +2768,13 @@ __metadata: languageName: node linkType: hard +"camelcase-css@npm:^2.0.1": + version: 2.0.1 + resolution: "camelcase-css@npm:2.0.1" + checksum: 1cec2b3b3dcb5026688a470b00299a8db7d904c4802845c353dbd12d9d248d3346949a814d83bfd988d4d2e5b9904c07efe76fecd195a1d4f05b543e7c0b56b1 + languageName: node + linkType: hard + "camelcase-keys@npm:^6.2.2": version: 6.2.2 resolution: "camelcase-keys@npm:6.2.2" @@ -2546,6 +2793,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001399, caniuse-lite@npm:^1.0.30001400": + version: 1.0.30001436 + resolution: "caniuse-lite@npm:1.0.30001436" + checksum: 7928ac7d93741a81b3005ca4623b133e7d790828be70b26ee55e4860facc59bc344f4092e20034981070a4714f70814c8be4929be4b22728031784f267f69099 + languageName: node + linkType: hard + "ccount@npm:^2.0.0": version: 2.0.1 resolution: "ccount@npm:2.0.1" @@ -2699,7 +2953,7 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 @@ -3039,6 +3293,16 @@ __metadata: languageName: node linkType: hard +"create-bot-whatsapp@workspace:packages/create-bot-whatsapp": + version: 0.0.0-use.local + resolution: "create-bot-whatsapp@workspace:packages/create-bot-whatsapp" + dependencies: + "@bot-whatsapp/cli": "*" + bin: + bot: ./lib/bin/bundle.create.cjs + languageName: unknown + linkType: soft + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -3076,6 +3340,15 @@ __metadata: languageName: node linkType: hard +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + languageName: node + linkType: hard + "dargs@npm:^7.0.0": version: 7.0.0 resolution: "dargs@npm:7.0.0" @@ -3149,6 +3422,13 @@ __metadata: languageName: node linkType: hard +"defined@npm:^1.0.0": + version: 1.0.1 + resolution: "defined@npm:1.0.1" + checksum: b1a852300bdb57f297289b55eafdd0c517afaa3ec8190e78fce91b9d8d0c0369d4505ecbdacfd3d98372e664f4a267d9bd793938d4a8c76209c9d9516fbe2101 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -3156,6 +3436,13 @@ __metadata: languageName: node linkType: hard +"denque@npm:^2.0.1": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 + languageName: node + linkType: hard + "depd@npm:^1.1.2": version: 1.1.2 resolution: "depd@npm:1.1.2" @@ -3193,6 +3480,26 @@ __metadata: languageName: node linkType: hard +"detective@npm:^5.2.1": + version: 5.2.1 + resolution: "detective@npm:5.2.1" + dependencies: + acorn-node: ^1.8.2 + defined: ^1.0.0 + minimist: ^1.2.6 + bin: + detective: bin/detective.js + checksum: dc4601bbc6be850edb3c2dab7a0eaf5a6169a15ad201679c66d40ea1986df816eeaecd590047f15b0780285f3eeea13b82dca0d4c52a47e744a571e326a72dc9 + languageName: node + linkType: hard + +"didyoumean@npm:^1.2.2": + version: 1.2.2 + resolution: "didyoumean@npm:1.2.2" + checksum: d5d98719d58b3c2fa59663c4c42ba9716f1fd01245c31d5fce31915bd3aa26e6aac149788e007358f778ebbd68a2256eb5973e8ca6f221df221ba060115acf2e + languageName: node + linkType: hard + "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -3216,6 +3523,13 @@ __metadata: languageName: node linkType: hard +"dlv@npm:^1.1.3": + version: 1.1.3 + resolution: "dlv@npm:1.1.3" + checksum: d7381bca22ed11933a1ccf376db7a94bee2c57aa61e490f680124fa2d1cd27e94eba641d9f45be57caab4f9a6579de0983466f620a2cd6230d7ec93312105ae7 + languageName: node + linkType: hard + "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -3258,6 +3572,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.251": + version: 1.4.284 + resolution: "electron-to-chromium@npm:1.4.284" + checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -3313,9 +3634,9 @@ __metadata: languageName: node linkType: hard -"esbuild-android-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-android-64@npm:0.15.16" +"esbuild-android-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-android-64@npm:0.15.18" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3327,9 +3648,9 @@ __metadata: languageName: node linkType: hard -"esbuild-android-arm64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-android-arm64@npm:0.15.16" +"esbuild-android-arm64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-android-arm64@npm:0.15.18" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3341,9 +3662,9 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-darwin-64@npm:0.15.16" +"esbuild-darwin-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-darwin-64@npm:0.15.18" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3355,9 +3676,9 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-arm64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-darwin-arm64@npm:0.15.16" +"esbuild-darwin-arm64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-darwin-arm64@npm:0.15.18" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3369,9 +3690,9 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-freebsd-64@npm:0.15.16" +"esbuild-freebsd-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-freebsd-64@npm:0.15.18" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3383,9 +3704,9 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-arm64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-freebsd-arm64@npm:0.15.16" +"esbuild-freebsd-arm64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-freebsd-arm64@npm:0.15.18" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3397,9 +3718,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-32@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-32@npm:0.15.16" +"esbuild-linux-32@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-32@npm:0.15.18" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3411,9 +3732,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-64@npm:0.15.16" +"esbuild-linux-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-64@npm:0.15.18" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3425,9 +3746,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-arm64@npm:0.15.16" +"esbuild-linux-arm64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-arm64@npm:0.15.18" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3439,9 +3760,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-arm@npm:0.15.16" +"esbuild-linux-arm@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-arm@npm:0.15.18" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3453,9 +3774,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-mips64le@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-mips64le@npm:0.15.16" +"esbuild-linux-mips64le@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-mips64le@npm:0.15.18" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3467,9 +3788,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-ppc64le@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-ppc64le@npm:0.15.16" +"esbuild-linux-ppc64le@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-ppc64le@npm:0.15.18" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3481,9 +3802,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-riscv64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-riscv64@npm:0.15.16" +"esbuild-linux-riscv64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-riscv64@npm:0.15.18" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3495,9 +3816,9 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-s390x@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-linux-s390x@npm:0.15.16" +"esbuild-linux-s390x@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-linux-s390x@npm:0.15.18" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3509,9 +3830,9 @@ __metadata: languageName: node linkType: hard -"esbuild-netbsd-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-netbsd-64@npm:0.15.16" +"esbuild-netbsd-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-netbsd-64@npm:0.15.18" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -3523,9 +3844,9 @@ __metadata: languageName: node linkType: hard -"esbuild-openbsd-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-openbsd-64@npm:0.15.16" +"esbuild-openbsd-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-openbsd-64@npm:0.15.18" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3537,9 +3858,9 @@ __metadata: languageName: node linkType: hard -"esbuild-sunos-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-sunos-64@npm:0.15.16" +"esbuild-sunos-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-sunos-64@npm:0.15.18" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3551,9 +3872,9 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-32@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-windows-32@npm:0.15.16" +"esbuild-windows-32@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-windows-32@npm:0.15.18" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3565,9 +3886,9 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-windows-64@npm:0.15.16" +"esbuild-windows-64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-windows-64@npm:0.15.18" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3579,9 +3900,9 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-arm64@npm:0.15.16": - version: 0.15.16 - resolution: "esbuild-windows-arm64@npm:0.15.16" +"esbuild-windows-arm64@npm:0.15.18": + version: 0.15.18 + resolution: "esbuild-windows-arm64@npm:0.15.18" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -3658,31 +3979,31 @@ __metadata: linkType: hard "esbuild@npm:^0.15.9": - version: 0.15.16 - resolution: "esbuild@npm:0.15.16" + version: 0.15.18 + resolution: "esbuild@npm:0.15.18" dependencies: - "@esbuild/android-arm": 0.15.16 - "@esbuild/linux-loong64": 0.15.16 - esbuild-android-64: 0.15.16 - esbuild-android-arm64: 0.15.16 - esbuild-darwin-64: 0.15.16 - esbuild-darwin-arm64: 0.15.16 - esbuild-freebsd-64: 0.15.16 - esbuild-freebsd-arm64: 0.15.16 - esbuild-linux-32: 0.15.16 - esbuild-linux-64: 0.15.16 - esbuild-linux-arm: 0.15.16 - esbuild-linux-arm64: 0.15.16 - esbuild-linux-mips64le: 0.15.16 - esbuild-linux-ppc64le: 0.15.16 - esbuild-linux-riscv64: 0.15.16 - esbuild-linux-s390x: 0.15.16 - esbuild-netbsd-64: 0.15.16 - esbuild-openbsd-64: 0.15.16 - esbuild-sunos-64: 0.15.16 - esbuild-windows-32: 0.15.16 - esbuild-windows-64: 0.15.16 - esbuild-windows-arm64: 0.15.16 + "@esbuild/android-arm": 0.15.18 + "@esbuild/linux-loong64": 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -3730,7 +4051,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 6f9262784b115363290cc9aa54692b3b646cd0508364333a609cc7be5ede4d93f91561ae8da48125e077da2e7add5368105486233ac2258f7169b171e8d78564 + checksum: ec12682b2cb2d4f0669d0e555028b87a9284ca7f6a1b26e35e69a8697165b35cc682ad598abc70f0bbcfdc12ca84ef888caf5ceee389237862e8f8c17da85f89 languageName: node linkType: hard @@ -4102,7 +4423,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -4260,6 +4581,13 @@ __metadata: languageName: node linkType: hard +"fraction.js@npm:^4.2.0": + version: 4.2.0 + resolution: "fraction.js@npm:4.2.0" + checksum: 8c76a6e21dedea87109d6171a0ac77afa14205794a565d71cb10d2925f629a3922da61bf45ea52dbc30bce4d8636dc0a27213a88cbd600eab047d82f9a3a94c5 + languageName: node + linkType: hard + "fs-extra@npm:^10.0.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -4351,6 +4679,15 @@ __metadata: languageName: node linkType: hard +"generate-function@npm:^2.3.1": + version: 2.3.1 + resolution: "generate-function@npm:2.3.1" + dependencies: + is-property: ^1.0.2 + checksum: 652f083de206ead2bae4caf9c7eeb465e8d98c0b8ed2a29c6afc538cef0785b5c6eea10548f1e13cc586d3afd796c13c830c2cb3dc612ec2457b2aadda5f57c9 + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -4761,7 +5098,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -5004,6 +5341,13 @@ __metadata: languageName: node linkType: hard +"is-property@npm:^1.0.2": + version: 1.0.2 + resolution: "is-property@npm:1.0.2" + checksum: 33b661a3690bcc88f7e47bb0a21b9e3187e76a317541ea7ec5e8096d954f441b77a46d8930c785f7fbf4ef8dfd624c25495221e026e50f74c9048fe501773be5 + languageName: node + linkType: hard + "is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" @@ -5237,6 +5581,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^2.0.5, lilconfig@npm:^2.0.6": + version: 2.0.6 + resolution: "lilconfig@npm:2.0.6" + checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -5378,6 +5729,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 16afbe8f749c7c849db1f4de4e2e6a31ac6e617cead3bdc4f9605cb703cd20e1e9fc1a7baba674ffcca57d660a6e5b53a9e236d7b25a295d3855cca79cc06744 + languageName: node + linkType: hard + "longest-streak@npm:^3.0.0": version: 3.1.0 resolution: "longest-streak@npm:3.1.0" @@ -5385,6 +5743,16 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^4.1.3": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: ^1.0.2 + yallist: ^2.1.2 + checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -5986,7 +6354,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -6261,6 +6629,22 @@ __metadata: languageName: node linkType: hard +"mysql2@npm:^2.3.3": + version: 2.3.3 + resolution: "mysql2@npm:2.3.3" + dependencies: + denque: ^2.0.1 + generate-function: ^2.3.1 + iconv-lite: ^0.6.3 + long: ^4.0.0 + lru-cache: ^6.0.0 + named-placeholders: ^1.1.2 + seq-queue: ^0.0.5 + sqlstring: ^2.3.2 + checksum: 45e479d0cbdb24ceb9d1846a1708ae2c33aa64f603f7899279b33560b1eec441f1b7a596075896f1305f701cfbc083bceb88bc72ba5d2f3656a3d6102611286a + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -6272,6 +6656,15 @@ __metadata: languageName: node linkType: hard +"named-placeholders@npm:^1.1.2": + version: 1.1.2 + resolution: "named-placeholders@npm:1.1.2" + dependencies: + lru-cache: ^4.1.3 + checksum: c9317d1b479d6733b3baedfde209c6c866cf387c2d625837f93355fdb6a9055b1e8180b883fe00bcb20edb3ba4dd21128ec2f1ed8cb884385cef7698cbcadcc4 + languageName: node + linkType: hard + "nanoid@npm:^3.3.3, nanoid@npm:^3.3.4": version: 3.3.4 resolution: "nanoid@npm:3.3.4" @@ -6354,6 +6747,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.6": + version: 2.0.6 + resolution: "node-releases@npm:2.0.6" + checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf + languageName: node + linkType: hard + "nopt@npm:^6.0.0": version: 6.0.0 resolution: "nopt@npm:6.0.0" @@ -6396,6 +6796,13 @@ __metadata: languageName: node linkType: hard +"normalize-range@npm:^0.1.2": + version: 0.1.2 + resolution: "normalize-range@npm:0.1.2" + checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -6445,6 +6852,13 @@ __metadata: languageName: node linkType: hard +"object-hash@npm:^3.0.0": + version: 3.0.0 + resolution: "object-hash@npm:3.0.0" + checksum: 80b4904bb3857c52cc1bfd0b52c0352532ca12ed3b8a6ff06a90cd209dfda1b95cee059a7625eb9da29537027f68ac4619363491eedb2f5d3dddbba97494fd6c + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -6755,7 +7169,77 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.18": +"postcss-import@npm:^14.1.0": + version: 14.1.0 + resolution: "postcss-import@npm:14.1.0" + dependencies: + postcss-value-parser: ^4.0.0 + read-cache: ^1.0.0 + resolve: ^1.1.7 + peerDependencies: + postcss: ^8.0.0 + checksum: cd45d406e90f67cdab9524352e573cc6b4462b790934a05954e929a6653ebd31288ceebc8ce3c3ed7117ae672d9ebbec57df0bceec0a56e9b259c2e71d47ca86 + languageName: node + linkType: hard + +"postcss-js@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-js@npm:4.0.0" + dependencies: + camelcase-css: ^2.0.1 + peerDependencies: + postcss: ^8.3.3 + checksum: 14be8a58670b4c5d037d40f179240a4f736d53530db727e2635638fa296bc4bff18149ca860928398aace422e55d07c9f5729eeccd395340944985199cdc82a5 + languageName: node + linkType: hard + +"postcss-load-config@npm:^3.1.4": + version: 3.1.4 + resolution: "postcss-load-config@npm:3.1.4" + dependencies: + lilconfig: ^2.0.5 + yaml: ^1.10.2 + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + checksum: 1c589504c2d90b1568aecae8238ab993c17dba2c44f848a8f13619ba556d26a1c09644d5e6361b5784e721e94af37b604992f9f3dc0483e687a0cc1cc5029a34 + languageName: node + linkType: hard + +"postcss-nested@npm:6.0.0": + version: 6.0.0 + resolution: "postcss-nested@npm:6.0.0" + dependencies: + postcss-selector-parser: ^6.0.10 + peerDependencies: + postcss: ^8.2.14 + checksum: 2105dc52cd19747058f1a46862c9e454b5a365ac2e7135fc1015d67a8fe98ada2a8d9ee578e90f7a093bd55d3994dd913ba5ff1d5e945b4ed9a8a2992ecc8f10 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.10": + version: 6.0.11 + resolution: "postcss-selector-parser@npm:6.0.11" + dependencies: + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: 0b01aa9c2d2c8dbeb51e9b204796b678284be9823abc8d6d40a8b16d4149514e922c264a8ed4deb4d6dbced564b9be390f5942c058582d8656351516d6c49cde + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f + languageName: node + linkType: hard + +"postcss@npm:^8.4.16, postcss@npm:^8.4.18": version: 8.4.19 resolution: "postcss@npm:8.4.19" dependencies: @@ -6850,6 +7334,13 @@ __metadata: languageName: node linkType: hard +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -6895,6 +7386,22 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + +"read-cache@npm:^1.0.0": + version: 1.0.0 + resolution: "read-cache@npm:1.0.0" + dependencies: + pify: ^2.3.0 + checksum: cffc728b9ede1e0667399903f9ecaf3789888b041c46ca53382fa3a06303e5132774dc0a96d0c16aa702dbac1ea0833d5a868d414f5ab2af1e1438e19e6657c6 + languageName: node + linkType: hard + "read-pkg-up@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg-up@npm:3.0.0" @@ -7074,7 +7581,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.22.1": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -7087,7 +7594,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": +"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: @@ -7194,8 +7701,8 @@ __metadata: linkType: hard "rollup@npm:^3.2.3": - version: 3.5.1 - resolution: "rollup@npm:3.5.1" + version: 3.6.0 + resolution: "rollup@npm:3.6.0" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -7203,7 +7710,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 9206af1fca3c05a519adf6cd81fa9c86d3262370256c2480b480e11f19dda212aac388d1893da6193d660071c54e57ae5981f54e0e52fe27e45245b991fbf6d3 + checksum: 9aefeddf54623cefdbf9d3f75ac4c3e68f08a4e7f0685ac70c49acbc7963307eb80492c519c76010e15af429d40086ab3b3301add09cb8da892bdf89c605cd52 languageName: node linkType: hard @@ -7311,6 +7818,13 @@ __metadata: languageName: node linkType: hard +"seq-queue@npm:^0.0.5": + version: 0.0.5 + resolution: "seq-queue@npm:0.0.5" + checksum: f8695a6cb613e1b378b9686cde4ea626944091a412fc1c9d24c5039283d4351dd115f4505e4cf103d3a2e4a9a6a72fc7698fdce703839fb1fec9627aa4ce5563 + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -7503,6 +8017,13 @@ __metadata: languageName: node linkType: hard +"sqlstring@npm:^2.3.2": + version: 2.3.3 + resolution: "sqlstring@npm:2.3.3" + checksum: 1e7e2d51c38a0cf7372e875408ca100b6e0c9a941ab7773975ea41fb36e5528e404dc787689be855780cf6d0a829ff71027964ae3a05a7446e91dce26672fda7 + languageName: node + linkType: hard + "ssri@npm:^9.0.0": version: 9.0.1 resolution: "ssri@npm:9.0.1" @@ -7707,6 +8228,42 @@ __metadata: languageName: node linkType: hard +"tailwindcss@npm:^3.1.8": + version: 3.2.4 + resolution: "tailwindcss@npm:3.2.4" + dependencies: + arg: ^5.0.2 + chokidar: ^3.5.3 + color-name: ^1.1.4 + detective: ^5.2.1 + didyoumean: ^1.2.2 + dlv: ^1.1.3 + fast-glob: ^3.2.12 + glob-parent: ^6.0.2 + is-glob: ^4.0.3 + lilconfig: ^2.0.6 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + object-hash: ^3.0.0 + picocolors: ^1.0.0 + postcss: ^8.4.18 + postcss-import: ^14.1.0 + postcss-js: ^4.0.0 + postcss-load-config: ^3.1.4 + postcss-nested: 6.0.0 + postcss-selector-parser: ^6.0.10 + postcss-value-parser: ^4.2.0 + quick-lru: ^5.1.1 + resolve: ^1.22.1 + peerDependencies: + postcss: ^8.0.9 + bin: + tailwind: lib/cli.js + tailwindcss: lib/cli.js + checksum: ec187d180c722ec4f57537f2216c7b21269b525f12aaf353cea464d939c3e6286a1221eb3e1206e45d1f015f296171309ad4d9952899b0245cd07d9500a9401f + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.12 resolution: "tar@npm:6.1.12" @@ -8125,6 +8682,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.0.9": + version: 1.0.10 + resolution: "update-browserslist-db@npm:1.0.10" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + browserslist-lint: cli.js + checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -8141,7 +8712,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 @@ -8429,7 +9000,7 @@ wrangler@latest: languageName: node linkType: hard -"xtend@npm:~4.0.1": +"xtend@npm:^4.0.2, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a @@ -8450,6 +9021,13 @@ wrangler@latest: languageName: node linkType: hard +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -8457,7 +9035,7 @@ wrangler@latest: languageName: node linkType: hard -"yaml@npm:^1.10.0": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f