Я бы предположил, что большинство библиотек ini не включают в себя функции расширения переменных, но с примитивами loda sh обобщенный c "глубокий заменитель объекта" не слишком сложен.
Я переключил :
разделитель для .
, поэтому имеет и get может искать значения напрямую.
const { get, has, isPlainObject, reduce } = require('lodash')
// Match all tokens like `${a.b}` and capture the variable path inside the parens
const re_token = /\${([\w$][\w\.$]*?)}/g
// If a string includes a token and the token exists in the object, replace it
function tokenReplace(value, key, object){
if (!value || !value.replace) return value
return value.replace(re_token, (match_string, token_path) => {
if (has(object, token_path)) return get(object, token_path)
return match_string
})
}
// Deep clone any plain objects and strings, replacing tokens
function plainObjectReplacer(node, object = node){
return reduce(node, (result, value, key) => {
result[key] = (isPlainObject(value))
? plainObjectReplacer(value, object)
: tokenReplace(value, key, object)
return result
}, {})
}
> plainObjectReplacer({ a: { b: { c: 1 }}, d: 'wat', e: '${d}${a.b.c}' })
{ a: { b: { c: 1 } }, d: 'wat', e: 'wat1' }
Вы найдете большинство инструментов управления конфигурациями (например, ansible), которые могут выполнить такое расширение переменных перед выполнением приложения при развертывании.