Jak szybko stworzyć własne CLI, które przyda nam się przy naszych codziennych zadaniach ? Odpowiedź to inquire.js (i dobry pomysł na nasze CLI).

W większości nowych instalacjach np. Gatsby.js czy Ghost.js,  mamy już gotowe implementacje modułu optymalizacji zdjęć i nie musimy się tym przejmować po za początkową konfiguracją. Jednakże moje starsze instalacje albo wordpressy nie mają tego szczęścia.

Mój problem był dość prosty, od czasu do czasu potrzebowałem narzędzia, które uruchomię na dowolnym folderze, które pozwoliło by mi szybko, bez bólu i bez pamiętania konfiguracji, komend, itp. przyciąć, zoptymalizować lub zmienić format zdjęć, które znajdują się wybranym folderze.

Szukając gotowych rozwiązań, upewniłem się tylko w przekonaniu, że nie ma nic na internecie co by sprostało moim wymaganiom, szczególnie jeżeli chodzi możliwość optymalizacji całego folderu i swego rodzaju UX całej operacji. Większość tools'ów wymaga dodatkowych argumentów, opcji do wpisania wraz z komendą, co powoduję, że za każdym razem muszę przeglądać dokumentacje w poszukiwaniu właściwej konfiguracji.

Tak zrodził się pomysł na mały program, który nazwałem Sharp Machine. Zdecydowałem się na lovell/sharp:

"High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images. Uses the libvips library."

ze względu na jego szybkość i znajomość biblioteki (Gatsby.js korzysta z sharpa'a).

Sharp machine, https://github.com/MassivDash/SharpMachine

Budowa własnego CLI

Budowa własnego CLI, okazała się dobra zabawą dzięki gotowym rozwiązaniom dostępnym w internecie. Szczególnie, mogę pochwalić bibliotekę Inquirer.js, która czyni tworzenie interaktywnych pytań i uzyskiwanie odpowiedzi od użytkownika dość trywialnym procederem.

index.js

const inquirer  = require('./libs/inquirer');

const run = async () => {
 const location = await inquirer.askInputQuestions(); 
};

run(); 

inquirer.js

const inquirer = require('inquirer');

module.exports = {
  askInputQuestions: () => {
    const questions = [
      {
        name: 'inputDir',
        type: 'input',
        message: 'Enter input directory (type . for current folder): ',
        validate: function( value ) {
          if (value.length) {
            return true;
          } else {
            return 'Gotta type in something';
          }
        }
      },
      {
        name: 'outputDir',
        type: 'input',
        message: 'Enter output directory :',
        validate: function(value) {
          if (value.length) {
            return true;
          } else {
            return 'Please Enter output directory';
          }
        }
      }
    ];
    return inquirer.prompt(questions);
  },
};

Po uruchomieniu programu i odpowiedzeniu na przygotowane pytania. W naszej zmiennej location przechowywane są odpowiedzi użytkownika. Na ich podstawie zadajemy kolejne pytania lub uruchamiamy odpowiednie procesy. W moim przypadku jest to sprawdzenie podanego folderu pod kątem obecności zdjęć oraz dalsze operacje i pytania o zadania dla modułu sharp. Inquirer.js posiada w swoim api, pytania; input, list, checkbox, expand, ... oraz editor. Ta ostatnia opcja okazała się doskonałym rozwiązaniem dla stworzenia custom configu do Sharp Machine. Ten typ pytania powoduje otwarcie ulubionego edytora tekstu oraz możliwość edycji pełnego obiektu konfiguracyjnego, które sprawia, że łatwo dostosować sharp machine do swoich potrzeb.

Do dalszych prac na interfejsem swojego CLI wykorzystałem:  

  • Chalk.js: daje możliwość ostylowania naszych wiadomości pokazywanych w konsoli.
  • Figlet.js: daje możliwość zrobienia consolowego splash screena / tytułu naszego programu CLI
  • Clui.js: daje możliwość dołączenia spinnera, progress bar'a  podczas operacji CLI

Sharp Machine został przemyślany jako moduł  do pracy globalnej, aby upewnić się, że nasz moduł będzie odpowiednio działać, warto pamiętać aby dodać do index.js (na samej górze pliku)

#!/usr/bin/env node

oraz do pliku package.json

  "bin": {
    "nazwa_naszego_pakietu": "./index.js"
  }

Tworzenie własnego CLI to dobre ćwiczenie do pracy z czystym node.js oraz asynchronicznymi działaniami. Polecam dla każdego kto uwielbia zabawy i pracę z node konsolą.    

Pełne źródło SharpMachine na githubie lub do przetestowania samemu

npm i -g sharpmachine
sharpmachine

Pozdrawiam