Get unlimited public & private packages + package-based permissions with npm Pro.Get started »

natan

1.2.0 • Public • Published

natan

Загрузчик конфигураций, умеет:

  • Загружать файлы с расширениями: json, js
  • Накладывать конфигурационные файлы, в соответствии с заданной иерархией
  • Интерполировать значения, для мелкой автоматизации
npm i natan --save

Overlapping

В контексте наложения используются следующие типы файлов:

  • Узловой файл:
    • Непосредственно загружаемый из приложения или наследуемый файл
    • Может иметь зависимости:
      • Наследуемый файл
      • Дефолтный файл
      • Локальный файл
  • Дефолтный файл:
    • Узловой файл перекрывает дефолтный файл
    • Не имеет зависимостей
  • Локальный файл:
    • Локальный файл перекрывает узловой файл
    • Не имеет зависимостей

Для определения иерархии наложения можно использовать:

  • Соглашение:
    • Наследуемый файл:
      • Расположен на одну директорию ниже узлового файла
      • Имеет тоже имя, что и узловой, но может иметь другое расширение
    • Дефолный файл:
      • Расположен в той же директории, что и узловой
      • Имеет имя default, и одно из разрешенных расширений
    • Локальный файл:
      • Расположен в той же директории, что и узловой
      • Имеет имя узлового, с добавлением постфикса .local и разрешенное расширение файла
  • Конфигурацию:
    • Наследуемый файл: добавлением поля __parent__ в узловой файл
    • Дефолтный файл: добавлением поля __default__ в узловой файл
    • Локальный файл: добавлением поля __local__ в узловой файл

example-config

var natan = require('natan')
var config = natan('node_modules/example-config/dashboard/dev') 
console.info(config)
 
/*
{ onTopTest: 'dashboard/dev!',
  logger: { transports: { Console: { level: 'debug', debugStdout: true, colorize: true } } },
  ports: { server: 7070, dashboard: 9090 },
  serverAddress: 'http://localhost:7070',
  someRegExp: /^(\d+)$/,
  storage: '/tmp/' }
*/
 

В данной примере:

  • Загружается узловой файл: dashboard/dev.json
  • Загружается дефолный файл узлового: dashboard/default.json
  • Загружается наследуемый файл узлового: dev.json
  • Загружается дефолтный файл наследуемого: default.json
  • Файлы накладываются в соответствие со своей иерархией
  • Значения интерполируются

Наложение может быть отключено:

  • Заданием переменной окружения: NATAN_OVERLAPPING=false
  • Передачей вторым аргументом: natan(path, { useInterpolating: false })

Interpolating

Интерполяция была задумана как мелкая автоматизация, для случаев когда:

  • Значения зависят от других значения
  • Значения являются вычисляемыми

Например удобно используя микросервисную архитектуру, определить порты приложений в общем файле, а в конфигурационном файле сервиса вычислить адреса на основе портов.

// root.json
{
    "ports": { "server": 100000, "dashboard": 8080 } }
}
 
// server.json
{
    "__parent__": "root",
    "dashboardAddress": "http://localhost:k{ ports.dashboard }"
}

Или задать временной интервал в человеко читаемом формате:

{
    "updateInterval": "t{ one minute }"
}

Или вычислить абсолютный путь к хранилищу, относительно рабочей директории:

{
    "storage": "p{ ./storage }"
}

Или сделать что-нибудь безумное:

{
    "workerName": "f{ 'worker-' + require('os').hostname() + '-' + Date.now() }" 
}

Или определить пороговый размер файла:

{
  "trashhold": "b{ 10 MB }"
}

Возможно человеко читаемо записать некоторый лимит:

{
  "limit": "n{ 150 000 000 }"
}

Полный список интерполируемых значений:

  • k{ ... } - определяет значение по существующему ключу
  • t{ ... } - определяет временной интервал в миллисукундах, используется библиотека human-interval
  • p{ ... } - определяет абсолютный путь, относительно рабочий директории
  • r{ ... } - вычисляет регулярное выражение, аналог вызова new RegExp('...')
  • b{ ... } - переводит размер файла в число, используется библиотека human2bytes
  • n{ ... } - удаляет пробелы и не числовые символы, заменяет запятые на точки, для того чтобы сконвертировать значение в число
  • f{ ... } - вычисляет значение функции, функции интерполируются в последнюю очередь, в качестве this используется текущая вычисленная конфигурация.

Интерполяция может быть отключена:

  • Заданием переменной окружения: NATAN_INTERPOLATING=false
  • Передачей вторым аргументом: natan(path, { useInterpolating: false })

Debug

  • Можно запустить тесты cd node_modules/natan && npm run test
  • Можно увидеть этапы сборки конфигурации задав: DEBUG=natan
  • Можно воспользоваться отладочными утилитами: natan-test-config и natan-test-configs
PATH="$PATH:$PWD/node_modules/.bin"
natan-test-config -c node_modules/natan/example-config/dashboard/dev

natan-test-config

PATH="$PATH:$PWD/node_modules/.bin"
natan-test-configs -d node_modules/natan/example-config/

natan-test-configs

Install

npm i natan

DownloadsWeekly Downloads

1

Version

1.2.0

License

MIT

Last publish

Collaborators

  • avatar