@vkontakte/api-schema-typescript-generator
Version:
VK API TypeScript generator
88 lines (83 loc) • 4.41 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.main = void 0;
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const perf_hooks_1 = require("perf_hooks");
const cli_1 = require("./cli");
const log_1 = require("./log");
const APITypingsGenerator_1 = require("./generators/APITypingsGenerator");
const helpers_1 = require("./helpers");
const helpMessage = `
Options:
${chalk_1.default.greenBright('--help')} Shows this help.
${chalk_1.default.greenBright('--schemaDir')} The relative path to directory with ${chalk_1.default.bold('methods.json')}, ${chalk_1.default.bold('objects.json')} and ${chalk_1.default.bold('responses.json')} files.
${chalk_1.default.greenBright('--outDir')} The directory where the files will be generated.
If you skip this param, script will work in linter mode without emitting files to file system.
${chalk_1.default.bold('Please note')} that this folder will be cleared after starting the generation.
${chalk_1.default.greenBright('--methods')} List of methods to generate responses and all needed objects.
Example:
- ${chalk_1.default.bold("'*'")} - to generate all responses and objects.
- ${chalk_1.default.bold("'messages.*, users.get, groups.isMember'")} - to generate all methods from messages section, users.get and groups.isMember.
`;
async function main() {
console.log(chalk_1.default.bold('VK API Schema TypeScript generator'));
const startTime = perf_hooks_1.performance.now();
const args = (0, cli_1.parseArguments)();
let { help, schemaDir, outDir, methods } = args;
if (help) {
console.log(helpMessage);
return;
}
const helpHint = `Use ${chalk_1.default.greenBright('--help')} to see all options.`;
if (!schemaDir) {
(0, log_1.consoleLogErrorAndExit)(`You should specify ${chalk_1.default.greenBright('schemaDir')}. ${helpHint}`);
return;
}
if (!outDir) {
(0, log_1.consoleLogInfo)(`${chalk_1.default.greenBright('outDir')} option is empty. ${helpHint}`);
(0, log_1.consoleLogInfo)('Script will work in linter mode without emitting files to file system.');
}
if (!Array.isArray(methods) || !methods.length) {
(0, log_1.consoleLogErrorAndExit)(`You should specify ${chalk_1.default.greenBright('methods')}. ${helpHint}`);
return;
}
schemaDir = path_1.default.resolve(schemaDir);
outDir = outDir ? path_1.default.resolve(outDir) : '';
// Read and check required schema files
const [methodsDefinitions, { definitions: responsesDefinitions }, { definitions: objectsDefinitions }, { errors: errorsDefinitions },] = await Promise.all([
(0, helpers_1.readJSONFile)(path_1.default.resolve(schemaDir, 'methods.json')),
(0, helpers_1.readJSONFile)(path_1.default.resolve(schemaDir, 'responses.json')),
(0, helpers_1.readJSONFile)(path_1.default.resolve(schemaDir, 'objects.json')),
(0, helpers_1.readJSONFile)(path_1.default.resolve(schemaDir, 'errors.json')),
]);
if (!Object.keys(methodsDefinitions).length) {
(0, log_1.consoleLogErrorAndExit)(`${chalk_1.default.greenBright('responses.json')} file is invalid.`);
return;
}
if (!Object.keys(responsesDefinitions).length) {
(0, log_1.consoleLogErrorAndExit)(`${chalk_1.default.greenBright('responses.json')} file is invalid.`);
return;
}
if (!Object.keys(objectsDefinitions).length) {
(0, log_1.consoleLogErrorAndExit)(`${chalk_1.default.greenBright('objects.json')} file is invalid.`);
return;
}
const needEmit = !!outDir;
const generator = new APITypingsGenerator_1.APITypingsGenerator({
needEmit,
outDirPath: outDir,
methodsDefinitions,
objects: objectsDefinitions,
responses: responsesDefinitions,
errors: errorsDefinitions,
methodsPattern: methods.join(','),
});
generator.generate();
const endTime = perf_hooks_1.performance.now();
(0, log_1.consoleLog)(`✨ Done in ${((endTime - startTime) / 1000).toFixed(2)}s.`);
}
exports.main = main;