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
JavaScript
;
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-/, ''));
});
});
},
};