Зміст
Коротко
Крос-платформені CLI на Node.js часто перетворюються на лабіринт if (process.platform === …). На Dev.to показали патерни Strategy і Factory для утиліти EADDRINUSE: команди різних ОС ховаються за інтерфейсами, ядро лишається тестованим.
Що сталося
Типова біль: локальний сервер не стартує, бо порт зайнятий. На Windows потрібні netstat і taskkill, на macOS і Linux — lsof і kill. Якщо розмазати ці гілки по всьому коду, unit-тести перетворюються на моки shell, а кожна нова ОС — ще один switch.
Автор будує шар так. TypeScript-інтерфейси описують контракт без рядків shell у бізнес-логіці. Factory обирає платформенну Strategy. Виконавець команд без стану запускає argv-масиви — менший ризик внедрення в shell.
Зверху — спільний API і CLI на одному ядрі. Приклад домену — «звільнити порт перед dev-сервером», але той самий каркас підходить для будь-якої різниці середовищ: бінарники, мережеві утиліти, обробка помилок.
Чому це важливо
npm-пакети, що «працюють на Mac», регулярно падають у Linux CI або у колег на Windows. Strategy робить поведінку передбачуваною і підмінною в тестах. Будь-який адаптер до зовнішніх систем виграє від розділення «політика vs механізм».
На практиці
- Опишіть інтерфейс домену до першої shell-команди.
- Одна Factory на вибір платформи.
- Runner приймає масив аргументів, не рядок
exec(`kill ${pid}`). - Тести: fake Strategy з записом викликів; інтеграційні — matrix по ОС у CI.
- CLI — тонка обгортка над тим самим сервісом з
"exports".
Підсумок
Factory і Strategy — спосіб тримати крос-платформенний npm-пакет читабельним. Матеріал на Dev.to корисний, якщо утиліти роздуваються від switch (os.platform()).

