UNPKG

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
"use strict"; 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;