pb-to-ts-api
Version:
help you transfer protobuf file to your custom d.ts and api request method
86 lines (80 loc) • 3.13 kB
text/typescript
import chalk from 'chalk';
import { Express } from 'express';
import glob from 'glob';
import minimist from 'minimist';
import { IOptions } from './interfaces/IOptions';
import { initServer } from './modules/mockServer';
import { transferTSFile } from './modules/transferTSFile';
const getUsage = () =>
`Usage: ${chalk.bold.green('pb2TSApi')} [options] ${chalk.bold.red('[file1.proto file2.proto ...]')} or ${chalk.bold.red('[./**/*.proto]')}`;
const getHelp = () =>
`Help:
${chalk.bold.green('--requestModule -r')}: the request module of you want to set, default is ${chalk.bold.red('\'axios\'')}, you can set to your custom request method, for example ${chalk.bold.red('\'@/request\'')};
${chalk.bold.green('--baseUrl -b')}: the base url of you want to set, default is ${chalk.bold.red('\'/\'')}, you can set to your api path, for example ${chalk.bold.red('\'/api\'')};
${chalk.bold.green('--folder -f')}: the folder of you want to save the output files, default is ${chalk.bold.red('\'./api\'')};
${chalk.bold.green('--root -r')}: the root path set to protobufjs, default is ${chalk.bold.red('the path of this command run')};
${chalk.bold.green('--optional -o')}: is transfrom d.ts optional to false, because of protobuf 3.0 set all filed is optional, default is ${chalk.bold.red('true')};
${chalk.bold.green('--mock -m')}: is open mock server, default is ${chalk.bold.red('false')};
${chalk.bold.green('--port -p')}: mock server port, default is ${chalk.bold.red('3000')};
`;
export async function main() {
try {
const argv = minimist(process.argv.slice(2), {
alias: {
requestModule: 'r',
baseUrl: 'b',
folder: 'f',
root: 'r',
optional: 'o',
mock: 'm',
port: 'p',
help: 'h',
},
string: ['requestModule', 'baseUrl', 'folder', 'root', 'port'],
boolean: ['optional', 'mock'],
default: {
requestModule: 'axios',
baseUrl: '/',
folder: './api',
root: process.cwd(),
optional: true,
mock: false,
port: '3000',
help: '',
},
});
if (argv.help) {
process.stderr.write(getHelp());
process.exit(1);
}
const { _: files } = argv;
const options: IOptions = {
requestModule: argv.requestModule,
baseUrl: argv.baseUrl,
folder: argv.folder,
root: argv.root,
optional: argv.optional,
mock: argv.mock,
port: argv.port,
help: argv.help,
};
if (!files.length) {
process.stderr.write(getUsage());
process.exit(1);
}
const protoFiles = await glob(files, { ignore: 'node_modules/**', windowsPathsNoEscape: true });
if (!protoFiles.length) {
process.stderr.write(chalk.bold.red(`there is not files for the flowing paths: \n ${files.join('\n')}`));
process.exit(1);
}
let mockServer: Express;
if (options.mock) {
mockServer = initServer(options);
}
await Promise.all(protoFiles.map(filePath => transferTSFile(filePath, mockServer, options)));
} catch (err) {
console.error(err);
process.exit(1);
}
}
main();