open-index/open-npm huggingface dataset:
npm package: @ling.black/deploy
Description: ## Установка
Author: Yakov V. Ling
Latest version: 1.1.1

# @ling.black/deploy

## Установка

```
yarn add @ling.black/deploy
```

## Использование

Предположим, что в директории `./myExpressApp` лежит проект express. Очень важно, что в `package.json` у нас есть скрипт
запуска:

```json
{
  "scripts": {
    "start": "node ./index.js"
  }
}
```

Порт мы решили использовать `3399`. Это указали в методе `app.listen`. Начнем:

### Общий пример

```js
import {createDeployClient} from "@ling.black/deploy";

(async () => {

    // Создаем подключение
    const deploy = await createDeployClient({
        host: 'myhost.ru',
        port: 22,
        password: '*******',
        user: 'user',
    });

    // Первым делом проверим, что порт не занят, или остановим процесс,
    // который его испольузет
    const port = await deploy.shell.commandPortUsage(3399);
    if (port.process) {
        await deploy.shell.commandKill(port.process);
    }

    // Создадим необходимую директорию и выполним загрузку
    await deploy.shell.command("cd /home/user/tests && mkdir -p app");
    await deploy.sftp.uploadDirectory("./myExpressApp", "/home/user/tests/app");

    // Установим и запустим приложение
    await deploy.shell.command("cd /home/user/tests/app && yarn");
    await deploy.shell.command("cd /home/user/tests/app && node ./index.js");
    // resolve настанет при остановке работы node приложения 

    // Данная строка кода вызовится очень не скоро. Когда express остановится
    deploy.close();

})();
```

Рассмотрим дополнительные примеры

### Загрузка и установка nodeJS приложения

```js
// Создадим необходимую директорию и выполним загрузку
await deploy.shell.command("cd /home/user/tests && mkdir -p app");
await deploy.sftp.uploadDirectory("./myExpressApp", "/home/user/tests/app");

// Установим и запустим приложение
await deploy.shell.command("cd /home/diego/tests/app && yarn");
```

Можно упростить в:

```js
await deploy.nodeJSUploadAndInstall("./myExpressApp", "/home/user/tests/app");
```

Таким образом, загрузка и установка упакованы в один метод. Однако нам все еще надо установить и запустить. Окей,
рассмотрим следующий вариант

### Deploy nodeJS приложения

```js
await deploy.nodeJSDeployApp({
    localPath: "./myExpressApp",
    remotePath: "/home/user/tests/app",
    install: true,
    start: true,
});
```

Флаг `install: true` запускает установку, а `start: true` запускает `yarn start` на сервере. Можно опустить эти
параметры, они по умолчанию установлены в `true`.

### Deploy nodeJS Express приложения

В прошлом примере мы смогли установить и запустить приложение, остается проверить порт. Такой вариант тоже имеется в
удобном виде:

```js
await deploy.nodeJSDeployExpressApp({
    localPath: "./myExpressApp",
    remotePath: "/home/user/tests/app",
    install: true,
    start: true,
    port: 3399,
});
```

В данный метод мы также передали порт. Если он будет занят, то вызовется `kill ${port}`. Консоль будет отображать все,
что получает nodeJS приложение. Это добивается флагом:

```js
    deploy.showStreamData = true;
```
npm package: @ling.black/log
Description: ## Установка
Author: Yakov V. Ling
Latest version: 1.0.0

# @log.black

## Установка

```
yarn add log.black
```

## Использование

```js
import {Logger} from "log.black";

Logger.log('Test message');
Logger.warning('Test message');
Logger.error('Test message');
Logger.success('Test message');
Logger.object({name: 'Kri', value: 3});

Logger.group('Test group');
Logger.error('0%');
Logger.success('100%');
Logger.groupEnd();
```

### Начать запись в файл

```js
import {LoggerSettings, Logger} from "log.black";

LoggerSettings.filePath = 'test.log';

Logger.log('Test message');
```

### Создать свой логгер

```js
import {createLogger, LType} from "log.black";

// Аргементы:
//  1. имя
//  2. цветовая ассоциация: LType.info, LType.warning, 
//  LType.danger, LType.success, LType.secondary, LType.none
const logger = createLogger('Server', LType.info);
```
npm package: @ling.black/reactive
Description: Реактивные элементы. Библиотека реализована крайне просто, исключительно для очевидного и легкого функционала. Имеется некоторая оптимизация.
Author: Yakov V. Ling
Latest version: 1.0.2

# @ling.black/reactive

Реактивные элементы. Библиотека реализована крайне просто, исключительно для очевидного и легкого функционала. Имеется
некоторая оптимизация.

## Установка
```
yarn add @ling.black/reactive
```

## Использование

Каждый реативный элемент имеет следующие параметры/методы:
- `reactiveVar.value` - значение реактивной переменной
- `reactiveVar.watch( value => console.log(value) )` - добавление наблюдателя
- `reactiveVar.shake()` - имитация изменения, которая приводит к активации всех наблюдателей

```js
import {reactive} from "@ling.black/reactive";

// Реактивная переменная
const myName = reactive('Вася');

// Наблюдатель
let wasName = myName.value;
myName.watch( name => {
   console.log(wasName + ' теперь ' + name);
   wasName = name;
});

// Изменения
myName.value = 'Олег';
myName.value = 'Кирилл';

// Console:
// Вася теперь Олег
// Олег теперь Кирилл
```

### Массив

```js
import {reactiveArray} from "@ling.black/reactive";

// Реактивная переменная
const arr = reactiveArray([0, 1]);

// Наблюдатель
arr.watch( a => console.log(a));

// Изменения
arr.push(2);
arr.push(3);

// Console:
// [ 0, 1, 2 ]
// [ 0, 1, 3 ]

arr.removeAt(0);
console.log(arr.value); // [ 1, 2, 3 ]
```

В отличаи от обычных переменных, массивы обладают следующими методами:
- `reactArr.set( arr: T[] )` - заменяет массив
- `reactArr.push( ...items: T[] )` - добавляет элемент в массив
- `reactArr.remove( item: T )` - удаляет элемент из массива
- `reactArr.removeAt( index: number )` - удаляет элемент из массива по индексу
- `reactArr.clear()` - очищает массив

### Объекты

Реализация реактивных объектов не добавлена. Рекомендовано собирать объект из простых реактивных типов.