const fs = require('fs'); function getType(t){ return (t?.type.names[0] || '').replace(/^Array\.\<(.*)\>$/, '$1*') } function graft(childNodes, parentLongname) { let result = ''; childNodes.filter(({memberof}) => memberof === parentLongname) .forEach(element => { if (element.kind === 'function') { result += `${getType(element.returns?.[0]) || 'void'} ${element.name}(${ element.params?.map(p=> `/* ${p.description || ''} */ ${getType(p)} ${p.name}` ).join(', ') || ''});\n`; } else if (element.kind === 'member') { result += `/* ${element.description || ''} */ ${getType(element)} ${element.name};` } else if (element.kind === 'class') { result+= `/** ${element.classdesc || ''} */\nclass ${element.name}{\n public: \n`; result += graft(childNodes, element.longname); result+= '\n};\n'; } }); return result; } /** @param {TAFFY} data @param {object} opts */ exports.publish = (data, {destination, query}) => { let docs; data({undocumented: true}).remove(); docs = data().get(); // <-- an array of Doclet objects fs.promises.writeFile('./result.json', JSON.stringify(docs), {encoding:'utf-8'}) let result = graft(docs); console.log(result) if (destination === 'console') { if (query && query.format === 'xml') { //console.log( xml.parse('xs:schema', root) ); } else { //console.log( require('jsdoc/util/dumper').dump(root) ); } } else { console.log('This template only supports output to the console. Use the option "-d console" when you run JSDoc.'); } };