natan
v1.2.0
Published
smart config loader and builder
Downloads
5
Maintainers
Readme
natan
Загрузчик конфигураций, умеет:
- Загружать файлы с расширениями:
json
,js
- Накладывать конфигурационные файлы, в соответствии с заданной иерархией
- Интерполировать значения, для мелкой автоматизации
npm i natan --save
Overlapping
В контексте наложения используются следующие типы файлов:
- Узловой файл:
- Непосредственно загружаемый из приложения или наследуемый файл
- Может иметь зависимости:
- Наследуемый файл
- Дефолтный файл
- Локальный файл
- Дефолтный файл:
- Узловой файл перекрывает дефолтный файл
- Не имеет зависимостей
- Локальный файл:
- Локальный файл перекрывает узловой файл
- Не имеет зависимостей
Для определения иерархии наложения можно использовать:
- Соглашение:
- Наследуемый файл:
- Расположен на одну директорию ниже узлового файла
- Имеет тоже имя, что и узловой, но может иметь другое расширение
- Дефолный файл:
- Расположен в той же директории, что и узловой
- Имеет имя
default
, и одно из разрешенных расширений
- Локальный файл:
- Расположен в той же директории, что и узловой
- Имеет имя узлового, с добавлением постфикса
.local
и разрешенное расширение файла
- Наследуемый файл:
- Конфигурацию:
- Наследуемый файл: добавлением поля
__parent__
в узловой файл - Дефолтный файл: добавлением поля
__default__
в узловой файл - Локальный файл: добавлением поля
__local__
в узловой файл
- Наследуемый файл: добавлением поля
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-intervalp{ ... }
- определяет абсолютный путь, относительно рабочий директорииr{ ... }
- вычисляет регулярное выражение, аналог вызоваnew RegExp('...')
b{ ... }
- переводит размер файла в число, используется библиотека human2bytesn{ ... }
- удаляет пробелы и не числовые символы, заменяет запятые на точки, для того чтобы сконвертировать значение в число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
PATH="$PATH:$PWD/node_modules/.bin"
natan-test-configs -d node_modules/natan/example-config/