Compare commits

...

67 Commits

Author SHA1 Message Date
Leifer Mendez
028f6186b4 Update 2022-12-12 00:38:51 +01:00
Leifer Mendez
aad129ea94 Create FUNDING.yml 2022-12-12 00:31:06 +01:00
Leifer Mendez
c64560bfc3 ci(version): updated versions every packages
ci(version):  updated versions every packages
2022-12-11 22:31:51 +01:00
Leifer Mendez
255ba86506 ci(version): updated versions every packages 2022-12-11 22:31:21 +01:00
Leifer Mendez
cd2dad9d26 ci(version): updated versions every packages
ci(version):  updated versions every packages
2022-12-11 22:27:02 +01:00
Leifer Mendez
c7ff6b4794 ci(version): updated versions every packages 2022-12-11 22:26:29 +01:00
Leifer Mendez
628d55df37 ci(version): updated versions every packages
ci(version):  updated versions every packages
2022-12-11 22:18:46 +01:00
Leifer Mendez
0059a1e7fb ci(version): updated versions every packages 2022-12-11 22:18:01 +01:00
Leifer Mendez
73ea7c0063 ci(version): updated versions every packages 2022-12-11 22:16:09 +01:00
Leifer Mendez
cb9f4befa0 fix/version
fix/version
2022-12-11 22:11:24 +01:00
Leifer Mendez
decccb672a ci(ci): push 2022-12-11 22:10:42 +01:00
Leifer Mendez
51466bf1c7 ci(ci): push 2022-12-11 22:09:29 +01:00
Leifer Mendez
397798790e feat(cli): create-starter
feat(cli): create-starter
2022-12-11 22:00:53 +01:00
Leifer Mendez
d3b8310180 fix(cli): create-starter 2022-12-11 21:58:13 +01:00
Leifer Mendez
7797c2b461 fix(cli): update cli copy 2022-12-11 20:59:28 +01:00
Leifer Mendez
929e74c84b fix(starter): pre-copy fix
pre-copy fix
2022-12-11 13:46:52 +01:00
08e2552907 fix: pre-copy fix 2022-12-11 05:55:31 -06:00
6617107ab8 fix: pre-copy fix 2022-12-11 05:48:51 -06:00
Leifer Mendez
8921959ea0 Merge pull request #165 from leifermendez:fix/version
fix(ci):  balance version
2022-12-10 21:49:33 +01:00
Leifer Mendez
ec46cfdd65 fix(ci): balance version 2022-12-10 21:48:55 +01:00
Leifer Mendez
bfb69d9a95 fix(cli): clean eslinter
fix(cli):  clean eslinter
2022-12-10 21:40:20 +01:00
Leifer Mendez
15f6972257 fix(cli): clean eslinter 2022-12-10 21:38:23 +01:00
Leifer Mendez
2319db3009 fix(cli): 🔥 create script - templates
fix(cli): 🔥 create script - templates
2022-12-10 21:33:07 +01:00
Leifer Mendez
9cb98b5e73 fix(cli): 🔥 create script - templates 2022-12-10 21:27:58 +01:00
Leifer Mendez
2999e0e753 fix(cli): 🔥 create script - templates
fix(cli): 🔥 create script - templates
2022-12-10 21:22:48 +01:00
Leifer Mendez
af716b7537 fix(cli): 🔥 create script - templates 2022-12-10 21:20:57 +01:00
Leifer Mendez
c6999c8493 fix(cli): 🔥 create script - templates
fix(cli): 🔥 create script - templates
2022-12-10 21:20:07 +01:00
Leifer Mendez
d4b49a9bd7 fix(cli): 🔥 create script - templates 2022-12-10 21:19:38 +01:00
Leifer Mendez
eebc3c9806 fix(cli): 🔥 create script - templates 2022-12-10 21:17:29 +01:00
Leifer Mendez
257f1cc12d ci(ci): update ci
ci(ci):  update ci
2022-12-09 15:00:05 +01:00
Leifer Mendez
1036273a28 ci(ci): update ci 2022-12-09 14:59:21 +01:00
Leifer Mendez
1b8ed93367 ci(ci): update ci
ci(ci):  update ci
2022-12-09 14:18:06 +01:00
Leifer Mendez
8c1820c879 ci(ci): update ci 2022-12-09 14:17:26 +01:00
Leifer Mendez
e5a9db7e12 feat(ci): update ci
feat(ci): update ci
2022-12-09 14:13:43 +01:00
Leifer Mendez
9d5aa7db5d ci(ci): update ci 2022-12-09 14:12:38 +01:00
Leifer Mendez
40b0d9691e chore(ci): script releases 2022-12-09 13:50:01 +01:00
Leifer Mendez
2e906bce79 feat(ci): 🎨 relases script 2022-12-09 12:17:29 +01:00
Leifer Mendez
f05ff4cf88 style: ✏️ fixed typos
style: ✏️ fixed typos
2022-12-08 22:48:12 +01:00
Leifer Mendez
5735b49e25 Merge pull request #155 from leifermendez/feat/releases
feat(release): added
2022-12-08 22:23:03 +01:00
Leifer Mendez
1988948c30 feat(release): added 2022-12-08 22:22:04 +01:00
Leifer Mendez
cb33c0df68 Merge pull request #154 from leifermendez/feat/releases
feat(relases): added
2022-12-08 22:19:25 +01:00
Leifer Mendez
f4ad7040ab feat(release): added 2022-12-08 22:15:46 +01:00
Leifer Mendez
b115dc3654 feat(ci): 🎨 add releases 2022-12-08 21:56:34 +01:00
6rak0
8c6023e93b style: ✏️ fixed typos
fixed typos
2022-12-08 14:34:41 -06:00
Leifer Mendez
5d7c297f2f Merge pull request #150 from leifermendez/fix/ci-yarn
ci(action): update
2022-12-08 20:17:46 +01:00
Leifer Mendez
04f99d5ed2 ci(action): update 2022-12-08 20:16:31 +01:00
Leifer Mendez
bb3f21b056 Merge pull request #149 from leifermendez/fix/ci-yarn
fix(ci): update yarn
2022-12-08 20:13:02 +01:00
Leifer Mendez
cf6188d860 ci(action): update 2022-12-08 20:12:11 +01:00
Leifer Mendez
294bfbb35f ci(action): update 2022-12-08 20:11:33 +01:00
github-actions[bot]
230538bcea docs(contributor): contrib-readme-action has updated readme 2022-12-07 22:43:36 +00:00
Leifer Mendez
5e7aa72494 Merge pull request #138 from vicente1992/feat-jsonfile-adapter
feat(adapter): implementation of json file adapter
2022-12-07 23:43:21 +01:00
vicente1992
3159ea5665 Merge branch 'dev' of https://github.com/vicente1992/bot-whatsapp into feat-jsonfile-adapter 2022-12-07 17:18:36 -05:00
vicente1992
4b307efe79 fix(adapter): conflict resolution 2022-12-07 17:14:16 -05:00
github-actions[bot]
0105dab2c4 docs(contributor): contrib-readme-action has updated readme 2022-12-07 22:10:34 +00:00
github-actions[bot]
6e8e16c9a4 docs(contributor): contrib-readme-action has updated readme 2022-12-07 20:33:21 +00:00
Leifer Mendez
8d73c86946 feat(adapter): mysql adapter
feat(adapter): mysql adapter
2022-12-07 21:33:05 +01:00
Leifer Mendez
a7b19d9bff fix(bot): flow improvement + add utils 2022-12-07 21:29:48 +01:00
vicente1992
4b7de0f690 feat(adapter): sql is added to create the table 2022-12-07 15:07:38 -05:00
github-actions[bot]
520145bf7d docs(contributor): contrib-readme-action has updated readme 2022-12-07 19:54:07 +00:00
Leifer Mendez
2253d57fed Merge branch 'dev' of github.com:leifermendez/bot-whatsapp into dev 2022-12-07 18:13:00 +01:00
Leifer Mendez
0fb93f66a3 Merge branch 'fix/webwhatsapp' into dev 2022-12-07 18:12:45 +01:00
Leifer Mendez
501887300d Merge branch 'fix/delay-message' into dev 2022-12-07 18:11:49 +01:00
Leifer Mendez
14b6247106 Merge pull request #137 from vicente1992/feat-mysql-adapter
feat(adapter): added adapter mysql
2022-12-07 18:09:13 +01:00
vicente1992
afa6771903 fix(adapter): corrections are made to the adapter 2022-12-06 15:48:25 -05:00
github-actions[bot]
88af2469cb docs(contributor): contrib-readme-action has updated readme 2022-12-06 18:36:55 +00:00
Leifer Mendez
999d6742b4 Merge pull request #141 from leifermendez:feature/twilio
Feature/twilio
2022-12-06 19:36:42 +01:00
vicente1992
5e1a373730 feat(adapter): implementation of json file adapter 2022-12-02 22:27:31 -05:00
85 changed files with 1555 additions and 871 deletions

1
.eslintignore Normal file
View File

@@ -0,0 +1 @@
packages/docs/*

View File

@@ -10,5 +10,9 @@ module.exports = {
parserOptions: { parserOptions: {
ecmaVersion: 'latest', ecmaVersion: 'latest',
}, },
rules: {}, rules: {
'no-unsafe-negation': 'off',
'no-prototype-builtins': 'off',
'no-useless-escape': 'off',
},
} }

9
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,9 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: #
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
custom: "https://www.buymeacoffee.com/leifermendez"

View File

@@ -1,26 +1,111 @@
name: Test / Coverage name: BotWhatsapp CI
on: on:
push: push:
branches: [dev] branches:
- main
pull_request: pull_request:
branches: [main] branches:
- main
- dev
jobs: jobs:
build: ############ BUILD PACKAGE ############
build-package:
name: Build Package
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs:
strategy: - test-unit
matrix:
node-version: [16.x]
steps: steps:
- uses: actions/checkout@v3 - name: Checkout
- name: Use Node.js ${{ matrix.node-version }} uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: ${{ matrix.node-version }} node-version: 16.x
- run: npm install cache: 'yarn'
- run: npm run build --if-present registry-url: https://registry.npmjs.org/
- run: npm run test.unit
- run: npm run test.coverage - run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: Build Package
run: yarn build
- name: Build Eslint rules
run: yarn lint:fix
############ RELEASE ############
release:
name: Release
runs-on: ubuntu-latest
needs:
- build-package
steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ github.head_ref }}
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: Build Package
run: yarn build
- name: Release @bot-whatsapp/bot
run: yarn node ./scripts/release.js --name=bot --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/cli
run: yarn node ./scripts/release.js --name=cli --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/create-bot-whatsapp
run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/database
run: yarn node ./scripts/release.js --name=database --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/provider
run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Commit Versioning
run: |
git config --global user.name 'Leifer Mendez (githubaction)'
git config --global user.email 'leifermendez@users.noreply.github.com'
git commit -am "ci(version): :zap: updated versions every packages"
git push
############ UNIT TEST ############
test-unit:
name: Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: Unit Tests
run: yarn test

View File

@@ -1,11 +1,10 @@
name: Add contributors name: Add contributors
on: on:
schedule:
- cron: '20 20 * * *'
push:
branches: [dev]
pull_request: pull_request:
branches: [main, dev] branches:
- dev
- main
types: [closed]
jobs: jobs:
contrib-readme-job: contrib-readme-job:

5
.gitignore vendored
View File

@@ -1,4 +1,5 @@
/node_modules /node_modules
/packages/*/starters
/packages/*/node_modules /packages/*/node_modules
/packages/*/dist /packages/*/dist
/packages/*/docs/dist /packages/*/docs/dist
@@ -20,6 +21,7 @@ coverage/
log log
log/* log/*
*.log *.log
*.tgz
lib lib
tmp/ tmp/
.yarn/* .yarn/*
@@ -27,6 +29,9 @@ tmp/
!.yarn/plugins/@yarnpkg/plugin-postinstall.cjs !.yarn/plugins/@yarnpkg/plugin-postinstall.cjs
.fleet/ .fleet/
example-app*/ example-app*/
base-*/
!starters/apps/base-*/
qr.svg qr.svg
package-lock.json package-lock.json
yarn-error.log yarn-error.log
.npmrc

View File

@@ -1,5 +1,5 @@
packages/**/lib packages/**/lib
packages/docs packages/docs/*.json
**/.git **/.git
**/.svn **/.svn
**/.hg **/.hg

View File

@@ -4,6 +4,8 @@
"contributing", "contributing",
"cli", "cli",
"bot", "bot",
"provider" "provider",
"adapter",
"ci"
] ]
} }

View File

@@ -4,10 +4,10 @@
__Requerimientos:__ __Requerimientos:__
- Node v16 o superior __[descargar node](https://nodejs.org/es/download/)__ - Node v16 o superior __[descargar node](https://nodejs.org/es/download/)__
- __[Yarn](https://classic.yarnpkg.com/lang/en/docs/install/#windows-stable)__ como gestor de paquetes. En el link conseguiras las intrucciones para instalar yarn. - __[Yarn](https://classic.yarnpkg.com/lang/en/docs/install/#windows-stable)__ como gestor de paquetes. En el link conseguirás las intrucciones para instalar yarn.
- __[VSCode](https://code.visualstudio.com/download)__ (recomendado): Editor de codigo con plugins - __[VSCode](https://code.visualstudio.com/download)__ (recomendado): Editor de código con plugins.
- __[Conventional Commits](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits&ssr=false#overview)__ (plugin-vscode) este plugin te ayudara a crear commit semantico. - __[Conventional Commits](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits&ssr=false#overview)__ (plugin-vscode) este plugin te ayudará a crear commit semántico.
- Se usara la rama __dev__ *(https://github.com/leifermendez/bot-whatsapp/tree/dev)* como rama principal hasta que se haga oficialmente el lanzamiento de la V2 - Se usará la rama __dev__ *(https://github.com/leifermendez/bot-whatsapp/tree/dev)* como rama principal hasta que se haga oficialmente el lanzamiento de la V2.
### 🚀 Iniciando ### 🚀 Iniciando
@@ -22,14 +22,14 @@ yarn install
``` ```
__Compilar (build)__ __Compilar (build)__
Para compilar la aplicación es necesario ejecutar, eso te genera dentro de packages del monorepo un directorio `lib` Para compilar la aplicación es necesario ejecutar este comando, el cual genera un directorio `lib` dentro de los paquetes del monorepo.
``` ```
yarn build yarn build
``` ```
__Example-app__ __Example-app__
Se ejecuta el CLI (Command Line Interface) para ayudarte a crear un app-bot de ejemplo Se ejecuta el CLI (Command Line Interface) para ayudarte a crear un app-bot de ejemplo.
``` ```
yarn run cli yarn run cli
``` ```
@@ -42,15 +42,16 @@ npm run pre-copy
npm start npm start
``` ```
__Commit y Push__ ### __Commit y Push__
El proyecto tiene implementado __[husky](https://typicode.github.io/husky/#/)__ es una herramienta que dispara unas acciones al momento de hacer commit y hacer push
__commit:__ Los commit son semanticos esto quiere decir que deben cumplir un standar al momento de escribirlos ejemplo ` feat(adapter): new adapter myqsl ` puede ver más info sobre esto __[aquí](https://github.com/conventional-changelog/commitlint/#what-is-commitlint)__ El proyecto tiene implementado __[husky](https://typicode.github.io/husky/#/)__, es una herramienta que dispara unas acciones al momento de hacer commit y hacer push.
__push:__ Cada push ejecutar `yarn run test` el cual ejecuta los test internos que tienen que cumplir con __95% de cobertura__. __commit:__ Los commit son semánticos, esto quiere decir que deben cumplir un standar al momento de escribirlos ejemplo: ` feat(adapter): new adapter myqsl ` puede ver más info sobre esto __[aquí](https://github.com/conventional-changelog/commitlint/#what-is-commitlint)__
__push:__ Cada push ejecutar `yarn run test` el cual realiza los test internos que tienen que cumplir con __95% de cobertura__.
> Documento en constaten actualización.... > Documento en constante actualización....
------ ------
- [Discord](https://link.codigoencasa.com/DISCORD) - [Discord](https://link.codigoencasa.com/DISCORD)

View File

@@ -46,14 +46,21 @@ Video como hacer PR: https://youtu.be/Lxt8Acob6aU
<sub><b>Null</b></sub> <sub><b>Null</b></sub>
</a> </a>
</td> </td>
<td align="center">
<a href="https://github.com/jzvi12">
<img src="https://avatars.githubusercontent.com/u/10729787?v=4" width="50;" alt="jzvi12"/>
<br />
<sub><b>Null</b></sub>
</a>
</td></tr>
<tr>
<td align="center"> <td align="center">
<a href="https://github.com/tonyvazgar"> <a href="https://github.com/tonyvazgar">
<img src="https://avatars.githubusercontent.com/u/21047090?v=4" width="50;" alt="tonyvazgar"/> <img src="https://avatars.githubusercontent.com/u/21047090?v=4" width="50;" alt="tonyvazgar"/>
<br /> <br />
<sub><b>Luis Antonio Vázquez García</b></sub> <sub><b>Luis Antonio Vázquez García</b></sub>
</a> </a>
</td></tr> </td>
<tr>
<td align="center"> <td align="center">
<a href="https://github.com/ulisesvina"> <a href="https://github.com/ulisesvina">
<img src="https://avatars.githubusercontent.com/u/20508563?v=4" width="50;" alt="ulisesvina"/> <img src="https://avatars.githubusercontent.com/u/20508563?v=4" width="50;" alt="ulisesvina"/>

3
core.class.log Normal file
View File

@@ -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 }

View File

@@ -11,12 +11,13 @@
"bot:rollup": "rollup --config ./packages/bot/rollup-bot.config.js", "bot:rollup": "rollup --config ./packages/bot/rollup-bot.config.js",
"provider:rollup": "rollup --config ./packages/provider/rollup-provider.config.js ", "provider:rollup": "rollup --config ./packages/provider/rollup-provider.config.js ",
"database:rollup": "rollup --config ./packages/database/rollup-database.config.js", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js",
"create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js",
"format:check": "prettier --check ./packages", "format:check": "prettier --check ./packages",
"format:write": "prettier --write ./packages", "format:write": "prettier --write ./packages",
"fmt.staged": "pretty-quick --staged", "fmt.staged": "pretty-quick --staged",
"lint:check": "eslint ./packages", "lint:check": "eslint ./packages",
"lint:fix": "eslint --fix ./packages", "lint:fix": "eslint --fix ./packages",
"build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup", "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run create-bot-whatsapp:rollup",
"copy.lib": "node ./scripts/move.js", "copy.lib": "node ./scripts/move.js",
"test.unit": "node ./node_modules/uvu/bin.js packages test", "test.unit": "node ./node_modules/uvu/bin.js packages test",
"test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit",
@@ -80,6 +81,7 @@
"rollup": "^3.2.3", "rollup": "^3.2.3",
"rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-cleanup": "^3.2.1",
"rollup-plugin-copy": "^3.4.0", "rollup-plugin-copy": "^3.4.0",
"semver": "^7.3.8",
"standard-version": "^9.5.0", "standard-version": "^9.5.0",
"uvu": "^0.5.6" "uvu": "^0.5.6"
}, },

View File

@@ -34,16 +34,16 @@ class CoreClass {
listenerBusEvents = () => [ listenerBusEvents = () => [
{ {
event: 'preinit', event: 'preinit',
func: () => printer('Iniciando provider espere...'), func: () => printer('Iniciando proveedor, espere...'),
}, },
{ {
event: 'require_action', event: 'require_action',
func: ({ instructions, title = '⚡⚡ ACCION REQUERIDA ⚡⚡' }) => func: ({ instructions, title = '⚡⚡ ACCIÓN REQUERIDA ⚡⚡' }) =>
printer(instructions, title), printer(instructions, title),
}, },
{ {
event: 'ready', event: 'ready',
func: () => printer('Provider conectado y listo'), func: () => printer('Proveedor conectado y listo'),
}, },
{ {
event: 'auth_failure', event: 'auth_failure',

View File

@@ -1,9 +1,8 @@
{ {
"name": "@bot-whatsapp/bot", "name": "@bot-whatsapp/bot",
"version": "0.0.1", "version": "0.0.12-alpha.0",
"description": "", "description": "",
"main": "./lib/bundle.bot.cjs", "main": "./lib/bundle.bot.cjs",
"private": true,
"scripts": { "scripts": {
"bot:rollup": "node ../../node_modules/.bin/rollup index.js --config ./rollup-cli.config.js", "bot:rollup": "node ../../node_modules/.bin/rollup index.js --config ./rollup-cli.config.js",
"format:check": "prettier --check .", "format:check": "prettier --check .",

View File

@@ -19,7 +19,7 @@ class ProviderClass extends EventEmitter {
* *
*/ */
sendMessage = async (userId, message, sendMessage) => { sendMessage = async (userId, message) => {
if (NODE_ENV !== 'production') if (NODE_ENV !== 'production')
console.log('[sendMessage]', { userId, message }) console.log('[sendMessage]', { userId, message })
return message return message

View File

@@ -12,20 +12,20 @@ const checkNodeVersion = () => {
) )
process.exit(1) process.exit(1)
} }
console.log(green(`Node.js combatible ${version}`)) console.log(green(`Node.js compatible ${version}`))
console.log(``) console.log(``)
} }
const checkOs = () => { const checkOs = () => {
console.log(bgCyan('🙂 Revisando tu Sistema Operativo')) console.log(bgCyan('🙂 Revisando tu sistema operativo'))
const os = process.platform const os = process.platform
if (!os.includes('win32')) { if (!os.includes('win32')) {
const messages = [ const messages = [
`El sistema operativo actual (${os}) posiblemente requiera`, `El sistema operativo actual (${os}) posiblemente requiera`,
`una confiuración adicional referente al puppeter`, `una configuración adicional referente al puppeteer`,
``, ``,
`Recuerda pasar por el WIKI`, `Recuerda pasar por el WIKI`,
`🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalaci%C3%B3n`, `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`,
``, ``,
] ]

View File

@@ -12,9 +12,13 @@ const copyFiles = async (from, to) => {
} }
} }
const copyBaseApp = async () => { /**
const BASEP_APP_PATH_FROM = `${process.cwd()}/starters/apps/base` * Copiar directorio con archivos
const BASEP_APP_PATH_TO = `${process.cwd()}/example-app-base` * @param {*} templateName
*/
const copyBaseApp = async (fromDir = process.cwd(), toDir = process.cwd()) => {
const BASEP_APP_PATH_FROM = `${fromDir}`
const BASEP_APP_PATH_TO = `${toDir}`
await copyFiles(BASEP_APP_PATH_FROM, BASEP_APP_PATH_TO) await copyFiles(BASEP_APP_PATH_FROM, BASEP_APP_PATH_TO)
} }

View File

@@ -14,7 +14,7 @@ const getPkgManage = async () => {
} }
const installDeps = (pkgManager, packageList) => { const installDeps = (pkgManager, packageList) => {
const errorMessage = `Ocurrio un error instalando ${packageList}` const errorMessage = `Ocurrió un error instalando ${packageList}`
let childProcess = [] let childProcess = []
const installSingle = (pkgInstall) => () => { const installSingle = (pkgInstall) => () => {

View File

@@ -1,54 +1,58 @@
const prompts = require('prompts') const prompts = require('prompts')
const { yellow, red } = require('kleur') const { yellow, red, cyan } = require('kleur')
const { installAll } = require('../install')
const { cleanSession } = require('../clean')
const { copyBaseApp } = require('../create-app') const { copyBaseApp } = require('../create-app')
const { join } = require('path')
const { existsSync } = require('fs')
const { checkNodeVersion, checkOs } = require('../check') const { checkNodeVersion, checkOs } = require('../check')
const { jsonConfig } = require('../configuration')
const bannerDone = () => {
console.log(``)
console.log(
cyan(
[
`[Agradecimientos]: Este es un proyecto OpenSource, si tienes intenciones de colaborar puedes hacerlo:`,
`[😉] Comprando un cafe https://www.buymeacoffee.com/leifermendez`,
`[⭐] Dar estrella https://github.com/leifermendez/bot-whatsapp`,
`[🚀] Realizando mejoras en el codigo`,
].join('\n')
)
)
console.log(``)
}
const startInteractive = async () => { const startInteractive = async () => {
const questions = [ const questions = [
{ {
type: 'text', type: 'text',
name: 'exampeOpt', name: 'outDir',
message: message: 'Quieres crear un bot? (Y/n)',
'Quieres crear una app de ejemplo "example-app-example"? (Y/n)',
},
// {
// type: 'text',
// name: 'dependencies',
// message:
// 'Quieres actualizar las librerias "whatsapp-web.js"? (Y/n)',
// },
{
type: 'text',
name: 'cleanTmp',
message: 'Quieres limpiar la session del bot? (Y/n)',
}, },
{ {
type: 'multiselect', type: 'multiselect',
name: 'providerWs', name: 'providerWs',
message: 'Proveedor de Whatsapp', message: '¿Cuál proveedor de whatsapp quieres utilizar?',
choices: [ choices: [
{ title: 'whatsapp-web.js', value: 'whatsapp-web.js' }, { title: 'whatsapp-web.js (gratis)', value: 'wweb' },
{ title: 'Twilio', value: 'twilio' },
{ title: 'Baileys (gratis)', value: 'bailey', disabled: true },
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true }, { title: 'API Oficial (Meta)', value: 'meta', disabled: true },
{ title: 'Twilio', value: 'twilio', disabled: true },
], ],
max: 1, max: 1,
hint: 'Espacio para selecionar', hint: 'Espacio para seleccionar',
instructions: '↑/↓', instructions: '↑/↓',
}, },
{ {
type: 'multiselect', type: 'multiselect',
name: 'providerDb', name: 'providerDb',
message: 'Cual base de datos quieres usar', message: '¿Cuál base de datos quieres utilizar?',
choices: [ choices: [
{ title: 'JSONFile', value: 'json' }, { title: 'Memory', value: 'memory' },
{ title: 'MySQL', value: 'mysql', disabled: true }, { title: 'Mongo', value: 'mongo' },
{ title: 'Mongo', value: 'mongo', disabled: true }, { title: 'MySQL', value: 'mysql' },
{ title: 'Json', value: 'json', disabled: true },
], ],
max: 1, max: 1,
hint: 'Espacio para selecionar', hint: 'Espacio para seleccionar',
instructions: '↑/↓', instructions: '↑/↓',
}, },
] ]
@@ -57,90 +61,77 @@ const startInteractive = async () => {
checkNodeVersion() checkNodeVersion()
checkOs() checkOs()
const onCancel = () => { const onCancel = () => {
console.log('Proceso cancelado!') console.log('¡Proceso cancelado!')
return true return true
} }
const response = await prompts(questions, { onCancel }) const response = await prompts(questions, { onCancel })
const { const { outDir = '', providerDb = [], providerWs = [] } = response
dependencies = '',
cleanTmp = '', const createApp = async (templateName = null) => {
exampeOpt = '', if (!templateName)
providerDb = [], throw new Error('TEMPLATE_NAME_INVALID: ', templateName)
providerWs = [],
} = response const possiblesPath = [
/** join(__dirname, 'starters', 'apps', templateName),
* Question join(__dirname, '..', 'starters', 'apps', templateName),
* @returns join(__dirname, '..', '..', 'starters', 'apps', templateName),
*/ ]
const installOrUdpateDep = async () => {
const answer = dependencies.toLowerCase() || 'n' const answer = outDir.toLowerCase() || 'n'
if (answer.includes('n')) return true if (answer.includes('n')) return true
if (answer.includes('y')) { if (answer.includes('y')) {
await installAll() const indexOfPath = possiblesPath.find((a) => existsSync(a))
return true await copyBaseApp(indexOfPath, join(process.cwd(), templateName))
console.log(``)
console.log(yellow(`cd ${templateName}`))
console.log(yellow(`npm install`))
console.log(yellow(`npm start`))
console.log(``)
return outDir
} }
} }
/** /**
* Question * Selccionar Provider (meta, twilio, etc...)
* @returns * @returns
*/ */
const cleanAllSession = async () => {
const answer = cleanTmp.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await cleanSession()
return true
}
}
const createApp = async () => {
const answer = exampeOpt.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await copyBaseApp()
return true
}
}
const vendorProvider = async () => { const vendorProvider = async () => {
const [answer] = providerWs
if (!providerWs.length) { if (!providerWs.length) {
console.log( console.log(
red( red(
`Debes de seleccionar una WS Provider. Tecla [Space] para seleccionar` `Debes seleccionar un proveedor de whatsapp. Tecla [Space] para seleccionar`
) )
) )
process.exit(1) process.exit(1)
} }
console.log(yellow(`'Deberia crer una carpeta en root/provider'`)) return answer
return true
} }
/**
* Selecionar adaptador de base de datos
* @returns
*/
const dbProvider = async () => { const dbProvider = async () => {
const answer = providerDb const [answer] = providerDb
if (!providerDb.length) { if (!providerDb.length) {
console.log( console.log(
red( red(
`Debes de seleccionar una DB Provider. Tecla [Space] para seleccionar` `Debes seleccionar un proveedor de base de datos. Tecla [Space] para seleccionar`
) )
) )
process.exit(1) process.exit(1)
} }
if (answer === 'json') { return answer
console.log('Deberia crer una carpeta en root/data')
return 1
}
} }
await createApp() const providerAdapter = await vendorProvider()
await installOrUdpateDep() const dbAdapter = await dbProvider()
await cleanAllSession() const NAME_DIR = ['base', providerAdapter, dbAdapter].join('-')
await vendorProvider() await createApp(NAME_DIR)
await dbProvider() bannerDone()
await jsonConfig()
} }
module.exports = { startInteractive } module.exports = { startInteractive }

View File

@@ -1,9 +1,8 @@
{ {
"name": "@bot-whatsapp/cli", "name": "@bot-whatsapp/cli",
"version": "0.0.1", "version": "0.0.19-alpha.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"private": true,
"devDependencies": { "devDependencies": {
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
@@ -11,6 +10,7 @@
"kleur": "^4.1.5" "kleur": "^4.1.5"
}, },
"files": [ "files": [
"./starters/",
"./lib/cli/bundle.cli.cjs" "./lib/cli/bundle.cli.cjs"
], ],
"bin": { "bin": {

View File

@@ -1,5 +1,6 @@
const banner = require('../../config/banner.rollup.json') const banner = require('../../config/banner.rollup.json')
const commonjs = require('@rollup/plugin-commonjs') const commonjs = require('@rollup/plugin-commonjs')
const copy = require('rollup-plugin-copy')
const { nodeResolve } = require('@rollup/plugin-node-resolve') const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { join } = require('path') const { join } = require('path')
@@ -12,5 +13,11 @@ module.exports = {
file: PATH, file: PATH,
format: 'cjs', format: 'cjs',
}, },
plugins: [commonjs(), nodeResolve()], plugins: [
copy({
targets: [{ src: 'starters/*', dest: join(__dirname, 'starters') }],
}),
commonjs(),
nodeResolve(),
],
} }

View File

@@ -1,3 +1,3 @@
#!/usr/bin/env node #!/usr/bin/env node
const main = require('../lib/bin/bundle.create.cjs') const main = require('../lib/bundle.create-bot-whatsapp.cjs')
main() main()

View File

@@ -1,12 +1,10 @@
const { startInteractive } = require('../cli')
/** /**
* Main function * Voy a llamar directo a CLI
* Temporalmente luego mejoro esta
* parte
* @returns
*/ */
const main = () => { const main = () => startInteractive()
console.clear()
console.log(``)
console.log(`[PostInstall]: Este es el main function.`)
console.log(`[PostInstall]: 👌 Aqui podrias instalar cosas`)
console.log(``)
}
module.exports = main module.exports = main

View File

@@ -1,13 +1,15 @@
{ {
"name": "create-bot-whatsapp", "name": "create-bot-whatsapp",
"version": "0.0.1", "version": "0.0.25-alpha.0",
"description": "", "description": "",
"main": "./lib/bin/bundle.create.cjs", "main": "./lib/bundle.create-bot-whatsapp.cjs",
"private": true, "files": [
"./starters/",
"./bin/create.js",
"./lib/bundle.create-bot-whatsapp.cjs"
],
"bin": "./bin/create.js",
"dependencies": { "dependencies": {
"@bot-whatsapp/cli": "*" "@bot-whatsapp/cli": "*"
},
"bin": {
"bot": "./lib/bin/bundle.create.cjs"
} }
} }

View File

@@ -1,9 +1,10 @@
const banner = require('../../config/banner.rollup.json') const banner = require('../../config/banner.rollup.json')
const commonjs = require('@rollup/plugin-commonjs') const commonjs = require('@rollup/plugin-commonjs')
const { nodeResolve } = require('@rollup/plugin-node-resolve') const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { join } = require('path') const { join } = require('path')
const PATH = join(__dirname, 'lib', 'bin', 'bundle.create.cjs') const PATH = join(__dirname, 'lib', 'bundle.create-bot-whatsapp.cjs')
module.exports = { module.exports = {
input: join(__dirname, 'index.js'), input: join(__dirname, 'index.js'),

View File

@@ -1,20 +1,24 @@
{ {
"name": "@bot-whatsapp/database", "name": "@bot-whatsapp/database",
"version": "0.0.1", "version": "0.0.11-alpha.0",
"description": "Esto es el conector a mysql, pg, mongo", "description": "Esto es el conector a mysql, pg, mongo",
"main": "./lib/mock/index.cjs", "main": "./lib/mock/index.cjs",
"private": true,
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"files": [
"./lib/"
],
"dependencies": { "dependencies": {
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"mongodb": "^4.11.0", "mongodb": "^4.11.0",
"mysql2": "^2.3.3" "mysql2": "^2.3.3",
"stormdb": "^0.6.0"
}, },
"exports": { "exports": {
"./mock": "./lib/mock/index.cjs", "./mock": "./lib/mock/index.cjs",
"./mongo": "./lib/mongo/index.cjs", "./mongo": "./lib/mongo/index.cjs",
"./json-file": "./lib/json-file/index.cjs",
"./mysql": "./lib/mysql/index.cjs" "./mysql": "./lib/mysql/index.cjs"
} }
} }

View File

@@ -30,4 +30,12 @@ module.exports = [
}, },
plugins: [commonjs()], 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()],
},
] ]

View File

@@ -0,0 +1,48 @@
const path = require('path')
const StormDB = require('stormdb')
const engine = new StormDB.localFileEngine(
path.join(process.cwd(), './db.stormdb')
)
class JsonFileAdapter {
db
listHistory = []
constructor() {
this.init().then()
}
init() {
return new Promise((resolve) => {
this.db = new StormDB(engine)
this.db.default({ history: [] })
resolve(this.db)
})
}
getPrevByNumber = async (from) => {
const response = await this.db.get('history')
const { history } = response.state
if (!history.length) {
return null
}
const result = history.filter((res) => res.from === from).pop()
return {
...result,
}
}
save = async (ctx) => {
await this.db
.get('history')
.push({ ...ctx })
.save()
console.log('Guardado en DB...', ctx)
this.listHistory.push(ctx)
}
}
module.exports = JsonFileAdapter

View File

@@ -13,9 +13,10 @@ class MyslAdapter {
async init() { async init() {
this.db = mysql.createConnection(this.credentials) this.db = mysql.createConnection(this.credentials)
await this.db.connect((error) => { await this.db.connect(async (error) => {
if (!error) { if (!error) {
console.log(`Solicitud de conexión a base de datos exitosa`) console.log(`Solicitud de conexión a base de datos exitosa`)
await this.checkTableExists()
} }
if (error) { if (error) {
@@ -64,6 +65,42 @@ class MyslAdapter {
}) })
this.listHistory.push(ctx) this.listHistory.push(ctx)
} }
createTable = () =>
new Promise((resolve) => {
const tableName = 'history'
const sql = `CREATE TABLE ${tableName}
(id INT AUTO_INCREMENT PRIMARY KEY,
ref varchar(255) NOT NULL,
keyword varchar(255) NOT NULL,
answer longtext NOT NULL,
refSerialize varchar(255) NOT NULL,
phone varchar(255) NOT NULL,
options longtext NOT NULL
)`
this.db.query(sql, (err) => {
if (err) throw err
console.log(`Tabla ${tableName} creada correctamente `)
resolve(true)
})
})
checkTableExists = () =>
new Promise((resolve) => {
const sql = "SHOW TABLES LIKE 'history'"
this.db.query(sql, (err, rows) => {
if (err) throw err
if (!rows.length) {
this.createTable()
}
resolve(!!rows.length)
})
})
} }
module.exports = MyslAdapter module.exports = MyslAdapter

View File

@@ -1,6 +1,6 @@
import { cloudflarePagesAdaptor } from '@builder.io/qwik-city/adaptors/cloudflare-pages/vite'; import { cloudflarePagesAdaptor } from '@builder.io/qwik-city/adaptors/cloudflare-pages/vite'
import { extendConfig } from '@builder.io/qwik-city/vite'; import { extendConfig } from '@builder.io/qwik-city/vite'
import baseConfig from '../../vite.config'; import baseConfig from '../../vite.config'
export default extendConfig(baseConfig, () => { export default extendConfig(baseConfig, () => {
return { return {
@@ -15,5 +15,5 @@ export default extendConfig(baseConfig, () => {
staticGenerate: true, staticGenerate: true,
}), }),
], ],
}; }
}); })

View File

@@ -2,4 +2,4 @@
// Cloudflare Pages Functions // Cloudflare Pages Functions
// https://developers.cloudflare.com/pages/platform/functions/ // https://developers.cloudflare.com/pages/platform/functions/
export { onRequest } from '../server/entry.cloudflare-pages'; export { onRequest } from '../server/entry.cloudflare-pages'

View File

@@ -1,16 +1,16 @@
import { component$, useStyles$ } from '@builder.io/qwik'; import { component$, useStyles$ } from '@builder.io/qwik'
import { useContent, useLocation, ContentMenu } from '@builder.io/qwik-city'; import { useContent, useLocation, ContentMenu } from '@builder.io/qwik-city'
import styles from './breadcrumbs.css?inline'; import styles from './breadcrumbs.css?inline'
export const Breadcrumbs = component$(() => { export const Breadcrumbs = component$(() => {
useStyles$(styles); useStyles$(styles)
const { menu } = useContent(); const { menu } = useContent()
const loc = useLocation(); const loc = useLocation()
const breadcrumbs = createBreadcrumbs(menu, loc.pathname); const breadcrumbs = createBreadcrumbs(menu, loc.pathname)
if (breadcrumbs.length === 0) { if (breadcrumbs.length === 0) {
return null; return null
} }
return ( return (
@@ -19,44 +19,47 @@ export const Breadcrumbs = component$(() => {
<span>{b.href ? <a href={b.href}>{b.text}</a> : b.text}</span> <span>{b.href ? <a href={b.href}>{b.text}</a> : b.text}</span>
))} ))}
</nav> </nav>
); )
}); })
export function createBreadcrumbs(menu: ContentMenu | undefined, pathname: string) { export function createBreadcrumbs(
menu: ContentMenu | undefined,
pathname: string
) {
if (menu?.items) { if (menu?.items) {
for (const indexA of menu.items) { for (const indexA of menu.items) {
const breadcrumbA: ContentBreadcrumb = { const breadcrumbA: ContentBreadcrumb = {
text: indexA.text, text: indexA.text,
}; }
if (typeof indexA.href === 'string') { if (typeof indexA.href === 'string') {
breadcrumbA.href = indexA.href; breadcrumbA.href = indexA.href
} }
if (indexA.href === pathname) { if (indexA.href === pathname) {
return [breadcrumbA]; return [breadcrumbA]
} }
if (indexA.items) { if (indexA.items) {
for (const indexB of indexA.items) { for (const indexB of indexA.items) {
const breadcrumbB: ContentBreadcrumb = { const breadcrumbB: ContentBreadcrumb = {
text: indexB.text, text: indexB.text,
}; }
if (typeof indexB.href === 'string') { if (typeof indexB.href === 'string') {
breadcrumbB.href = indexB.href; breadcrumbB.href = indexB.href
} }
if (indexB.href === pathname) { if (indexB.href === pathname) {
return [breadcrumbA, breadcrumbB]; return [breadcrumbA, breadcrumbB]
} }
if (indexB.items) { if (indexB.items) {
for (const indexC of indexB.items) { for (const indexC of indexB.items) {
const breadcrumbC: ContentBreadcrumb = { const breadcrumbC: ContentBreadcrumb = {
text: indexC.text, text: indexC.text,
}; }
if (typeof indexC.href === 'string') { if (typeof indexC.href === 'string') {
breadcrumbC.href = indexC.href; breadcrumbC.href = indexC.href
} }
if (indexC.href === pathname) { if (indexC.href === pathname) {
return [breadcrumbA, breadcrumbB, breadcrumbC]; return [breadcrumbA, breadcrumbB, breadcrumbC]
} }
} }
} }
@@ -65,10 +68,10 @@ export function createBreadcrumbs(menu: ContentMenu | undefined, pathname: strin
} }
} }
return []; return []
} }
interface ContentBreadcrumb { interface ContentBreadcrumb {
text: string; text: string
href?: string; href?: string
} }

View File

@@ -1,8 +1,8 @@
import { component$, useStyles$ } from '@builder.io/qwik'; import { component$, useStyles$ } from '@builder.io/qwik'
import styles from './footer.css?inline'; import styles from './footer.css?inline'
export default component$(() => { export default component$(() => {
useStyles$(styles); useStyles$(styles)
return ( return (
<footer> <footer>
@@ -27,10 +27,14 @@ export default component$(() => {
</li> </li>
</ul> </ul>
<div> <div>
<a href="https://www.builder.io/" target="_blank" class="builder"> <a
href="https://www.builder.io/"
target="_blank"
class="builder"
>
Made with by Builder.io Made with by Builder.io
</a> </a>
</div> </div>
</footer> </footer>
); )
}); })

View File

@@ -1,12 +1,12 @@
import { component$, useStyles$ } from '@builder.io/qwik'; import { component$, useStyles$ } from '@builder.io/qwik'
import { useLocation } from '@builder.io/qwik-city'; import { useLocation } from '@builder.io/qwik-city'
import { QwikLogo } from '../icons/qwik'; import { QwikLogo } from '../icons/qwik'
import styles from './header.css?inline'; import styles from './header.css?inline'
export default component$(() => { export default component$(() => {
useStyles$(styles); useStyles$(styles)
const { pathname } = useLocation(); const { pathname } = useLocation()
return ( return (
<header> <header>
@@ -14,13 +14,19 @@ export default component$(() => {
<QwikLogo /> <QwikLogo />
</a> </a>
<nav> <nav>
<a href="/docs" class={{ active: pathname.startsWith('/docs') }}> <a
href="/docs"
class={{ active: pathname.startsWith('/docs') }}
>
Docs Docs
</a> </a>
<a href="/about-us" class={{ active: pathname.startsWith('/about-us') }}> <a
href="/about-us"
class={{ active: pathname.startsWith('/about-us') }}
>
About Us About Us
</a> </a>
</nav> </nav>
</header> </header>
); )
}); })

View File

@@ -17,4 +17,4 @@ export const QwikLogo = () => (
d="M33.3 24.69 15.02 4.75l2.6 15.62-4.66 4.51L31.91 43.7l-1.7-15.62 3.1-3.4Z" d="M33.3 24.69 15.02 4.75l2.6 15.62-4.66 4.51L31.91 43.7l-1.7-15.62 3.1-3.4Z"
/> />
</svg> </svg>
); )

View File

@@ -1,12 +1,12 @@
import { component$, useStyles$ } from '@builder.io/qwik'; import { component$, useStyles$ } from '@builder.io/qwik'
import { useContent, Link, useLocation } from '@builder.io/qwik-city'; import { useContent, Link, useLocation } from '@builder.io/qwik-city'
import styles from './menu.css?inline'; import styles from './menu.css?inline'
export default component$(() => { export default component$(() => {
useStyles$(styles); useStyles$(styles)
const { menu } = useContent(); const { menu } = useContent()
const loc = useLocation(); const loc = useLocation()
return ( return (
<aside class="menu"> <aside class="menu">
@@ -20,7 +20,8 @@ export default component$(() => {
<Link <Link
href={item.href} href={item.href}
class={{ class={{
'is-active': loc.pathname === item.href, 'is-active':
loc.pathname === item.href,
}} }}
> >
{item.text} {item.text}
@@ -32,5 +33,5 @@ export default component$(() => {
)) ))
: null} : null}
</aside> </aside>
); )
}); })

View File

@@ -1,15 +1,16 @@
import { useContent, useLocation } from '@builder.io/qwik-city'; import { useContent, useLocation } from '@builder.io/qwik-city'
import { component$, useStyles$ } from '@builder.io/qwik'; import { component$, useStyles$ } from '@builder.io/qwik'
import styles from './on-this-page.css?inline'; import styles from './on-this-page.css?inline'
export default component$(() => { export default component$(() => {
useStyles$(styles); useStyles$(styles)
const { headings } = useContent(); const { headings } = useContent()
const contentHeadings = headings?.filter((h) => h.level === 2 || h.level === 3) || []; const contentHeadings =
headings?.filter((h) => h.level === 2 || h.level === 3) || []
const { pathname } = useLocation(); const { pathname } = useLocation()
const editUrl = `#update-your-edit-url-for-${pathname}`; const editUrl = `#update-your-edit-url-for-${pathname}`
return ( return (
<aside class="on-this-page"> <aside class="on-this-page">
@@ -58,5 +59,5 @@ export default component$(() => {
</li> </li>
</ul> </ul>
</aside> </aside>
); )
}); })

View File

@@ -1,19 +1,22 @@
import { component$ } from '@builder.io/qwik'; import { component$ } from '@builder.io/qwik'
import { useDocumentHead, useLocation } from '@builder.io/qwik-city'; import { useDocumentHead, useLocation } from '@builder.io/qwik-city'
/** /**
* The RouterHead component is placed inside of the document `<head>` element. * The RouterHead component is placed inside of the document `<head>` element.
*/ */
export const RouterHead = component$(() => { export const RouterHead = component$(() => {
const head = useDocumentHead(); const head = useDocumentHead()
const loc = useLocation(); const loc = useLocation()
return ( return (
<> <>
<title>{head.title}</title> <title>{head.title}</title>
<link rel="canonical" href={loc.href} /> <link rel="canonical" href={loc.href} />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
{head.meta.map((m) => ( {head.meta.map((m) => (
@@ -28,5 +31,5 @@ export const RouterHead = component$(() => {
<style {...s.props} dangerouslySetInnerHTML={s.style} /> <style {...s.props} dangerouslySetInnerHTML={s.style} />
))} ))}
</> </>
); )
}); })

View File

@@ -7,10 +7,10 @@
* - https://qwik.builder.io/qwikcity/adaptors/cloudflare-pages/ * - https://qwik.builder.io/qwikcity/adaptors/cloudflare-pages/
* *
*/ */
import { createQwikCity } from '@builder.io/qwik-city/middleware/cloudflare-pages'; import { createQwikCity } from '@builder.io/qwik-city/middleware/cloudflare-pages'
import qwikCityPlan from '@qwik-city-plan'; import qwikCityPlan from '@qwik-city-plan'
import render from './entry.ssr'; import render from './entry.ssr'
const onRequest = createQwikCity({ render, qwikCityPlan }); const onRequest = createQwikCity({ render, qwikCityPlan })
export { onRequest }; export { onRequest }

View File

@@ -9,9 +9,9 @@
* - More code is transferred to the browser than in SSR mode. * - More code is transferred to the browser than in SSR mode.
* - Optimizer/Serialization/Deserialization code is not exercised! * - Optimizer/Serialization/Deserialization code is not exercised!
*/ */
import { render, RenderOptions } from '@builder.io/qwik'; import { render, RenderOptions } from '@builder.io/qwik'
import Root from './root'; import Root from './root'
export default function (opts: RenderOptions) { export default function (opts: RenderOptions) {
return render(document, <Root />, opts); return render(document, <Root />, opts)
} }

View File

@@ -10,11 +10,11 @@
* - https://vitejs.dev/config/preview-options.html#preview-options * - https://vitejs.dev/config/preview-options.html#preview-options
* *
*/ */
import { createQwikCity } from '@builder.io/qwik-city/middleware/node'; import { createQwikCity } from '@builder.io/qwik-city/middleware/node'
import render from './entry.ssr'; import render from './entry.ssr'
import qwikCityPlan from '@qwik-city-plan'; import qwikCityPlan from '@qwik-city-plan'
/** /**
* The default export is the QwikCity adaptor used by Vite preview. * The default export is the QwikCity adaptor used by Vite preview.
*/ */
export default createQwikCity({ render, qwikCityPlan }); export default createQwikCity({ render, qwikCityPlan })

View File

@@ -10,9 +10,9 @@
* - npm run build * - npm run build
* *
*/ */
import { renderToStream, RenderToStreamOptions } from '@builder.io/qwik/server'; import { renderToStream, RenderToStreamOptions } from '@builder.io/qwik/server'
import { manifest } from '@qwik-client-manifest'; import { manifest } from '@qwik-client-manifest'
import Root from './root'; import Root from './root'
export default function (opts: RenderToStreamOptions) { export default function (opts: RenderToStreamOptions) {
return renderToStream(<Root />, { return renderToStream(<Root />, {
@@ -23,5 +23,5 @@ export default function (opts: RenderToStreamOptions) {
lang: 'en-us', lang: 'en-us',
...opts.containerAttributes, ...opts.containerAttributes,
}, },
}); })
} }

View File

@@ -6,11 +6,12 @@
--user-font-scale: 1rem - 16px; --user-font-scale: 1rem - 16px;
--max-width: calc(100% - 1rem); --max-width: calc(100% - 1rem);
--font-body: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, --font-body: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI,
Apple Color Emoji, Segoe UI Emoji; Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;
--font-mono: 'IBM Plex Mono', Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', --font-mono: 'IBM Plex Mono', Consolas, 'Andale Mono WT', 'Andale Mono',
'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono',
'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace; 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco,
'Courier New', Courier, monospace;
color-scheme: light; color-scheme: light;
--theme-accent: #006ce9; --theme-accent: #006ce9;

View File

@@ -1,8 +1,12 @@
import { component$ } from '@builder.io/qwik'; import { component$ } from '@builder.io/qwik'
import { QwikCityProvider, RouterOutlet, ServiceWorkerRegister } from '@builder.io/qwik-city'; import {
import { RouterHead } from './components/router-head/router-head'; QwikCityProvider,
RouterOutlet,
ServiceWorkerRegister,
} from '@builder.io/qwik-city'
import { RouterHead } from './components/router-head/router-head'
import './global.css'; import './global.css'
export default component$(() => { export default component$(() => {
/* /*
@@ -22,5 +26,5 @@ export default component$(() => {
<ServiceWorkerRegister /> <ServiceWorkerRegister />
</body> </body>
</QwikCityProvider> </QwikCityProvider>
); )
}); })

View File

@@ -1,11 +1,11 @@
import { component$, Slot, useStyles$ } from '@builder.io/qwik'; import { component$, Slot, useStyles$ } from '@builder.io/qwik'
import type { DocumentHead } from '@builder.io/qwik-city'; import type { DocumentHead } from '@builder.io/qwik-city'
import Menu from '~/components/menu/menu'; import Menu from '~/components/menu/menu'
import OnThisPage from '~/components/on-this-page/on-this-page'; import OnThisPage from '~/components/on-this-page/on-this-page'
import styles from './docs.css?inline'; import styles from './docs.css?inline'
export default component$(() => { export default component$(() => {
useStyles$(styles); useStyles$(styles)
return ( return (
<div class="docs"> <div class="docs">
@@ -15,11 +15,11 @@ export default component$(() => {
</article> </article>
<OnThisPage /> <OnThisPage />
</div> </div>
); )
}); })
export const head: DocumentHead = ({ head }) => { export const head: DocumentHead = ({ head }) => {
return { return {
title: `${head.title} - Documentation`, title: `${head.title} - Documentation`,
}; }
}; }

View File

@@ -1,6 +1,6 @@
import { component$, Slot } from '@builder.io/qwik'; import { component$, Slot } from '@builder.io/qwik'
import Footer from '~/components/footer/footer'; import Footer from '~/components/footer/footer'
import Header from '~/components/header/header'; import Header from '~/components/header/header'
export default component$(() => { export default component$(() => {
return ( return (
@@ -11,5 +11,5 @@ export default component$(() => {
</main> </main>
<Footer /> <Footer />
</> </>
); )
}); })

View File

@@ -7,12 +7,12 @@
* Qwik uses a service worker to speed up your site and reduce latency, ie, not used in the traditional way of offline. * Qwik uses a service worker to speed up your site and reduce latency, ie, not used in the traditional way of offline.
* You can also use this file to add more functionality that runs in the service worker. * You can also use this file to add more functionality that runs in the service worker.
*/ */
import { setupServiceWorker } from '@builder.io/qwik-city/service-worker'; import { setupServiceWorker } from '@builder.io/qwik-city/service-worker'
setupServiceWorker(); setupServiceWorker()
addEventListener('install', () => self.skipWaiting()); addEventListener('install', () => self.skipWaiting())
addEventListener('activate', () => self.clients.claim()); addEventListener('activate', () => self.clients.claim())
declare const self: ServiceWorkerGlobalScope; declare const self: ServiceWorkerGlobalScope

View File

@@ -1,10 +1,10 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
const defaultTheme = require("tailwindcss/defaultTheme"); const defaultTheme = require('tailwindcss/defaultTheme')
const colors = require("tailwindcss/colors"); const colors = require('tailwindcss/colors')
module.exports = { module.exports = {
content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
theme: { theme: {
extend: { extend: {
colors: { colors: {
@@ -17,5 +17,5 @@ module.exports = {
}, },
}, },
plugins: [], plugins: [],
darkMode: "class", darkMode: 'class',
}; }

View File

@@ -1,7 +1,7 @@
import { defineConfig } from 'vite'; import { defineConfig } from 'vite'
import { qwikVite } from '@builder.io/qwik/optimizer'; import { qwikVite } from '@builder.io/qwik/optimizer'
import { qwikCity } from '@builder.io/qwik-city/vite'; import { qwikCity } from '@builder.io/qwik-city/vite'
import tsconfigPaths from 'vite-tsconfig-paths'; import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig(() => { export default defineConfig(() => {
return { return {
@@ -11,5 +11,5 @@ export default defineConfig(() => {
'Cache-Control': 'public, max-age=600', 'Cache-Control': 'public, max-age=600',
}, },
}, },
}; }
}); })

View File

@@ -1,12 +1,14 @@
{ {
"name": "@bot-whatsapp/provider", "name": "@bot-whatsapp/provider",
"version": "0.0.1", "version": "0.0.17-alpha.0",
"description": "Esto es el conector a Twilio, Meta, etc...", "description": "Esto es el conector a Twilio, Meta, etc...",
"main": "./lib/mock/index.cjs", "main": "./lib/mock/index.cjs",
"private": true,
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"files": [
"./lib/"
],
"dependencies": { "dependencies": {
"@bot-whatsapp/bot": "*", "@bot-whatsapp/bot": "*",
"qr-image": "^3.2.0" "qr-image": "^3.2.0"

View File

@@ -5,6 +5,12 @@ const TwilioWebHookServer = require('./server')
const { parseNumber } = require('./utils') const { parseNumber } = require('./utils')
/** /**
* ⚙TwilioProvider: Es un provedor que te ofrece enviar
* mensaje a Whatsapp via API
* info: https://www.twilio.com/es-mx/messaging/whatsapp
* video: https://youtu.be/KoOmsHylxUw
*
* Necesitas las siguientes tokens y valores
* { accountSid, authToken, vendorNumber } * { accountSid, authToken, vendorNumber }
*/ */
class TwilioProvider extends ProviderClass { class TwilioProvider extends ProviderClass {
@@ -15,7 +21,7 @@ class TwilioProvider extends ProviderClass {
super() super()
this.vendor = new twilio(accountSid, authToken) this.vendor = new twilio(accountSid, authToken)
this.twilioHook = new TwilioWebHookServer(_port) this.twilioHook = new TwilioWebHookServer(_port)
this.vendorNumber = vendorNumber this.vendorNumber = parseNumber(vendorNumber)
this.twilioHook.start() this.twilioHook.start()
const listEvents = this.busEvents() const listEvents = this.busEvents()
@@ -25,14 +31,6 @@ class TwilioProvider extends ProviderClass {
} }
} }
sendMessage = async (number, message) => {
return this.vendor.messages.create({
body: message,
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 * Mapeamos los eventos nativos de whatsapp-web.js a los que la clase Provider espera
* para tener un standar de eventos * para tener un standar de eventos
@@ -54,6 +52,65 @@ class TwilioProvider extends ProviderClass {
}, },
}, },
] ]
/**
* Enviar un archivo multimedia
* https://www.twilio.com/es-mx/docs/whatsapp/tutorial/send-and-receive-media-messages-whatsapp-nodejs
* @private
* @param {*} number
* @param {*} mediaInput
* @returns
*/
sendMedia = async (number, message, mediaInput = null) => {
if (!mediaInput) throw new Error(`MEDIA_INPUT_NULL_: ${mediaInput}`)
number = parseNumber(number)
return this.vendor.messages.create({
mediaUrl: [`${mediaInput}`],
body: message,
from: `whatsapp:+${this.vendorNumber}`,
to: `whatsapp:+${number}`,
})
}
/**
* Enviar botones
* https://www.twilio.com/es-mx/docs/whatsapp/buttons
* @private
* @param {*} number
* @param {*} message
* @param {*} buttons []
* @returns
*/
sendButtons = async () => {
console.log(``)
console.log(
`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`
)
console.log(
`[NOTA]: https://www.twilio.com/es-mx/docs/whatsapp/buttons`
)
console.log(``)
}
/**
*
* @param {*} userId
* @param {*} message
* @param {*} param2
* @returns
*/
sendMessage = async (number, message, { options }) => {
number = parseNumber(number)
if (options?.buttons?.length)
this.sendButtons(number, message, options.buttons)
if (options?.media)
return this.sendMedia(number, message, options.media)
return this.vendor.messages.create({
body: message,
from: `whatsapp:+${this.vendorNumber}`,
to: `whatsapp:+${number}`,
})
}
} }
module.exports = TwilioProvider module.exports = TwilioProvider

View File

@@ -11,6 +11,7 @@ class TwilioWebHookServer extends EventEmitter {
twilioServer twilioServer
twilioPort twilioPort
constructor(_twilioPort) { constructor(_twilioPort) {
super()
this.twilioServer = this.buildHTTPServer() this.twilioServer = this.buildHTTPServer()
this.twilioPort = _twilioPort this.twilioPort = _twilioPort
} }
@@ -51,7 +52,7 @@ class TwilioWebHookServer extends EventEmitter {
console.log(``) console.log(``)
console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`) console.log(`[Twilio]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
console.log( console.log(
`[Twilio]: http://localhost:${this.twilioPort}/twilio-hook` `[Twilio]: POST http://localhost:${this.twilioPort}/twilio-hook`
) )
console.log(`[Twilio]: Más información en la documentacion`) console.log(`[Twilio]: Más información en la documentacion`)
console.log(``) console.log(``)

View File

@@ -1,21 +1,20 @@
const { const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js')
Client,
LocalAuth,
MessageMedia,
Buttons,
List,
} = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/bot') const { ProviderClass } = require('@bot-whatsapp/bot')
const { Console } = require('console') const { Console } = require('console')
const { createWriteStream, existsSync } = require('fs') const { createWriteStream } = require('fs')
const { cleanNumber, generateImage, isValidNumber } = require('./utils') const {
cleanNumber,
generateImage,
isValidNumber,
downloadMedia,
} = require('./utils')
const logger = new Console({ const logger = new Console({
stdout: createWriteStream('./log'), stdout: createWriteStream('./log'),
}) })
/** /**
* WebWhatsappProvider: Es una clase tipo adaptor * ⚙️ WebWhatsappProvider: Es una clase tipo adaptor
* que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas)
* https://github.com/pedroslopez/whatsapp-web.js * https://github.com/pedroslopez/whatsapp-web.js
*/ */
@@ -97,9 +96,9 @@ class WebWhatsappProvider extends ProviderClass {
* @returns * @returns
*/ */
sendMedia = async (number, mediaInput = null) => { sendMedia = async (number, mediaInput = null) => {
if (!existsSync(mediaInput)) if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) const fileDownloaded = await downloadMedia(mediaInput)
const media = MessageMedia.fromFilePath(mediaInput) const media = MessageMedia.fromFilePath(fileDownloaded)
return this.vendor.sendMessage(number, media, { return this.vendor.sendMessage(number, media, {
sendAudioAsVoice: true, sendAudioAsVoice: true,
}) })
@@ -129,19 +128,19 @@ class WebWhatsappProvider extends ProviderClass {
* @param {*} buttons [] * @param {*} buttons []
* @returns * @returns
*/ */
sendList = async (number, message, listInput = []) => { // sendList = async (number, message, listInput = []) => {
let sections = [ // let sections = [
{ // {
title: 'sectionTitle', // title: 'sectionTitle',
rows: [ // rows: [
{ title: 'ListItem1', description: 'desc' }, // { title: 'ListItem1', description: 'desc' },
{ title: 'ListItem2' }, // { title: 'ListItem2' },
], // ],
}, // },
] // ]
let list = new List('List body', 'btnText', sections, 'Title', 'footer') // let list = new List('List body', 'btnText', sections, 'Title', 'footer')
return this.vendor.sendMessage(number, list) // return this.vendor.sendMessage(number, list)
} // }
/** /**
* Enviar un mensaje solo texto * Enviar un mensaje solo texto
@@ -164,9 +163,9 @@ class WebWhatsappProvider extends ProviderClass {
*/ */
sendMessage = async (userId, message, { options }) => { sendMessage = async (userId, message, { options }) => {
const number = cleanNumber(userId) const number = cleanNumber(userId)
if (options?.media) return this.sendMedia(number, options.media)
if (options?.buttons?.length) if (options?.buttons?.length)
return this.sendButtons(number, message, options.buttons) return this.sendButtons(number, message, options.buttons)
if (options?.media) return this.sendMedia(number, options.media)
return this.sendText(number, message) return this.sendText(number, message)
} }
} }

View File

@@ -1,5 +1,8 @@
const { createWriteStream } = require('fs') const { createWriteStream } = require('fs')
const qr = require('qr-image') const qr = require('qr-image')
const { tmpdir } = require('os')
const http = require('http')
const https = require('https')
const cleanNumber = (number, full = false) => { const cleanNumber = (number, full = false) => {
number = number.replace('@c.us', '') number = number.replace('@c.us', '')
@@ -18,4 +21,33 @@ const isValidNumber = (rawNumber) => {
return !exist return !exist
} }
module.exports = { cleanNumber, generateImage, isValidNumber } /**
* Incompleta
* Descargar archivo multimedia para enviar
* @param {*} url
* @returns
*/
const downloadMedia = (url) => {
return new Promise((resolve, reject) => {
const ext = url.split('.').pop()
const checkProtocol = url.includes('https:')
const handleHttp = checkProtocol ? https : http
const name = `tmp-${Date.now()}.${ext}`
const fullPath = `${tmpdir()}/${name}`
const file = createWriteStream(fullPath)
handleHttp.get(url, function (response) {
response.pipe(file)
file.on('finish', function () {
file.close()
resolve(fullPath)
})
file.on('error', function () {
console.log('errro')
file.close()
reject(null)
})
})
})
}
module.exports = { cleanNumber, generateImage, isValidNumber, downloadMedia }

View File

@@ -15,4 +15,4 @@ Promise.all([
copyLibPkg('bot', appDir), copyLibPkg('bot', appDir),
copyLibPkg('database', appDir), copyLibPkg('database', appDir),
copyLibPkg('provider', appDir), copyLibPkg('provider', appDir),
]).then(() => console.log('Todas las lib copiadas')) ]).then(() => console.log('Todas las librerías copiadas'))

123
scripts/release.js Normal file
View File

@@ -0,0 +1,123 @@
const { writeFile, readFileSync } = require('fs')
const { join } = require('path')
const { execFile } = require('node:child_process')
const process = require('node:process')
const util = require('node:util')
const OS_ENVIROMENT_WIN = process.platform.includes('win32')
const semver = require('semver')
const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm'
const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN] = process.argv.slice(2) || [null]
const PATH_PACKAGES = join(__dirname, '..', `packages`)
const cmd = util.promisify(execFile)
/**
* Create Token
*/
const npmToken = (token = null) =>
new Promise((resolve, reject) => {
writeFile(
`${process.cwd()}/.npmrc`,
`//registry.npmjs.org/:_authToken=${token}`,
(error) => {
if (error) reject(error)
resolve()
}
)
})
/**
* Leer package json
* @param {*} packageName
* @returns
*/
const readPackage = (packageName = null) => {
const pkgJson = join(PATH_PACKAGES, packageName, 'package.json')
const rawFile = readFileSync(pkgJson, 'utf-8')
if (!rawFile) throw new Error(`ERROR_FILE_READ`)
return JSON.parse(rawFile)
}
/**
* Actualizar package json
* @param {*} packageName
* @param {*} newPkgJson
*/
const updatePackage = (packageName = null, newPkgJson) => {
return new Promise((resolve, reject) => {
const pkgJson = join(PATH_PACKAGES, packageName, 'package.json')
if (!Object.keys(newPkgJson).length) throw new Error(`ERROR_FILE_READ`)
writeFile(pkgJson, newPkgJson, (err) => {
if (err) reject(err)
resolve(true)
})
})
}
/**
* Actualizar version
* @param {*} packageName
*/
const updateVersion = async (packageName = null, number = null) => {
if (!packageName) throw new Error(`PATH_ERROR_PACKAGE: ${packageName}`)
const pkgJsonObject = readPackage(packageName)
const { version } = pkgJsonObject
const newVersion = !number
? semver.inc(version, 'prepatch', 'alpha')
: `${number}`
if (!semver.valid(newVersion))
throw new Error(`VERSION_ERROR: ${newVersion}`)
const newPkgJson = JSON.stringify(
{ ...pkgJsonObject, version: newVersion },
null,
2
)
await updatePackage(packageName, newPkgJson)
return { version: newVersion }
}
const packRelease = async (packageName) => {
const pkgJson = join(PATH_PACKAGES, packageName)
const { stdout } = await cmd(NPM_COMMAND, ['pack'], {
stdio: 'inherit',
cwd: pkgJson,
})
return stdout
}
const publishRelease = async (packageName, latest = null) => {
const args = !latest ? ['--tag', 'dev'] : ['--access', 'public']
const pkgJson = join(PATH_PACKAGES, packageName)
const { stdout } = await cmd(NPM_COMMAND, ['publish'].concat(args), {
stdio: 'inherit',
cwd: pkgJson,
})
console.log(stdout)
return stdout
}
/**
* Recibe los argumentos entrantes
*/
const main = async () => {
if (PKG_ARG) {
const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null
const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null
const pkgNumber = PKG_ARG_VERSION
? PKG_ARG_VERSION.split('=').at(1)
: null
if (tokenNpm) await npmToken(tokenNpm)
await updateVersion(pkgName, pkgNumber)
await packRelease(pkgName)
await publishRelease(pkgName, pkgNumber)
}
}
main()

View File

@@ -1,10 +1,10 @@
{ {
"name": "bot-whatsapp-basic", "name": "bot-whatsapp-base",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"pre-copy": "cd .. && yarn run copy.lib example-app-basic", "pre-copy": "cd .. && yarn run copy.lib base-twilio-memory",
"start": "node app.js" "start": "node app.js"
}, },
"keywords": [], "keywords": [],

View File

@@ -1,9 +1,9 @@
### BASIC APP ### BASE APP
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
- Bienvenido a mi tienda
- Como puedo ayudarte?
![](https://i.imgur.com/0z0G91w.png) - Tengo: Zapatos Bolsos etc..
------ ------
- [Discord](https://link.codigoencasa.com/DISCORD) - [Discord](https://link.codigoencasa.com/DISCORD)

View File

@@ -0,0 +1,28 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

View File

@@ -0,0 +1,16 @@
{
"name": "bot-whatsapp-base",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-twilio-mongo",
"start": "node app.js"
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.3"
},
"author": "",
"license": "ISC"
}

View File

@@ -0,0 +1,12 @@
### BASE APP
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
- Bienvenido a mi tienda
- Como puedo ayudarte?
- Tengo: Zapatos Bolsos etc..
------
- [Discord](https://link.codigoencasa.com/DISCORD)
- [Twitter](https://twitter.com/leifermendez)
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
- [Telegram](https://t.me/leifermendez)

View File

@@ -0,0 +1,28 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

View File

@@ -0,0 +1,16 @@
{
"name": "bot-whatsapp-base",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-twilio-mysql",
"start": "node app.js"
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.3"
},
"author": "",
"license": "ISC"
}

View File

@@ -0,0 +1,12 @@
### BASE APP
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
- Bienvenido a mi tienda
- Como puedo ayudarte?
- Tengo: Zapatos Bolsos etc..
------
- [Discord](https://link.codigoencasa.com/DISCORD)
- [Twitter](https://twitter.com/leifermendez)
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
- [Telegram](https://t.me/leifermendez)

View File

@@ -0,0 +1,28 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

View File

@@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"pre-copy": "cd .. && yarn run copy.lib example-app-base", "pre-copy": "cd .. && yarn run copy.lib base-wweb-memory",
"start": "node app.js" "start": "node app.js"
}, },
"keywords": [], "keywords": [],

View File

@@ -0,0 +1,12 @@
### BASE APP
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
- Bienvenido a mi tienda
- Como puedo ayudarte?
- Tengo: Zapatos Bolsos etc..
------
- [Discord](https://link.codigoencasa.com/DISCORD)
- [Twitter](https://twitter.com/leifermendez)
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
- [Telegram](https://t.me/leifermendez)

View File

@@ -0,0 +1,28 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

View File

@@ -0,0 +1,16 @@
{
"name": "bot-whatsapp-base",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-wweb-mongo",
"start": "node app.js"
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.3"
},
"author": "",
"license": "ISC"
}

View File

@@ -0,0 +1,12 @@
### BASE APP
Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde.
- Bienvenido a mi tienda
- Como puedo ayudarte?
- Tengo: Zapatos Bolsos etc..
------
- [Discord](https://link.codigoencasa.com/DISCORD)
- [Twitter](https://twitter.com/leifermendez)
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
- [Telegram](https://t.me/leifermendez)

View File

@@ -0,0 +1,28 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

View File

@@ -0,0 +1,16 @@
{
"name": "bot-whatsapp-base",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"pre-copy": "cd .. && yarn run copy.lib base-wweb-mysql",
"start": "node app.js"
},
"keywords": [],
"dependencies": {
"whatsapp-web.js": "^1.18.3"
},
"author": "",
"license": "ISC"
}

View File

@@ -1,55 +0,0 @@
const {
createBot,
createProvider,
createFlow,
addKeyword,
addChild,
} = require('@bot-whatsapp/bot')
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
const MockAdapter = require('@bot-whatsapp/database/mock')
/**
* Declarando flujo hijo
*/
const flowZapatos = addKeyword(['zapatos', 'ZAPATOS'])
.addAnswer('🤯 Veo que elegiste zapatos')
.addAnswer('Tengo muchos zapatos...bla bla')
const flowBolsos = addKeyword(['bolsos', 'BOLSOS'])
.addAnswer('🙌 Veo que elegiste bolsos')
.addAnswer('Tengo muchos bolsos...bla bla')
/**
* Declarando flujo principal
*/
const flowPrincipal = addKeyword(['hola', 'ole', 'HOLA'])
.addAnswer('Bienvenido a mi tienda')
.addAnswer('Como puedo ayudarte?')
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc..'])
.addAnswer('Escribe zapatos o bolsos')
.addAnswer(
'esperando respuesta...',
{ capture: true },
(ctx) => {
console.log('Aqui puedes ver más info del usuario...')
console.log('Puedes enviar un mail, hook, etc..')
console.log(ctx)
},
[...addChild(flowBolsos), ...addChild(flowZapatos)]
)
const main = async () => {
const adapterDB = new MockAdapter()
const adapterFlow = createFlow([flowPrincipal])
const adapterProvider = createProvider(WebWhatsappProvider)
createBot({
flow: adapterFlow,
provider: adapterProvider,
database: adapterDB,
})
}
main()

185
yarn.lock
View File

@@ -82,15 +82,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/client-cognito-identity@npm:3.222.0": "@aws-sdk/client-cognito-identity@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/client-cognito-identity@npm:3.222.0" resolution: "@aws-sdk/client-cognito-identity@npm:3.223.0"
dependencies: dependencies:
"@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0 "@aws-crypto/sha256-js": 2.0.0
"@aws-sdk/client-sts": 3.222.0 "@aws-sdk/client-sts": 3.223.0
"@aws-sdk/config-resolver": 3.222.0 "@aws-sdk/config-resolver": 3.222.0
"@aws-sdk/credential-provider-node": 3.222.0 "@aws-sdk/credential-provider-node": 3.223.0
"@aws-sdk/fetch-http-handler": 3.222.0 "@aws-sdk/fetch-http-handler": 3.222.0
"@aws-sdk/hash-node": 3.222.0 "@aws-sdk/hash-node": 3.222.0
"@aws-sdk/invalid-dependency": 3.222.0 "@aws-sdk/invalid-dependency": 3.222.0
@@ -116,19 +116,18 @@ __metadata:
"@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-browser": 3.222.0
"@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0
"@aws-sdk/util-endpoints": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0
"@aws-sdk/util-retry": 3.222.0
"@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-browser": 3.222.0
"@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0
"@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-browser": 3.188.0
"@aws-sdk/util-utf8-node": 3.208.0 "@aws-sdk/util-utf8-node": 3.208.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: b733d9bad0232a17967da9b27311cb2adf41acaefc584173e6d74b3b966ed3908b9e9fa65b3a0f3e12709dc305e64b1a5351ea43ac666650a375cb10143368e3 checksum: ada894c3fbe943044617d719dc947af51546dbfea72e5b63f23c6230677c39dc0355248ed1ba119a29f2d4b7bc64e28400880b580a263bcd45d05fdf45007ad7
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/client-sso-oidc@npm:3.222.0": "@aws-sdk/client-sso-oidc@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/client-sso-oidc@npm:3.222.0" resolution: "@aws-sdk/client-sso-oidc@npm:3.223.0"
dependencies: dependencies:
"@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0 "@aws-crypto/sha256-js": 2.0.0
@@ -157,19 +156,18 @@ __metadata:
"@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-browser": 3.222.0
"@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0
"@aws-sdk/util-endpoints": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0
"@aws-sdk/util-retry": 3.222.0
"@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-browser": 3.222.0
"@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0
"@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-browser": 3.188.0
"@aws-sdk/util-utf8-node": 3.208.0 "@aws-sdk/util-utf8-node": 3.208.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: 40674d89438b689480bdfa10bfb044d90341d87096ae6b0803e6ecc1695d48b1f7a8c513109e92001c380e2b2f5b18aa3e8af1c8ecd3d2f04f63f160cb039611 checksum: ab5b6142d897ec48a3bb246577c23d1b6e26ee228c7ce264f826d10f88caa83e03f0dac9d88e361c70b778ceef45f0ebd9712cd03ca5b60ab240a3d4382ecb7c
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/client-sso@npm:3.222.0": "@aws-sdk/client-sso@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/client-sso@npm:3.222.0" resolution: "@aws-sdk/client-sso@npm:3.223.0"
dependencies: dependencies:
"@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0 "@aws-crypto/sha256-js": 2.0.0
@@ -198,24 +196,23 @@ __metadata:
"@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-browser": 3.222.0
"@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0
"@aws-sdk/util-endpoints": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0
"@aws-sdk/util-retry": 3.222.0
"@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-browser": 3.222.0
"@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0
"@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-browser": 3.188.0
"@aws-sdk/util-utf8-node": 3.208.0 "@aws-sdk/util-utf8-node": 3.208.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: bc0cd1125bc5aa94b3fdec15167ce9539acf4a187da060d51fa8ad7c30d0bf6cfee9e3a0175d65e204aba92efee4087c99d1190e1b43927c01cd7a8b1bbbb93e checksum: 856e3745182906d274dc894baa7d853966b0074f89ea892f29132e1cefdf49f267f1d0fffaa2de3de352d19ff3963d59290602057bd4510731e0156199bed664
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/client-sts@npm:3.222.0": "@aws-sdk/client-sts@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/client-sts@npm:3.222.0" resolution: "@aws-sdk/client-sts@npm:3.223.0"
dependencies: dependencies:
"@aws-crypto/sha256-browser": 2.0.0 "@aws-crypto/sha256-browser": 2.0.0
"@aws-crypto/sha256-js": 2.0.0 "@aws-crypto/sha256-js": 2.0.0
"@aws-sdk/config-resolver": 3.222.0 "@aws-sdk/config-resolver": 3.222.0
"@aws-sdk/credential-provider-node": 3.222.0 "@aws-sdk/credential-provider-node": 3.223.0
"@aws-sdk/fetch-http-handler": 3.222.0 "@aws-sdk/fetch-http-handler": 3.222.0
"@aws-sdk/hash-node": 3.222.0 "@aws-sdk/hash-node": 3.222.0
"@aws-sdk/invalid-dependency": 3.222.0 "@aws-sdk/invalid-dependency": 3.222.0
@@ -242,14 +239,13 @@ __metadata:
"@aws-sdk/util-defaults-mode-browser": 3.222.0 "@aws-sdk/util-defaults-mode-browser": 3.222.0
"@aws-sdk/util-defaults-mode-node": 3.222.0 "@aws-sdk/util-defaults-mode-node": 3.222.0
"@aws-sdk/util-endpoints": 3.222.0 "@aws-sdk/util-endpoints": 3.222.0
"@aws-sdk/util-retry": 3.222.0
"@aws-sdk/util-user-agent-browser": 3.222.0 "@aws-sdk/util-user-agent-browser": 3.222.0
"@aws-sdk/util-user-agent-node": 3.222.0 "@aws-sdk/util-user-agent-node": 3.222.0
"@aws-sdk/util-utf8-browser": 3.188.0 "@aws-sdk/util-utf8-browser": 3.188.0
"@aws-sdk/util-utf8-node": 3.208.0 "@aws-sdk/util-utf8-node": 3.208.0
fast-xml-parser: 4.0.11 fast-xml-parser: 4.0.11
tslib: ^2.3.1 tslib: ^2.3.1
checksum: 79f18e5b44541673213715e3465a8b000716c03120ea087e6920abba3542683dbd4b881ecb091ef90df34947eec00c82daf70089ea0e5e92cffbb4e57e2d76d7 checksum: 6976345f839b0028a0e83f6d11e3323da68cef103ae5381299c6d75df25a1ef336b83023c79896242fbc4b7d2a27f3deebb1b1922e815e6cc7780f3eee302210
languageName: node languageName: node
linkType: hard linkType: hard
@@ -266,15 +262,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/credential-provider-cognito-identity@npm:3.222.0": "@aws-sdk/credential-provider-cognito-identity@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.222.0" resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/client-cognito-identity": 3.222.0 "@aws-sdk/client-cognito-identity": 3.223.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: e6a61cf601825907931ed0cc42050b895b150468feb95c1052e053ce00d33e8d225663ca337da1c5825eee7e24438311ba0d28b2a6021868d3e6796aa81fdeeb checksum: e0f03110b120699ef9c458edd5b1a248f5e3f360931b2e8be7ebb7fc33da51ac1c3fdf96bb05a755a2d303c00c7effee7a582706da2333b4ee43c0040ff551a5
languageName: node languageName: node
linkType: hard linkType: hard
@@ -302,37 +298,37 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/credential-provider-ini@npm:3.222.0": "@aws-sdk/credential-provider-ini@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/credential-provider-ini@npm:3.222.0" resolution: "@aws-sdk/credential-provider-ini@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/credential-provider-env": 3.222.0 "@aws-sdk/credential-provider-env": 3.222.0
"@aws-sdk/credential-provider-imds": 3.222.0 "@aws-sdk/credential-provider-imds": 3.222.0
"@aws-sdk/credential-provider-sso": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0
"@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/credential-provider-web-identity": 3.222.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: eac19a9b52066f76cf23bee102369df7d50097dfee3be14b12c2e178c16868acd1a79b13c00d3e3ac40d2fbc14b4e2b06119d0c51c5d875c6be3606c33514d62 checksum: f407fe591999f1da1d5580b182af261ceeb4455da9a53d18ae871c9cf244e6e72fa10ef28036419790e2b5787d64c5de5b4daf4c7f69acb866894410baa880d0
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/credential-provider-node@npm:3.222.0": "@aws-sdk/credential-provider-node@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/credential-provider-node@npm:3.222.0" resolution: "@aws-sdk/credential-provider-node@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/credential-provider-env": 3.222.0 "@aws-sdk/credential-provider-env": 3.222.0
"@aws-sdk/credential-provider-imds": 3.222.0 "@aws-sdk/credential-provider-imds": 3.222.0
"@aws-sdk/credential-provider-ini": 3.222.0 "@aws-sdk/credential-provider-ini": 3.223.0
"@aws-sdk/credential-provider-process": 3.222.0 "@aws-sdk/credential-provider-process": 3.222.0
"@aws-sdk/credential-provider-sso": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0
"@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/credential-provider-web-identity": 3.222.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: f17ce6c9b45d48d9bebd63766b5d85e45f6a1d50b02bea4784d0055269a0f5c05e5ba343c6b138cd29086b94c6bb4511568e9fb59f340f3988526b2d7950cb4c checksum: 6ce5f88f75a6e879344ea76fa2b390c779d74f1b3657fa15367b15797b09d9713ef0d2f14c95421254a6bc0b8bde1acd2634978a6549e02a74c33160ae6130fd
languageName: node languageName: node
linkType: hard linkType: hard
@@ -348,17 +344,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/credential-provider-sso@npm:3.222.0": "@aws-sdk/credential-provider-sso@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/credential-provider-sso@npm:3.222.0" resolution: "@aws-sdk/credential-provider-sso@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/client-sso": 3.222.0 "@aws-sdk/client-sso": 3.223.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0
"@aws-sdk/token-providers": 3.222.0 "@aws-sdk/token-providers": 3.223.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: 8e0a39a722fd6548b9758ab4c711eac9128a64bae1fa9bfce5f0b92c2df34883fdcd544c9a48f501d3a7b695e6d0b51a9b5e1be1b7eac626a1818860cfc86072 checksum: 4593a94dc86ef7218517061cf875285c2c6087f1d4a1199442055e6165701f11f9921612a04ab3c1b3f29b3132d46a8ce8cd26070fad132509e20eca1b89f217
languageName: node languageName: node
linkType: hard linkType: hard
@@ -374,25 +370,25 @@ __metadata:
linkType: hard linkType: hard
"@aws-sdk/credential-providers@npm:^3.186.0": "@aws-sdk/credential-providers@npm:^3.186.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/credential-providers@npm:3.222.0" resolution: "@aws-sdk/credential-providers@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/client-cognito-identity": 3.222.0 "@aws-sdk/client-cognito-identity": 3.223.0
"@aws-sdk/client-sso": 3.222.0 "@aws-sdk/client-sso": 3.223.0
"@aws-sdk/client-sts": 3.222.0 "@aws-sdk/client-sts": 3.223.0
"@aws-sdk/credential-provider-cognito-identity": 3.222.0 "@aws-sdk/credential-provider-cognito-identity": 3.223.0
"@aws-sdk/credential-provider-env": 3.222.0 "@aws-sdk/credential-provider-env": 3.222.0
"@aws-sdk/credential-provider-imds": 3.222.0 "@aws-sdk/credential-provider-imds": 3.222.0
"@aws-sdk/credential-provider-ini": 3.222.0 "@aws-sdk/credential-provider-ini": 3.223.0
"@aws-sdk/credential-provider-node": 3.222.0 "@aws-sdk/credential-provider-node": 3.223.0
"@aws-sdk/credential-provider-process": 3.222.0 "@aws-sdk/credential-provider-process": 3.222.0
"@aws-sdk/credential-provider-sso": 3.222.0 "@aws-sdk/credential-provider-sso": 3.223.0
"@aws-sdk/credential-provider-web-identity": 3.222.0 "@aws-sdk/credential-provider-web-identity": 3.222.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: a6c159abbc210d62ed7d1153278b423595493583f53ec2a9143b402ee149cc1ae39be41615c76c3b658e1e9f70e89019a594c8e7a6a320cf7ea37443714a79ac checksum: 289d043f41460751e90c3adc323f3a56e517f67c0a7f8889249e0969b3302f19d093eef4a10d3528bdf34f1043f95fa41555ed5c91af4d2ca636cded1775c81c
languageName: node languageName: node
linkType: hard linkType: hard
@@ -678,16 +674,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@aws-sdk/token-providers@npm:3.222.0": "@aws-sdk/token-providers@npm:3.223.0":
version: 3.222.0 version: 3.223.0
resolution: "@aws-sdk/token-providers@npm:3.222.0" resolution: "@aws-sdk/token-providers@npm:3.223.0"
dependencies: dependencies:
"@aws-sdk/client-sso-oidc": 3.222.0 "@aws-sdk/client-sso-oidc": 3.223.0
"@aws-sdk/property-provider": 3.222.0 "@aws-sdk/property-provider": 3.222.0
"@aws-sdk/shared-ini-file-loader": 3.222.0 "@aws-sdk/shared-ini-file-loader": 3.222.0
"@aws-sdk/types": 3.222.0 "@aws-sdk/types": 3.222.0
tslib: ^2.3.1 tslib: ^2.3.1
checksum: e0d2d9af50570ca1e9ae4cfe32889a9146a0e49ce3004dfc4d5305ba0f64b7561da95d09ccaf18927638417d3bd1eb9772cb58256aef242beab03a56e4e68883 checksum: 08d724bc685b90761159b449413c9dddb581cc61cd982ee9a189e8682d1a703acc70663beec2ae31d1ebf6fe9a86480b63fb65da531e35b2e8772a2c3906969f
languageName: node languageName: node
linkType: hard linkType: hard
@@ -819,16 +815,6 @@ __metadata:
languageName: node languageName: node
linkType: hard 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
languageName: node
linkType: hard
"@aws-sdk/util-uri-escape@npm:3.201.0": "@aws-sdk/util-uri-escape@npm:3.201.0":
version: 3.201.0 version: 3.201.0
resolution: "@aws-sdk/util-uri-escape@npm:3.201.0" resolution: "@aws-sdk/util-uri-escape@npm:3.201.0"
@@ -918,7 +904,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@bot-whatsapp/bot@*, @bot-whatsapp/bot@workspace:packages/bot": "@bot-whatsapp/bot@npm:*":
version: 0.0.1
resolution: "@bot-whatsapp/bot@npm:0.0.1"
dependencies:
dotenv: ^16.0.3
checksum: 4a9e6e4e3793149f65a569a2b672a6c71aa5ca34e169ca2230b4617c268ee0cd68a9bf10311f7a856a514a55e63fba97c2257f796056c25c3881646cebb18107
languageName: node
linkType: hard
"@bot-whatsapp/bot@workspace:packages/bot":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@bot-whatsapp/bot@workspace:packages/bot" resolution: "@bot-whatsapp/bot@workspace:packages/bot"
dependencies: dependencies:
@@ -930,7 +925,16 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@bot-whatsapp/cli@*, @bot-whatsapp/cli@workspace:packages/cli": "@bot-whatsapp/cli@npm:*":
version: 0.0.1
resolution: "@bot-whatsapp/cli@npm:0.0.1"
bin:
bot: bin/cli.js
checksum: f58373f5cc4014bc22664452d20ec676645d04ba95c4ea8525db1a6adafa3b183e403c72c8ff670670bad8b56be6da098cc6767c1bffffa086b76e987cf79e86
languageName: node
linkType: hard
"@bot-whatsapp/cli@workspace:packages/cli":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@bot-whatsapp/cli@workspace:packages/cli" resolution: "@bot-whatsapp/cli@workspace:packages/cli"
dependencies: dependencies:
@@ -943,17 +947,38 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@bot-whatsapp/database@*, @bot-whatsapp/database@workspace:packages/database": "@bot-whatsapp/database@npm:*":
version: 0.0.1
resolution: "@bot-whatsapp/database@npm:0.0.1"
dependencies:
dotenv: ^16.0.3
mongodb: ^4.11.0
checksum: cc86a9a1117d5a3b4092f42cb138f8d04f6cacf0b9d6994a2c6f8ead7317c1d4acd8aee824ad4dfb4d6294646d1a32a49d37847d3b44bd35df86cdc18af675c4
languageName: node
linkType: hard
"@bot-whatsapp/database@workspace:packages/database":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@bot-whatsapp/database@workspace:packages/database" resolution: "@bot-whatsapp/database@workspace:packages/database"
dependencies: dependencies:
dotenv: ^16.0.3 dotenv: ^16.0.3
mongodb: ^4.11.0 mongodb: ^4.11.0
mysql2: ^2.3.3 mysql2: ^2.3.3
stormdb: ^0.6.0
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@bot-whatsapp/provider@*, @bot-whatsapp/provider@workspace:packages/provider": "@bot-whatsapp/provider@npm:*":
version: 0.0.1
resolution: "@bot-whatsapp/provider@npm:0.0.1"
dependencies:
"@bot-whatsapp/bot": "*"
qr-image: ^3.2.0
checksum: 01ffa3f06ed90cffd4157b2c81b7ed705ffd708ca49cb2b051de767959b97c100b84ab0ae2f1c46407007e42e3bbb29ad04e074829041b048317939ebf6569ca
languageName: node
linkType: hard
"@bot-whatsapp/provider@workspace:packages/provider":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@bot-whatsapp/provider@workspace:packages/provider" resolution: "@bot-whatsapp/provider@workspace:packages/provider"
dependencies: dependencies:
@@ -988,6 +1013,7 @@ __metadata:
rollup: ^3.2.3 rollup: ^3.2.3
rollup-plugin-cleanup: ^3.2.1 rollup-plugin-cleanup: ^3.2.1
rollup-plugin-copy: ^3.4.0 rollup-plugin-copy: ^3.4.0
semver: ^7.3.8
standard-version: ^9.5.0 standard-version: ^9.5.0
uvu: ^0.5.6 uvu: ^0.5.6
languageName: unknown languageName: unknown
@@ -3142,7 +3168,7 @@ __metadata:
dependencies: dependencies:
"@bot-whatsapp/cli": "*" "@bot-whatsapp/cli": "*"
bin: bin:
bot: ./lib/bin/bundle.create.cjs create-bot-whatsapp: ./bin/create.js
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@@ -7650,7 +7676,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": "semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8":
version: 7.3.8 version: 7.3.8
resolution: "semver@npm:7.3.8" resolution: "semver@npm:7.3.8"
dependencies: dependencies:
@@ -7907,6 +7933,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"stormdb@npm:^0.6.0":
version: 0.6.0
resolution: "stormdb@npm:0.6.0"
checksum: 5974329c1c5af9f0829a5551bef8476dcf6df921f4b9e135acb96863ed0d20ece9bec32d9fd42b84b5d76de30c7d20d3095d14cc75c8f0777f4799b422bd4053
languageName: node
linkType: hard
"streamsearch@npm:^1.1.0": "streamsearch@npm:^1.1.0":
version: 1.1.0 version: 1.1.0
resolution: "streamsearch@npm:1.1.0" resolution: "streamsearch@npm:1.1.0"