eslint-plugin-jsdoc 46.2.6 → 46.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"validTypes.js","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","obj","__esModule","default","asExpression","suppressTypes","Set","tryParsePathIgnoreError","path","tryParse","_default","iterateJsdoc","jsdoc","report","utils","context","settings","allowEmptyNamepaths","options","mode","tag","tags","validNamepathParsing","namepath","tagName","handled","startsWith","endChar","slice","includes","startChar","charAt","validTypeParsing","type","parsedTypes","parse","traverse","node","_node$right","_node$right2","_node$right2$meta","typ","right","meta","position","problems","length","msg","reduce","str","message","thisNamepath","getTagDescription","replace","trim","test","thatNamepath","name","value","undefined","has","otherModeMaps","filter","mde","map","getTagStructureForMode","tagMightHaveNamePosition","modeInfo","mightHaveTypePosition","tagMightHaveTypePosition","tagMustHaveNamePosition","mustHaveTypePosition","tagMustHaveTypePosition","tagMissingRequiredTypeOrNamepath","hasTypePosition","Boolean","hasNameOrNamepathPosition","tagMightHaveNamepath","parseClosureTemplateTag","iterateAllJsdocs","docs","description","url","schema","additionalProperties","properties","exports","module"],"sources":["../../src/rules/validTypes.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\n\nconst asExpression = /as\\s+/u;\n\nconst suppressTypes = new Set([\n // https://github.com/google/closure-compiler/wiki/@suppress-annotations\n // https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/ParserConfig.properties#L154\n 'accessControls',\n 'checkDebuggerStatement',\n 'checkPrototypalTypes',\n 'checkRegExp',\n 'checkTypes',\n 'checkVars',\n 'closureDepMethodUsageChecks',\n 'const',\n 'constantProperty',\n 'deprecated',\n 'duplicate',\n 'es5Strict',\n 'externsValidation',\n 'extraProvide',\n 'extraRequire',\n 'globalThis',\n 'invalidCasts',\n 'lateProvide',\n 'legacyGoogScopeRequire',\n 'lintChecks',\n 'messageConventions',\n 'misplacedTypeAnnotation',\n 'missingOverride',\n 'missingPolyfill',\n 'missingProperties',\n 'missingProvide',\n 'missingRequire',\n 'missingSourcesWarnings',\n 'moduleLoad',\n 'nonStandardJsDocs',\n 'partialAlias',\n 'polymer',\n 'reportUnknownTypes',\n 'strictMissingProperties',\n 'strictModuleDepCheck',\n 'strictPrimitiveOperators',\n 'suspiciousCode',\n\n // Not documented in enum\n 'switch',\n 'transitionalSuspiciousCodeWarnings',\n 'undefinedNames',\n 'undefinedVars',\n 'underscore',\n 'unknownDefines',\n 'untranspilableFeatures',\n 'unusedLocalVariables',\n 'unusedPrivateMembers',\n 'useOfGoogProvide',\n 'uselessCode',\n 'visibility',\n 'with',\n]);\n\n/**\n * @param {string} path\n * @returns {boolean}\n */\nconst tryParsePathIgnoreError = (path) => {\n try {\n tryParse(path);\n\n return true;\n } catch {\n // Keep the original error for including the whole type\n }\n\n return false;\n};\n\n// eslint-disable-next-line complexity\nexport default iterateJsdoc(({\n jsdoc,\n report,\n utils,\n context,\n settings,\n}) => {\n const {\n allowEmptyNamepaths = false,\n } = context.options[0] || {};\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n /**\n * @param {string} namepath\n * @param {string} [tagName]\n * @returns {boolean}\n */\n const validNamepathParsing = function (namepath, tagName) {\n if (tryParsePathIgnoreError(namepath)) {\n return true;\n }\n\n let handled = false;\n\n if (tagName) {\n // eslint-disable-next-line default-case\n switch (tagName) {\n case 'requires':\n case 'module': {\n if (!namepath.startsWith('module:')) {\n handled = tryParsePathIgnoreError(`module:${namepath}`);\n }\n\n break;\n }\n\n case 'memberof': case 'memberof!': {\n const endChar = namepath.slice(-1);\n if ([\n '#', '.', '~',\n ].includes(endChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(0, -1));\n }\n\n break;\n }\n\n case 'borrows': {\n const startChar = namepath.charAt(0);\n if ([\n '#', '.', '~',\n ].includes(startChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(1));\n }\n }\n }\n }\n\n if (!handled) {\n report(`Syntax error in namepath: ${namepath}`, null, tag);\n\n return false;\n }\n\n return true;\n };\n\n /**\n * @param {string} type\n * @returns {boolean}\n */\n const validTypeParsing = function (type) {\n let parsedTypes;\n try {\n if (mode === 'permissive') {\n parsedTypes = tryParse(type);\n } else {\n parsedTypes = parse(type, mode);\n }\n } catch {\n report(`Syntax error in type: ${type}`, null, tag);\n\n return false;\n }\n\n if (mode === 'closure' || mode === 'typescript') {\n traverse(parsedTypes, (node) => {\n const {\n type: typ,\n } = node;\n\n if (\n (typ === 'JsdocTypeObjectField' || typ === 'JsdocTypeKeyValue') &&\n node.right?.type === 'JsdocTypeNullable' &&\n node.right?.meta?.position === 'suffix'\n ) {\n report(`Syntax error in type: ${node.right.type}`, null, tag);\n }\n });\n }\n\n return true;\n };\n\n if (tag.problems.length) {\n const msg = tag.problems.reduce((str, {\n message,\n }) => {\n return str + '; ' + message;\n }, '').slice(2);\n report(`Invalid name: ${msg}`, null, tag);\n continue;\n }\n\n if (tag.tag === 'borrows') {\n const thisNamepath = /** @type {string} */ (\n utils.getTagDescription(tag)\n ).replace(asExpression, '')\n .trim();\n\n if (!asExpression.test(/** @type {string} */ (\n utils.getTagDescription(tag)\n )) || !thisNamepath) {\n report(`@borrows must have an \"as\" expression. Found \"${utils.getTagDescription(tag)}\"`, null, tag);\n\n continue;\n }\n\n if (validNamepathParsing(thisNamepath, 'borrows')) {\n const thatNamepath = tag.name;\n\n validNamepathParsing(thatNamepath);\n }\n\n continue;\n }\n\n if (tag.tag === 'suppress' && mode === 'closure') {\n let parsedTypes;\n\n try {\n parsedTypes = tryParse(tag.type);\n } catch {\n // Ignore\n }\n\n if (parsedTypes) {\n traverse(parsedTypes, (node) => {\n let type;\n if ('value' in node && typeof node.value === 'string') {\n type = node.value;\n }\n\n if (type !== undefined && !suppressTypes.has(type)) {\n report(`Syntax error in suppress type: ${type}`, null, tag);\n }\n });\n }\n }\n\n const otherModeMaps = /** @type {import('../jsdocUtils.js').ParserMode[]} */ ([\n 'jsdoc', 'typescript', 'closure', 'permissive',\n ]).filter(\n (mde) => {\n return mde !== mode;\n },\n ).map((mde) => {\n return utils.getTagStructureForMode(mde);\n });\n\n const tagMightHaveNamePosition = utils.tagMightHaveNamePosition(tag.tag, otherModeMaps);\n if (tagMightHaveNamePosition !== true && tag.name) {\n const modeInfo = tagMightHaveNamePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a name${modeInfo}.`, null, tag);\n\n continue;\n }\n\n const mightHaveTypePosition = utils.tagMightHaveTypePosition(tag.tag, otherModeMaps);\n if (mightHaveTypePosition !== true && tag.type) {\n const modeInfo = mightHaveTypePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a bracketed type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED NAME\n const tagMustHaveNamePosition = utils.tagMustHaveNamePosition(tag.tag, otherModeMaps);\n\n // Don't handle `@param` here though it does require name as handled by\n // `require-param-name` (`@property` would similarly seem to require one,\n // but is handled by `require-property-name`)\n if (tagMustHaveNamePosition !== false && !tag.name && !allowEmptyNamepaths && ![\n 'param', 'arg', 'argument',\n 'property', 'prop',\n ].includes(tag.tag) &&\n (tag.tag !== 'see' || !utils.getTagDescription(tag).includes('{@link'))\n ) {\n const modeInfo = tagMustHaveNamePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a name/namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE\n const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag, otherModeMaps);\n if (mustHaveTypePosition !== false && !tag.type) {\n const modeInfo = mustHaveTypePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE OR NAME/NAMEPATH\n const tagMissingRequiredTypeOrNamepath = utils.tagMissingRequiredTypeOrNamepath(tag, otherModeMaps);\n if (tagMissingRequiredTypeOrNamepath !== false && !allowEmptyNamepaths) {\n const modeInfo = tagMissingRequiredTypeOrNamepath === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have either a type or namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // VALID TYPE\n const hasTypePosition = mightHaveTypePosition === true && Boolean(tag.type);\n if (hasTypePosition) {\n validTypeParsing(tag.type);\n }\n\n // VALID NAME/NAMEPATH\n const hasNameOrNamepathPosition = (\n tagMustHaveNamePosition !== false ||\n utils.tagMightHaveNamepath(tag.tag)\n ) && Boolean(tag.name);\n\n if (hasNameOrNamepathPosition) {\n if (mode !== 'jsdoc' && tag.tag === 'template') {\n for (const namepath of utils.parseClosureTemplateTag(tag)) {\n validNamepathParsing(namepath);\n }\n } else {\n validNamepathParsing(tag.name, tag.tag);\n }\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Requires all types to be valid JSDoc or Closure compiler types without syntax errors.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/valid-types.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowEmptyNamepaths: {\n default: false,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"validTypes.js","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","obj","__esModule","default","inlineTags","Set","asExpression","suppressTypes","tryParsePathIgnoreError","path","tryParse","_default","iterateJsdoc","jsdoc","report","utils","context","settings","allowEmptyNamepaths","options","mode","tag","tags","validNamepathParsing","namepath","tagName","handled","startsWith","endChar","slice","includes","startChar","charAt","validTypeParsing","type","parsedTypes","parse","traverse","node","_node$right","_node$right2","_node$right2$meta","typ","right","meta","position","problems","length","msg","reduce","str","message","thisNamepath","getTagDescription","replace","trim","test","thatNamepath","name","value","undefined","has","otherModeMaps","filter","mde","map","getTagStructureForMode","tagMightHaveNamePosition","modeInfo","mightHaveTypePosition","tagMightHaveTypePosition","tagMustHaveNamePosition","mustHaveTypePosition","tagMustHaveTypePosition","tagMissingRequiredTypeOrNamepath","hasTypePosition","Boolean","hasNameOrNamepathPosition","tagMightHaveNamepath","parseClosureTemplateTag","inlineTag","text","namepathOrURL","iterateAllJsdocs","docs","description","url","schema","additionalProperties","properties","exports","module"],"sources":["../../src/rules/validTypes.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\n\nconst inlineTags = new Set([\n 'link', 'linkcode', 'linkplain',\n 'tutorial',\n]);\n\nconst asExpression = /as\\s+/u;\n\nconst suppressTypes = new Set([\n // https://github.com/google/closure-compiler/wiki/@suppress-annotations\n // https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/ParserConfig.properties#L154\n 'accessControls',\n 'checkDebuggerStatement',\n 'checkPrototypalTypes',\n 'checkRegExp',\n 'checkTypes',\n 'checkVars',\n 'closureDepMethodUsageChecks',\n 'const',\n 'constantProperty',\n 'deprecated',\n 'duplicate',\n 'es5Strict',\n 'externsValidation',\n 'extraProvide',\n 'extraRequire',\n 'globalThis',\n 'invalidCasts',\n 'lateProvide',\n 'legacyGoogScopeRequire',\n 'lintChecks',\n 'messageConventions',\n 'misplacedTypeAnnotation',\n 'missingOverride',\n 'missingPolyfill',\n 'missingProperties',\n 'missingProvide',\n 'missingRequire',\n 'missingSourcesWarnings',\n 'moduleLoad',\n 'nonStandardJsDocs',\n 'partialAlias',\n 'polymer',\n 'reportUnknownTypes',\n 'strictMissingProperties',\n 'strictModuleDepCheck',\n 'strictPrimitiveOperators',\n 'suspiciousCode',\n\n // Not documented in enum\n 'switch',\n 'transitionalSuspiciousCodeWarnings',\n 'undefinedNames',\n 'undefinedVars',\n 'underscore',\n 'unknownDefines',\n 'untranspilableFeatures',\n 'unusedLocalVariables',\n 'unusedPrivateMembers',\n 'useOfGoogProvide',\n 'uselessCode',\n 'visibility',\n 'with',\n]);\n\n/**\n * @param {string} path\n * @returns {boolean}\n */\nconst tryParsePathIgnoreError = (path) => {\n try {\n tryParse(path);\n\n return true;\n } catch {\n // Keep the original error for including the whole type\n }\n\n return false;\n};\n\n// eslint-disable-next-line complexity\nexport default iterateJsdoc(({\n jsdoc,\n report,\n utils,\n context,\n settings,\n}) => {\n const {\n allowEmptyNamepaths = false,\n } = context.options[0] || {};\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n /**\n * @param {string} namepath\n * @param {string} [tagName]\n * @returns {boolean}\n */\n const validNamepathParsing = function (namepath, tagName) {\n if (tryParsePathIgnoreError(namepath)) {\n return true;\n }\n\n let handled = false;\n\n if (tagName) {\n // eslint-disable-next-line default-case\n switch (tagName) {\n case 'requires':\n case 'module': {\n if (!namepath.startsWith('module:')) {\n handled = tryParsePathIgnoreError(`module:${namepath}`);\n }\n\n break;\n }\n\n case 'memberof': case 'memberof!': {\n const endChar = namepath.slice(-1);\n if ([\n '#', '.', '~',\n ].includes(endChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(0, -1));\n }\n\n break;\n }\n\n case 'borrows': {\n const startChar = namepath.charAt(0);\n if ([\n '#', '.', '~',\n ].includes(startChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(1));\n }\n }\n }\n }\n\n if (!handled) {\n report(`Syntax error in namepath: ${namepath}`, null, tag);\n\n return false;\n }\n\n return true;\n };\n\n /**\n * @param {string} type\n * @returns {boolean}\n */\n const validTypeParsing = function (type) {\n let parsedTypes;\n try {\n if (mode === 'permissive') {\n parsedTypes = tryParse(type);\n } else {\n parsedTypes = parse(type, mode);\n }\n } catch {\n report(`Syntax error in type: ${type}`, null, tag);\n\n return false;\n }\n\n if (mode === 'closure' || mode === 'typescript') {\n traverse(parsedTypes, (node) => {\n const {\n type: typ,\n } = node;\n\n if (\n (typ === 'JsdocTypeObjectField' || typ === 'JsdocTypeKeyValue') &&\n node.right?.type === 'JsdocTypeNullable' &&\n node.right?.meta?.position === 'suffix'\n ) {\n report(`Syntax error in type: ${node.right.type}`, null, tag);\n }\n });\n }\n\n return true;\n };\n\n if (tag.problems.length) {\n const msg = tag.problems.reduce((str, {\n message,\n }) => {\n return str + '; ' + message;\n }, '').slice(2);\n report(`Invalid name: ${msg}`, null, tag);\n continue;\n }\n\n if (tag.tag === 'borrows') {\n const thisNamepath = /** @type {string} */ (\n utils.getTagDescription(tag)\n ).replace(asExpression, '')\n .trim();\n\n if (!asExpression.test(/** @type {string} */ (\n utils.getTagDescription(tag)\n )) || !thisNamepath) {\n report(`@borrows must have an \"as\" expression. Found \"${utils.getTagDescription(tag)}\"`, null, tag);\n\n continue;\n }\n\n if (validNamepathParsing(thisNamepath, 'borrows')) {\n const thatNamepath = tag.name;\n\n validNamepathParsing(thatNamepath);\n }\n\n continue;\n }\n\n if (tag.tag === 'suppress' && mode === 'closure') {\n let parsedTypes;\n\n try {\n parsedTypes = tryParse(tag.type);\n } catch {\n // Ignore\n }\n\n if (parsedTypes) {\n traverse(parsedTypes, (node) => {\n let type;\n if ('value' in node && typeof node.value === 'string') {\n type = node.value;\n }\n\n if (type !== undefined && !suppressTypes.has(type)) {\n report(`Syntax error in suppress type: ${type}`, null, tag);\n }\n });\n }\n }\n\n const otherModeMaps = /** @type {import('../jsdocUtils.js').ParserMode[]} */ ([\n 'jsdoc', 'typescript', 'closure', 'permissive',\n ]).filter(\n (mde) => {\n return mde !== mode;\n },\n ).map((mde) => {\n return utils.getTagStructureForMode(mde);\n });\n\n const tagMightHaveNamePosition = utils.tagMightHaveNamePosition(tag.tag, otherModeMaps);\n if (tagMightHaveNamePosition !== true && tag.name) {\n const modeInfo = tagMightHaveNamePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a name${modeInfo}.`, null, tag);\n\n continue;\n }\n\n const mightHaveTypePosition = utils.tagMightHaveTypePosition(tag.tag, otherModeMaps);\n if (mightHaveTypePosition !== true && tag.type) {\n const modeInfo = mightHaveTypePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a bracketed type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED NAME\n const tagMustHaveNamePosition = utils.tagMustHaveNamePosition(tag.tag, otherModeMaps);\n\n // Don't handle `@param` here though it does require name as handled by\n // `require-param-name` (`@property` would similarly seem to require one,\n // but is handled by `require-property-name`)\n if (tagMustHaveNamePosition !== false && !tag.name && !allowEmptyNamepaths && ![\n 'param', 'arg', 'argument',\n 'property', 'prop',\n ].includes(tag.tag) &&\n (tag.tag !== 'see' || !utils.getTagDescription(tag).includes('{@link'))\n ) {\n const modeInfo = tagMustHaveNamePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a name/namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE\n const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag, otherModeMaps);\n if (mustHaveTypePosition !== false && !tag.type) {\n const modeInfo = mustHaveTypePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE OR NAME/NAMEPATH\n const tagMissingRequiredTypeOrNamepath = utils.tagMissingRequiredTypeOrNamepath(tag, otherModeMaps);\n if (tagMissingRequiredTypeOrNamepath !== false && !allowEmptyNamepaths) {\n const modeInfo = tagMissingRequiredTypeOrNamepath === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have either a type or namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // VALID TYPE\n const hasTypePosition = mightHaveTypePosition === true && Boolean(tag.type);\n if (hasTypePosition) {\n validTypeParsing(tag.type);\n }\n\n // VALID NAME/NAMEPATH\n const hasNameOrNamepathPosition = (\n tagMustHaveNamePosition !== false ||\n utils.tagMightHaveNamepath(tag.tag)\n ) && Boolean(tag.name);\n\n if (hasNameOrNamepathPosition) {\n if (mode !== 'jsdoc' && tag.tag === 'template') {\n for (const namepath of utils.parseClosureTemplateTag(tag)) {\n validNamepathParsing(namepath);\n }\n } else {\n validNamepathParsing(tag.name, tag.tag);\n }\n }\n\n for (const inlineTag of tag.inlineTags) {\n if (inlineTags.has(inlineTag.tag) && !inlineTag.text && !inlineTag.namepathOrURL) {\n report(`Inline tag \"${inlineTag.tag}\" missing content`, null, tag);\n }\n }\n }\n\n for (const inlineTag of jsdoc.inlineTags) {\n if (inlineTags.has(inlineTag.tag) && !inlineTag.text && !inlineTag.namepathOrURL) {\n report(`Inline tag \"${inlineTag.tag}\" missing content`);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Requires all types to be valid JSDoc or Closure compiler types without syntax errors.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/valid-types.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowEmptyNamepaths: {\n default: false,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  * [Options](#user-content-match-description-options)
6
6
  * [`matchDescription`](#user-content-match-description-options-matchdescription)
7
7
  * [`message`](#user-content-match-description-options-message)
8
+ * [`nonemptyTags`](#user-content-match-description-options-nonemptytags)
8
9
  * [`tags`](#user-content-match-description-options-tags)
9
10
  * [`mainDescription`](#user-content-match-description-options-maindescription)
10
11
  * [`contexts`](#user-content-match-description-options-contexts)
@@ -21,8 +22,14 @@ by our supported Node versions):
21
22
 
22
23
  ``^\n?([A-Z`\\d_][\\s\\S]*[.?!`]\\s*)?$``
23
24
 
24
- Applies to the jsdoc block description and `@description` (or `@desc`)
25
- by default but the `tags` option (see below) may be used to match other tags.
25
+ Applies by default to the jsdoc block description and to the following tags:
26
+
27
+ - `@description`/`@desc`
28
+ - `@summary`
29
+ - `@file`/`@fileoverview`/`@overview`
30
+ - `@classdesc`
31
+
32
+ In addition, the `tags` option (see below) may be used to match other tags.
26
33
 
27
34
  The default (and all regex options) defaults to using (only) the `u` flag, so
28
35
  to add your own flags, encapsulate your expression as a string, but like a
@@ -71,6 +78,23 @@ You may provide a custom default message by using the following format:
71
78
  This can be overridden per tag or for the main block description by setting
72
79
  `message` within `tags` or `mainDescription`, respectively.
73
80
 
81
+ <a name="user-content-match-description-options-nonemptytags"></a>
82
+ <a name="match-description-options-nonemptytags"></a>
83
+ ### <code>nonemptyTags</code>
84
+
85
+ If not set to `false`, will enforce that the following tags have at least
86
+ some content:
87
+
88
+ - `@copyright`
89
+ - `@example`
90
+ - `@see`
91
+ - `@todo`
92
+ - `@throws`/`@exception`
93
+ - `@yields`/`@yield`
94
+
95
+ If you supply your own tag description for any of the above tags in `tags`,
96
+ your description will take precedence.
97
+
74
98
  <a name="user-content-match-description-options-tags"></a>
75
99
  <a name="match-description-options-tags"></a>
76
100
  ### <code>tags</code>
@@ -186,7 +210,7 @@ section of our README for more on the expected format.
186
210
  |Aliases|`@desc`|
187
211
  |Recommended|false|
188
212
  |Settings||
189
- |Options|`contexts`, `mainDescription`, `matchDescription`, `message`, `tags`|
213
+ |Options|`contexts`, `mainDescription`, `matchDescription`, `message`, `nonemptyTags`, `tags`|
190
214
 
191
215
  <a name="user-content-match-description-failing-examples"></a>
192
216
  <a name="match-description-failing-examples"></a>
@@ -335,7 +359,6 @@ function quux (foo) {
335
359
  function quux () {
336
360
 
337
361
  }
338
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"summary":true}}]
339
362
  // Message: JSDoc description does not satisfy the regex pattern.
340
363
 
341
364
  /**
@@ -368,7 +391,6 @@ function quux () {
368
391
  function quux (foo) {
369
392
 
370
393
  }
371
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"description":true}}]
372
394
  // Message: JSDoc description does not satisfy the regex pattern.
373
395
 
374
396
  /**
@@ -602,6 +624,13 @@ function quux () {
602
624
  function foo(): string;
603
625
  // "jsdoc/match-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[endLine=0]"}],"matchDescription":"^\\S[\\s\\S]*\\S$"}]
604
626
  // Message: JSDoc description does not satisfy the regex pattern.
627
+
628
+ /**
629
+ * @copyright
630
+ */
631
+ function quux () {
632
+ }
633
+ // Message: JSDoc description must not be empty.
605
634
  ````
606
635
 
607
636
 
@@ -722,7 +751,6 @@ function quux () {
722
751
  function quux () {
723
752
 
724
753
  }
725
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"description":true}}]
726
754
 
727
755
  /**
728
756
  * @description Foo
@@ -732,13 +760,11 @@ function quux () {
732
760
  function quux () {
733
761
 
734
762
  }
735
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"description":true}}]
736
763
 
737
764
  /** @description Foo bar. */
738
765
  function quux () {
739
766
 
740
767
  }
741
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"description":true}}]
742
768
 
743
769
  /**
744
770
  * @description Foo
@@ -747,7 +773,6 @@ function quux () {
747
773
  function quux () {
748
774
 
749
775
  }
750
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"description":true}}]
751
776
 
752
777
  /**
753
778
  * Foo. {@see Math.sin}.
@@ -872,7 +897,7 @@ const q = {
872
897
  // "jsdoc/match-description": ["error"|"warn", {"contexts":[]}]
873
898
 
874
899
  /**
875
- * @description foo.
900
+ * @deprecated foo.
876
901
  */
877
902
  function quux () {
878
903
 
@@ -887,7 +912,6 @@ function quux () {
887
912
  function quux () {
888
913
 
889
914
  }
890
- // "jsdoc/match-description": ["error"|"warn", {"tags":{"summary":true}}]
891
915
 
892
916
  /**
893
917
  * Foo.
@@ -975,5 +999,12 @@ function foo(): string;
975
999
  */
976
1000
  function foo(): void;
977
1001
  // "jsdoc/match-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[endLine!=0]:not(:has(JsdocTag))"}],"matchDescription":"^\\S[\\s\\S]*\\S$"}]
1002
+
1003
+ /**
1004
+ * @copyright
1005
+ */
1006
+ function quux () {
1007
+ }
1008
+ // "jsdoc/match-description": ["error"|"warn", {"nonemptyTags":false}]
978
1009
  ````
979
1010
 
@@ -178,6 +178,12 @@ function quux () {}
178
178
  */
179
179
  // "jsdoc/match-name": ["error"|"warn", {"match":[{"disallowName":"/^opt_/i","replacement":""}]}]
180
180
  // Message: Only allowing names not matching `/^opt_/i` but found "opt_a".
181
+
182
+ /**
183
+ * @template
184
+ */
185
+ // "jsdoc/match-name": ["error"|"warn", {"match":[{"disallowName":"/^$/","tags":["template"]}]}]
186
+ // Message: Only allowing names not matching `/^$/u` but found "".
181
187
  ````
182
188
 
183
189
 
@@ -373,5 +373,11 @@ class Test {
373
373
  abstract Test(): void;
374
374
  }
375
375
  // "jsdoc/no-restricted-syntax": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock:not(*:has(JsdocTag[tag=/returns/]))","context":"TSEmptyBodyFunctionExpression[returnType.typeAnnotation.type!=/TSVoidKeyword|TSUndefinedKeyword/]","message":"methods with non-void return types must have a @returns tag"}]}]
376
+
377
+ /**
378
+ * @private
379
+ */
380
+ function quux () {}
381
+ // "jsdoc/no-restricted-syntax": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock:not(JsdocBlock:has(JsdocTag[tag=/private|protected|public/]))","context":"any","message":"Access modifier tags must be present"}]}]
376
382
  ````
377
383
 
@@ -8,7 +8,8 @@
8
8
  * [Passing examples](#user-content-require-description-passing-examples)
9
9
 
10
10
 
11
- Requires that all functions have a description.
11
+ Requires that all functions (or optionally other structures) with a JSDoc block
12
+ have a description.
12
13
 
13
14
  * All functions must have an implicit description (e.g., text above tags) or
14
15
  have the option `descriptionStyle` set to `tag` (requiring `@description`
@@ -487,6 +487,21 @@ function quux (items) {
487
487
  }
488
488
  // Settings: {"jsdoc":{"mode":"typescript"}}
489
489
  // Message: Syntax error in type: JsdocTypeNullable
490
+
491
+ /**
492
+ * An inline {@link} tag without content.
493
+ */
494
+ // Message: Inline tag "link" missing content
495
+
496
+ /**
497
+ * An inline {@tutorial} tag without content.
498
+ */
499
+ // Message: Inline tag "tutorial" missing content
500
+
501
+ /**
502
+ * @param {SomeType} aName An inline {@link} tag without content.
503
+ */
504
+ // Message: Inline tag "link" missing content
490
505
  ````
491
506
 
492
507
 
@@ -850,5 +865,17 @@ function quux() {
850
865
  /**
851
866
  * @returns {Promise<{publicKey, privateKey}>} - The public and private key
852
867
  */
868
+
869
+ /**
870
+ * Some other {@inline} tag.
871
+ */
872
+
873
+ /**
874
+ * @param {SomeType} aName An inline {@link text} tag with content.
875
+ */
876
+
877
+ /**
878
+ * An inline {@link text} tag with content.
879
+ */
853
880
  ````
854
881
 
package/package.json CHANGED
@@ -136,5 +136,5 @@
136
136
  "test-cov": "cross-env TIMING=1 nyc --reporter text npm run test-no-cov",
137
137
  "test-index": "npm run test-no-cov -- test/rules/index.js"
138
138
  },
139
- "version": "46.2.6"
139
+ "version": "46.4.0"
140
140
  }
package/tsconfig.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "compilerOptions": {
3
3
  "lib": ["es2022"],
4
4
  "moduleResolution": "node",
5
- "module": "esnext",
5
+ "module": "NodeNext",
6
6
  "allowJs": true,
7
7
  "checkJs": true,
8
8
  "noEmit": true,