| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | /** * Dump information about parser events to the console. * * @module plugins/eventDumper */const _ = require('underscore');const doop = require('jsdoc/util/doop');const dump = require('jsdoc/util/dumper').dump;const env = require('jsdoc/env');const util = require('util');const conf = env.conf.eventDumper || {};// Dump the included parser events (defaults to all events)let events = conf.include || [    'parseBegin',    'fileBegin',    'beforeParse',    'jsdocCommentFound',    'symbolFound',    'newDoclet',    'fileComplete',    'parseComplete',    'processingComplete'];// Don't dump the excluded parser eventsif (conf.exclude) {    events = _.difference(events, conf.exclude);}/** * Replace AST node objects in events with a placeholder. * * @param {Object} o - An object whose properties may contain AST node objects. * @return {Object} The modified object. */function replaceNodeObjects(o) {    const OBJECT_PLACEHOLDER = '<Object>';    if (o.code && o.code.node) {        // don't break the original object!        o.code = doop(o.code);        o.code.node = OBJECT_PLACEHOLDER;    }    if (o.doclet && o.doclet.meta && o.doclet.meta.code && o.doclet.meta.code.node) {        // don't break the original object!        o.doclet.meta.code = doop(o.doclet.meta.code);        o.doclet.meta.code.node = OBJECT_PLACEHOLDER;    }    if (o.astnode) {        o.astnode = OBJECT_PLACEHOLDER;    }    return o;}/** * Get rid of unwanted crud in an event object. * * @param {object} e The event object. * @return {object} The fixed-up object. */function cleanse(e) {    let result = {};    Object.keys(e).forEach(prop => {        // by default, don't stringify properties that contain an array of functions        if (!conf.includeFunctions && util.isArray(e[prop]) && e[prop][0] &&            String(typeof e[prop][0]) === 'function') {            result[prop] = `function[${e[prop].length}]`;        }        // never include functions that belong to the object        else if (typeof e[prop] !== 'function') {            result[prop] = e[prop];        }    });    // allow users to omit node objects, which can be enormous    if (conf.omitNodes) {        result = replaceNodeObjects(result);    }    return result;}exports.handlers = {};events.forEach(eventType => {    exports.handlers[eventType] = e => {        console.log( dump({            type: eventType,            content: cleanse(e)        }) );    };});
 |