@guillermobrachetta/cli-todo
Version:
CLI to manage todos
93 lines (71 loc) • 2.03 kB
JavaScript
/**
* cli-todo
* CLI to manage todos
*
* @author Guillermo Brachetta <https://www.gbrachetta.com>
*/
import fs from 'fs';
import path from 'path';
import makeDir from 'make-dir';
import process from 'process';
import chalk from 'chalk';
import alert from 'cli-alerts';
import init from './utils/init.js';
import cli from './utils/cli.js';
import log from './utils/log.js';
import ask from './utils/ask.js';
import select from './utils/select.js';
// Database
import { Low } from 'lowdb';
import { JSONFile } from 'lowdb/node';
const dbTodos = path.join(process.cwd(), '.todo/todos.json');
const { input, flags } = cli;
const { clear, debug } = flags;
// Colors
const yellow = chalk.hex('#dab000').inverse;
const dim = chalk.dim;
// EFI Function
(async () => {
init({ clear });
input.includes('help') && cli.showHelp(0);
if (!fs.existsSync(dbTodos)) {
await makeDir('.todo');
}
const adapter = new JSONFile(dbTodos);
const db = new Low(adapter);
await db.read();
db.data ||= { todos: [] };
db.write();
// COMMAND: List todos
if (input.includes('view') || input.includes('ls')) {
const allTodos = await db.data.todos;
allTodos.map((todo, i) => console.log(`${dim(`${++i}:`)} ${todo.title}`));
console.log(`\n${yellow(' TOTAL ')} ${allTodos.length}\n`);
}
// COMMAND: ADD todo
if (input.includes('add')) {
const whatTodo = await ask({ message: 'Add a todo' });
await db.data.todos.push({ title: whatTodo });
db.write();
alert({
type: 'success',
name: 'ADDED',
msg: 'Successfully',
});
}
// COMMAND: DELETE todo
if (input.includes('del')) {
const toDelete = await select({
choices: await db.data.todos,
message: 'Finish todos:',
});
await db.read();
const allTodos = await db.data.todos;
const toDel = new Set(toDelete);
const toKeep = allTodos.filter((todo) => !toDel.has(todo.title));
db.data.todos = toKeep;
db.write();
}
debug && log(flags);
})();