UNPKG

custom-template-generator

Version:

generate file template

139 lines (123 loc) 4.66 kB
'use strict'; var path = require('path'); var fs = require('fs'); var format = require('string-template'); var _s = require('underscore.string'); var inquirer = require('inquirer'); var mkdirp = require('mkdirp'); var _ = require('lodash'); var beautify = require('js-beautify').js_beautify; module.exports = function (options) { var files = []; var templateAbsolutePath = path.join(__dirname, '../..', options.customTemplatesUrl + '/' + options.templateName.toLowerCase()); // set variables init(); // component template folder url if (options.customTemplatesUrl) { files = getFiles(templateAbsolutePath); } else { throw new Error('Specify the location of the templates folder using the customTemplatesUrl'); } if (options.showPrompt) { inquirer.prompt([{ type: "confirm", message: "Are you sure you want to create '" + options.componentName + "'?", name: "confirmed", default: true }], function (answers) { if (answers.confirmed) { return finalize(); } return false; }); } else { return finalize(); } /** * @name getFiles * @description get files inside folder recursively * @param {array} args */ function getFiles(dir, files_) { if (dir === undefined || !fs.existsSync(dir.toLowerCase())) { return []; } files_ = files_ || []; var files = fs.readdirSync(dir); for (var i in files) { var name = dir + path.sep + files[i]; if (fs.statSync(name).isDirectory()){ getFiles(name, files_); } else { files_.push(name); } } return files_; } /** * @name generateTemplate * @description generate file template * @param {file} template */ function generateTemplate(templatePath) { var absoluteTemplatePath = path.resolve(templatePath); var dest = options.wrapInFolder ? options.componentName + path.sep : ""; // check if the file need a specific location if (options.dest) { dest = options.dest + path.sep + dest; } fs.readFile(absoluteTemplatePath, 'utf8', function(err, data) { if (err) throw err; var templateFilename = absoluteTemplatePath.replace(templateAbsolutePath + path.sep, ""); var templatePathWithoutFileName = templateFilename.substring(0, templateFilename.lastIndexOf(path.sep)) .replace(/{component}/g, options.componentName); var fileExt = templateFilename ? templateFilename.split('.').pop() : ''; mkdirp(dest + templatePathWithoutFileName, function () { var injectedData = { name: options.componentName, Name: _s.classify(options.componentName), Name_: _.snakeCase(options.componentName).toUpperCase(), name_: _.snakeCase(options.componentName) }; // Inject the data defined through the options. if (options.data) { injectedData = _.extend(options.data, injectedData); } var formattedData = format(data, injectedData); // will auto indent the whole file if (options.autoIndent === true && _.includes(options.autoIndentExtensions, fileExt)) { formattedData = beautify(formattedData); } fs.writeFile(dest + templateFilename.replace(/{component}/g, options.componentName), formattedData, function (err) { if (err) { return console.log(err); } console.log('\x1b[32m%s\x1b[0m: ', "Created: " + dest + templateFilename.replace(/{component}/g, options.componentName)); }); }); }); } /** * @name init * @description set the options, file name, etc * @param none */ function init() { var defaultOptions = { showPrompt: true, wrapInFolder: true, autoIndentExtensions: ['js', 'ts'] } options = _.extend(defaultOptions, options); } /** * @name finalize * @description generate files * @param none */ function finalize() { // generate templates for (var i = 0; i < files.length; i++) { generateTemplate(files[i]); } return true; } };