Недавно я переписал свой первый проект на 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-версию?