UNPKG

boats

Version:

Beautiful Open / Async Template System - Write less yaml with BOATS and Nunjucks.

58 lines (57 loc) 2.41 kB
"use strict"; 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'); } }