1.2.0 • Published 9 years ago

natan v1.2.0

Weekly downloads
2
License
MIT
Repository
github
Last release
9 years ago

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

1.2.0

9 years ago

1.1.0

9 years ago

1.0.12

9 years ago

1.0.11

9 years ago

1.0.10

10 years ago

1.0.9

10 years ago

1.0.6

10 years ago

1.0.5

10 years ago

1.0.4

10 years ago

1.0.3

10 years ago

1.0.2

10 years ago

1.0.1

10 years ago

1.0.0

10 years ago