UNPKG

type2docfx

Version:

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

167 lines 7.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.run = void 0; var serializer = require("js-yaml"); var os_1 = require("os"); var path_1 = require("path"); var child_process_1 = require("child_process"); var parser_1 = require("./parser"); var postTransformer_1 = require("./postTransformer"); var tocGenerator_1 = require("./tocGenerator"); var idResolver_1 = require("./idResolver"); var constants_1 = require("./common/constants"); var context_1 = require("./converters/context"); var toSdpConvertHelper_1 = require("./helpers/toSdpConvertHelper"); var typedoc_1 = require("typedoc"); var converter_1 = require("typedoc/dist/lib/converter"); var fs_extra_1 = require("fs-extra"); var error_1 = require("./common/error"); function run(inputPath, outputPath) { var json = null; if (fs_extra_1.existsSync(inputPath) && fs_extra_1.lstatSync(inputPath).isDirectory()) { // Building a folder json = runTypeDoc(inputPath); } else if (fs_extra_1.existsSync(inputPath) && fs_extra_1.lstatSync(inputPath).isFile() && inputPath.endsWith('.json')) { // Building typedoc json output json = fs_extra_1.readJSONSync(inputPath); } else { // Building an npm package spec, this could be anything `npm install` supports: a package name, a git repository, a tarball file, etc. json = runPackage(inputPath); } var uidMapping = {}; // const innerClassReferenceMapping = new Map<string, string[]>(); var collection = []; if (json) { var context = new context_1.Context('', '', json.name, new Map()); collection = new parser_1.Parser().traverse(json, uidMapping, context); } if (!collection || collection.length === 0) { console.log("Warning: nothing genereatd."); } var referenceMappings = []; for (var _i = 0, collection_1 = collection; _i < collection_1.length; _i++) { var rootElement = collection_1[_i]; var referenceMapping = {}; idResolver_1.resolveIds(rootElement, uidMapping, referenceMapping); referenceMappings.push(referenceMapping); } var rootElementsForTOC = JSON.parse(JSON.stringify(collection)); var flattenElements = collection.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); }, []); fs_extra_1.ensureDirSync(outputPath); console.log('Yaml dump start.'); var allUids = toSdpConvertHelper_1.getAllUids(flattenElements); // insertClassReferenceForModule(flattenElements); var noDuplicateModels = {}; for (var _a = 0, flattenElements_1 = flattenElements; _a < flattenElements_1.length; _a++) { var transfomredClass = flattenElements_1[_a]; // to add this to handle duplicate class and module under the same hierachy // insertInnerClassReference(innerClassReferenceMapping, transfomredClass); transfomredClass = JSON.parse(JSON.stringify(transfomredClass)); var content = toSdpConvertHelper_1.convertToSDP(transfomredClass, flattenElements, allUids); var item = transfomredClass.items[0]; noDuplicateModels[item.uid] = item; if (content) { var filename = generateFilename(item.uid.replace(item.package + ".", '')); console.log("Dump " + outputPath + "/" + filename + ".yml"); fs_extra_1.writeFileSync(outputPath + "/" + filename + ".yml", "" + constants_1.sdpYamlHeaderPrefix + content.type + "\n" + serializer.safeDump(content.model)); } } console.log('Yaml dump end.'); var yamlModels = []; for (var key in noDuplicateModels) { yamlModels.push(noDuplicateModels[key]); } if (yamlModels.length > 0) { var packageIndex = toSdpConvertHelper_1.mergeElementsToPackageSDP(yamlModels, allUids); fs_extra_1.writeFileSync(outputPath + "/index.yml", constants_1.sdpYamlHeaderPrefix + "Package\n" + serializer.safeDump(packageIndex)); console.log('Package index generated.'); var toc = tocGenerator_1.generateTOC(rootElementsForTOC, flattenElements[0].items[0].package); fs_extra_1.writeFileSync(outputPath + "/toc.yml", serializer.safeDump(toc)); console.log('Toc generated.'); } } exports.run = run; function generateFilename(originName) { var filename = originName; filename = filename.replace(/\//g, '.'); if (constants_1.alreadyExistFilename.indexOf(filename.toLowerCase()) !== -1) { console.log("[warning] filename " + filename + " is conflict! prefix add _"); } constants_1.alreadyExistFilename.push(filename.toLowerCase()); return filename; } function runTypeDoc(directory) { var app = new typedoc_1.Application({ mode: 'Modules', logger: 'console', target: 'ES5', module: 'CommonJS', includeDeclarations: true, ignoreCompilerErrors: true, excludeExternals: true, stripInternal: true, tsconfig: path_1.join(directory, 'tsconfig.json') }); var fileNames = app.expandInputFiles([directory]).map(function (file) { return file.replace(/\\/g, '/'); }); var rootFile = getRootFile(); if (!rootFile) { return app.serializer.projectToObject(app.convert(fileNames)); } if (!fs_extra_1.existsSync(rootFile)) { throw new error_1.UserError(rootFile + " doesn't exist, which is defined in package.json."); } // If we have a root file to follow, only include files in the source directory that are // transitively reachable from the root file. // // The following line tells typedoc to not treat files in the source directory as external. // https://github.com/TypeStrong/typedoc/blob/v0.15.3/src/lib/converter/context.ts#L221 app.converter.on(converter_1.Converter.EVENT_BEGIN, function (context) { return context.fileNames = fileNames; }); return app.serializer.projectToObject(app.convert([rootFile])); function getRootFile() { var packageJsonPath = path_1.join(directory, 'package.json'); if (fs_extra_1.existsSync(packageJsonPath)) { var _a = JSON.parse(fs_extra_1.readFileSync(packageJsonPath).toString()), types = _a.types, typings = _a.typings; if (types || typings) { return path_1.resolve(path_1.join(directory, types || typings)); } } } } function runPackage(inputPath) { fs_extra_1.ensureDirSync(path_1.join(os_1.tmpdir(), 'type2docfx')); var tempPath = fs_extra_1.mkdtempSync(path_1.join(os_1.tmpdir(), 'type2docfx', 'package-')); fs_extra_1.ensureDirSync(tempPath); console.log("Install package " + inputPath + " to " + tempPath); // Copy .npmrc to our temp working directory to inherit credentials and configurations // from the current working directory. if (fs_extra_1.existsSync('.npmrc')) { fs_extra_1.copyFileSync('.npmrc', tempPath + "/.npmrc"); } var command = 'npm'; if (process.platform === 'win32') { command = 'npm.cmd'; } try { child_process_1.execFileSync(command, ['install', inputPath, '--prefix', tempPath]); } finally { fs_extra_1.removeSync(tempPath + "/.npmrc"); } var dependencies = fs_extra_1.readJSONSync(path_1.join(tempPath, 'package.json')).dependencies; var packageName = Object.keys(dependencies)[0]; var packagePath = tempPath + "/node_modules/" + packageName; var json = runTypeDoc(packagePath); console.log("Clean up " + tempPath); fs_extra_1.removeSync(tempPath); return json; } //# sourceMappingURL=main.js.map