diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..036c86e --- /dev/null +++ b/.github/FUNDING.yml @@ -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 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 017ec38..aa05560 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,8 @@ -name: BotWhatsapp CI +name: BotWhatsapp Build-Test on: - push: - branches: - - main pull_request: branches: - - main - dev jobs: @@ -38,46 +34,6 @@ jobs: - 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 - - - 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 }}" - ############ UNIT TEST ############ test-unit: name: Unit Tests diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml new file mode 100644 index 0000000..ecaf98f --- /dev/null +++ b/.github/workflows/releases.yml @@ -0,0 +1,56 @@ +name: BotWhatsapp Releases + +on: + push: + branches: + - next-release + +jobs: + ############ RELEASE ############ + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + persist-credentials: false + fetch-depth: 0 + + - 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 & Push changes + uses: actions-js/push@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + message: 'ci(version): :zap: automatic - ${date} updated versions every packages' + branch: 'dev' diff --git a/.gitignore b/.gitignore index 606fd39..bb10ef4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /node_modules -/packages/create-bot-whatsapp/starters +/packages/*/starters /packages/*/node_modules /packages/*/dist /packages/*/docs/dist diff --git a/README.md b/README.md index 854af44..a75b6be 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ -------- 🦊 Documentación: [https://bot-whatsapp.pages.dev/](https://bot-whatsapp.pages.dev/) Video como hacer PR: https://youtu.be/Lxt8Acob6aU - -- [ ] Evitar dependencias + +🚀 __Roadmap:__ [https://github.com/users/leifermendez/projects/4/views/1](https://github.com/users/leifermendez/projects/4/views/1) **Comunidad** diff --git a/packages/bot/package.json b/packages/bot/package.json index 18f4ce0..2a9a35c 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.4-alpha.0", + "version": "0.0.18-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/create-app/index.js b/packages/cli/create-app/index.js index ce6f199..3890e7e 100644 --- a/packages/cli/create-app/index.js +++ b/packages/cli/create-app/index.js @@ -16,9 +16,9 @@ const copyFiles = async (from, to) => { * Copiar directorio con archivos * @param {*} templateName */ -const copyBaseApp = async (templateName = null) => { - const BASEP_APP_PATH_FROM = `${process.cwd()}/starters/apps/${templateName}` - const BASEP_APP_PATH_TO = `${process.cwd()}/${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) } diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index 6e30553..6eccea9 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -1,8 +1,25 @@ const prompts = require('prompts') -const { yellow, red } = require('kleur') +const { yellow, red, cyan } = require('kleur') const { copyBaseApp } = require('../create-app') +const { join } = require('path') +const { existsSync } = require('fs') const { checkNodeVersion, checkOs } = require('../check') +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 questions = [ { @@ -49,48 +66,29 @@ const startInteractive = async () => { } const response = await prompts(questions, { onCancel }) const { outDir = '', providerDb = [], providerWs = [] } = response - /** - * @deprecated - * Question - * @returns - */ - // const installOrUdpateDep = async () => { - // const answer = dependencies.toLowerCase() || 'n' - // if (answer.includes('n')) return true - // if (answer.includes('y')) { - // await installAll() - // return true - // } - // } - - /** - * @deprecated - * Question - * @returns - */ - // const cleanAllSession = async () => { - // const answer = cleanTmp.toLowerCase() || 'n' - // if (answer.includes('n')) return true - - // if (answer.includes('y')) { - // await cleanSession() - // return true - // } - // } - - /** - * Crear una app (copiar plantilla) - * @returns - */ const createApp = async (templateName = null) => { if (!templateName) throw new Error('TEMPLATE_NAME_INVALID: ', templateName) + + const possiblesPath = [ + join(__dirname, 'starters', 'apps', templateName), + join(__dirname, '..', 'starters', 'apps', templateName), + join(__dirname, '..', '..', 'starters', 'apps', templateName), + ] + const answer = outDir.toLowerCase() || 'n' if (answer.includes('n')) return true if (answer.includes('y')) { - await copyBaseApp(templateName) + const indexOfPath = possiblesPath.find((a) => existsSync(a)) + 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 } } @@ -109,7 +107,6 @@ const startInteractive = async () => { ) process.exit(1) } - console.log(yellow(`'Deberia crer una carpeta en root/provider'`)) return answer } @@ -134,6 +131,7 @@ const startInteractive = async () => { const dbAdapter = await dbProvider() const NAME_DIR = ['base', providerAdapter, dbAdapter].join('-') await createApp(NAME_DIR) + bannerDone() } module.exports = { startInteractive } diff --git a/packages/cli/package.json b/packages/cli/package.json index 5f29641..06bb8ae 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.4-alpha.0", + "version": "0.0.25-alpha.0", "description": "", "main": "index.js", "devDependencies": { @@ -10,6 +10,7 @@ "kleur": "^4.1.5" }, "files": [ + "./starters/", "./lib/cli/bundle.cli.cjs" ], "bin": { diff --git a/packages/cli/rollup-cli.config.js b/packages/cli/rollup-cli.config.js index a28c560..597071b 100644 --- a/packages/cli/rollup-cli.config.js +++ b/packages/cli/rollup-cli.config.js @@ -1,5 +1,6 @@ const banner = require('../../config/banner.rollup.json') const commonjs = require('@rollup/plugin-commonjs') +const copy = require('rollup-plugin-copy') const { nodeResolve } = require('@rollup/plugin-node-resolve') const { join } = require('path') @@ -12,5 +13,11 @@ module.exports = { file: PATH, format: 'cjs', }, - plugins: [commonjs(), nodeResolve()], + plugins: [ + copy({ + targets: [{ src: 'starters/*', dest: join(__dirname, 'starters') }], + }), + commonjs(), + nodeResolve(), + ], } diff --git a/packages/create-bot-whatsapp/bin/create.js b/packages/create-bot-whatsapp/bin/create.js old mode 100644 new mode 100755 diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 4a76abf..83665e5 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.13-alpha.0", + "version": "0.0.31-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/rollup-create.config.js b/packages/create-bot-whatsapp/rollup-create.config.js index cc5eb34..9ba77ed 100644 --- a/packages/create-bot-whatsapp/rollup-create.config.js +++ b/packages/create-bot-whatsapp/rollup-create.config.js @@ -1,6 +1,6 @@ const banner = require('../../config/banner.rollup.json') const commonjs = require('@rollup/plugin-commonjs') -const copy = require('rollup-plugin-copy') + const { nodeResolve } = require('@rollup/plugin-node-resolve') const { join } = require('path') @@ -13,11 +13,5 @@ module.exports = { file: PATH, format: 'cjs', }, - plugins: [ - copy({ - targets: [{ src: 'starters/*', dest: join(__dirname, 'starters') }], - }), - commonjs(), - nodeResolve(), - ], + plugins: [commonjs(), nodeResolve()], } diff --git a/packages/database/package.json b/packages/database/package.json index cc44837..5ac3692 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.4-alpha.0", + "version": "0.0.17-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 9cb7956..4b01f03 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.10-alpha.0", + "version": "0.0.23-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/scripts/release.js b/scripts/release.js index d72522e..9dfcc62 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -82,6 +82,35 @@ const updateVersion = async (packageName = null, number = null) => { return { version: newVersion } } +/** + * Revisar si la version nueva existe o no en npmjs + * @param {*} packageName + * @param {*} version + * @returns + */ +const checkExistVersion = async (packageName = null, version = null) => { + try { + const pkgJson = join(PATH_PACKAGES, packageName) + const pkgJsonObject = readPackage(packageName) + const { stdout } = await cmd( + NPM_COMMAND, + ['view', `${pkgJsonObject.name}@${version}`], + { + stdio: 'inherit', + cwd: pkgJson, + } + ) + return true + } catch (e) { + return false + } +} + +/** + * Empaquetar + * @param {*} packageName + * @returns + */ const packRelease = async (packageName) => { const pkgJson = join(PATH_PACKAGES, packageName) const { stdout } = await cmd(NPM_COMMAND, ['pack'], { @@ -91,6 +120,12 @@ const packRelease = async (packageName) => { return stdout } +/** + * Lanzar release + * @param {*} packageName + * @param {*} latest + * @returns + */ const publishRelease = async (packageName, latest = null) => { const args = !latest ? ['--tag', 'dev'] : ['--access', 'public'] const pkgJson = join(PATH_PACKAGES, packageName) @@ -106,15 +141,24 @@ const publishRelease = async (packageName, latest = null) => { * Recibe los argumentos entrantes */ +/** + * Init + */ const main = async () => { if (PKG_ARG) { + let EXIST_VERSION = true 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) + + while (EXIST_VERSION) { + const { version } = await updateVersion(pkgName, pkgNumber) + EXIST_VERSION = await checkExistVersion(pkgName, version) + console.log(`[${pkgName} - Version]: `, version, EXIST_VERSION) + } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) } diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index b2c29e1..b2448c8 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", + "pre-copy": "cd .. && yarn run copy.lib base-twilio-memory", "start": "node app.js" }, "keywords": [], diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index b2c29e1..a4b841e 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", + "pre-copy": "cd .. && yarn run copy.lib base-twilio-mongo", "start": "node app.js" }, "keywords": [], diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index b2c29e1..870ed85 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", + "pre-copy": "cd .. && yarn run copy.lib base-twilio-mysql", "start": "node app.js" }, "keywords": [], diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index b2c29e1..b009b4f 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "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" }, "keywords": [], diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index b2c29e1..a805681 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", + "pre-copy": "cd .. && yarn run copy.lib base-wweb-mongo", "start": "node app.js" }, "keywords": [], diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index b2c29e1..f24129b 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -4,7 +4,7 @@ "description": "", "main": "app.js", "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", + "pre-copy": "cd .. && yarn run copy.lib base-wweb-mysql", "start": "node app.js" }, "keywords": [], diff --git a/starters/apps/base/README.md b/starters/apps/base/README.md deleted file mode 100644 index f8e0e90..0000000 --- a/starters/apps/base/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### 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) diff --git a/starters/apps/base/app.js b/starters/apps/base/app.js deleted file mode 100644 index 61a4bb0..0000000 --- a/starters/apps/base/app.js +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/starters/apps/base/package.json b/starters/apps/base/package.json deleted file mode 100644 index b2c29e1..0000000 --- a/starters/apps/base/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "bot-whatsapp-base", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-base", - "start": "node app.js" - }, - "keywords": [], - "dependencies": { - "whatsapp-web.js": "^1.18.3" - }, - "author": "", - "license": "ISC" -} diff --git a/starters/apps/basic/README.md b/starters/apps/basic/README.md deleted file mode 100644 index 98c9930..0000000 --- a/starters/apps/basic/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### BASIC APP - -Este bot contiene un flujo basico en el cual una persona (cliente) escribe **"hola"** y el bot responde. - - -![](https://i.imgur.com/0z0G91w.png) - ------- -- [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) diff --git a/starters/apps/basic/app.js b/starters/apps/basic/app.js deleted file mode 100644 index 78d9132..0000000 --- a/starters/apps/basic/app.js +++ /dev/null @@ -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() diff --git a/starters/apps/basic/package.json b/starters/apps/basic/package.json deleted file mode 100644 index baa6f3b..0000000 --- a/starters/apps/basic/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "bot-whatsapp-basic", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "pre-copy": "cd .. && yarn run copy.lib example-app-basic", - "start": "node app.js" - }, - "keywords": [], - "dependencies": { - "whatsapp-web.js": "^1.18.3" - }, - "author": "", - "license": "ISC" -}