foalts2-cli
Version:
CLI tool for FoalTS
153 lines (152 loc) • 5.27 kB
JavaScript
;
/**
* FoalTS
* Copyright(c) 2017-2022 Loïc Poullain <loic.poullain@centraliens.net>
* Released under the MIT License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
// 3p
const safe_1 = require("colors/safe");
const program = require("commander");
// FoalTS
const create_secret_1 = require("./create-secret");
const generate_1 = require("./generate");
const file_system_1 = require("./generate/file-system");
const rmdir_1 = require("./rmdir");
const run_script_1 = require("./run-script");
function displayError(...lines) {
console.error();
lines.forEach(line => console.error(safe_1.red(line)));
console.error();
process.exitCode = 1;
}
// tslint:disable-next-line:no-var-requires
const pkg = require('../package.json');
program
.version(pkg.version, '-v, --version');
program
.command('createapp <name>')
.description('Create a new project.')
.option('-G, --no-git', 'Don\'t initialize a git repository')
.option('-I, --no-install', 'Don\'t autoinstall packages using yarn or npm (uses first available)')
.option('-m, --mongodb', 'Generate a new project using MongoDB instead of SQLite', false)
.option('-y, --yaml', 'Generate a new project using YAML configuration instead of JSON', false)
.action((name, options) => {
generate_1.createApp({
autoInstall: options.install,
initRepo: options.git,
mongodb: options.mongodb,
name,
yaml: options.yaml
});
});
program
.command('createsecret')
.description('Create a 256-bit random secret encoded in base64.')
.action(() => create_secret_1.createSecret().then(secret => console.log(secret)));
program
.command('run <name>')
.alias('run-script')
.description('Run a shell script.')
.action((name) => {
run_script_1.runScript({ name }, process.argv);
});
program
.command('connect <framework> <path>')
.description('Configure your frontend to interact with your application.')
.addHelpText('after', `
Available frameworks:
- angular
- react
- vue
`)
.action(async (framework, path) => {
switch (framework) {
case 'angular':
generate_1.connectAngular(path);
break;
case 'react':
generate_1.connectReact(path);
break;
case 'vue':
generate_1.connectVue(path);
break;
default:
displayError(`Unknown framework ${safe_1.yellow(framework)}. Please provide a valid one:`, '', ' - angular', ' - react', ' - vue');
}
});
const generateTypes = [
'controller', 'entity', 'rest-api', 'hook', 'script', 'service', 'vscode-config'
];
program
.command('generate <type> [name]')
.description('Generate and/or modify files.')
.option('-r, --register', 'Register the controller into app.controller.ts (only available if type=controller|rest-api)', false)
.option('-a, --auth', 'Add an owner to the entities of the generated REST API (only available if type=rest-api)', false)
.alias('g')
.addHelpText('after', `
Available types:
${generateTypes.map(t => ` - ${t}`).join('\n')}
`)
.action(async (type, name, options) => {
if (!name && type !== 'vscode-config') {
displayError(`Argument "name" is required when creating a ${type}. Please provide one.`);
return;
}
try {
switch (type) {
case 'controller':
generate_1.createController({ name, register: options.register });
break;
case 'entity':
generate_1.createEntity({ name });
break;
case 'rest-api':
generate_1.createRestApi({ name, register: options.register, auth: options.auth });
break;
case 'hook':
generate_1.createHook({ name });
break;
case 'script':
generate_1.createScript({ name });
break;
case 'service':
generate_1.createService({ name });
break;
case 'vscode-config':
generate_1.createVSCodeConfig();
break;
default:
displayError(`Unknown type ${safe_1.yellow(type)}. Please provide a valid one:`, '', ...generateTypes.map(t => ` - ${t}`));
}
}
catch (error) {
if (error instanceof file_system_1.ClientError) {
displayError(error.message);
return;
}
throw error;
}
});
program
.command('rmdir <name>')
.description('Remove a directory and all its contents, including any subdirectories and files.')
.action(async (name) => {
try {
await rmdir_1.rmdir(name);
}
catch (error) {
if (error.code === 'ENOTDIR') {
displayError(error.message);
return;
}
throw error;
}
});
program
.on('command:*', (commands) => {
program.outputHelp();
displayError(`Unknown command ${safe_1.yellow(commands[0])}.`);
});
program.parse(process.argv);