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