All files todo.js

100% Statements 32/32
100% Branches 6/6
100% Functions 9/9
100% Lines 30/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 651x 1x   1x     28x 28x 16x   13x         19x       13x 13x 5x       13x 13x 13x       2x       3x 3x 3x 1x   2x 2x 2x       4x 4x 4x 1x   3x 3x 3x     1x                
const fs = require('fs');
const path = require('path');
 
const TODO_FILE = path.join(__dirname, 'todos.json');
 
function loadTodos() {
  try {
    const data = fs.readFileSync(TODO_FILE, 'utf8');
    return JSON.parse(data);
  } catch (error) {
    return [];
  }
}
 
function saveTodos(todos) {
  fs.writeFileSync(TODO_FILE, JSON.stringify(todos, null, 2));
}
 
function addTodo(task) {
  const todos = loadTodos();
  const newTodo = {
    id: todos.length > 0 ? Math.max(...todos.map(t => t.id)) + 1 : 1,
    task,
    completed: false
  };
  todos.push(newTodo);
  saveTodos(todos);
  return newTodo;
}
 
function listTodos() {
  return loadTodos();
}
 
function completeTodo(id) {
  const todos = loadTodos();
  const todo = todos.find(t => t.id === id);
  if (!todo) {
    return null;
  }
  todo.completed = true;
  saveTodos(todos);
  return todo;
}
 
function deleteTodo(id) {
  const todos = loadTodos();
  const index = todos.findIndex(t => t.id === id);
  if (index === -1) {
    return null;
  }
  const deleted = todos.splice(index, 1)[0];
  saveTodos(todos);
  return deleted;
}
 
module.exports = {
  addTodo,
  listTodos,
  completeTodo,
  deleteTodo,
  loadTodos,
  saveTodos
};