UNPKG

typescript-scaffolder

Version:

![npm version](https://img.shields.io/npm/v/typescript-scaffolder) ### Unit Test Coverage: 97.53%

75 lines (74 loc) 3.31 kB
"use strict"; 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); }