add validation cli

This commit is contained in:
Leifer
2022-10-25 13:43:17 +02:00
parent 5dc81f60c0
commit ceade85334
21 changed files with 2093 additions and 144 deletions

16
.eslintrc.js Normal file
View File

@@ -0,0 +1,16 @@
module.exports = {
"env": {
"browser": true,
"commonjs": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"overrides": [
],
"parserOptions": {
"ecmaVersion": "latest"
},
"rules": {
}
}

Binary file not shown.

1571
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"main": "app.js", "main": "app.js",
"scripts": { "scripts": {
"start": "node ./app.js", "start": "node ./app.js",
"test": "echo \"Error: no test specified\" && exit 1" "cli": "node ./packages/cli/bin/cli.js"
}, },
"workspaces": [ "workspaces": [
"packages/cli", "packages/cli",
@@ -52,8 +52,12 @@
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^23.0.2",
"eslint": "^8.26.0",
"eslint-config-prettier": "^8.5.0",
"pm2": "^5.2.0", "pm2": "^5.2.0",
"prettier": "2.7.1" "prettier": "^2.7.1",
"rollup": "^3.2.3"
}, },
"engines": { "engines": {
"node": "16.x" "node": "16.x"

Binary file not shown.

View File

@@ -1,18 +1,20 @@
# @bot-whatsapp/cli # @bot-whatsapp/cli
- [X] Revisar version de NODE - [x] Revisar version de NODE
- [X] Revisar OS - [x] Revisar OS
- [X] Obtener Package Manager - [x] Obtener Package Manager
- [X] Revisar las libreria de WhatsappWeb para obtener version reciente - [x] Revisar las libreria de WhatsappWeb para obtener version reciente
- [X] Opcion interactiva de limpiar session - [x] Opcion interactiva de limpiar session
- [ ] Opcion de generar `json` con la configuracion - [ ] Opcion de generar `json` con la configuracion
- [ ] Agregar `rollup` para limpiar el codigo - [x] Agregar `rollup` para limpiar el codigo
---
**Comunidad**
---------
__Comunidad__
> Forma parte de este proyecto. > Forma parte de este proyecto.
- [Discord](https://link.codigoencasa.com/DISCORD) - [Discord](https://link.codigoencasa.com/DISCORD)
- [Twitter](https://twitter.com/leifermendez) - [Twitter](https://twitter.com/leifermendez)
- [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR) - [Youtube](https://www.youtube.com/watch?v=5lEMCeWEJ8o&list=PL_WGMLcL4jzWPhdhcUyhbFU6bC0oJd2BR)
- [Telegram](https://t.me/leifermendez) - [Telegram](https://t.me/leifermendez)

View File

@@ -1,4 +1,4 @@
- [X] Revisar version de NODE - [x] Revisar version de NODE
- [X] Revisar OS - [x] Revisar OS
- [X] Obtener Package Manager - [x] Obtener Package Manager
- [X] Revisar las libreria de WhatsappWeb para obtener version reciente - [x] Revisar las libreria de WhatsappWeb para obtener version reciente

3
packages/cli/bin/cli.js Normal file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env node
const index = require('../lib/bundle.cjs')
index.startInteractive()

View File

@@ -1,40 +1,38 @@
const {red, yellow, green, bgCyan} = require('kleur') const { red, yellow, green, bgCyan } = require('kleur')
const checkNodeVersion = () => { const checkNodeVersion = () => {
console.log(bgCyan('🚀 Revisando tu Node.js')) console.log(bgCyan('🚀 Revisando tu Node.js'))
const version = process.version; const version = process.version
const majorVersion = parseInt(version.replace('v','').split('.').shift()) const majorVersion = parseInt(version.replace('v', '').split('.').shift())
if(majorVersion < 16){ if (majorVersion < 16) {
console.error( console.error(
red(`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}`) red(
`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}`
)
) )
process.exit(1) process.exit(1)
} }
console.log(green(`Node.js combatible ${version}`)) console.log(green(`Node.js combatible ${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 confiuración adicional referente al puppeter`,
``, ``,
`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%C3%B3n`,
`` ``,
] ]
console.log( console.log(yellow(messages.join(' \n')))
yellow(messages.join(' \n'))
)
} }
console.log(``) console.log(``)
} }
module.exports = { checkNodeVersion, checkOs }
module.exports ={ checkNodeVersion, checkOs }

View File

@@ -1,11 +1,10 @@
const rimraf = require("rimraf"); const rimraf = require('rimraf')
const { yellow } = require('kleur') const { yellow } = require('kleur')
const { join } = require('path') const { join } = require('path')
const PATH_WW = [ const PATH_WW = [
join(process.cwd(), '.wwebjs_auth'), join(process.cwd(), '.wwebjs_auth'),
join(process.cwd(), 'session.json') join(process.cwd(), 'session.json'),
] ]
const cleanSession = () => { const cleanSession = () => {

0
packages/cli/db/index.js Normal file
View File

View File

@@ -0,0 +1,3 @@
const { startInteractive } = require('./interactive')
if (process.env.NODE_ENV === 'dev') startInteractive()
module.exports = { startInteractive }

View File

@@ -1,6 +1,6 @@
const { readFileSync } = require('fs') const { readFileSync } = require('fs')
const { join } = require('path') const { join } = require('path')
const { installDeps, getPkgManage } = require('./tool') const { installDeps } = require('./tool')
const PKG_TO_UPDATE = () => { const PKG_TO_UPDATE = () => {
const data = readFileSync(join(__dirname, 'pkg-to-update.json'), 'utf-8') const data = readFileSync(join(__dirname, 'pkg-to-update.json'), 'utf-8')
@@ -9,9 +9,8 @@ const PKG_TO_UPDATE = () => {
return pkg return pkg
} }
const installAll = async () => { const installAll = async () => {
const pkg = await getPkgManage() // const pkg = await getPkgManage()
installDeps('npm', PKG_TO_UPDATE()).runInstall() installDeps('npm', PKG_TO_UPDATE()).runInstall()
} }

View File

@@ -4,7 +4,7 @@ const { detect } = require('detect-package-manager')
const PKG_OPTION = { const PKG_OPTION = {
npm: 'install', npm: 'install',
yarn: 'add', yarn: 'add',
pnpm: 'add' pnpm: 'add',
} }
const getPkgManage = async () => { const getPkgManage = async () => {
@@ -12,22 +12,24 @@ const getPkgManage = async () => {
return pkg return pkg
} }
const installDeps = (pkgManager, package) => { const installDeps = (pkgManager, packageList) => {
const errorMessage = `Ocurrio un error instalando ${package}` const errorMessage = `Ocurrio un error instalando ${packageList}`
let childProcess = [] let childProcess = []
const installSingle = (pkgInstall) => () => { const installSingle = (pkgInstall) => () => {
new Promise((resolve, reject) => { new Promise((resolve) => {
try { try {
childProcess = spawn(pkgManager, [PKG_OPTION[pkgManager], pkgInstall], { childProcess = spawn(
stdio: 'inherit' pkgManager,
}) [PKG_OPTION[pkgManager], pkgInstall],
{
stdio: 'inherit',
}
)
childProcess.on('error', (e) => { childProcess.on('error', (e) => {
console.error(e) console.error(e)
console.error( console.error(red(errorMessage))
red(errorMessage)
)
resolve() resolve()
}) })
@@ -36,37 +38,30 @@ const installDeps = (pkgManager, package) => {
resolve() resolve()
} else { } else {
console.error(code) console.error(code)
console.error( console.error(red(errorMessage))
red(errorMessage)
)
} }
}) })
resolve() resolve()
} catch (e) { } catch (e) {
console.error(e) console.error(e)
console.error( console.error(red(errorMessage))
red(errorMessage)
)
} }
}) })
} }
if (typeof package === 'string') { if (typeof packageList === 'string') {
childProcess.push(installSingle(package)) childProcess.push(installSingle(packageList))
} else { } else {
for (const pkg of package) { for (const pkg of packageList) {
childProcess.push(installSingle(pkg)) childProcess.push(installSingle(pkg))
} }
} }
const runInstall = () => { const runInstall = () => {
return Promise.all(childProcess.map((i) => i())) return Promise.all(childProcess.map((i) => i()))
} }
return { runInstall } return { runInstall }
} }
module.exports = { getPkgManage, installDeps } module.exports = { getPkgManage, installDeps }

View File

@@ -1,53 +0,0 @@
const prompts = require('prompts');
const { installAll } = require('./install')
const { cleanSession } = require('./clean')
const { checkNodeVersion, checkOs } = require('./check')
const questions = [
{
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)'
}
];
(async () => {
console.clear()
checkNodeVersion()
checkOs()
const onCancel = prompt => {
console.log('Proceso cancelado!');
return true;
}
const response = await prompts(questions, { onCancel });
const { dependencies = '', cleanTmp = '' } = response
const installOrUdpateDep = async () => {
const answer = dependencies.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await installAll()
return true
}
}
const cleanAllSession = async () => {
const answer = cleanTmp.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await cleanSession()
return true
}
}
installOrUdpateDep()
cleanAllSession()
})();

View File

@@ -0,0 +1,125 @@
const prompts = require('prompts')
const { yellow, red } = require('kleur')
const { installAll } = require('../install')
const { cleanSession } = require('../clean')
const { checkNodeVersion, checkOs } = require('../check')
const startInteractive = async () => {
const questions = [
{
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',
name: 'providerWs',
message: 'Proveedor de Whatsapp',
choices: [
{ title: 'whatsapp-web.js', value: 'whatsapp-web.js' },
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true },
{ title: 'Twilio', value: 'twilio', disabled: true },
],
max: 1,
hint: 'Espacio para selecionar',
instructions: '↑/↓',
},
{
type: 'multiselect',
name: 'providerDb',
message: 'Cual base de datos quieres usar',
choices: [
{ title: 'JSONFile', value: 'json' },
{ title: 'MySQL', value: 'mysql', disabled: true },
{ title: 'Mongo', value: 'mongo', disabled: true },
],
max: 1,
hint: 'Espacio para selecionar',
instructions: '↑/↓',
},
]
console.clear()
checkNodeVersion()
checkOs()
const onCancel = () => {
console.log('Proceso cancelado!')
return true
}
const response = await prompts(questions, { onCancel })
const {
dependencies = '',
cleanTmp = '',
providerDb = [],
providerWs = [],
} = response
/**
* Question #1
* @returns
*/
const installOrUdpateDep = async () => {
const answer = dependencies.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await installAll()
return true
}
}
/**
* Question #2
* @returns
*/
const cleanAllSession = async () => {
const answer = cleanTmp.toLowerCase() || 'n'
if (answer.includes('n')) return true
if (answer.includes('y')) {
await cleanSession()
return true
}
}
const vendorProvider = async () => {
if (!providerWs.length) {
console.log(
red(
`Debes de seleccionar una WS Provider. Tecla [Space] para seleccionar`
)
)
process.exit(1)
}
console.log(yellow(`'Deberia crer una carpeta en root/provider'`))
return true
}
const dbProvider = async () => {
const answer = providerDb
if (!providerDb.length) {
console.log(
red(
`Debes de seleccionar una DB Provider. Tecla [Space] para seleccionar`
)
)
process.exit(1)
}
if (answer === 'json') {
console.log('Deberia crer una carpeta en root/data')
return 1
}
}
await installOrUdpateDep()
await cleanAllSession()
await vendorProvider()
await dbProvider()
}
module.exports = { startInteractive }

286
packages/cli/lib/bundle.cjs Normal file
View File

@@ -0,0 +1,286 @@
'use strict';
var require$$0$3 = require('prompts');
var require$$0 = require('kleur');
var require$$0$1 = require('fs');
var require$$1$1 = require('path');
var require$$1 = require('cross-spawn');
var require$$2 = require('detect-package-manager');
var require$$0$2 = require('rimraf');
const { red: red$2 } = require$$0;
const spawn = require$$1;
const { detect } = require$$2;
const PKG_OPTION = {
npm: 'install',
yarn: 'add',
pnpm: 'add',
};
const getPkgManage = async () => {
const pkg = await detect();
return pkg
};
const installDeps$1 = (pkgManager, packageList) => {
const errorMessage = `Ocurrio un error instalando ${packageList}`;
let childProcess = [];
const installSingle = (pkgInstall) => () => {
new Promise((resolve) => {
try {
childProcess = spawn(
pkgManager,
[PKG_OPTION[pkgManager], pkgInstall],
{
stdio: 'inherit',
}
);
childProcess.on('error', (e) => {
console.error(e);
console.error(red$2(errorMessage));
resolve();
});
childProcess.on('close', (code) => {
if (code === 0) {
resolve();
} else {
console.error(code);
console.error(red$2(errorMessage));
}
});
resolve();
} catch (e) {
console.error(e);
console.error(red$2(errorMessage));
}
});
};
if (typeof packageList === 'string') {
childProcess.push(installSingle(packageList));
} else {
for (const pkg of packageList) {
childProcess.push(installSingle(pkg));
}
}
const runInstall = () => {
return Promise.all(childProcess.map((i) => i()))
};
return { runInstall }
};
var tool = { getPkgManage, installDeps: installDeps$1 };
const { readFileSync } = require$$0$1;
const { join: join$1 } = require$$1$1;
const { installDeps } = tool;
const PKG_TO_UPDATE = () => {
const data = readFileSync(join$1(__dirname, 'pkg-to-update.json'), 'utf-8');
const dataParse = JSON.parse(data);
const pkg = Object.keys(dataParse).map((n) => `${n}@${dataParse[n]}`);
return pkg
};
const installAll$1 = async () => {
// const pkg = await getPkgManage()
installDeps('npm', PKG_TO_UPDATE()).runInstall();
};
var install = { installAll: installAll$1 };
const rimraf = require$$0$2;
const { yellow: yellow$2 } = require$$0;
const { join } = require$$1$1;
const PATH_WW = [
join(process.cwd(), '.wwebjs_auth'),
join(process.cwd(), 'session.json'),
];
const cleanSession$1 = () => {
const queue = [];
for (const PATH of PATH_WW) {
console.log(yellow$2(`😬 Eliminando: ${PATH}`));
queue.push(rimraf(PATH, () => Promise.resolve()));
}
return Promise.all(queue)
};
var clean = { cleanSession: cleanSession$1 };
const { red: red$1, yellow: yellow$1, green, bgCyan } = require$$0;
const checkNodeVersion$1 = () => {
console.log(bgCyan('🚀 Revisando tu Node.js'));
const version = process.version;
const majorVersion = parseInt(version.replace('v', '').split('.').shift());
if (majorVersion < 16) {
console.error(
red$1(
`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}`
)
);
process.exit(1);
}
console.log(green(`Node.js combatible ${version}`));
console.log(``);
};
const checkOs$1 = () => {
console.log(bgCyan('🙂 Revisando tu Sistema Operativo'));
const os = process.platform;
if (!os.includes('win32')) {
const messages = [
`El sistema operativo actual (${os}) posiblemente requiera`,
`una confiuración adicional referente al puppeter`,
``,
`Recuerda pasar por el WIKI`,
`🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalaci%C3%B3n`,
``,
];
console.log(yellow$1(messages.join(' \n')));
}
console.log(``);
};
var check = { checkNodeVersion: checkNodeVersion$1, checkOs: checkOs$1 };
const prompts = require$$0$3;
const { yellow, red } = require$$0;
const { installAll } = install;
const { cleanSession } = clean;
const { checkNodeVersion, checkOs } = check;
const startInteractive$1 = async () => {
const questions = [
{
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',
name: 'providerWs',
message: 'Proveedor de Whatsapp',
choices: [
{ title: 'whatsapp-web.js', value: 'whatsapp-web.js' },
{ title: 'API Oficial (Meta)', value: 'meta', disabled: true },
{ title: 'Twilio', value: 'twilio', disabled: true },
],
max: 1,
hint: 'Espacio para selecionar',
instructions: '↑/↓',
},
{
type: 'multiselect',
name: 'providerDb',
message: 'Cual base de datos quieres usar',
choices: [
{ title: 'JSONFile', value: 'json' },
{ title: 'MySQL', value: 'mysql', disabled: true },
{ title: 'Mongo', value: 'mongo', disabled: true },
],
max: 1,
hint: 'Espacio para selecionar',
instructions: '↑/↓',
},
];
console.clear();
checkNodeVersion();
checkOs();
const onCancel = () => {
console.log('Proceso cancelado!');
return true
};
const response = await prompts(questions, { onCancel });
const {
dependencies = '',
cleanTmp = '',
providerDb = [],
providerWs = [],
} = response;
/**
* Question #1
* @returns
*/
const installOrUdpateDep = async () => {
const answer = dependencies.toLowerCase() || 'n';
if (answer.includes('n')) return true
if (answer.includes('y')) {
await installAll();
return true
}
};
/**
* Question #2
* @returns
*/
const cleanAllSession = async () => {
const answer = cleanTmp.toLowerCase() || 'n';
if (answer.includes('n')) return true
if (answer.includes('y')) {
await cleanSession();
return true
}
};
const vendorProvider = async () => {
if (!providerWs.length) {
console.log(
red(
`Debes de seleccionar una WS Provider. Tecla [Space] para seleccionar`
)
);
process.exit(1);
}
console.log(yellow(`'Deberia crer una carpeta en root/provider'`));
return true
};
const dbProvider = async () => {
const answer = providerDb;
if (!providerDb.length) {
console.log(
red(
`Debes de seleccionar una DB Provider. Tecla [Space] para seleccionar`
)
);
process.exit(1);
}
if (answer === 'json') {
console.log('Deberia crer una carpeta en root/data');
return 1
}
};
await installOrUdpateDep();
await cleanAllSession();
await vendorProvider();
await dbProvider();
};
var interactive = { startInteractive: startInteractive$1 };
const { startInteractive } = interactive;
if (process.env.NODE_ENV === 'dev') startInteractive();
var cli = { startInteractive };
module.exports = cli;

View File

@@ -1,22 +1,25 @@
{ {
"name": "cli", "name": "cli",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "cli:dev": "NODE_ENV=dev node ./index.js",
}, "cli:rollup": "rollup index.js --config ./rollup-cli.config.js",
"keywords": [], "format:check": "prettier --check .",
"author": "", "format:write": "prettier --write .",
"license": "ISC", "lint:check": "eslint .",
"devDependencies": { "lint:fix": "eslint --fix .",
"cross-spawn": "^7.0.3", "build:cli": "npm run format:write && npm run lint:fix && npm run cli:rollup"
"detect-package-manager": "^2.0.1", },
"kleur": "^4.1.5", "keywords": [],
"prompts": "^2.4.2", "author": "",
"rimraf": "^3.0.2" "license": "ISC",
}, "devDependencies": {
"dependencies": { "cross-spawn": "^7.0.3",
"whatsapp-web.js": "^1.18.0" "detect-package-manager": "^2.0.1",
} "kleur": "^4.1.5",
"prompts": "^2.4.2",
"rimraf": "^3.0.2"
}
} }

View File

@@ -1,3 +1,3 @@
{ {
"whatsapp-web.js":"latest" "whatsapp-web.js": "latest"
} }

View File

View File

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