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
JavaScript
;
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