refactor(jsdoc): plumb dependency container through parser, doclets, and tags

And remove `jsdoc/env` dependency from `tag`, `tag/dictionary/definitions`, and `tag/validator`.
This commit is contained in:
Jeff Williams 2021-10-03 09:10:14 -07:00
parent 6583e7680e
commit f7055161eb
19 changed files with 138 additions and 102 deletions

View File

@ -303,7 +303,7 @@ module.exports = (() => {
const conf = dependencies.get('config');
props.parser = parser.createParser(conf);
props.parser = parser.createParser(dependencies);
if (conf.plugins) {
plugins.installPlugins(conf.plugins, props.parser);

View File

@ -511,12 +511,12 @@ function getImplementedAdditions(implDoclets, allDoclets, { documented, memberof
return additions;
}
function augment(doclets, propertyName, docletFinder) {
function augment(doclets, propertyName, docletFinder, jsdocDeps) {
const index = doclets.index.longname;
const dependencies = sort(mapDependencies(index, propertyName));
dependencies.forEach((depName) => {
const additions = docletFinder(index[depName], doclets, doclets.index);
const additions = docletFinder(index[depName], doclets, doclets.index, jsdocDeps);
additions.forEach((addition) => {
const longname = addition.longname;

View File

@ -380,13 +380,19 @@ class Doclet {
* Create a doclet.
*
* @param {string} docletSrc - The raw source code of the jsdoc comment.
* @param {object=} meta - Properties describing the code related to this comment.
* @param {object} meta - Properties describing the code related to this comment.
* @param {object} dependencies - JSDoc dependencies.
*/
constructor(docletSrc, meta = {}) {
constructor(docletSrc, meta, dependencies) {
let newTags = [];
meta = meta || {};
/** The original text of the comment from the source code. */
this.comment = docletSrc;
Object.defineProperty(this, 'dependencies', {
enumerable: false,
value: dependencies,
});
this.setMeta(meta);
docletSrc = unwrap(docletSrc);
@ -442,7 +448,7 @@ class Doclet {
*/
addTag(title, text) {
const tagDef = dictionary.lookUp(title);
const newTag = new Tag(title, text, this.meta);
const newTag = new Tag(title, text, this.meta, this.dependencies);
if (tagDef && tagDef.onTagged) {
tagDef.onTagged(this, newTag);
@ -663,7 +669,7 @@ exports.Doclet = Doclet;
exports.combine = (primary, secondary) => {
const copyMostPropertiesExclude = ['params', 'properties', 'undocumented'];
const copySpecificPropertiesInclude = ['params', 'properties'];
const target = new Doclet('');
const target = new Doclet('', null, secondary.dependencies);
// First, copy most properties to the target doclet.
copyMostProperties(primary, secondary, target, copyMostPropertiesExclude);

View File

@ -25,18 +25,18 @@ function filterByLongname({ longname }) {
return false;
}
function createDoclet(comment, e) {
function createDoclet(comment, e, deps) {
let doclet;
let flatComment;
let msg;
try {
doclet = new Doclet(comment, e);
doclet = new Doclet(comment, e, deps);
} catch (error) {
flatComment = comment.replace(/[\r\n]/g, '');
msg = `cannot create a doclet for the comment "${flatComment}": ${error.message}`;
log.error(msg);
doclet = new Doclet('', e);
doclet = new Doclet('', e, deps);
}
return doclet;
@ -61,13 +61,13 @@ function createDoclet(comment, e) {
*
* @private
*/
function createSymbolDoclet(comment, e) {
let doclet = createDoclet(comment, e);
function createSymbolDoclet(comment, e, deps) {
let doclet = createDoclet(comment, e, deps);
if (doclet.name) {
// try again, without the comment
e.comment = '@undocumented';
doclet = createDoclet(e.comment, e);
doclet = createDoclet(e.comment, e, deps);
}
return doclet;
@ -273,7 +273,7 @@ function addSymbolMemberof(parser, doclet, astNode) {
}
function newSymbolDoclet(parser, docletSrc, e) {
const newDoclet = createSymbolDoclet(docletSrc, e);
const newDoclet = createSymbolDoclet(docletSrc, e, parser.dependencies);
// if there's an alias, use that as the symbol name
if (newDoclet.alias) {
@ -327,7 +327,7 @@ exports.attachTo = (parser) => {
let newDoclet;
for (let i = 0, l = comments.length; i < l; i++) {
newDoclet = createDoclet(comments[i], e);
newDoclet = createDoclet(comments[i], e, parser.dependencies);
// we're only interested in virtual comments here
if (!newDoclet.name) {

View File

@ -72,18 +72,24 @@ function definedInScope(doclet, basename) {
*/
class Parser extends EventEmitter {
// TODO: docs
constructor(conf) {
constructor(dependencies) {
super();
this.clear();
this._conf = conf || {};
this._conf = dependencies.get('config');
this._dependencies = dependencies;
this._visitor = new Visitor();
this._walker = new Walker();
this._visitor.setParser(this);
Object.defineProperties(this, {
dependencies: {
get() {
return this._dependencies;
},
},
visitor: {
get() {
return this._visitor;
@ -626,8 +632,8 @@ class Parser extends EventEmitter {
exports.Parser = Parser;
// TODO: docs
exports.createParser = (config) => {
return new Parser(config);
exports.createParser = (deps) => {
return new Parser(deps);
};
// TODO: document other events

View File

@ -333,7 +333,7 @@ function makeConstructorFinisher(parser) {
// We prefer the parent doclet because it has the correct kind, longname, and memberof.
// The child doclet might or might not have the correct kind, longname, and memberof.
combined = combineDoclets(parentDoclet, eventDoclet);
combined = combineDoclets(parentDoclet, eventDoclet, parser.dependencies);
parser.addResult(combined);

View File

@ -2,7 +2,7 @@
* Functionality related to JSDoc tags.
* @module jsdoc/tag
*/
const env = require('jsdoc/env');
const _ = require('lodash');
const { log } = require('@jsdoc/util');
const path = require('path');
const tag = {
@ -22,7 +22,7 @@ function trim(text, opts, meta) {
let match;
opts = opts || {};
text = String(typeof text === 'undefined' ? '' : text);
text = String(_.isNull(text) || _.isUndefined(text) ? '' : text);
if (mustPreserveWhitespace(text, meta)) {
text = `"${text}"`;
@ -42,11 +42,13 @@ function trim(text, opts, meta) {
return text;
}
function addHiddenProperty(obj, propName, propValue) {
function addHiddenProperty(obj, propName, propValue, dependencies) {
const options = dependencies.get('options');
Object.defineProperty(obj, propName, {
value: propValue,
writable: true,
enumerable: Boolean(env.opts.debug),
enumerable: Boolean(options.debug),
configurable: true,
});
}
@ -71,7 +73,7 @@ function parseType({ text, originalTitle }, { canHaveName, canHaveType }, meta)
}
}
function processTagText(tagInstance, tagDef, meta) {
function processTagText(tagInstance, tagDef, meta, dependencies) {
let tagType;
if (tagDef.onTagText) {
@ -92,7 +94,7 @@ function processTagText(tagInstance, tagDef, meta) {
tagInstance.value.type = {
names: tagType.type,
};
addHiddenProperty(tagInstance.value.type, 'parsedType', tagType.parsedType);
addHiddenProperty(tagInstance.value.type, 'parsedType', tagType.parsedType, dependencies);
}
['optional', 'nullable', 'variable', 'defaultvalue'].forEach((prop) => {
@ -138,15 +140,17 @@ class Tag {
* Constructs a new tag object. Calls the tag validator.
*
* @param {string} tagTitle
* @param {string=} tagBody
* @param {object=} meta
* @param {string} tagBody
* @param {object} meta
* @param {object} dependencies
*/
constructor(tagTitle, tagBody, meta) {
constructor(tagTitle, tagBody, meta, dependencies) {
let tagDef;
let trimOpts;
meta = meta || {};
this.dependencies = dependencies;
this.originalTitle = trim(tagTitle);
/** The title of the tag (for example, `title` in `@title text`). */
@ -179,7 +183,7 @@ class Tag {
this.text = trim(tagBody, trimOpts, meta);
if (this.text) {
processTagText(this, tagDef, meta);
processTagText(this, tagDef, meta, dependencies);
}
tag.validator.validate(this, tagDef, meta);

View File

@ -5,13 +5,12 @@
const _ = require('lodash');
const { applyNamespace, SCOPE, LONGNAMES } = require('@jsdoc/core').name;
const commonPathPrefix = require('common-path-prefix');
const env = require('jsdoc/env');
const { isInlineTag } = require('@jsdoc/tag').inline;
const { log } = require('@jsdoc/util');
const { nodeToValue } = require('@jsdoc/parse').astNode;
const parseTagType = require('@jsdoc/tag').type.parse;
const path = require('path');
const { Syntax } = require('@jsdoc/parse');
const parseTagType = require('@jsdoc/tag').type.parse;
const hasOwnProp = Object.prototype.hasOwnProperty;
@ -31,7 +30,7 @@ function cloneTagDef(tagDef, extras) {
return extras ? _.extend(newTagDef, extras) : newTagDef;
}
function getSourcePaths() {
function getSourcePaths(env) {
const sourcePaths = env.sourceFiles.slice(0) || [];
if (env.opts._) {
@ -47,9 +46,9 @@ function getSourcePaths() {
return sourcePaths;
}
function filepathMinusPrefix(filepath) {
function filepathMinusPrefix(filepath, env) {
let commonPrefix;
const sourcePaths = getSourcePaths();
const sourcePaths = getSourcePaths(env);
let result = '';
commonPrefix =
@ -121,7 +120,8 @@ function setNameToFile(doclet) {
let docletName;
if (doclet.meta.filename) {
docletName = filepathMinusPrefix(doclet.meta.path) + doclet.meta.filename;
docletName =
filepathMinusPrefix(doclet.meta.path, doclet.dependencies.get('env')) + doclet.meta.filename;
doclet.addTag('name', docletName);
}
}
@ -150,8 +150,9 @@ function setDocletNameToFilename(doclet) {
let docletName = '';
if (doclet.meta.path) {
docletName = filepathMinusPrefix(doclet.meta.path);
docletName = filepathMinusPrefix(doclet.meta.path, doclet.dependencies.get('env'));
}
// TODO: Drop the file extension regardless of what it is.
docletName += doclet.meta.filename.replace(/\.js$/i, '');
doclet.name = docletName;

View File

@ -2,7 +2,6 @@
* @module jsdoc/tag/validator
* @requires jsdoc/tag/dictionary
*/
const env = require('jsdoc/env');
const { log } = require('@jsdoc/util');
function buildMessage(tagName, { filename, lineno, comment }, desc) {
@ -18,8 +17,9 @@ function buildMessage(tagName, { filename, lineno, comment }, desc) {
/**
* Validate the given tag.
*/
exports.validate = ({ title, text, value }, tagDef, meta) => {
const allowUnknownTags = env.conf.tags.allowUnknownTags;
exports.validate = ({ dependencies, title, text, value }, tagDef, meta) => {
const config = dependencies.get('config');
const allowUnknownTags = config.tags.allowUnknownTags;
// handle cases where the tag definition does not exist
if (!tagDef) {

View File

@ -18,7 +18,7 @@ const helpers = {
doclets: doclets,
});
},
createParser,
createParser: () => createParser(jsdoc.deps),
didLog: (fn, level) => {
const events = [];
@ -55,7 +55,7 @@ const helpers = {
}
return {
doclets: doclets,
doclets,
getByLongname(longname) {
return doclets.filter((doclet) => (doclet.longname || doclet.name) === longname);
},

View File

@ -34,10 +34,14 @@ describe('module names', () => {
];
env.opts._ = [];
doclet = new Doclet('/** @module */', {
lineno: 1,
filename: 'C:\\Users\\Jane Smith\\myproject\\lib\\mymodule.js',
});
doclet = new Doclet(
'/** @module */',
{
lineno: 1,
filename: 'C:\\Users\\Jane Smith\\myproject\\lib\\mymodule.js',
},
jsdoc.deps
);
expect(doclet.name).toBe('lib/mymodule');
});

View File

@ -38,7 +38,7 @@ describe('jsdoc/doclet', () => {
function makeDoclet(tagStrings) {
const comment = `/**\n${tagStrings.join('\n')}\n*/`;
return new Doclet(comment, {});
return new Doclet(comment, {}, jsdoc.deps);
}
describe('aliases', () => {
@ -205,7 +205,7 @@ describe('jsdoc/doclet', () => {
describe('setScope', () => {
it('should accept the correct scope names', () => {
function setScope(scopeName) {
const newDoclet = new Doclet('/** Huzzah, a doclet! */');
const newDoclet = new Doclet('/** Huzzah, a doclet! */', null, jsdoc.deps);
newDoclet.setScope(scopeName);
}
@ -217,7 +217,7 @@ describe('jsdoc/doclet', () => {
it('should throw an error for invalid scope names', () => {
function setScope() {
const newDoclet = new Doclet('/** Woe betide this doclet. */');
const newDoclet = new Doclet('/** Woe betide this doclet. */', null, jsdoc.deps);
newDoclet.setScope('fiddlesticks');
}
@ -228,8 +228,12 @@ describe('jsdoc/doclet', () => {
describe('combine', () => {
it('should override most properties of the secondary doclet', () => {
const primaryDoclet = new Doclet('/** New and improved!\n@version 2.0.0 */');
const secondaryDoclet = new Doclet('/** Hello!\n@version 1.0.0 */');
const primaryDoclet = new Doclet(
'/** New and improved!\n@version 2.0.0 */',
null,
jsdoc.deps
);
const secondaryDoclet = new Doclet('/** Hello!\n@version 1.0.0 */', null, jsdoc.deps);
const newDoclet = doclet.combine(primaryDoclet, secondaryDoclet);
Object.getOwnPropertyNames(newDoclet).forEach((property) => {
@ -238,8 +242,8 @@ describe('jsdoc/doclet', () => {
});
it('should add properties that are missing from the secondary doclet', () => {
const primaryDoclet = new Doclet('/** Hello!\n@version 2.0.0 */');
const secondaryDoclet = new Doclet('/** Hello! */');
const primaryDoclet = new Doclet('/** Hello!\n@version 2.0.0 */', null, jsdoc.deps);
const secondaryDoclet = new Doclet('/** Hello! */', null, jsdoc.deps);
const newDoclet = doclet.combine(primaryDoclet, secondaryDoclet);
expect(newDoclet.version).toBe('2.0.0');
@ -252,14 +256,14 @@ describe('jsdoc/doclet', () => {
"should use the secondary doclet's params and properties if the primary doclet " +
'had none',
() => {
const primaryDoclet = new Doclet('/** Hello! */');
const primaryDoclet = new Doclet('/** Hello! */', null, jsdoc.deps);
const secondaryComment = [
'/**',
' * @param {string} foo - The foo.',
' * @property {number} bar - The bar.',
' */',
].join('\n');
const secondaryDoclet = new Doclet(secondaryComment);
const secondaryDoclet = new Doclet(secondaryComment, null, jsdoc.deps);
const newDoclet = doclet.combine(primaryDoclet, secondaryDoclet);
properties.forEach((property) => {
@ -275,14 +279,14 @@ describe('jsdoc/doclet', () => {
' * @property {string} qux - The qux.',
' */',
].join('\n');
const primaryDoclet = new Doclet(primaryComment);
const primaryDoclet = new Doclet(primaryComment, null, jsdoc.deps);
const secondaryComment = [
'/**',
' * @param {string} foo - The foo.',
' * @property {number} bar - The bar.',
' */',
].join('\n');
const secondaryDoclet = new Doclet(secondaryComment);
const secondaryDoclet = new Doclet(secondaryComment, null, jsdoc.deps);
const newDoclet = doclet.combine(primaryDoclet, secondaryDoclet);
properties.forEach((property) => {

View File

@ -6,7 +6,6 @@ describe('jsdoc/src/parser', () => {
const jsdocParser = require('jsdoc/src/parser');
const path = require('path');
const config = jsdoc.deps.get('config');
const dirname = path.resolve(path.join(__dirname, '..', '..', '..', '..'));
it('should exist', () => {
@ -22,8 +21,8 @@ describe('jsdoc/src/parser', () => {
});
describe('createParser', () => {
it('should return a Parser when called with a config', () => {
expect(jsdocParser.createParser(config)).toBeObject();
it('should return a Parser when called with dependencies', () => {
expect(jsdocParser.createParser(jsdoc.deps)).toBeObject();
});
});
@ -31,7 +30,7 @@ describe('jsdoc/src/parser', () => {
let parser;
beforeEach(() => {
parser = new jsdocParser.Parser();
parser = new jsdocParser.Parser(jsdoc.deps);
});
it('should have a "visitor" property', () => {

View File

@ -3,7 +3,7 @@ describe('jsdoc/src/visitor', () => {
const { Parser } = require('jsdoc/src/parser');
const { Visitor } = require('jsdoc/src/visitor');
const parser = new Parser();
const parser = new Parser(jsdoc.deps);
const visitor = new Visitor();
describe('visitNodeComments', () => {

View File

@ -45,17 +45,17 @@ describe('jsdoc/tag', () => {
// allow each test to recreate the tags (for example, after enabling debug mode)
function createTags() {
// synonym for @param; space in the title
tagArg = new jsdocTag.Tag('arg ', text, meta);
tagArg = new jsdocTag.Tag('arg ', text, meta, jsdoc.deps);
// @param with no type, but with optional and defaultvalue
tagParam = new jsdocTag.Tag('param', '[foo=1]', meta);
tagParam = new jsdocTag.Tag('param', '[foo=1]', meta, jsdoc.deps);
// @param with type and no type modifiers (such as optional)
tagParamWithType = new jsdocTag.Tag('param', '{string} foo', meta);
tagParamWithType = new jsdocTag.Tag('param', '{string} foo', meta, jsdoc.deps);
// @example that does not need indentation to be removed
tagExample = new jsdocTag.Tag('example', textExample, meta);
tagExample = new jsdocTag.Tag('example', textExample, meta, jsdoc.deps);
// @example that needs indentation to be removed
tagExampleIndented = new jsdocTag.Tag('example', textExampleIndented, meta);
tagExampleIndented = new jsdocTag.Tag('example', textExampleIndented, meta, jsdoc.deps);
// for testing that onTagText is run when necessary
tagType = new jsdocTag.Tag('type', 'MyType ', meta);
tagType = new jsdocTag.Tag('type', 'MyType ', meta, jsdoc.deps);
}
beforeEach(() => {
@ -116,10 +116,10 @@ describe('jsdoc/tag', () => {
let wsTrailing;
function newTags() {
wsOnly = new jsdocTag.Tag('name', ' ', { code: { name: ' ' } });
wsLeading = new jsdocTag.Tag('name', ' foo', { code: { name: ' foo' } });
wsTrailing = new jsdocTag.Tag('name', 'foo ', { code: { name: 'foo ' } });
wsBoth = new jsdocTag.Tag('name', ' foo ', { code: { name: ' foo ' } });
wsOnly = new jsdocTag.Tag('name', ' ', { code: { name: ' ' } }, jsdoc.deps);
wsLeading = new jsdocTag.Tag('name', ' foo', { code: { name: ' foo' } }, jsdoc.deps);
wsTrailing = new jsdocTag.Tag('name', 'foo ', { code: { name: 'foo ' } }, jsdoc.deps);
wsBoth = new jsdocTag.Tag('name', ' foo ', { code: { name: ' foo ' } }, jsdoc.deps);
}
expect(jsdoc.didLog(newTags, 'error')).toBeFalse();
@ -208,7 +208,7 @@ describe('jsdoc/tag', () => {
describe('tag validating', () => {
it('logs an error for tags with bad type expressions', () => {
function newTag() {
return new jsdocTag.Tag('param', '{!*!*!*!} foo');
return new jsdocTag.Tag('param', '{!*!*!*!} foo', null, jsdoc.deps);
}
expect(jsdoc.didLog(newTag, 'error')).toBeTrue();
@ -216,7 +216,7 @@ describe('jsdoc/tag', () => {
it('validates tags with no text', () => {
function newTag() {
return new jsdocTag.Tag('copyright');
return new jsdocTag.Tag('copyright', null, null, jsdoc.deps);
}
expect(jsdoc.didLog(newTag, 'error')).toBeTrue();

View File

@ -18,15 +18,15 @@ describe('jsdoc/tag/validator', () => {
const dictionary = require('jsdoc/tag/dictionary');
const allowUnknown = Boolean(config.tags.allowUnknownTags);
const badTag = { title: 'lkjasdlkjfb' };
const badTag2 = new tag.Tag('type', '{string} I am a string!');
const badTag = { dependencies: jsdoc.deps, title: 'lkjasdlkjfb' };
const badTag2 = new tag.Tag('type', '{string} I am a string!', null, jsdoc.deps);
const meta = {
filename: 'asdf.js',
lineno: 1,
comment: 'Better luck next time.',
};
const goodTag = new tag.Tag('name', 'MyDocletName', meta); // mustHaveValue
const goodTag2 = new tag.Tag('ignore', '', meta); // mustNotHaveValue
const goodTag = new tag.Tag('name', 'MyDocletName', meta, jsdoc.deps); // mustHaveValue
const goodTag2 = new tag.Tag('ignore', '', meta, jsdoc.deps); // mustNotHaveValue
function validateTag(theTag) {
validator.validate(theTag, dictionary.lookUp(theTag.title), meta);

View File

@ -669,7 +669,7 @@ describe('jsdoc/util/templateHelper', () => {
let attribs;
it('should return an array', () => {
doc = new doclet.Doclet('/** ljklajsdf */', {});
doc = new doclet.Doclet('/** ljklajsdf */', {}, jsdoc.deps);
attribs = helper.getAttribs(doc);
expect(attribs).toBeEmptyArray();
@ -681,7 +681,7 @@ describe('jsdoc/util/templateHelper', () => {
function doTests(tests, whatNotToContain) {
for (const src in tests) {
if (hasOwnProp.call(tests, src)) {
doc = new doclet.Doclet(`/** ${src} */`, {});
doc = new doclet.Doclet(`/** ${src} */`, {}, jsdoc.deps);
attribs = helper.getAttribs(doc);
if (tests[src]) {
@ -782,7 +782,11 @@ describe('jsdoc/util/templateHelper', () => {
});
it('should detect multiple attributes', () => {
const fdsaFoo = new doclet.Doclet('/** @const module:fdsa~FOO\n@readonly\n@private */', {});
const fdsaFoo = new doclet.Doclet(
'/** @const module:fdsa~FOO\n@readonly\n@private */',
{},
jsdoc.deps
);
attribs = helper.getAttribs(fdsaFoo);
@ -814,14 +818,14 @@ describe('jsdoc/util/templateHelper', () => {
// returns links to allowed types for a doclet.
it('returns an empty array if the doclet has no specified type', () => {
const doc = new doclet.Doclet('/** @const ASDF */', {});
const doc = new doclet.Doclet('/** @const ASDF */', {}, jsdoc.deps);
const types = helper.getSignatureTypes(doc);
expect(types).toBeEmptyArray();
});
it("returns a string array of the doclet's types", () => {
const doc = new doclet.Doclet('/** @const {number|Array.<boolean>} ASDF */', {});
const doc = new doclet.Doclet('/** @const {number|Array.<boolean>} ASDF */', {}, jsdoc.deps);
const types = helper.getSignatureTypes(doc);
expect(types).toBeArrayOfSize(2);
@ -836,7 +840,7 @@ describe('jsdoc/util/templateHelper', () => {
// make some links.
helper.longnameToUrl.MyClass = 'MyClass.html';
doc = new doclet.Doclet('/** @const {MyClass} ASDF */', {});
doc = new doclet.Doclet('/** @const {MyClass} ASDF */', {}, jsdoc.deps);
types = helper.getSignatureTypes(doc);
expect(types).toBeArrayOfSize(1);
@ -850,7 +854,7 @@ describe('jsdoc/util/templateHelper', () => {
// make some links.
helper.longnameToUrl.MyClass = 'MyClass.html';
doc = new doclet.Doclet('/** @const {MyClass} ASDF */', {});
doc = new doclet.Doclet('/** @const {MyClass} ASDF */', {}, jsdoc.deps);
types = helper.getSignatureTypes(doc, 'myCSSClass');
expect(types).toBeArrayOfSize(1);
@ -862,7 +866,7 @@ describe('jsdoc/util/templateHelper', () => {
// retrieves parameter names.
// if css class is provided, optional parameters are wrapped in a <span> with that class.
it('returns an empty array if the doclet has no specified type', () => {
const doc = new doclet.Doclet('/** @function myFunction */', {});
const doc = new doclet.Doclet('/** @function myFunction */', {}, jsdoc.deps);
const params = helper.getSignatureParams(doc);
expect(params).toBeEmptyArray();
@ -871,7 +875,8 @@ describe('jsdoc/util/templateHelper', () => {
it("returns a string array of the doclet's parameter names", () => {
const doc = new doclet.Doclet(
'/** @function myFunction\n @param {string} foo - asdf. */',
{}
{},
jsdoc.deps
);
const params = helper.getSignatureParams(doc);
@ -886,7 +891,8 @@ describe('jsdoc/util/templateHelper', () => {
' * @param {number} [bar=1] - another explanation.\n' +
' * @param {string} [baz] - another explanation.\n' +
' */',
{}
{},
jsdoc.deps
);
const params = helper.getSignatureParams(doc, 'cssClass');
@ -903,7 +909,8 @@ describe('jsdoc/util/templateHelper', () => {
' * @param {number} [bar=1] - another explanation.\n' +
' * @param {string} [baz] - another explanation.\n' +
' */',
{}
{},
jsdoc.deps
);
const params = helper.getSignatureParams(doc);
@ -936,7 +943,7 @@ describe('jsdoc/util/templateHelper', () => {
});
it('returns an empty array if the doclet has no returns', () => {
const doc = new doclet.Doclet('/** @function myFunction */', {});
const doc = new doclet.Doclet('/** @function myFunction */', {}, jsdoc.deps);
const returns = helper.getSignatureReturns(doc);
expect(returns).toBeEmptyArray();
@ -945,7 +952,8 @@ describe('jsdoc/util/templateHelper', () => {
it('returns an empty array if the doclet has @returns but with no type', () => {
const doc = new doclet.Doclet(
'/** @function myFunction\n@returns an interesting result.*/',
{}
{},
jsdoc.deps
);
const returns = helper.getSignatureReturns(doc);
@ -953,14 +961,14 @@ describe('jsdoc/util/templateHelper', () => {
});
it('uses the value of the `yields` property', () => {
const doc = new doclet.Doclet('/** @yields {string} A string. */', {});
const doc = new doclet.Doclet('/** @yields {string} A string. */', {}, jsdoc.deps);
const html = helper.getSignatureReturns(doc);
expect(html).toContain('string');
});
it('prefers `yields` over `returns`', () => {
const doc = new doclet.Doclet('/** @yields {string}\n@returns {number} */', {});
const doc = new doclet.Doclet('/** @yields {string}\n@returns {number} */', {}, jsdoc.deps);
const html = helper.getSignatureReturns(doc);
expect(html).toContain('string');
@ -976,7 +984,8 @@ describe('jsdoc/util/templateHelper', () => {
doc = new doclet.Doclet(
'/** @function myFunction\n@returns {number|MyClass} an interesting result.*/',
{}
{},
jsdoc.deps
);
returns = helper.getSignatureReturns(doc);
@ -994,7 +1003,8 @@ describe('jsdoc/util/templateHelper', () => {
doc = new doclet.Doclet(
'/** @function myFunction\n@returns {number|MyClass} an interesting result.*/',
{}
{},
jsdoc.deps
);
returns = helper.getSignatureReturns(doc, 'myCssClass');
@ -1012,14 +1022,16 @@ describe('jsdoc/util/templateHelper', () => {
// make a hierarchy.
const lackeys = new doclet.Doclet(
'/** @member lackeys\n@memberof module:mafia/gangs.Sharks~Henchman\n@instance*/',
{}
{},
jsdoc.deps
);
const henchman = new doclet.Doclet(
'/** @class Henchman\n@memberof module:mafia/gangs.Sharks\n@inner */',
{}
{},
jsdoc.deps
);
const gang = new doclet.Doclet('/** @namespace module:mafia/gangs.Sharks */', {});
const mafia = new doclet.Doclet('/** @module mafia/gangs */', {});
const gang = new doclet.Doclet('/** @namespace module:mafia/gangs.Sharks */', {}, jsdoc.deps);
const mafia = new doclet.Doclet('/** @module mafia/gangs */', {}, jsdoc.deps);
const data = taffy([lackeys, henchman, gang, mafia]);
afterEach(() => {

View File

@ -2,8 +2,8 @@ describe('@lends tag', () => {
// see also specs/documentation/lends.js for tests on @lends behaviour.
const { Doclet } = require('jsdoc/doclet');
const doc = new Doclet('/** @lends */', {});
const doc2 = new Doclet('/** @lends MyClass# */', {});
const doc = new Doclet('/** @lends */', {}, jsdoc.deps);
const doc2 = new Doclet('/** @lends MyClass# */', {}, jsdoc.deps);
it("sets the doclet's 'alias' property to the tag value or <global>", () => {
expect(doc.alias).toBe('<global>');

View File

@ -58,7 +58,7 @@ describe('@overview tag', () => {
lineno: 1,
filename: fakePath,
};
doclet = new Doclet(docletSrc, docletMeta);
doclet = new Doclet(docletSrc, docletMeta, jsdoc.deps);
doclet.addTag('file', 'A random file.');
expect(doclet.name).toBe('somefile.js');