diff --git a/packages/jsdoc/cli.js b/packages/jsdoc/cli.js index 7963d5fd..9271cdfe 100644 --- a/packages/jsdoc/cli.js +++ b/packages/jsdoc/cli.js @@ -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); diff --git a/packages/jsdoc/lib/jsdoc/augment.js b/packages/jsdoc/lib/jsdoc/augment.js index b03ec7b6..c482f2bc 100644 --- a/packages/jsdoc/lib/jsdoc/augment.js +++ b/packages/jsdoc/lib/jsdoc/augment.js @@ -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; diff --git a/packages/jsdoc/lib/jsdoc/doclet.js b/packages/jsdoc/lib/jsdoc/doclet.js index 4b28f7a2..0623df1c 100644 --- a/packages/jsdoc/lib/jsdoc/doclet.js +++ b/packages/jsdoc/lib/jsdoc/doclet.js @@ -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); diff --git a/packages/jsdoc/lib/jsdoc/src/handlers.js b/packages/jsdoc/lib/jsdoc/src/handlers.js index ce0567e1..4c890b2f 100644 --- a/packages/jsdoc/lib/jsdoc/src/handlers.js +++ b/packages/jsdoc/lib/jsdoc/src/handlers.js @@ -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) { diff --git a/packages/jsdoc/lib/jsdoc/src/parser.js b/packages/jsdoc/lib/jsdoc/src/parser.js index c13a5445..cb6ff998 100644 --- a/packages/jsdoc/lib/jsdoc/src/parser.js +++ b/packages/jsdoc/lib/jsdoc/src/parser.js @@ -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 diff --git a/packages/jsdoc/lib/jsdoc/src/visitor.js b/packages/jsdoc/lib/jsdoc/src/visitor.js index f997e83c..cd5aaa25 100644 --- a/packages/jsdoc/lib/jsdoc/src/visitor.js +++ b/packages/jsdoc/lib/jsdoc/src/visitor.js @@ -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); diff --git a/packages/jsdoc/lib/jsdoc/tag.js b/packages/jsdoc/lib/jsdoc/tag.js index 1cdc733c..6fceaa80 100644 --- a/packages/jsdoc/lib/jsdoc/tag.js +++ b/packages/jsdoc/lib/jsdoc/tag.js @@ -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); diff --git a/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js b/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js index 77ce875a..2351c26c 100644 --- a/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js +++ b/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js @@ -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; diff --git a/packages/jsdoc/lib/jsdoc/tag/validator.js b/packages/jsdoc/lib/jsdoc/tag/validator.js index eb85517c..0bdd21d5 100644 --- a/packages/jsdoc/lib/jsdoc/tag/validator.js +++ b/packages/jsdoc/lib/jsdoc/tag/validator.js @@ -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) { diff --git a/packages/jsdoc/test/helpers/jsdoc.js b/packages/jsdoc/test/helpers/jsdoc.js index f58a348f..cab619b1 100644 --- a/packages/jsdoc/test/helpers/jsdoc.js +++ b/packages/jsdoc/test/helpers/jsdoc.js @@ -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); }, diff --git a/packages/jsdoc/test/specs/documentation/modules.js b/packages/jsdoc/test/specs/documentation/modules.js index 3dd55764..61456202 100644 --- a/packages/jsdoc/test/specs/documentation/modules.js +++ b/packages/jsdoc/test/specs/documentation/modules.js @@ -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'); }); diff --git a/packages/jsdoc/test/specs/jsdoc/doclet.js b/packages/jsdoc/test/specs/jsdoc/doclet.js index 91d9178e..852827b3 100644 --- a/packages/jsdoc/test/specs/jsdoc/doclet.js +++ b/packages/jsdoc/test/specs/jsdoc/doclet.js @@ -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) => { diff --git a/packages/jsdoc/test/specs/jsdoc/src/parser.js b/packages/jsdoc/test/specs/jsdoc/src/parser.js index 3d87b493..a66495f0 100644 --- a/packages/jsdoc/test/specs/jsdoc/src/parser.js +++ b/packages/jsdoc/test/specs/jsdoc/src/parser.js @@ -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', () => { diff --git a/packages/jsdoc/test/specs/jsdoc/src/visitor.js b/packages/jsdoc/test/specs/jsdoc/src/visitor.js index 87f19ed1..9c078a43 100644 --- a/packages/jsdoc/test/specs/jsdoc/src/visitor.js +++ b/packages/jsdoc/test/specs/jsdoc/src/visitor.js @@ -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', () => { diff --git a/packages/jsdoc/test/specs/jsdoc/tag.js b/packages/jsdoc/test/specs/jsdoc/tag.js index 29389b21..c2f0049e 100644 --- a/packages/jsdoc/test/specs/jsdoc/tag.js +++ b/packages/jsdoc/test/specs/jsdoc/tag.js @@ -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(); diff --git a/packages/jsdoc/test/specs/jsdoc/tag/validator.js b/packages/jsdoc/test/specs/jsdoc/tag/validator.js index 4377b9dd..ea6e2981 100644 --- a/packages/jsdoc/test/specs/jsdoc/tag/validator.js +++ b/packages/jsdoc/test/specs/jsdoc/tag/validator.js @@ -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); diff --git a/packages/jsdoc/test/specs/jsdoc/util/templateHelper.js b/packages/jsdoc/test/specs/jsdoc/util/templateHelper.js index c773763d..4f45ace8 100644 --- a/packages/jsdoc/test/specs/jsdoc/util/templateHelper.js +++ b/packages/jsdoc/test/specs/jsdoc/util/templateHelper.js @@ -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.} ASDF */', {}); + const doc = new doclet.Doclet('/** @const {number|Array.} 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 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(() => { diff --git a/packages/jsdoc/test/specs/tags/lendstag.js b/packages/jsdoc/test/specs/tags/lendstag.js index 9e94c258..4449d477 100644 --- a/packages/jsdoc/test/specs/tags/lendstag.js +++ b/packages/jsdoc/test/specs/tags/lendstag.js @@ -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 ", () => { expect(doc.alias).toBe(''); diff --git a/packages/jsdoc/test/specs/tags/overviewtag.js b/packages/jsdoc/test/specs/tags/overviewtag.js index bb7bd840..94573e5e 100644 --- a/packages/jsdoc/test/specs/tags/overviewtag.js +++ b/packages/jsdoc/test/specs/tags/overviewtag.js @@ -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');