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
130 lines (108 loc) • 3.33 kB
text/typescript
/* eslint-disable no-prototype-builtins */
import is from 'is';
import Template from '@tps/templates';
import type { TemplateOptions } from '@tps/templates/templates';
import logger from '@tps/utilities/logger';
import { CommandModule } from 'yargs';
import { getCliArgsFromTemplate } from './helpers';
export interface UseArgv {
use: string;
packages: string[];
default: boolean;
hidden: boolean;
newFolder: boolean;
force: boolean;
wipe: boolean;
buildPaths: string[];
}
// TODO: async is not working. need to debug. Completely ignores this function when its async
export const options = (yargs) => {
const { argv } = yargs;
const template = argv._[0];
yargs.options({
use: {
alias: 'u',
describe: 'Template package to create your with',
type: 'string',
},
packages: {
alias: 'p',
describe: 'Additional Packages to use when building your template',
type: 'array',
},
default: {
alias: 'd',
type: 'boolean',
describe: 'Use all default answers to all prompts',
},
newFolder: {
alias: 'f',
describe: 'Create a new folder',
type: 'boolean',
},
force: {
describe:
'force the template to be made. This will override any files that tps needs to create',
type: 'boolean',
},
wipe: {
describe:
'force the template to be made. This will delete the directory if exists',
type: 'boolean',
},
hidden: {
describe: 'Prompt all hidden prompts',
type: 'boolean',
},
});
if (!template) return yargs;
const templateOptions = getCliArgsFromTemplate(template);
yargs.options(templateOptions);
return yargs;
};
export const createHandler: CommandModule<object, UseArgv>['handler'] = async (
argv,
) => {
/**
* if we ever want to be able to pass a name in then we should add this to the flags.
* @example
* {
* "name": {
* "alias": "n",
* "describe": "Name for template rendering. defaults to base name of the destination path",
* "type": "string"
* },
* }
*/
const dest = process.cwd();
const { packages, buildPaths, ...answers } = argv;
const tpsConfig: Partial<TemplateOptions> = {};
if (argv.hasOwnProperty('newFolder')) tpsConfig.newFolder = argv.newFolder;
if (argv.hasOwnProperty('force')) tpsConfig.force = argv.force;
if (argv.hasOwnProperty('wipe')) tpsConfig.wipe = argv.wipe;
if (argv.hasOwnProperty('default')) tpsConfig.default = argv.default;
if (argv.hasOwnProperty('hidden')) tpsConfig.hidden = argv.hidden;
logger.cli.info('Tps Config: %n', tpsConfig);
const tps = new Template(argv.use, tpsConfig);
// @ts-expect-error wrong types for `is`
if (is.array(packages) && !is.array.empty(packages)) {
logger.cli.info('Loading packages:', packages);
tps.loadPackages(packages);
}
if (tps.hasPrompts()) {
logger.cli.info('Answers to prompts: %n', answers);
tps.setAnswers(answers);
}
// @ts-expect-error wrong types for `is`
const hasBuildPaths: boolean = !is.array.empty(buildPaths) as boolean;
const renderItems = hasBuildPaths ? buildPaths : null;
const renderData = {
name: argv.name,
};
logger.cli.info('Build paths: %n', buildPaths);
const results = await tps.render(dest, renderItems, renderData);
const templatesBuilt = Array.isArray(results) ? results : [results];
templatesBuilt.forEach((template) => {
console.log(template);
});
};