Как я прокачал свой первый проект по фронту

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Читать в полной версии →

Недавно я переписал свой первый проект на TypeScript, но не закончил работу над ним. Вооружившись полученными во время выполнения второго проекта знаниями, я возвращаюсь к «Играми разума».

Работа с Node.js и модулем Commander.js была очень интересной, поэтому я решил: «Почему бы мне не внедрить его и в первый проект?».

Подготовка

Unit-тесты я буду писать на TypeScript, поэтому сначала нужно подготовить среду. В частности, к jest-пакетам из второго проекта нужно будет добавить @types/jest.

Используем Commander.js

Выбор игры был реализован через вывод списка с дальнейшим запуском через switch. Но в этом случае такой подход не годится: при запуске приложения нужно будет прописывать названия игры и использовать его в качестве аргумента.

Немного переписал код, протестировал, все работает. Отлично!

А как же пользователь?

Хорошо, я знаю какие есть игры и как они называются, но что делать другим? Откуда пользователь узнает, что ему запускать?

Нужен вывод списка игр, но как его реализовать? В Commander.js есть встроенная опция --help, через которую можно показывать список. Но это неверный путь, он не логичен. Help должен выводить список опций и информацию о приложении, а не список игр. Что ж, открываю мануал.

Command

Идеальный вариант, простой и логичный, внедряю. Теперь список игр выводится простой командой brain-games list. Довольно лаконично. А так выглядит вывод команды brain-games -h:

Usage: brain-games [options] [command] 

A set of CLI arithmetic games

Options:
  -v, --version  output the current version
  -h, --help     read more information

Commands:
  list           list of games with description

Конец?

Проект оказался слишком простым, поэтому я решил усложнить задачу и сделать работу с папкой games автоматической. Программа сама будет брать названия игр и использовать их.

Для этого я использую следующие модули:

import { readdirSync } from "fs";
import { resolve, extname } from "path";
import { cwd } from "process";

Используя readdirSync, я получаю массив с названиями файлов в папке games для дальнейшей работы с ними. После этого я создал объект и интерфейс к нему для вывода списка игр с их описаниями.

Вот что у меня получилось:

$ brain-games list
calc: Arithmetic expressions that need to be calculated
even: Determining an even number
gcd: Determining the greatest common divisor
prime: Definition of a prime number
progression: Finding missing numbers in a sequence of numbers

Тесты

Для тестирования списка игр я решил использовать openSync и rmSync из fs. Во время теста создается файл и проверятся вывод списка игр, после файл удаляется.

Увы, мне удалось покрыть тестами только 59% кода. Довольно сложно тестировать то, что ничего не возвращает 😅.

Конец

На этом все. Теперь можно оставить первый проект в покое — добавлять в него уже нечего. Как обычно, прикрепляю ссылку на проект для самых любопытствующих. Мой проект.

Всем спасибо за внимание! 😊

P.S. А что если сделать Web-версию?