UNPKG

templates-mo

Version:

Templates is a scaffolding framework that makes code generation simple, dynamic, and reusable. Generate files, parts of your app, or whole project structures—without the repetitive copy-pasting

163 lines (162 loc) • 7.06 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BANNED_TEMPLATES = void 0; const fs_1 = __importDefault(require("fs")); const constants_1 = require("../../utilities/constants"); const templates_1 = __importDefault(require("../../templates")); const logger_1 = __importDefault(require("../../utilities/logger")); const path_1 = __importDefault(require("path")); const helpers_1 = require("../../utilities/helpers"); const removeConfigFileNames = (arr) => { const configFilesMap = templates_1.default.tpsrcConfigNames.reduce((mapping, name) => { // eslint-disable-next-line no-param-reassign -- adding to object not reassigning mapping[name] = true; return mapping; }, {}); return arr.filter((item) => { // if item is not a config file return !configFilesMap[item]; }); }; exports.BANNED_TEMPLATES = [ 'init', 'new-template', 'new-test', 'tps-docs', ]; exports.default = { command: ['list', 'ls'], description: 'Show all available templates', builder: { global: { type: 'boolean', description: 'List out global files', alias: 'g', default: true, }, local: { type: 'boolean', description: 'List out local files', alias: 'l', default: true, }, default: { type: 'boolean', description: 'List out default templates', alias: 'd', default: true, }, nodeModules: { type: 'boolean', description: 'List out 3rd party templates', alias: 'n', default: true, }, }, handler(argv) { return __awaiter(this, void 0, void 0, function* () { const { local, default: defaultTemplates, global, nodeModules } = argv; logger_1.default.cli.info('Args: %n', { local, default: defaultTemplates, global, nodeModules, }); /** * All template locations */ const templateLocations = templates_1.default.getTemplateLocations(); logger_1.default.cli.info('Template locations: %n', templateLocations); /** * Filter out local, global, default, 3rd party templates depending * on what the user supplies */ const filteredTemplates = templateLocations.filter((dir) => { const isDefaultTemplate = dir.startsWith(path_1.default.join(constants_1.MAIN_DIR, constants_1.TPS_FOLDER)); const isNodeModulesTemplate = path_1.default.parse(dir).base === 'node_modules'; const isGlobalTemplates = dir.startsWith(path_1.default.join(constants_1.USER_HOME, constants_1.TPS_FOLDER)) || dir.startsWith(path_1.default.join(constants_1.USER_HOME, 'node_modules')); const isLocalTemplate = !isDefaultTemplate && !isGlobalTemplates; logger_1.default.cli.info('%s %n', dir, { isDefaultTemplate, isGlobalTemplates, isLocalTemplate, isNodeModulesTemplate, }); if (!defaultTemplates && isDefaultTemplate) return false; if (!global && isGlobalTemplates) return false; if (!nodeModules && isNodeModulesTemplate) return false; if (!local && isLocalTemplate) return false; return true; }); logger_1.default.cli.info('Templates after filter: %n\n', filteredTemplates); /** * Fetch templates in each directories still present */ const templatesNested = yield Promise.all(filteredTemplates.map((templateDir) => __awaiter(this, void 0, void 0, function* () { let directoryTemplates = []; try { /** * readdir throws error when not present. To prevent * making multiple call (existence, readdir) for each directory * well just return empty array here. */ directoryTemplates = yield fs_1.default.promises.readdir(templateDir, {}); } catch (err) { /** * log any errors that dont have to do with the directory existing */ if ((err === null || err === void 0 ? void 0 : err.code) !== 'ENOENT') { logger_1.default.cli.error('Template readdir error %n', { templateDir, err, }); } return []; } if (path_1.default.parse(templateDir).base === 'node_modules') { /** * Only print out packages that start with `tps` */ directoryTemplates = directoryTemplates.filter((template) => { return template.startsWith('tps-'); }); } if (templateDir.startsWith(path_1.default.join(constants_1.MAIN_DIR))) { /** * Removed banned templates. Banned templates are * this repos internal templates */ directoryTemplates = directoryTemplates.filter((template) => { return !exports.BANNED_TEMPLATES.includes(template); }); } /** * Remove `.tpsrc` file */ return removeConfigFileNames(directoryTemplates); }))); const templates = (0, helpers_1.unique)((0, helpers_1.flatten)(templatesNested)); templates.forEach((template) => { console.log(template.replace(/^tps-/, '')); }); }); }, };