const Handlebars = require('handlebars'); const { forOwn, cloneDeep } = require('lodash'); const interpolateEnvVars = (str, processEnvVars) => { if (!str || !str.length || typeof str !== 'string') { return str; } const template = Handlebars.compile(str, { noEscape: true }); return template({ process: { env: { ...processEnvVars } } }); }; const interpolateString = (str, { envVars, collectionVariables, processEnvVars }) => { if (!str || !str.length || typeof str !== 'string') { return str; } processEnvVars = processEnvVars || {}; collectionVariables = collectionVariables || {}; // we clone envVars because we don't want to modify the original object envVars = envVars ? cloneDeep(envVars) : {}; // envVars can inturn have values as {{process.env.VAR_NAME}} // so we need to interpolate envVars first with processEnvVars forOwn(envVars, (value, key) => { envVars[key] = interpolateEnvVars(value, processEnvVars); }); const template = Handlebars.compile(str, { noEscape: true }); // collectionVariables take precedence over envVars const combinedVars = { ...envVars, ...collectionVariables, process: { env: { ...processEnvVars } } }; return template(combinedVars); }; module.exports = { interpolateString };