Compare commits

...

46 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
bb3f21b056 Merge pull request #149 from leifermendez/fix/ci-yarn
fix(ci): update yarn
2022-12-08 20:13:02 +01:00
77 changed files with 1263 additions and 778 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,29 +1,111 @@
name: Bot CI name: BotWhatsapp CI
on: on:
push: push:
branches: [dev] branches:
- main
pull_request: pull_request:
branches: [main, dev] 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
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable - run: corepack enable
- name: Install NPM Dependencies - name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000 run: yarn install --immutable --network-timeout 300000
- name: Build
- name: Build Package
run: yarn build run: yarn build
- name: Test
- 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 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:

7
.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,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

@@ -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,12 +1,14 @@
{ {
"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",

View File

@@ -1,19 +1,19 @@
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 {
build: { build: {
ssr: true, ssr: true,
rollupOptions: { rollupOptions: {
input: ['src/entry.cloudflare-pages.tsx', '@qwik-city-plan'], input: ['src/entry.cloudflare-pages.tsx', '@qwik-city-plan'],
}, },
}, },
plugins: [ plugins: [
cloudflarePagesAdaptor({ cloudflarePagesAdaptor({
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,44 +1,44 @@
{ {
"name": "bot-whatsapp-docs", "name": "bot-whatsapp-docs",
"version": "0.0.1", "version": "0.0.1",
"description": "Basic start point to build a docs site with Qwik", "description": "Basic start point to build a docs site with Qwik",
"engines": { "engines": {
"node": ">=15.0.0" "node": ">=15.0.0"
}, },
"private": true, "private": true,
"scripts": { "scripts": {
"build": "qwik build", "build": "qwik build",
"build.client": "vite build", "build.client": "vite build",
"build.preview": "vite build --ssr src/entry.preview.tsx", "build.preview": "vite build --ssr src/entry.preview.tsx",
"build.server": "vite build -c adaptors/cloudflare-pages/vite.config.ts", "build.server": "vite build -c adaptors/cloudflare-pages/vite.config.ts",
"build.types": "tsc --incremental --noEmit", "build.types": "tsc --incremental --noEmit",
"deploy": "wrangler pages dev ./dist", "deploy": "wrangler pages dev ./dist",
"dev": "vite --mode ssr", "dev": "vite --mode ssr",
"dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force", "dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force",
"fmt": "prettier --write .", "fmt": "prettier --write .",
"fmt.check": "prettier --check .", "fmt.check": "prettier --check .",
"lint": "eslint \"src/**/*.ts*\"", "lint": "eslint \"src/**/*.ts*\"",
"preview": "qwik build preview && vite preview --open", "preview": "qwik build preview && vite preview --open",
"start": "vite --open --mode ssr", "start": "vite --open --mode ssr",
"qwik": "qwik" "qwik": "qwik"
}, },
"devDependencies": { "devDependencies": {
"@builder.io/qwik": "0.14.1", "@builder.io/qwik": "0.14.1",
"@builder.io/qwik-city": "0.0.127", "@builder.io/qwik-city": "0.0.127",
"@types/eslint": "8.4.10", "@types/eslint": "8.4.10",
"@types/node": "latest", "@types/node": "latest",
"@typescript-eslint/eslint-plugin": "5.43.0", "@typescript-eslint/eslint-plugin": "5.43.0",
"@typescript-eslint/parser": "5.43.0", "@typescript-eslint/parser": "5.43.0",
"autoprefixer": "10.4.11", "autoprefixer": "10.4.11",
"eslint": "8.28.0", "eslint": "8.28.0",
"eslint-plugin-qwik": "0.14.1", "eslint-plugin-qwik": "0.14.1",
"node-fetch": "3.3.0", "node-fetch": "3.3.0",
"postcss": "^8.4.16", "postcss": "^8.4.16",
"prettier": "2.7.1", "prettier": "2.7.1",
"tailwindcss": "^3.1.8", "tailwindcss": "^3.1.8",
"typescript": "4.9.3", "typescript": "4.9.3",
"vite": "3.2.4", "vite": "3.2.4",
"vite-tsconfig-paths": "3.5.0", "vite-tsconfig-paths": "3.5.0",
"wrangler": "latest" "wrangler": "latest"
} }
} }

View File

@@ -1,6 +1,6 @@
module.exports = { module.exports = {
plugins: { plugins: {
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },
} }

View File

@@ -1,9 +1,9 @@
{ {
"$schema": "https://json.schemastore.org/web-manifest-combined.json", "$schema": "https://json.schemastore.org/web-manifest-combined.json",
"name": "qwik-project-name", "name": "qwik-project-name",
"short_name": "Welcome to Qwik", "short_name": "Welcome to Qwik",
"start_url": ".", "start_url": ".",
"display": "standalone", "display": "standalone",
"background_color": "#fff", "background_color": "#fff",
"description": "A Qwik project app." "description": "A Qwik project app."
} }

View File

@@ -1,25 +1,25 @@
nav.breadcrumbs { nav.breadcrumbs {
padding: 5px; padding: 5px;
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
} }
nav.breadcrumbs > span { nav.breadcrumbs > span {
display: inline-block; display: inline-block;
padding: 5px 0; padding: 5px 0;
font-size: 12px; font-size: 12px;
} }
nav.breadcrumbs > span a { nav.breadcrumbs > span a {
text-decoration: none; text-decoration: none;
color: inherit; color: inherit;
} }
nav.breadcrumbs > span::after { nav.breadcrumbs > span::after {
content: '>'; content: '>';
padding: 0 5px; padding: 0 5px;
opacity: 0.4; opacity: 0.4;
} }
nav.breadcrumbs > span:last-child::after { nav.breadcrumbs > span:last-child::after {
display: none; display: none;
} }

View File

@@ -1,74 +1,77 @@
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 (
<nav class="breadcrumbs">
{breadcrumbs.map((b) => (
<span>{b.href ? <a href={b.href}>{b.text}</a> : b.text}</span>
))}
</nav>
);
});
export function createBreadcrumbs(menu: ContentMenu | undefined, pathname: string) {
if (menu?.items) {
for (const indexA of menu.items) {
const breadcrumbA: ContentBreadcrumb = {
text: indexA.text,
};
if (typeof indexA.href === 'string') {
breadcrumbA.href = indexA.href;
}
if (indexA.href === pathname) {
return [breadcrumbA];
}
if (indexA.items) {
for (const indexB of indexA.items) {
const breadcrumbB: ContentBreadcrumb = {
text: indexB.text,
};
if (typeof indexB.href === 'string') {
breadcrumbB.href = indexB.href;
}
if (indexB.href === pathname) {
return [breadcrumbA, breadcrumbB];
}
if (indexB.items) {
for (const indexC of indexB.items) {
const breadcrumbC: ContentBreadcrumb = {
text: indexC.text,
};
if (typeof indexC.href === 'string') {
breadcrumbC.href = indexC.href;
}
if (indexC.href === pathname) {
return [breadcrumbA, breadcrumbB, breadcrumbC];
}
}
}
}
}
} }
}
return []; return (
<nav class="breadcrumbs">
{breadcrumbs.map((b) => (
<span>{b.href ? <a href={b.href}>{b.text}</a> : b.text}</span>
))}
</nav>
)
})
export function createBreadcrumbs(
menu: ContentMenu | undefined,
pathname: string
) {
if (menu?.items) {
for (const indexA of menu.items) {
const breadcrumbA: ContentBreadcrumb = {
text: indexA.text,
}
if (typeof indexA.href === 'string') {
breadcrumbA.href = indexA.href
}
if (indexA.href === pathname) {
return [breadcrumbA]
}
if (indexA.items) {
for (const indexB of indexA.items) {
const breadcrumbB: ContentBreadcrumb = {
text: indexB.text,
}
if (typeof indexB.href === 'string') {
breadcrumbB.href = indexB.href
}
if (indexB.href === pathname) {
return [breadcrumbA, breadcrumbB]
}
if (indexB.items) {
for (const indexC of indexB.items) {
const breadcrumbC: ContentBreadcrumb = {
text: indexC.text,
}
if (typeof indexC.href === 'string') {
breadcrumbC.href = indexC.href
}
if (indexC.href === pathname) {
return [breadcrumbA, breadcrumbB, breadcrumbC]
}
}
}
}
}
}
}
return []
} }
interface ContentBreadcrumb { interface ContentBreadcrumb {
text: string; text: string
href?: string; href?: string
} }

View File

@@ -1,22 +1,22 @@
footer { footer {
border-top: 0.5px solid #ddd; border-top: 0.5px solid #ddd;
margin-top: 40px; margin-top: 40px;
padding: 20px; padding: 20px;
text-align: center; text-align: center;
} }
footer a { footer a {
color: #9e9e9e; color: #9e9e9e;
font-size: 12px; font-size: 12px;
} }
footer ul { footer ul {
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
footer li { footer li {
display: inline-block; display: inline-block;
padding: 6px 12px; padding: 6px 12px;
} }

View File

@@ -1,36 +1,40 @@
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>
<ul> <ul>
<li> <li>
<a href="/docs">Docs</a> <a href="/docs">Docs</a>
</li> </li>
<li> <li>
<a href="/about-us">About Us</a> <a href="/about-us">About Us</a>
</li> </li>
<li> <li>
<a href="https://qwik.builder.io/">Qwik</a> <a href="https://qwik.builder.io/">Qwik</a>
</li> </li>
<li> <li>
<a href="https://twitter.com/QwikDev">Twitter</a> <a href="https://twitter.com/QwikDev">Twitter</a>
</li> </li>
<li> <li>
<a href="https://github.com/BuilderIO/qwik">GitHub</a> <a href="https://github.com/BuilderIO/qwik">GitHub</a>
</li> </li>
<li> <li>
<a href="https://qwik.builder.io/chat">Chat</a> <a href="https://qwik.builder.io/chat">Chat</a>
</li> </li>
</ul> </ul>
<div> <div>
<a href="https://www.builder.io/" target="_blank" class="builder"> <a
Made with by Builder.io href="https://www.builder.io/"
</a> target="_blank"
</div> class="builder"
</footer> >
); Made with by Builder.io
}); </a>
</div>
</footer>
)
})

View File

@@ -1,34 +1,34 @@
header { header {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 11; z-index: 11;
display: grid; display: grid;
grid-template-columns: minmax(130px, auto) 1fr; grid-template-columns: minmax(130px, auto) 1fr;
gap: 30px; gap: 30px;
height: 80px; height: 80px;
width: 100%; width: 100%;
padding: 10px; padding: 10px;
background-color: white; background-color: white;
overflow: hidden; overflow: hidden;
} }
header a.logo { header a.logo {
display: block; display: block;
} }
header a { header a {
text-decoration: none; text-decoration: none;
} }
header nav { header nav {
text-align: right; text-align: right;
} }
header nav a { header nav a {
display: inline-block; display: inline-block;
padding: 5px 15px; padding: 5px 15px;
} }
header nav a:hover { header nav a:hover {
text-decoration: underline; text-decoration: underline;
} }

View File

@@ -1,26 +1,32 @@
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>
<a class="logo" href="/"> <a class="logo" href="/">
<QwikLogo /> <QwikLogo />
</a> </a>
<nav> <nav>
<a href="/docs" class={{ active: pathname.startsWith('/docs') }}> <a
Docs href="/docs"
</a> class={{ active: pathname.startsWith('/docs') }}
<a href="/about-us" class={{ active: pathname.startsWith('/about-us') }}> >
About Us Docs
</a> </a>
</nav> <a
</header> href="/about-us"
); class={{ active: pathname.startsWith('/about-us') }}
}); >
About Us
</a>
</nav>
</header>
)
})

View File

@@ -1,20 +1,20 @@
export const QwikLogo = () => ( export const QwikLogo = () => (
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 167 53"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 167 53">
<path <path
fill="#000" fill="#000"
d="M81.95 46.59h-6.4V35.4a12.25 12.25 0 0 1-7.06 2.17c-3.47 0-6.06-.94-7.67-2.92-1.6-1.96-2.42-5.45-2.42-10.43 0-5.1.95-8.62 2.87-10.67 1.96-2.08 5.1-3.09 9.43-3.09 4.1 0 7.82.57 11.25 1.67V46.6Zm-6.4-30.31a16.6 16.6 0 0 0-4.85-.66c-2.17 0-3.73.56-4.6 1.7-.85 1.17-1.32 3.38-1.32 6.65 0 3.08.41 5.14 1.26 6.26.86 1.1 2.33 1.67 4.5 1.67 2.84 0 5.01-1.17 5.01-2.62v-13Zm15.58-5.14c2.27 6.3 4.2 12.6 5.86 18.95 2.22-6.5 4.1-12.8 5.55-18.95h5.61a187.5 187.5 0 0 1 5.3 18.95c2.52-6.9 4.5-13.21 5.95-18.95h6.31a285.68 285.68 0 0 1-8.92 25.76h-7.53c-.86-4.6-2.22-10.14-4.04-16.75a151.51 151.51 0 0 1-4.89 16.75H92.8a287.88 287.88 0 0 0-8.17-25.76h6.5Zm41.7-3.58c-2.83 0-3.63-.7-3.63-3.59 0-2.57.82-3.18 3.63-3.18 2.83 0 3.63.6 3.63 3.18 0 2.89-.8 3.59-3.63 3.59Zm-3.18 3.58h6.4V36.9h-6.4V11.14Zm36.65 0c-4.54 6.46-7.72 10.39-9.49 11.8 1.46.95 5.36 5.95 10.2 13.98h-7.38c-6.02-9.13-8.89-13.07-10.3-13.67v13.67h-6.4V0h6.4v23.23c1.45-1.06 4.63-5.1 9.54-12.09h7.43Z" d="M81.95 46.59h-6.4V35.4a12.25 12.25 0 0 1-7.06 2.17c-3.47 0-6.06-.94-7.67-2.92-1.6-1.96-2.42-5.45-2.42-10.43 0-5.1.95-8.62 2.87-10.67 1.96-2.08 5.1-3.09 9.43-3.09 4.1 0 7.82.57 11.25 1.67V46.6Zm-6.4-30.31a16.6 16.6 0 0 0-4.85-.66c-2.17 0-3.73.56-4.6 1.7-.85 1.17-1.32 3.38-1.32 6.65 0 3.08.41 5.14 1.26 6.26.86 1.1 2.33 1.67 4.5 1.67 2.84 0 5.01-1.17 5.01-2.62v-13Zm15.58-5.14c2.27 6.3 4.2 12.6 5.86 18.95 2.22-6.5 4.1-12.8 5.55-18.95h5.61a187.5 187.5 0 0 1 5.3 18.95c2.52-6.9 4.5-13.21 5.95-18.95h6.31a285.68 285.68 0 0 1-8.92 25.76h-7.53c-.86-4.6-2.22-10.14-4.04-16.75a151.51 151.51 0 0 1-4.89 16.75H92.8a287.88 287.88 0 0 0-8.17-25.76h6.5Zm41.7-3.58c-2.83 0-3.63-.7-3.63-3.59 0-2.57.82-3.18 3.63-3.18 2.83 0 3.63.6 3.63 3.18 0 2.89-.8 3.59-3.63 3.59Zm-3.18 3.58h6.4V36.9h-6.4V11.14Zm36.65 0c-4.54 6.46-7.72 10.39-9.49 11.8 1.46.95 5.36 5.95 10.2 13.98h-7.38c-6.02-9.13-8.89-13.07-10.3-13.67v13.67h-6.4V0h6.4v23.23c1.45-1.06 4.63-5.1 9.54-12.09h7.43Z"
/> />
<path <path
fill="#18B6F6" fill="#18B6F6"
d="M40.97 52.54 32.1 43.7l-.14.02v-.1l-18.9-18.66 4.66-4.5-2.74-15.7L2 20.87a7.14 7.14 0 0 0-1.03 8.52l8.11 13.45a6.81 6.81 0 0 0 5.92 3.3l4.02-.05 21.96 6.46Z" d="M40.97 52.54 32.1 43.7l-.14.02v-.1l-18.9-18.66 4.66-4.5-2.74-15.7L2 20.87a7.14 7.14 0 0 0-1.03 8.52l8.11 13.45a6.81 6.81 0 0 0 5.92 3.3l4.02-.05 21.96 6.46Z"
/> />
<path <path
fill="#AC7EF4" fill="#AC7EF4"
d="m45.82 20.54-1.78-3.3-.93-1.68-.37-.66-.04.04-4.9-8.47a6.85 6.85 0 0 0-5.99-3.43l-4.28.12-12.8.04a6.85 6.85 0 0 0-5.85 3.37L1.1 21.99 15 4.73l18.24 20.04L30 28.04l1.94 15.68.02-.04v.04h-.04l.04.04 1.51 1.47 7.36 7.19c.3.29.81-.06.6-.43l-4.54-8.93 7.91-14.63.26-.3a6.73 6.73 0 0 0 .76-7.6Z" d="m45.82 20.54-1.78-3.3-.93-1.68-.37-.66-.04.04-4.9-8.47a6.85 6.85 0 0 0-5.99-3.43l-4.28.12-12.8.04a6.85 6.85 0 0 0-5.85 3.37L1.1 21.99 15 4.73l18.24 20.04L30 28.04l1.94 15.68.02-.04v.04h-.04l.04.04 1.51 1.47 7.36 7.19c.3.29.81-.06.6-.43l-4.54-8.93 7.91-14.63.26-.3a6.73 6.73 0 0 0 .76-7.6Z"
/> />
<path <path
fill="#fff" fill="#fff"
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,13 +1,13 @@
.menu { .menu {
background: #eee; background: #eee;
padding: 20px 10px; padding: 20px 10px;
} }
.menu h5 { .menu h5 {
margin: 0; margin: 0;
} }
.menu ul { .menu ul {
padding-left: 20px; padding-left: 20px;
margin: 5px 0 25px 0; margin: 5px 0 25px 0;
} }

View File

@@ -1,36 +1,37 @@
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">
{menu {menu
? menu.items?.map((item) => ( ? menu.items?.map((item) => (
<> <>
<h5>{item.text}</h5> <h5>{item.text}</h5>
<ul> <ul>
{item.items?.map((item) => ( {item.items?.map((item) => (
<li> <li>
<Link <Link
href={item.href} href={item.href}
class={{ class={{
'is-active': loc.pathname === item.href, 'is-active':
}} loc.pathname === item.href,
> }}
{item.text} >
</Link> {item.text}
</li> </Link>
))} </li>
</ul> ))}
</> </ul>
)) </>
: null} ))
</aside> : null}
); </aside>
}); )
})

View File

@@ -1,33 +1,33 @@
.on-this-page { .on-this-page {
padding-bottom: 20px; padding-bottom: 20px;
font-size: 0.9em; font-size: 0.9em;
} }
.on-this-page h6 { .on-this-page h6 {
margin: 10px 0; margin: 10px 0;
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
} }
.on-this-page ul { .on-this-page ul {
margin: 0; margin: 0;
padding: 0 0 20px 0; padding: 0 0 20px 0;
list-style: none; list-style: none;
} }
.on-this-page a { .on-this-page a {
position: relative; position: relative;
display: block; display: block;
border: 0 solid #ddd; border: 0 solid #ddd;
border-left-width: 2px; border-left-width: 2px;
padding: 4px 2px 4px 8px; padding: 4px 2px 4px 8px;
text-decoration: none; text-decoration: none;
} }
.on-this-page a.indent { .on-this-page a.indent {
padding-left: 30px; padding-left: 30px;
} }
.on-this-page a:hover { .on-this-page a:hover {
border-color: var(--theme-accent); border-color: var(--theme-accent);
} }

View File

@@ -1,62 +1,63 @@
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">
{contentHeadings.length > 0 ? ( {contentHeadings.length > 0 ? (
<> <>
<h6>On This Page</h6> <h6>On This Page</h6>
<ul> <ul>
{contentHeadings.map((h) => ( {contentHeadings.map((h) => (
<li> <li>
<a <a
href={`#${h.id}`} href={`#${h.id}`}
class={{ class={{
block: true, block: true,
indent: h.level > 2, indent: h.level > 2,
}} }}
> >
{h.text} {h.text}
</a> </a>
</li> </li>
))} ))}
</ul> </ul>
</> </>
) : null} ) : null}
<h6>More</h6> <h6>More</h6>
<ul> <ul>
<li> <li>
<a href={editUrl} target="_blank"> <a href={editUrl} target="_blank">
Edit this page Edit this page
</a> </a>
</li> </li>
<li> <li>
<a href="https://qwik.builder.io/chat" target="_blank"> <a href="https://qwik.builder.io/chat" target="_blank">
Join our community Join our community
</a> </a>
</li> </li>
<li> <li>
<a href="https://github.com/BuilderIO/qwik" target="_blank"> <a href="https://github.com/BuilderIO/qwik" target="_blank">
GitHub GitHub
</a> </a>
</li> </li>
<li> <li>
<a href="https://twitter.com/QwikDev" target="_blank"> <a href="https://twitter.com/QwikDev" target="_blank">
@QwikDev @QwikDev
</a> </a>
</li> </li>
</ul> </ul>
</aside> </aside>
); )
}); })

View File

@@ -1,32 +1,35 @@
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
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
{head.meta.map((m) => ( {head.meta.map((m) => (
<meta {...m} /> <meta {...m} />
))} ))}
{head.links.map((l) => ( {head.links.map((l) => (
<link {...l} /> <link {...l} />
))} ))}
{head.styles.map((s) => ( {head.styles.map((s) => (
<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,18 +10,18 @@
* - 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 />, {
manifest, manifest,
...opts, ...opts,
// Use container attributes to set attributes on the html tag. // Use container attributes to set attributes on the html tag.
containerAttributes: { containerAttributes: {
lang: 'en-us', lang: 'en-us',
...opts.containerAttributes, ...opts.containerAttributes,
}, },
}); })
} }

View File

@@ -1,66 +1,67 @@
* { * {
box-sizing: border-box; box-sizing: border-box;
} }
:root { :root {
--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;
--theme-text: #181818; --theme-text: #181818;
} }
@media (min-width: 50em) { @media (min-width: 50em) {
:root { :root {
--max-width: 46em; --max-width: 46em;
} }
} }
body { body {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
min-height: 100vh; min-height: 100vh;
font-family: var(--font-body); font-family: var(--font-body);
font-size: 1rem; font-size: 1rem;
font-size: clamp(0.9rem, 0.75rem + 0.375vw + var(--user-font-scale), 1rem); font-size: clamp(0.9rem, 0.75rem + 0.375vw + var(--user-font-scale), 1rem);
line-height: 1.5; line-height: 1.5;
max-width: 100vw; max-width: 100vw;
background: var(--theme-bg); background: var(--theme-bg);
color: var(--theme-text); color: var(--theme-text);
} }
main { main {
padding: 10px 20px; padding: 10px 20px;
max-width: 960px; max-width: 960px;
margin: 0 auto; margin: 0 auto;
} }
a { a {
color: var(--theme-accent); color: var(--theme-accent);
} }
a:hover { a:hover {
text-decoration: none; text-decoration: none;
} }
code, code,
kbd, kbd,
samp, samp,
pre { pre {
font-family: var(--font-mono); font-family: var(--font-mono);
} }
code { code {
background-color: rgb(224, 224, 224); background-color: rgb(224, 224, 224);
padding: 2px 4px; padding: 2px 4px;
border-radius: 3px; border-radius: 3px;
font-size: 0.9em; font-size: 0.9em;
border-bottom: 2px solid #bfbfbf; border-bottom: 2px solid #bfbfbf;
} }

View File

@@ -1,26 +1,30 @@
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$(() => {
/* /*
* The root of a QwikCity site always start with the <QwikCityProvider> component, * The root of a QwikCity site always start with the <QwikCityProvider> component,
* immediately followed by the document's <head> and <body>. * immediately followed by the document's <head> and <body>.
* *
* Dont remove the `<head>` and `<body>` elements. * Dont remove the `<head>` and `<body>` elements.
*/ */
return ( return (
<QwikCityProvider> <QwikCityProvider>
<head> <head>
<meta charSet="utf-8" /> <meta charSet="utf-8" />
<RouterHead /> <RouterHead />
</head> </head>
<body lang="en"> <body lang="en">
<RouterOutlet /> <RouterOutlet />
<ServiceWorkerRegister /> <ServiceWorkerRegister />
</body> </body>
</QwikCityProvider> </QwikCityProvider>
); )
}); })

View File

@@ -1,22 +1,22 @@
.docs { .docs {
display: grid; display: grid;
grid-template-columns: 210px auto 190px; grid-template-columns: 210px auto 190px;
grid-template-areas: 'menu article on-this-page'; grid-template-areas: 'menu article on-this-page';
gap: 40px; gap: 40px;
} }
.docs h1 { .docs h1 {
margin-top: 0; margin-top: 0;
} }
.docs .menu { .docs .menu {
grid-area: menu; grid-area: menu;
} }
.docs article { .docs article {
grid-area: article; grid-area: article;
} }
.docs .on-this-page { .docs .on-this-page {
grid-area: on-this-page; grid-area: on-this-page;
} }

View File

@@ -1,25 +1,25 @@
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">
<Menu /> <Menu />
<article> <article>
<Slot /> <Slot />
</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,15 +1,15 @@
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 (
<> <>
<Header /> <Header />
<main> <main>
<Slot /> <Slot />
</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,21 +1,21 @@
/** @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: {
primary: colors.purple, primary: colors.purple,
secondary: colors.sky, secondary: colors.sky,
}, },
fontFamily: { fontFamily: {
sans: ["'Inter'", ...defaultTheme.fontFamily.sans], sans: ["'Inter'", ...defaultTheme.fontFamily.sans],
}, },
},
}, },
}, plugins: [],
plugins: [], darkMode: 'class',
darkMode: "class", }
};

View File

@@ -1,15 +1,15 @@
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 {
plugins: [qwikCity(), qwikVite(), tsconfigPaths()], plugins: [qwikCity(), qwikVite(), tsconfigPaths()],
preview: { preview: {
headers: { headers: {
'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

@@ -81,7 +81,7 @@ class TwilioProvider extends ProviderClass {
* @param {*} buttons [] * @param {*} buttons []
* @returns * @returns
*/ */
sendButtons = async (number, message, buttons = []) => { sendButtons = async () => {
console.log(``) console.log(``)
console.log( console.log(
`[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo` `[NOTA]: Actualmente enviar botons con Twilio esta en desarrollo`

View File

@@ -1,13 +1,7 @@
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 { const {
cleanNumber, cleanNumber,
generateImage, generateImage,
@@ -134,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

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()

View File

@@ -904,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:
@@ -916,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:
@@ -929,7 +947,17 @@ __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:
@@ -940,7 +968,17 @@ __metadata:
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:
@@ -975,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
@@ -3129,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
@@ -7637,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: