typescript-scaffolder
Version:
 
61 lines (60 loc) • 2.53 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateInterfacesFromFile = generateInterfacesFromFile;
exports.generateInterfacesFromPath = generateInterfacesFromPath;
const file_system_1 = require("../utils/file-system");
const schema_inferer_1 = require("../utils/schema-inferer");
const fs_1 = __importDefault(require("fs"));
const node_path_1 = __importDefault(require("node:path"));
const logger_1 = require("../utils/logger");
/**
* processes the JSON files and generates typescript
* interfaces using the same folder structure
* @param file
* @param relativePath
* @param outputBaseDir
*/
async function generateInterfacesFromFile(file, relativePath, outputBaseDir) {
const funcName = 'generateTypedInterfaces';
logger_1.Logger.debug(funcName, "Generating typed interfaces...");
const outputDir = node_path_1.default.join(outputBaseDir, node_path_1.default.dirname(relativePath));
(0, file_system_1.ensureDir)(outputDir);
const outFile = node_path_1.default.join(outputDir, node_path_1.default.basename(file, '.json') + '.ts');
try {
const tsInterface = await (0, schema_inferer_1.inferJsonSchemaFromPath)(file);
if (tsInterface !== null) {
fs_1.default.writeFileSync(outFile, tsInterface, 'utf-8');
logger_1.Logger.debug(funcName, `Generated: ${outFile}`);
}
else {
logger_1.Logger.warn(funcName, `Failed to generate interface from ${file}`);
}
}
catch (error) {
const err = `Critical error when trying to process ${file}, ${error}`;
logger_1.Logger.error(funcName, err);
throw new Error(err);
}
}
/**
* Parses a directory structure housing JSON schemas and
* regenerates the directory tree with interfaces.
* Only does JSON for now
* @param schemaDir
* @param outputDir
* @param ext
*/
async function generateInterfacesFromPath(schemaDir, outputDir, ext = '.json') {
const funcName = 'generateTypedInterfaces';
logger_1.Logger.debug(funcName, `Walking directory for enums: ${schemaDir}`);
(0, file_system_1.ensureDir)(outputDir);
const tasks = [];
(0, file_system_1.walkDirectory)(schemaDir, (filePath, relativePath) => {
const task = generateInterfacesFromFile(filePath, relativePath, outputDir);
tasks.push(task);
}, ext);
await Promise.all(tasks);
}