CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-jsdoc

API documentation generator for JavaScript that parses source code and JSDoc comments to produce HTML documentation

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

parser.mddocs/

JavaScript Parser

JSDoc's parser engine analyzes JavaScript source code, extracts JSDoc comments, and generates documentation objects (doclets). It supports modern ES6+ syntax and provides event-driven processing with extensive customization options.

Capabilities

Parser Creation

Functions for creating and configuring parser instances.

/**
 * Create a new parser instance of the specified type
 * @param type - Parser type (default: 'js')
 * @returns Parser instance
 */
function createParser(type?: string): Parser;

/**
 * Available parser types
 */
const PARSERS: {
  js: string;
};

Parser Class

Main parser class for processing JavaScript source files and generating doclets.

class Parser {
  /**
   * Create a new Parser instance
   * @param builderInstance - AST builder (optional)
   * @param visitorInstance - AST visitor (optional) 
   * @param walkerInstance - AST walker (optional)
   */
  constructor(builderInstance?, visitorInstance?, walkerInstance?);

  /**
   * Parse source files and extract JSDoc comments
   * @param sourceFiles - Array of file paths or single file path
   * @param encoding - File encoding (default: 'utf8')
   * @returns Array of generated doclets
   */
  parse(sourceFiles: string | string[], encoding?: string): Doclet[];

  /**
   * Add a doclet to the results buffer
   * @param doclet - Doclet to add to results
   */
  addResult(doclet: Doclet): void;

  /**
   * Get current parsing results
   * @returns Array of doclets
   */
  results(): Doclet[];

  /**
   * Clear parser state and results
   */
  clear(): void;

  /**
   * Fire processing complete event
   * @param doclets - Final doclet array
   */
  fireProcessingComplete(doclets: Doclet[]): void;
}

AST Node Visitor Management

Methods for managing custom AST node visitors during parsing.

/**
 * Add custom AST node visitor
 * @param visitor - Visitor function for AST nodes
 */
addAstNodeVisitor(visitor: Function): void;

/**
 * Get all registered AST node visitors
 * @returns Array of visitor functions
 */
getAstNodeVisitors(): Function[];

Symbol Resolution

Advanced methods for resolving symbol relationships and scope.

/**
 * Resolve what a node is a member of
 * @param node - AST node
 * @returns Object with memberof and basename information
 */
astnodeToMemberof(node: ASTNode): {
  memberof?: string;
  basename?: string;
};

/**
 * Resolve what "this" refers to for a given node
 * @param node - AST node containing "this" reference
 * @returns Longname of the enclosing context
 */
resolveThis(node: ASTNode): string;

/**
 * Resolve parent objects for a property node
 * @param node - Property AST node
 * @returns Array of parent doclets
 */
resolvePropertyParents(node: { parent: ASTNode }): Doclet[];

/**
 * Resolve variable scope for a node
 * @param node - AST node
 * @param basename - Variable basename
 * @returns Scope longname
 */
resolveVar(node: { enclosingScope?: ASTNode; type: string }, basename: string): string;

/**
 * Resolve enum properties
 * @param e - Event object with doclet and code information
 */
resolveEnum(e: { doclet: Doclet; code: { node: ASTNode } }): void;

Doclet Reference Management

Methods for managing doclet references and lookups.

/**
 * Add doclet reference for node lookup
 * @param e - Event object with doclet and code information
 */
addDocletRef(e: {
  doclet?: Doclet;
  code?: { node: ASTNode };
}): void;

Parser Events

The parser emits events during processing that can be handled by plugins.

Core Events

// Event interfaces
interface ParseBeginEvent {
  sourcefiles: string[];
}

interface FileBeginEvent {
  filename: string;
}

interface JSDocCommentFoundEvent {
  comment: string;
  lineno: number;
  columnno: number;
  filename: string;
}

interface SymbolFoundEvent {
  // Symbol information
}

interface NewDocletEvent {
  doclet: Doclet;
}

interface FileCompleteEvent {
  filename: string;
  source?: string;
}

interface ParseCompleteEvent {
  sourcefiles: string[];
  doclets: Doclet[];
}

interface ProcessingCompleteEvent {
  doclets: Doclet[];
}

Event Usage Examples

// Adding event handlers
parser.on('parseBegin', (e) => {
  console.log('Starting to parse:', e.sourcefiles);
});

parser.on('jsdocCommentFound', (e) => {
  console.log(`Found comment at ${e.filename}:${e.lineno}`);
});

parser.on('newDoclet', (e) => {
  console.log('Generated doclet:', e.doclet.longname);
});

Doclet Interface

Structure of documentation objects generated by the parser.

interface Doclet {
  // Core properties
  kind: string;           // 'function', 'class', 'member', etc.
  name: string;           // Symbol name
  longname: string;       // Full qualified name
  description?: string;   // Description text
  
  // Hierarchy
  memberof?: string;      // Parent symbol longname
  scope?: string;         // 'static', 'instance', 'inner', 'global'
  
  // Metadata
  meta: {
    path: string;         // File path
    filename: string;     // File name
    lineno: number;       // Line number
    code: {
      name?: string;      // Code symbol name
      type: string;       // AST node type
      value?: any;        // Symbol value
      paramnames?: string[]; // Parameter names
    };
  };
  
  // Function-specific
  params?: Parameter[];   // Function parameters
  returns?: Return[];     // Return information
  
  // Class-specific
  classdesc?: string;     // Class description
  
  // Type information
  type?: {
    names: string[];      // Type names
  };
  
  // Documentation flags
  undocumented?: boolean; // No JSDoc comment
  ignore?: boolean;       // Should be ignored
  inherited?: boolean;    // Inherited member
  virtual?: boolean;      // Virtual/abstract member
}

interface Parameter {
  name: string;
  type?: { names: string[] };
  description?: string;
  optional?: boolean;
  defaultvalue?: any;
}

interface Return {
  type?: { names: string[] };
  description?: string;
}

Usage Examples

Basic Parser Usage

const parser = require('jsdoc/src/parser');
const env = require('jsdoc/env');

// Set up environment
env.opts = { encoding: 'utf8' };
env.conf = {
  source: {
    includePattern: '\\.js$',
    excludePattern: 'node_modules/'
  }
};

// Create and use parser
const jsdocParser = parser.createParser();
const doclets = jsdocParser.parse(['src/myfile.js']);

console.log(`Generated ${doclets.length} doclets`);
doclets.forEach(doclet => {
  console.log(`${doclet.kind}: ${doclet.longname}`);
});

Advanced Parser with Events

const parser = require('jsdoc/src/parser');
const env = require('jsdoc/env');

// Configure environment
env.conf = {
  source: { includePattern: '\\.js$' },
  plugins: ['plugins/markdown']
};

// Create parser with event handlers
const jsdocParser = parser.createParser();

jsdocParser.on('parseBegin', (e) => {
  console.log('Starting parse of:', e.sourcefiles);
});

jsdocParser.on('newDoclet', (e) => {
  if (!e.doclet.undocumented) {
    console.log(`Documented: ${e.doclet.longname}`);
  }
});

jsdocParser.on('parseComplete', (e) => {
  console.log(`Parse complete: ${e.doclets.length} doclets generated`);
});

// Parse files
const doclets = jsdocParser.parse(['src/**/*.js']);

Custom AST Node Visitor

const parser = require('jsdoc/src/parser');

// Create parser
const jsdocParser = parser.createParser();

// Add custom visitor for specific node types
jsdocParser.addAstNodeVisitor(function(node, e, parser, currentSourceName) {
  if (node.type === 'FunctionExpression' && node.id && node.id.name) {
    console.log(`Found function expression: ${node.id.name}`);
  }
});

// Parse with custom visitor
const doclets = jsdocParser.parse(['myfile.js']);

Working with Doclets

// Filter doclets by type
const functions = doclets.filter(d => d.kind === 'function');
const classes = doclets.filter(d => d.kind === 'class');

// Find specific doclet by longname
const mainClass = doclets.find(d => d.longname === 'MyClass');

// Get all members of a class
const members = doclets.filter(d => d.memberof === 'MyClass');

// Get undocumented symbols
const undocumented = doclets.filter(d => d.undocumented);

Integration with Other Systems

Plugin Integration

// Parser automatically loads plugins
env.conf.plugins = ['plugins/markdown', 'plugins/overloadHelper'];

const jsdocParser = parser.createParser();
// Plugins are now active during parsing

Template Integration

// Doclets are passed to template publish function
function publish(data, opts) {
  // data is a TaffyDB collection of doclets
  const allDoclets = data().get();
  
  allDoclets.forEach(doclet => {
    if (doclet.kind === 'function') {
      generateFunctionDoc(doclet);
    }
  });
}

Error Handling

Parser Error Types

  • Syntax Errors: Invalid JavaScript syntax in source files
  • JSDoc Errors: Malformed JSDoc comments or tags
  • File Errors: Missing files, encoding issues
  • Plugin Errors: Plugin loading or execution failures

Error Handling Examples

try {
  const doclets = jsdocParser.parse(['problematic-file.js']);
} catch (error) {
  if (error.message.includes('Unexpected token')) {
    console.error('Syntax error in source file');
  } else {
    console.error('Parser error:', error.message);
  }
}

// Use pedantic mode to treat warnings as errors
env.opts.pedantic = true;

docs

cli.md

configuration.md

environment.md

index.md

parser.md

plugins.md

templates.md

utilities.md

tile.json