@sprucelabs/spruce-templates
Version:
Templates used for code generation in skills!
76 lines (75 loc) • 3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const globby_1 = __importDefault(require("@sprucelabs/globby"));
const handlebars_1 = __importDefault(require("handlebars"));
class DirectoryTemplateUtility {
static async filesInTemplate(code) {
const filePaths = [];
const files = await (0, globby_1.default)(path_1.default.join(__dirname, '../templates/directories', code), {
dot: true,
});
for (const file of files) {
const isDefinitionFile = file.search('.d.ts') > -1;
if (!isDefinitionFile) {
const templateFile = this.loadFileDetails(code, file);
filePaths.push(templateFile);
}
}
return filePaths;
}
static async build(options) {
const builtFiles = [];
const { kind, context } = options;
const files = await this.filesInTemplate(kind);
for (const file of files) {
const { isHandlebarsTemplate, path } = file;
let contents = fs_1.default.readFileSync(path).toString();
if (isHandlebarsTemplate) {
const compiledTemplate = handlebars_1.default.compile(contents);
contents = compiledTemplate(context);
}
builtFiles.push({
...file,
contents,
});
}
return builtFiles;
}
static loadFileDetails(code, filePath) {
const fullPath = path_1.default.resolve(filePath);
const matches = fullPath.match(/(.*)\/([^/]+)$/);
const directory = (matches && matches[1]) || '';
const templateFilename = matches && matches[2];
const fileMatches = templateFilename === null || templateFilename === void 0 ? void 0 : templateFilename.match(/(.*)\.hbs$/);
let isHandlebarsTemplate = false;
let filename;
if (fileMatches && fileMatches[1]) {
filename = fileMatches[1];
isHandlebarsTemplate = true;
}
else {
filename = templateFilename;
}
const root = path_1.default.join(__dirname, '..', 'templates', 'directories', code);
const relativeBaseDirectory = path_1.default.relative(root, directory);
if (!directory ||
!filename ||
typeof relativeBaseDirectory === 'undefined') {
throw new Error('INVALID_TEMPLATE_FILES');
}
return {
isHandlebarsTemplate,
directory,
relativeDirectory: relativeBaseDirectory,
filename,
path: filePath,
relativePath: path_1.default.join(relativeBaseDirectory, filename),
};
}
}
exports.default = DirectoryTemplateUtility;