UNPKG

typescript-member-signatures

Version:

Command line tool to extract given interface member signatures as JSON strings, recursively in the extends chain with the purpose of documentation

53 lines 3.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const assert_1 = require("assert"); const cannabis_1 = require("cannabis"); const misc_utils_of_mine_generic_1 = require("misc-utils-of-mine-generic"); const ts_morph_1 = require("ts-morph"); const ts_simple_ast_extra_1 = require("ts-simple-ast-extra"); const getProject_1 = require("./getProject"); function extractMemberSignatures(o) { const root = getProject_1.getProject(o); let declarations = o.declarations; if (!declarations) { const r = cannabis_1.queryAst(`//InterfaceDeclaration [matchEvery(@namePath, '${o.target}')]`, root); if (r.error) { assert_1.fail(r.error); } declarations = r.result.filter(ts_morph_1.TypeGuards.isInterfaceDeclaration); } return declarations.filter(misc_utils_of_mine_generic_1.notUndefined).map((i) => { const all = [i, ...ts_simple_ast_extra_1.getExtendsRecursively(i) .map(m => m.getFirstChildByKind(ts_morph_1.SyntaxKind.Identifier))] .map(i => ts_morph_1.TypeGuards.isIdentifier(i) ? ts_simple_ast_extra_1.getDefinitionsOf(i) : [i]) .flat() .filter(i => !!i && ts_morph_1.TypeGuards.isInterfaceDeclaration(i)); const methods = all.map(i => i.getMethods()).flat() .filter(f => !o.ignoreMemberWithUnderscorePrefix || !f.getName().startsWith('_')) .filter((o, i, a) => a.findIndex(e => e.getName() === o.getName()) === i) .map(m => extractDoc(m, o)); const properties = all.map(i => i.getProperties()).flat() .filter(f => !o.ignoreMemberWithUnderscorePrefix || !f.getName().startsWith('_')) .filter((o, i, a) => a.findIndex(e => e.getName() === o.getName()) === i) .map(m => extractDoc(m, o)); return o.onlySignature ? { name: i.getName(), signature: `interface ${i.getName()} {\n ${properties.map(p => p.signature).join('\n ')}\n ${methods.map(p => p.signature).join('\n ')}\n}`, } : Object.assign({ name: i.getName(), signature: `interface ${i.getName()} {\n ${properties.map(p => p.signature).join('\n ')}\n ${methods.map(p => p.signature).join('\n ')}\n}`, methods, properties }, o.generateMarkdownDocs ? { markdown: `\`${i.getName()}\`\n\nProperties:\n * ${properties.map(p => p.markdown).join('\n * ')}\n\nMethods: \n * ${methods.map(p => p.markdown).join('\n * ')}` } : {}); }); } exports.extractMemberSignatures = extractMemberSignatures; function extractDoc(m, o) { m.formatText(); const signature = m.getText(); return o.onlySignature ? { signature } : Object.assign({ name: m.getName(), signature, typeText: misc_utils_of_mine_generic_1.tryTo(() => m.getType().getText()) || undefined, optional: signature.includes('?'), jsDocsText: m.getJsDocs().map(j => j.getInnerText()).join('\n') }, o.generateMarkdownDocs ? { markdown: markdownDocs(m, o) } : {}); } function markdownDocs(m, o) { return `\`${m.getText()}\`: ${m.getJsDocs().map(j => j.getInnerText()).join(' . ')}`; } //# sourceMappingURL=extractMemberSignatures.js.map