react-tsdoc
Version:
CLI to extract information from React Typescript component files with TSDoc for documentation generation purposes
131 lines (130 loc) • 5.08 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateDocsForFile = void 0;
var path_1 = __importDefault(require("path"));
var fs_1 = __importDefault(require("fs"));
var ts_morph_1 = require("ts-morph");
var reactComponentHelper_1 = require("./utils/reactComponentHelper");
var paramsHelper_1 = require("./utils/paramsHelper");
var tsDocHelper_1 = require("./utils/tsDocHelper");
var exportHelper_1 = require("./utils/exportHelper");
var project = new ts_morph_1.Project();
/**
* Generate docs for a singular file
*
* @param sourceFile - The sourceFile node to document
*/
var generateDocsForFile = function (sourceFile) {
var defaultExport = (0, exportHelper_1.getDefaultExport)(sourceFile);
if (!defaultExport || !(0, reactComponentHelper_1.isReactComponent)(defaultExport))
return;
var component = (0, reactComponentHelper_1.getComponentFunction)(defaultExport);
if (component) {
var doc_1 = {
// @ts-ignore
displayName: defaultExport.getName(),
description: (0, tsDocHelper_1.getDeclarationDescription)(component),
methods: [],
props: {}
};
var params = (0, paramsHelper_1.getDeclarationParams)(component);
for (var param in params) {
var _a = params[param], required = _a.required, initializer = _a.initializer, type = _a.type;
doc_1.props[param] = __assign(__assign({}, (!!initializer) && { defaultValue: {
value: initializer,
computed: false
} }), { required: required, tsType: type });
}
;
(0, tsDocHelper_1.getPropBlocks)(component).forEach(function (propBlock) {
var parsedPropBlock = (0, tsDocHelper_1.renderPropBlock)(propBlock.content);
if (!parsedPropBlock)
return;
if (doc_1.props[parsedPropBlock.propName]) {
doc_1.props[parsedPropBlock.propName] = __assign({ description: parsedPropBlock.content }, doc_1.props[parsedPropBlock.propName]);
}
});
return doc_1;
}
return undefined;
};
exports.generateDocsForFile = generateDocsForFile;
/**
* Parses file(s) and generates JSON docs
*
* @param sourceFiles - File(s) to parse
* @param output - File to write results to (if CLI)
* @param isCLI - Sets if function should log to console
*/
var generateDocs = function (sourceFiles, isCLI) {
if (isCLI === void 0) { isCLI = false; }
var sourceFileCount = project.getSourceFiles().length;
var docs = {};
sourceFiles.forEach(function (sourceFile, sourceFileIndex) {
if (isCLI) {
console.log("Processing file ".concat(sourceFileIndex + 1, " of ").concat(sourceFileCount));
}
var sourceFilePath = path_1.default.relative(process.cwd(), sourceFile.getFilePath().toString());
var fileDocs = (0, exports.generateDocsForFile)(sourceFile);
if (fileDocs) {
if (sourceFiles.length > 1) {
docs[sourceFilePath] = fileDocs;
}
else {
docs = fileDocs;
}
}
});
return docs;
};
/**
* Load up files, check for syntax errors, and return/write data
*
* @param directory - File(s) to parse
* @param output - File to write results to (if CLI)
* @param isCLI - Sets if function should log to console
*/
var parser = function (directory, output, isCLI) {
if (isCLI === void 0) { isCLI = false; }
var program = project.getProgram();
if (fs_1.default.lstatSync(directory).isDirectory()) {
project.addSourceFilesAtPaths("".concat(directory, "/**/*{.ts,.tsx}"));
}
else if (fs_1.default.lstatSync(directory).isFile()) {
project.addSourceFileAtPath(directory);
}
project.resolveSourceFileDependencies();
var diagnostics = program.getSyntacticDiagnostics();
if (diagnostics.length) {
diagnostics.forEach(function (diagnostic) {
throw Error("".concat(diagnostic.getMessageText(), " on line ").concat(diagnostic.getLineNumber(), " in ").concat(diagnostic.getSourceFile().getFilePath()));
});
return;
}
if (isCLI)
console.time('Finished in');
var docs = generateDocs(project.getSourceFiles(), isCLI);
if (isCLI) {
fs_1.default.writeFile(output, JSON.stringify(docs), 'utf8', function () {
console.timeEnd('Finished in');
});
}
else {
return docs;
}
};
exports.default = parser;
;