boats
Version:
Beautiful Open / Async Template System - Write less yaml with BOATS and Nunjucks.
58 lines (57 loc) • 2.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = default_1;
const tslib_1 = require("tslib");
const upath_1 = tslib_1.__importDefault(require("upath"));
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
const nunjucks_1 = tslib_1.__importDefault(require("nunjucks"));
const mixinDirectoryKey = 'mixinDirectory';
function parseMixinPath(mixinPath, pathInjector, currentFilePointer) {
// Don't forget to parse the mixin path, as that could have been defined as an absolute path
// Maybe should be done when setting mixinPath initially
// eslint-disable-next-line prefer-const
let [parsedMixinPath, absolute] = pathInjector.injectMixin(mixinPath);
if (absolute) {
parsedMixinPath = upath_1.default.relative(upath_1.default.dirname(currentFilePointer), parsedMixinPath);
}
return upath_1.default.dirname(upath_1.default.normalize(parsedMixinPath));
}
function default_1() {
const tplGlobals = this.env.globals;
const pathInjector = (tplGlobals.pathInjector);
// eslint-disable-next-line prefer-rest-params
const [argumentPath, isAbsolute] = pathInjector.injectMixin(arguments[0]);
const renderPath = isAbsolute
? argumentPath
: upath_1.default.join(upath_1.default.dirname(tplGlobals.currentFilePointer), argumentPath);
if (!fs_extra_1.default.pathExistsSync(renderPath)) {
throw new Error('Path not found when trying to render mixin: ' + renderPath);
}
const vars = {};
const mixinObj = tplGlobals.mixinObject[tplGlobals.mixinNumber];
vars[mixinDirectoryKey] = parseMixinPath(mixinObj.mixinPath, pathInjector, tplGlobals.currentFilePointer);
let skipAutoIndex = false;
for (let i = 1; i < arguments.length; ++i) {
if (arguments[i] === '--skip-auto-indent') {
skipAutoIndex = true;
}
else {
vars[tplGlobals.mixinVarNamePrefix + i] = arguments[i];
}
}
const replaceVal = `
`;
const rendered = nunjucks_1.default.render(renderPath, vars);
// inject the indentation
if (skipAutoIndex) {
return rendered;
}
else {
const parts = rendered.split('\n');
parts.forEach((part, i) => {
parts[i] = mixinObj.mixinLinePadding + part;
});
++this.env.globals.mixinNumber;
return replaceVal + parts.join('\n');
}
}