UNPKG

type2docfx

Version:

A tool to convert json format output from TypeDoc to universal reference model for DocFx to consume.

131 lines (130 loc) 5.63 kB
#!/usr/bin/env node "use strict"; exports.__esModule = true; var fs = require("fs-extra"); var serializer = require("js-yaml"); var program = require("commander"); var jsonTraverse_1 = require("./jsonTraverse"); var postTransformer_1 = require("./postTransformer"); var tocGenerator_1 = require("./tocGenerator"); var packageGenerator_1 = require("./packageGenerator"); var moduleGenerator_1 = require("./moduleGenerator"); var idResolver_1 = require("./idResolver"); var constants_1 = require("./common/constants"); var flags_1 = require("./common/flags"); var pjson = require('../package.json'); var path; var outputPath; var repoConfigPath; program .version("v" + pjson.version) .description('A tool to convert the json format api file generated by TypeDoc to yaml format output files for docfx.') .option('--hasModule', 'Add the option if the source repository contains module.') .option('--disableAlphabetOrder', 'Add the option if you want to disable the alphabet order in output yaml.') .option('--basePath [value]', 'Current base path to the repository.') .option('--sourceUrl [value]', 'Define the source repository address.') .option('--sourceBranch [value]', 'Define the branch of source repository.') .arguments('<inputFile> <outputFolder> [repoConfigureFile]') .action(function (input, output, repoConfig) { path = input; outputPath = output; repoConfigPath = repoConfig; }) .parse(process.argv); if (!path || !outputPath) { console.log('Error: The input file path and output folder path is not specified!'); program.help(); } var repoConfig; if (repoConfigPath && program.basePath) { if (fs.existsSync(repoConfigPath)) { var temp = JSON.parse(fs.readFileSync(repoConfigPath).toString()); repoConfig = { repo: temp.repo, branch: temp.branch, basePath: program.basePath }; } else { console.log("Error: repository config file path {" + repoConfigPath + "} doesn't exit!"); program.help(); } } if (!repoConfig && program.sourceUrl && program.sourceBranch && program.basePath) { repoConfig = { repo: program.sourceUrl, branch: program.sourceBranch, basePath: program.basePath }; } if (program.hasModule) { flags_1.flags.hasModule = true; } if (program.disableAlphabetOrder) { flags_1.flags.enableAlphabetOrder = false; } var json = null; if (fs.existsSync(path)) { var dataStr = fs.readFileSync(path).toString(); json = JSON.parse(dataStr); } else { console.error('Api doc file ' + path + ' doesn\'t exist.'); program.help(); } var rootElements = []; var uidMapping = {}; var referenceMappings = []; if (json) { jsonTraverse_1.traverse(json, '', rootElements, null, uidMapping, repoConfig); } if (rootElements && rootElements.length) { rootElements.forEach(function (rootElement) { var referenceMapping = {}; idResolver_1.resolveIds(rootElement, uidMapping, referenceMapping); referenceMappings.push(referenceMapping); }); var functionsMapping_1 = postTransformer_1.groupOrphanFunctions(rootElements); var flattenElements = rootElements.map(function (rootElement, index) { if (rootElement.uid.indexOf('constructor') >= 0) { return []; } return postTransformer_1.postTransform(rootElement, referenceMappings[index]); }).reduce(function (a, b) { return a.concat(b); }, []); console.log('Yaml dump start.'); fs.ensureDir(outputPath); flattenElements.forEach(function (transfomredClass) { transfomredClass = JSON.parse(JSON.stringify(transfomredClass)); var filename = transfomredClass.items[0].uid.replace(transfomredClass.items[0].package + ".", ''); filename = filename.split('(')[0]; console.log("Dump " + outputPath + "/" + filename + ".yml"); fs.writeFileSync(outputPath + "/" + filename + ".yml", constants_1.yamlHeader + "\n" + serializer.safeDump(transfomredClass)); }); console.log('Yaml dump end.'); var yamlModels_1 = []; flattenElements.forEach(function (element) { yamlModels_1.push(element.items[0]); }); var packageIndex = packageGenerator_1.generatePackage(yamlModels_1); postTransformer_1.insertFunctionToIndex(packageIndex, functionsMapping_1['ParentToPackage']); packageIndex = JSON.parse(JSON.stringify(packageIndex)); fs.writeFileSync(outputPath + "/index.yml", constants_1.yamlHeader + "\n" + serializer.safeDump(packageIndex)); console.log('Package index genrated.'); var toc = tocGenerator_1.generateToc(yamlModels_1, flattenElements[0].items[0].package); toc = JSON.parse(JSON.stringify(toc)); fs.writeFileSync(outputPath + "/toc.yml", serializer.safeDump(toc)); console.log('Toc genrated.'); if (flags_1.flags.hasModule) { var moduleIndexes = moduleGenerator_1.generateModules(toc[0].items); moduleIndexes.forEach(function (moduleIndex) { if (moduleIndex.items && moduleIndex.items.length) { postTransformer_1.insertFunctionToIndex(moduleIndex, functionsMapping_1[moduleIndex.items[0].name]); moduleIndex = JSON.parse(JSON.stringify(moduleIndex)); fs.writeFileSync(outputPath + "/" + moduleIndex.items[0].uid + ".yml", constants_1.yamlHeader + "\n" + serializer.safeDump(moduleIndex)); } }); console.log('Module indexes generated.'); } }