typescript-scaffolder
Version:
 ### Unit Test Coverage: 97.53%
75 lines (74 loc) • 3.31 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateJsonSchemaFromInterface = generateJsonSchemaFromInterface;
exports.generateJsonSchemaFromFile = generateJsonSchemaFromFile;
exports.generateJsonSchemasFromPath = generateJsonSchemasFromPath;
const path_1 = __importDefault(require("path"));
const ts_to_json_schema_mapper_1 = require("../utils/ts-to-json-schema-mapper");
const file_system_1 = require("../utils/file-system");
const logger_1 = require("../utils/logger");
const fs_1 = __importDefault(require("fs"));
const interface_parser_1 = require("../utils/interface-parser");
/**
* Consumes an array of parsed interfaces and produces a JSON schema
* @param interfaces
*/
function generateJsonSchemaFromInterface(interfaces) {
const funcName = "generateJsonSchemaFromInterface";
logger_1.Logger.debug(funcName, "generating json schema from interfaces");
if (interfaces.length === 0)
return {};
const root = (0, ts_to_json_schema_mapper_1.convertToJsonSchema)(interfaces[0], interfaces);
interfaces.slice(1).forEach(i => {
root.definitions[i.name] = (0, ts_to_json_schema_mapper_1.convertToJsonSchema)(i, interfaces);
});
return root;
}
/**
* Generates a JSON schema from a TypeScript file and writes it to the output directory.
* @param filePath
* @param relativePath
* @param outputBaseDir
*/
async function generateJsonSchemaFromFile(filePath, relativePath, outputBaseDir) {
const funcName = "generateJsonSchemas";
logger_1.Logger.debug(funcName, "Generating JSON schema...");
const outputDir = path_1.default.join(outputBaseDir, path_1.default.dirname(relativePath));
const outFile = path_1.default.join(outputDir, path_1.default.basename(filePath, '.ts') + '.schema.json');
(0, file_system_1.ensureDir)(outputDir);
try {
const interfaces = (0, interface_parser_1.extractInterfacesFromFile)(filePath);
const schema = generateJsonSchemaFromInterface(interfaces);
if (schema !== null) {
fs_1.default.writeFileSync(outFile, JSON.stringify(schema, null, 2), 'utf-8');
logger_1.Logger.debug(funcName, `Generated: ${outFile}`);
}
else {
logger_1.Logger.warn(funcName, `Failed to generate schema from ${filePath}`);
}
}
catch (error) {
const err = `Critical error when trying to process ${filePath}, ${error}`;
logger_1.Logger.error(funcName, err);
throw new Error(err);
}
}
/**
* Walks a directory tree, generating JSON schemas from TypeScript files and writing them out.
* @param interfaceDir
* @param outputDir
*/
async function generateJsonSchemasFromPath(interfaceDir, outputDir) {
const funcName = "generateJsonSchemas";
logger_1.Logger.debug(funcName, `Walking directory for interfaces: ${interfaceDir}`);
(0, file_system_1.ensureDir)(outputDir);
const tasks = [];
(0, file_system_1.walkDirectory)(interfaceDir, (filePath, relativePath) => {
const task = generateJsonSchemaFromFile(filePath, relativePath, outputDir);
tasks.push(task);
}, ".ts");
await Promise.all(tasks);
}