UNPKG

@guillermobrachetta/cli-todo

Version:

CLI to manage todos

93 lines (71 loc) 2.03 kB
#!/usr/bin/env node /** * 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); })();