Search code examples
node.jswebstormjsdoc

JSDoc when exporting a function constructor in node.js


I'm just starting to add some JSDoc comments to a code base I've been working on, for the most part this seems to work, but there's one area that's causing me some difficulties.

If I describe a function constructor in a file, and then export it on the module.exports, when I later require() that module, I get no documentation on the type and the inferred type is set as |exports. Clicking on the doesn't take me anywhere. I currently have:

/**
 * Creates an instance of the StatusCodeErrorItem
 * @param {string} message The message for this error
 * @param {object} params The parameters that caused this error to occur
 * @alias lib/common/StatusCodeErrorItem.StatusCodeErrorItem
 * @returns {StatusCodeErrorItem}
 * @constructor
 */
function StatusCodeErrorItem(message, params) {
    this.message = message;
    this.params = params;
}

/**
 * Holds information about an error
 * @module lib/common/StatusCodeErrorItem
 */
module.exports = StatusCodeErrorItem;

and in the file that uses it:

var StatusCodeErrorItem = require('./StatusCodeErrorItem');

I'd thought at this point that'd I'd be able to press f1 to bring up the inline documentation, and see the definition of StatusCodeErrorItem as described in that file. But instead I only see: inferred type StatusCodeErrorItem|exports

Webstorm 9 Node.js 0.10.36 (I know both are old)

Any thoughts on what I'm doing wrong? Is what I'm after even possible? Are my versions simply too old?

Cheers


Solution

  • Webstorm 2016.1.1 solves the issue. The below JSDoc gets correctly assigned to types pulled in by require. I'll now be pestering people to get me a new license.

    'use strict';
    
    /**
     * Creates an instance of the StatusCodeErrorItem
     * @memberof common
     * @constructor
     * @classdesc A class for holding information about an error. The params object allows the tracking of the function
     *  parameters that caused the error, but should not be used to store large objects.
     * @description Creates an instance of the StatusCodeErrorItem with the given message and optional params object
     * @param {string} message The message for this error
     * @param {object} [params] The parameters that caused this error to occur
     * @returns {StatusCodeErrorItem}
     * @see {@link module:lib/common/StatusCodeError.StatusCodeError|StatusCodeError}
     */
    function StatusCodeErrorItem(message, params) {
        this.message = message;
        this.params = params;
    }
    
    /**
     * Surfaces a class that holds information about an error
     * @module lib/common/StatusCodeErrorItem
     */
    module.exports = StatusCodeErrorItem;