eslint-plugin-jsdoc 60.7.1 → 60.8.1

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.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","inlineTags","Set","jsdocTypePrattKeywords","asExpression","suppressTypes","tryParsePathIgnoreError","path","tryParse","_default","exports","iterateJsdoc","context","jsdoc","report","settings","utils","allowEmptyNamepaths","options","mode","tag","tags","validNamepathParsing","namepath","tagName","has","handled","endChar","slice","includes","startsWith","startChar","charAt","validTypeParsing","type","parsedTypes","parse","traverse","node","typ","right","meta","position","problems","length","msg","reduce","str","message","thisNamepath","getTagDescription","replace","trim","test","thatNamepath","name","value","undefined","otherModeMaps","filter","mde","map","getTagStructureForMode","tagMightHaveNamePosition","modeInfo","description","mightHaveTypePosition","tagMightHaveTypePosition","tagMustHaveNamePosition","mustHaveTypePosition","tagMustHaveTypePosition","tagMissingRequiredTypeOrNamepath","hasTypePosition","Boolean","hasNameOrNamepathPosition","tagMightHaveNamepath","parseClosureTemplateTag","inlineTag","text","namepathOrURL","iterateAllJsdocs","docs","url","schema","additionalProperties","properties","module"],"sources":["../../src/rules/validTypes.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\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 jsdocTypePrattKeywords = new Set([\n 'extends',\n 'import',\n 'is',\n 'readonly',\n 'typeof',\n]);\n\nconst asExpression = /as\\s+/v;\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 'checkEs5InheritanceCorrectnessConditions',\n 'checkPrototypalTypes',\n 'checkRegExp',\n 'checkTypes',\n 'checkVars',\n 'closureClassChecks',\n 'closureDepMethodUsageChecks',\n 'const',\n 'constantProperty',\n 'dangerousUnrecognizedTypeError',\n 'deprecated',\n 'duplicate',\n 'es5Strict',\n 'externsValidation',\n 'extraProvide',\n 'extraRequire',\n 'globalThis',\n 'invalidCasts',\n 'lateProvide',\n 'legacyGoogScopeRequire',\n 'lintChecks',\n 'lintVarDeclarations',\n 'messageConventions',\n 'misplacedTypeAnnotation',\n 'missingOverride',\n 'missingPolyfill',\n 'missingProperties',\n 'missingProvide',\n 'missingRequire',\n 'missingReturn',\n 'missingSourcesWarnings',\n 'moduleLoad',\n 'msgDescriptions',\n 'nonStandardJsDocs',\n 'partialAlias',\n 'polymer',\n 'reportUnknownTypes',\n 'strictCheckTypes',\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\n // Not documented?\n 'unusedPrivateMembers',\n 'uselessCode',\n 'useOfGoogProvide',\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 context,\n jsdoc,\n report,\n settings,\n utils,\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 (\n tryParsePathIgnoreError(namepath) ||\n jsdocTypePrattKeywords.has(namepath)\n ) {\n return true;\n }\n\n let handled = false;\n\n if (tagName) {\n switch (tagName) {\n case 'memberof':\n 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 'module': case 'requires': {\n if (!namepath.startsWith('module:')) {\n handled = tryParsePathIgnoreError(`module:${namepath}`);\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 === 'import') {\n // A named import will look like a type, but not be valid; we also don't\n // need to check the name/namepath\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 // Documentation like `@returns {@link SomeType}` is technically ambiguous. Specifically it\n // could either be intepreted as a type `\"@link SomeType\"` or a description `\"{@link SomeType}\"`.\n // However this is a good heuristic.\n if (tag.type.trim().startsWith('@')) {\n tag.description = `{${tag.type}} ${tag.description}`;\n tag.type = '';\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 'arg', 'argument', 'param',\n 'prop', 'property',\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 // Auto-added to settings and has own rule already, so don't duplicate\n tag.tag !== 'next'\n ) {\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 if (!tryParsePathIgnoreError(\n // May be an issue with the commas of\n // `utils.parseClosureTemplateTag`, so first try a raw\n // value; we really need a proper parser instead, however.\n tag.name.trim().replace(/^\\[?(?<name>.*?)=.*$/v, '$<name>'),\n )) {\n for (const namepath of utils.parseClosureTemplateTag(tag)) {\n validNamepathParsing(namepath);\n }\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/namepaths to be valid JSDoc, Closure compiler, or TypeScript types (configurable in settings).',\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 description: `Set to \\`false\\` to bulk disallow\nempty name paths with namepath groups 2 and 4 (these might often be\nexpected to have an accompanying name path, though they have some\nindicative value without one; these may also allow names to be defined\nin another manner elsewhere in the block); you can use\n\\`settings.jsdoc.structuredTags\\` with the \\`required\\` key set to \"name\" if you\nwish to require name paths on a tag-by-tag basis. Defaults to \\`true\\`.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"validTypes.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","inlineTags","Set","asExpression","suppressTypes","tryParsePathIgnoreError","path","mode","parseNamePath","includeSpecial","tryParseNameIgnoreError","name","parseName","_default","exports","iterateJsdoc","context","jsdoc","report","settings","utils","allowEmptyNamepaths","options","tag","tags","validNamepathParsing","namepath","tagName","handled","endChar","slice","includes","startsWith","startChar","charAt","validTypeParsing","type","parsedTypes","tryParse","parse","traverse","node","typ","right","meta","position","problems","length","msg","reduce","str","message","thisNamepath","getTagDescription","replace","trim","test","thatNamepath","value","undefined","has","otherModeMaps","filter","mde","map","getTagStructureForMode","tagMightHaveNamePosition","modeInfo","description","mightHaveTypePosition","tagMightHaveTypePosition","tagMustHaveNamePosition","mustHaveTypePosition","tagMustHaveTypePosition","tagMissingRequiredTypeOrNamepath","hasTypePosition","Boolean","hasNamepathPosition","tagMightHaveNamepath","parseClosureTemplateTag","hasNamePosition","tagMightHaveName","inlineTag","text","namepathOrURL","iterateAllJsdocs","docs","url","schema","additionalProperties","properties","module"],"sources":["../../src/rules/validTypes.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse,\n parseName,\n parseNamePath,\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+/v;\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 'checkEs5InheritanceCorrectnessConditions',\n 'checkPrototypalTypes',\n 'checkRegExp',\n 'checkTypes',\n 'checkVars',\n 'closureClassChecks',\n 'closureDepMethodUsageChecks',\n 'const',\n 'constantProperty',\n 'dangerousUnrecognizedTypeError',\n 'deprecated',\n 'duplicate',\n 'es5Strict',\n 'externsValidation',\n 'extraProvide',\n 'extraRequire',\n 'globalThis',\n 'invalidCasts',\n 'lateProvide',\n 'legacyGoogScopeRequire',\n 'lintChecks',\n 'lintVarDeclarations',\n 'messageConventions',\n 'misplacedTypeAnnotation',\n 'missingOverride',\n 'missingPolyfill',\n 'missingProperties',\n 'missingProvide',\n 'missingRequire',\n 'missingReturn',\n 'missingSourcesWarnings',\n 'moduleLoad',\n 'msgDescriptions',\n 'nonStandardJsDocs',\n 'partialAlias',\n 'polymer',\n 'reportUnknownTypes',\n 'strictCheckTypes',\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\n // Not documented?\n 'unusedPrivateMembers',\n 'uselessCode',\n 'useOfGoogProvide',\n 'visibility',\n 'with',\n]);\n\n/**\n * @param {string} path\n * @param {import('jsdoc-type-pratt-parser').ParseMode|\"permissive\"} mode\n * @returns {boolean}\n */\nconst tryParsePathIgnoreError = (path, mode) => {\n try {\n parseNamePath(path, mode === 'permissive' ? 'jsdoc' : mode, {\n includeSpecial: true,\n });\n\n return true;\n } catch {\n // Keep the original error for including the whole type\n }\n\n return false;\n};\n\n/**\n * @param {string} name\n * @param {import('jsdoc-type-pratt-parser').ParseMode|\"permissive\"} mode\n * @returns {boolean}\n */\nconst tryParseNameIgnoreError = (name, mode) => {\n try {\n parseName(name, mode === 'permissive' ? 'jsdoc' : mode);\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 context,\n jsdoc,\n report,\n settings,\n utils,\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 (\n tryParsePathIgnoreError(namepath, mode)\n ) {\n return true;\n }\n\n let handled = false;\n\n if (tagName) {\n switch (tagName) {\n case 'memberof':\n case 'memberof!': {\n const endChar = namepath.slice(-1);\n if ([\n '#', '.', '~',\n ].includes(endChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(0, -1), mode);\n }\n\n break;\n }\n\n case 'module': case 'requires': {\n if (!namepath.startsWith('module:')) {\n handled = tryParsePathIgnoreError(`module:${namepath}`, mode);\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), mode);\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 === 'import') {\n // A named import will look like a type, but not be valid; we also don't\n // need to check the name/namepath\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 // Documentation like `@returns {@link SomeType}` is technically ambiguous. Specifically it\n // could either be intepreted as a type `\"@link SomeType\"` or a description `\"{@link SomeType}\"`.\n // However this is a good heuristic.\n if (tag.type.trim().startsWith('@')) {\n tag.description = `{${tag.type}} ${tag.description}`;\n tag.type = '';\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 'arg', 'argument', 'param',\n 'prop', 'property',\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 // Auto-added to settings and has own rule already, so don't duplicate\n tag.tag !== 'next'\n ) {\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 hasNamepathPosition = (\n tagMustHaveNamePosition !== false ||\n utils.tagMightHaveNamepath(tag.tag)\n ) && Boolean(tag.name);\n\n if (hasNamepathPosition) {\n if (mode !== 'jsdoc' && tag.tag === 'template') {\n if (!tryParsePathIgnoreError(\n // May be an issue with the commas of\n // `utils.parseClosureTemplateTag`, so first try a raw\n // value; we really need a proper parser instead, however.\n tag.name.trim().replace(/^\\[?(?<name>.*?)=.*$/v, '$<name>'),\n mode,\n )) {\n for (const namepath of utils.parseClosureTemplateTag(tag)) {\n validNamepathParsing(namepath);\n }\n }\n } else {\n validNamepathParsing(tag.name, tag.tag);\n }\n }\n\n const hasNamePosition = utils.tagMightHaveName(tag.tag) &&\n Boolean(tag.name);\n if (hasNamePosition && !tryParseNameIgnoreError(tag.name, mode)) {\n report(`Syntax error in name: ${tag.name}`, null, tag);\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/namepaths to be valid JSDoc, Closure compiler, or TypeScript types (configurable in settings).',\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 description: `Set to \\`false\\` to bulk disallow\nempty name paths with namepath groups 2 and 4 (these might often be\nexpected to have an accompanying name path, though they have some\nindicative value without one; these may also allow names to be defined\nin another manner elsewhere in the block); you can use\n\\`settings.jsdoc.structuredTags\\` with the \\`required\\` key set to \"name\" if you\nwish to require name paths on a tag-by-tag basis. Defaults to \\`true\\`.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "~0.65.2",
8
+ "@es-joy/jsdoccomment": "~0.68.1",
9
9
  "are-docs-informative": "^0.0.2",
10
10
  "comment-parser": "1.4.1",
11
11
  "debug": "^4.4.3",
@@ -27,7 +27,7 @@
27
27
  "@babel/plugin-syntax-class-properties": "^7.12.13",
28
28
  "@babel/plugin-transform-flow-strip-types": "^7.27.1",
29
29
  "@babel/preset-env": "^7.28.3",
30
- "@es-joy/escodegen": "^4.0.3",
30
+ "@es-joy/escodegen": "^4.2.0",
31
31
  "@es-joy/jsdoc-eslint-parser": "^0.24.0",
32
32
  "@eslint/core": "^0.16.0",
33
33
  "@hkdobrev/run-if-changed": "^0.6.3",
@@ -41,7 +41,7 @@
41
41
  "@types/estree": "^1.0.8",
42
42
  "@types/json-schema": "^7.0.15",
43
43
  "@types/mocha": "^10.0.10",
44
- "@types/node": "^24.6.1",
44
+ "@types/node": "^24.6.2",
45
45
  "@types/semver": "^7.7.1",
46
46
  "@types/spdx-expression-parse": "^3.0.5",
47
47
  "@typescript-eslint/types": "^8.45.0",
@@ -52,17 +52,17 @@
52
52
  "camelcase": "^8.0.0",
53
53
  "chai": "^6.2.0",
54
54
  "decamelize": "^6.0.1",
55
- "eslint": "9.36.0",
56
- "eslint-config-canonical": "^45.0.0",
55
+ "eslint": "9.37.0",
56
+ "eslint-config-canonical": "^45.0.1",
57
57
  "gitdown": "^4.1.1",
58
58
  "glob": "^11.0.3",
59
59
  "globals": "^16.4.0",
60
60
  "husky": "^9.1.7",
61
- "jsdoc-type-pratt-parser": "^6.1.2",
61
+ "jsdoc-type-pratt-parser": "^6.3.3",
62
62
  "json-schema": "^0.4.0",
63
63
  "json-schema-to-typescript": "^15.0.4",
64
64
  "lint-staged": "^16.2.3",
65
- "mocha": "^11.7.3",
65
+ "mocha": "^11.7.4",
66
66
  "open-editor": "^5.1.0",
67
67
  "replace": "^1.2.2",
68
68
  "rimraf": "^6.0.1",
@@ -178,5 +178,5 @@
178
178
  "test-cov": "TIMING=1 c8 --reporter text pnpm run test-no-cov",
179
179
  "test-index": "pnpm run test-no-cov test/rules/index.js"
180
180
  },
181
- "version": "60.7.1"
181
+ "version": "60.8.1"
182
182
  }
@@ -18,7 +18,7 @@ const getDefaultTagStructureForMode = (mode) => {
18
18
  const isJsdocTypescriptOrPermissive = isJsdocOrTypescript || isPermissive;
19
19
 
20
20
  // Properties:
21
- // `namepathRole` - 'namepath-referencing'|'namepath-defining'|'namepath-or-url-referencing'|'text'|false
21
+ // `namepathRole` - 'namepath-referencing'|'name-defining'|'namepath-defining'|'namepath-or-url-referencing'|'text'|false
22
22
  // `typeAllowed` - boolean
23
23
  // `nameRequired` - boolean
24
24
  // `typeRequired` - boolean
@@ -35,11 +35,7 @@ const getDefaultTagStructureForMode = (mode) => {
35
35
 
36
36
  // Among `namepath-defining` and `namepath-referencing`, these do not seem
37
37
  // to allow curly brackets in their doc signature or examples (`modifies`
38
- // references namepaths within its type brackets and `param` is
39
- // name-defining but not namepath-defining, so not part of these groups)
40
-
41
- // Todo: Should support special processing for "name" as distinct from
42
- // "namepath" (e.g., param can't define a namepath)
38
+ // references namepaths within its type brackets)
43
39
 
44
40
  // Todo: Should support a `tutorialID` type (for `@tutorial` block and
45
41
  // inline)
@@ -249,6 +245,9 @@ const getDefaultTagStructureForMode = (mode) => {
249
245
 
250
246
  [
251
247
  'enum', new Map(/** @type {[string, string|boolean][]} */ ([
248
+ [
249
+ 'namepathRole', 'name-defining',
250
+ ],
252
251
  // Has example showing curly brackets but not in doc signature
253
252
  [
254
253
  'typeAllowed', true,
@@ -614,7 +613,7 @@ const getDefaultTagStructureForMode = (mode) => {
614
613
  'module', new Map(/** @type {[string, string|boolean][]} */ ([
615
614
  // Optional "name" and no curly brackets
616
615
  // this block impacts `no-undefined-types` and `valid-types` (search for
617
- // "isNamepathDefiningTag|tagMightHaveNamepath|tagMightHaveEitherTypeOrNamePosition")
616
+ // "isNameOrNamepathDefiningTag|tagMightHaveNameOrNamepath|tagMightHaveEitherTypeOrNamePosition")
618
617
  [
619
618
  'namepathRole', isJsdoc ? 'namepath-defining' : 'text',
620
619
  ],
@@ -907,7 +906,7 @@ const getDefaultTagStructureForMode = (mode) => {
907
906
  // Seems to require a "namepath" in the signature (with no
908
907
  // counter-examples)
909
908
  [
910
- 'namepathRole', 'namepath-defining',
909
+ 'namepathRole', 'name-defining',
911
910
  ],
912
911
 
913
912
  // TypeScript may allow it to be dropped if followed by @property or @member;
@@ -92,10 +92,11 @@ import esquery from 'esquery';
92
92
  * parseClosureTemplateTag: ParseClosureTemplateTag,
93
93
  * getPreferredTagNameObject: GetPreferredTagNameObject,
94
94
  * pathDoesNotBeginWith: import('./jsdocUtils.js').PathDoesNotBeginWith
95
- * isNamepathDefiningTag: IsNamepathX,
95
+ * isNameOrNamepathDefiningTag: IsNamepathX,
96
96
  * isNamepathReferencingTag: IsNamepathX,
97
97
  * isNamepathOrUrlReferencingTag: IsNamepathX,
98
- * tagMightHaveNamepath: IsNamepathX,
98
+ * tagMightHaveNameOrNamepath: IsNamepathX,
99
+ * tagMightHaveName: IsNamepathX
99
100
  * }} BasicUtils
100
101
  */
101
102
 
@@ -526,9 +527,11 @@ import esquery from 'esquery';
526
527
  * tagMustHaveNamePosition: TagMustHave,
527
528
  * tagMustHaveTypePosition: TagMustHave,
528
529
  * tagMissingRequiredTypeOrNamepath: TagMissingRequiredTypeOrNamepath,
529
- * isNamepathDefiningTag: IsNamepathX,
530
+ * isNameOrNamepathDefiningTag: IsNamepathX,
530
531
  * isNamepathReferencingTag: IsNamepathX,
531
532
  * isNamepathOrUrlReferencingTag: IsNamepathX,
533
+ * tagMightHaveNameOrNamepath: IsNamepathX,
534
+ * tagMightHaveName: IsNamepathX,
532
535
  * tagMightHaveNamepath: IsNamepathX,
533
536
  * getTagStructureForMode: GetTagStructureForMode,
534
537
  * mayBeUndefinedTypeTag: MayBeUndefinedTypeTag,
@@ -614,18 +617,20 @@ const getBasicUtils = (context, {
614
617
  const utils = {};
615
618
 
616
619
  for (const method of [
617
- 'isNamepathDefiningTag',
620
+ 'isNameOrNamepathDefiningTag',
618
621
  'isNamepathReferencingTag',
619
622
  'isNamepathOrUrlReferencingTag',
623
+ 'tagMightHaveNameOrNamepath',
624
+ 'tagMightHaveName',
620
625
  'tagMightHaveNamepath',
621
626
  ]) {
622
627
  /** @type {IsNamepathX} */
623
628
  utils[
624
- /** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */ (
629
+ /** @type {"isNameOrNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNameOrNamepath"|"tagMightHaveName"} */ (
625
630
  method
626
631
  )] = (tagName) => {
627
632
  return jsdocUtils[
628
- /** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */
633
+ /** @type {"isNameOrNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNameOrNamepath"|"tagMightHaveName"} */
629
634
  (method)
630
635
  ](tagName);
631
636
  };
@@ -1769,7 +1774,7 @@ const getUtils = (
1769
1774
  /**
1770
1775
  * @typedef {{
1771
1776
  * [key: string]: {
1772
- * name?: "text"|"namepath-defining"|"namepath-referencing"|false,
1777
+ * name?: "text"|"name-defining"|"namepath-defining"|"namepath-referencing"|false,
1773
1778
  * type?: boolean|string[],
1774
1779
  * required?: ("name"|"type"|"typeOrNameRequired")[]
1775
1780
  * }
package/src/jsdocUtils.js CHANGED
@@ -1055,10 +1055,14 @@ const getTagStructureForMode = (mode, structuredTags) => {
1055
1055
  * @param {import('./getDefaultTagStructureForMode.js').TagStructure} tagMap
1056
1056
  * @returns {boolean}
1057
1057
  */
1058
- const isNamepathDefiningTag = (tag, tagMap = tagStructure) => {
1058
+ const isNameOrNamepathDefiningTag = (tag, tagMap = tagStructure) => {
1059
1059
  const tagStruct = ensureMap(tagMap, tag);
1060
1060
 
1061
- return tagStruct.get('namepathRole') === 'namepath-defining';
1061
+ return /** @type {(string|boolean|undefined)[]} */ ([
1062
+ 'name-defining',
1063
+ 'namepath-defining',
1064
+ ]).includes(/** @type {string|boolean|undefined} */ (
1065
+ tagStruct.get('namepathRole')));
1062
1066
  };
1063
1067
 
1064
1068
  /**
@@ -1110,7 +1114,8 @@ const tagMightHaveTypePosition = (tag, tagMap = tagStructure) => {
1110
1114
  };
1111
1115
 
1112
1116
  const namepathTypes = new Set([
1113
- 'namepath-defining', 'namepath-referencing',
1117
+ 'name-defining', 'namepath-defining',
1118
+ 'namepath-referencing',
1114
1119
  ]);
1115
1120
 
1116
1121
  /**
@@ -1131,7 +1136,7 @@ const tagMightHaveNamePosition = (tag, tagMap = tagStructure) => {
1131
1136
  * @param {import('./getDefaultTagStructureForMode.js').TagStructure} tagMap
1132
1137
  * @returns {boolean}
1133
1138
  */
1134
- const tagMightHaveNamepath = (tag, tagMap = tagStructure) => {
1139
+ const tagMightHaveNameOrNamepath = (tag, tagMap = tagStructure) => {
1135
1140
  const tagStruct = ensureMap(tagMap, tag);
1136
1141
 
1137
1142
  const nampathRole = tagStruct.get('namepathRole');
@@ -1140,6 +1145,37 @@ const tagMightHaveNamepath = (tag, tagMap = tagStructure) => {
1140
1145
  namepathTypes.has(/** @type {string} */ (nampathRole));
1141
1146
  };
1142
1147
 
1148
+ /**
1149
+ * @param {string} tag
1150
+ * @param {import('./getDefaultTagStructureForMode.js').TagStructure} tagMap
1151
+ * @returns {boolean}
1152
+ */
1153
+ const tagMightHaveNamepath = (tag, tagMap = tagStructure) => {
1154
+ const tagStruct = ensureMap(tagMap, tag);
1155
+
1156
+ const nampathRole = tagStruct.get('namepathRole');
1157
+
1158
+ return nampathRole !== false &&
1159
+ [
1160
+ 'namepath-defining',
1161
+ 'namepath-referencing',
1162
+ ].includes(/** @type {string} */ (nampathRole));
1163
+ };
1164
+
1165
+ /**
1166
+ * @param {string} tag
1167
+ * @param {import('./getDefaultTagStructureForMode.js').TagStructure} tagMap
1168
+ * @returns {boolean}
1169
+ */
1170
+ const tagMightHaveName = (tag, tagMap = tagStructure) => {
1171
+ const tagStruct = ensureMap(tagMap, tag);
1172
+
1173
+ const nampathRole = tagStruct.get('namepathRole');
1174
+
1175
+ return nampathRole !== false &&
1176
+ nampathRole === 'name-defining';
1177
+ };
1178
+
1143
1179
  /**
1144
1180
  * @param {string} tag
1145
1181
  * @param {import('./getDefaultTagStructureForMode.js').TagStructure} tagMap
@@ -1157,7 +1193,7 @@ const tagMustHaveNamePosition = (tag, tagMap = tagStructure) => {
1157
1193
  * @returns {boolean}
1158
1194
  */
1159
1195
  const tagMightHaveEitherTypeOrNamePosition = (tag, tagMap) => {
1160
- return Boolean(tagMightHaveTypePosition(tag, tagMap)) || tagMightHaveNamepath(tag, tagMap);
1196
+ return Boolean(tagMightHaveTypePosition(tag, tagMap)) || tagMightHaveNameOrNamepath(tag, tagMap);
1161
1197
  };
1162
1198
 
1163
1199
  /**
@@ -1182,7 +1218,7 @@ const tagMissingRequiredTypeOrNamepath = (tag, tagMap = tagStructure) => {
1182
1218
  const hasTypePosition = mightHaveTypePosition && Boolean(tag.type);
1183
1219
  const hasNameOrNamepathPosition = (
1184
1220
  tagMustHaveNamePosition(tag.tag, tagMap) ||
1185
- tagMightHaveNamepath(tag.tag, tagMap)
1221
+ tagMightHaveNameOrNamepath(tag.tag, tagMap)
1186
1222
  ) && Boolean(tag.name);
1187
1223
  const mustHaveEither = tagMustHaveEitherTypeOrNamePosition(tag.tag, tagMap);
1188
1224
  const hasEither = tagMightHaveEitherTypeOrNamePosition(tag.tag, tagMap) &&
@@ -1890,7 +1926,7 @@ export {
1890
1926
  hasYieldValue,
1891
1927
  isConstructor,
1892
1928
  isGetter,
1893
- isNamepathDefiningTag,
1929
+ isNameOrNamepathDefiningTag,
1894
1930
  isNamepathOrUrlReferencingTag,
1895
1931
  isNamepathReferencingTag,
1896
1932
  isSetter,
@@ -1902,6 +1938,8 @@ export {
1902
1938
  setTagStructure,
1903
1939
  strictNativeTypes,
1904
1940
  tagMightHaveEitherTypeOrNamePosition,
1941
+ tagMightHaveName,
1942
+ tagMightHaveNameOrNamepath,
1905
1943
  tagMightHaveNamepath,
1906
1944
  tagMightHaveNamePosition,
1907
1945
  tagMightHaveTypePosition,
@@ -49,7 +49,7 @@ const checkNotAlignedPerTag = (utils, tag, customSpacings) => {
49
49
  let spacerProps;
50
50
  /** @type {ContentProp[]} */
51
51
  let contentProps;
52
- const mightHaveNamepath = utils.tagMightHaveNamepath(tag.tag);
52
+ const mightHaveNamepath = utils.tagMightHaveNameOrNamepath(tag.tag);
53
53
  if (mightHaveNamepath) {
54
54
  spacerProps = [
55
55
  'postDelimiter', 'postTag', 'postType', 'postName',
@@ -139,7 +139,7 @@ export default iterateJsdoc(({
139
139
  return doc.tags.filter(({
140
140
  tag,
141
141
  }) => {
142
- return utils.isNamepathDefiningTag(tag) && ![
142
+ return utils.isNameOrNamepathDefiningTag(tag) && ![
143
143
  'arg',
144
144
  'argument',
145
145
  'param',
@@ -569,7 +569,7 @@ export default iterateJsdoc(({
569
569
  const tags = doc.tags.filter(({
570
570
  tag,
571
571
  }) => {
572
- return utils.isNamepathDefiningTag(tag);
572
+ return utils.isNameOrNamepathDefiningTag(tag);
573
573
  });
574
574
  if (!tags.length) {
575
575
  return [];
@@ -48,7 +48,7 @@ export default iterateJsdoc(({
48
48
  return doc.tags.filter(({
49
49
  tag,
50
50
  }) => {
51
- return utils.isNamepathDefiningTag(tag);
51
+ return utils.isNameOrNamepathDefiningTag(tag);
52
52
  });
53
53
  });
54
54
 
@@ -437,7 +437,7 @@ export default iterateJsdoc(({
437
437
  for (const tag of jsdoc.tags) {
438
438
  const mightHaveTypePosition = utils.tagMightHaveTypePosition(tag.tag);
439
439
  const hasTypePosition = mightHaveTypePosition === true && Boolean(tag.type);
440
- if (hasTypePosition && (!exemptTypedefs || !utils.isNamepathDefiningTag(tag.tag))) {
440
+ if (hasTypePosition && (!exemptTypedefs || !utils.isNameOrNamepathDefiningTag(tag.tag))) {
441
441
  iterateInlineImports(tag);
442
442
  }
443
443
  }
@@ -1,6 +1,8 @@
1
1
  import iterateJsdoc from '../iterateJsdoc.js';
2
2
  import {
3
3
  parse,
4
+ parseName,
5
+ parseNamePath,
4
6
  traverse,
5
7
  tryParse,
6
8
  } from '@es-joy/jsdoccomment';
@@ -10,14 +12,6 @@ const inlineTags = new Set([
10
12
  'tutorial',
11
13
  ]);
12
14
 
13
- const jsdocTypePrattKeywords = new Set([
14
- 'extends',
15
- 'import',
16
- 'is',
17
- 'readonly',
18
- 'typeof',
19
- ]);
20
-
21
15
  const asExpression = /as\s+/v;
22
16
 
23
17
  const suppressTypes = new Set([
@@ -88,11 +82,31 @@ const suppressTypes = new Set([
88
82
 
89
83
  /**
90
84
  * @param {string} path
85
+ * @param {import('jsdoc-type-pratt-parser').ParseMode|"permissive"} mode
86
+ * @returns {boolean}
87
+ */
88
+ const tryParsePathIgnoreError = (path, mode) => {
89
+ try {
90
+ parseNamePath(path, mode === 'permissive' ? 'jsdoc' : mode, {
91
+ includeSpecial: true,
92
+ });
93
+
94
+ return true;
95
+ } catch {
96
+ // Keep the original error for including the whole type
97
+ }
98
+
99
+ return false;
100
+ };
101
+
102
+ /**
103
+ * @param {string} name
104
+ * @param {import('jsdoc-type-pratt-parser').ParseMode|"permissive"} mode
91
105
  * @returns {boolean}
92
106
  */
93
- const tryParsePathIgnoreError = (path) => {
107
+ const tryParseNameIgnoreError = (name, mode) => {
94
108
  try {
95
- tryParse(path);
109
+ parseName(name, mode === 'permissive' ? 'jsdoc' : mode);
96
110
 
97
111
  return true;
98
112
  } catch {
@@ -125,8 +139,7 @@ export default iterateJsdoc(({
125
139
  */
126
140
  const validNamepathParsing = function (namepath, tagName) {
127
141
  if (
128
- tryParsePathIgnoreError(namepath) ||
129
- jsdocTypePrattKeywords.has(namepath)
142
+ tryParsePathIgnoreError(namepath, mode)
130
143
  ) {
131
144
  return true;
132
145
  }
@@ -141,7 +154,7 @@ export default iterateJsdoc(({
141
154
  if ([
142
155
  '#', '.', '~',
143
156
  ].includes(endChar)) {
144
- handled = tryParsePathIgnoreError(namepath.slice(0, -1));
157
+ handled = tryParsePathIgnoreError(namepath.slice(0, -1), mode);
145
158
  }
146
159
 
147
160
  break;
@@ -149,7 +162,7 @@ export default iterateJsdoc(({
149
162
 
150
163
  case 'module': case 'requires': {
151
164
  if (!namepath.startsWith('module:')) {
152
- handled = tryParsePathIgnoreError(`module:${namepath}`);
165
+ handled = tryParsePathIgnoreError(`module:${namepath}`, mode);
153
166
  }
154
167
 
155
168
  break;
@@ -160,7 +173,7 @@ export default iterateJsdoc(({
160
173
  if ([
161
174
  '#', '.', '~',
162
175
  ].includes(startChar)) {
163
- handled = tryParsePathIgnoreError(namepath.slice(1));
176
+ handled = tryParsePathIgnoreError(namepath.slice(1), mode);
164
177
  }
165
178
  }
166
179
  }
@@ -354,18 +367,19 @@ export default iterateJsdoc(({
354
367
  }
355
368
 
356
369
  // VALID NAME/NAMEPATH
357
- const hasNameOrNamepathPosition = (
370
+ const hasNamepathPosition = (
358
371
  tagMustHaveNamePosition !== false ||
359
372
  utils.tagMightHaveNamepath(tag.tag)
360
373
  ) && Boolean(tag.name);
361
374
 
362
- if (hasNameOrNamepathPosition) {
375
+ if (hasNamepathPosition) {
363
376
  if (mode !== 'jsdoc' && tag.tag === 'template') {
364
377
  if (!tryParsePathIgnoreError(
365
378
  // May be an issue with the commas of
366
379
  // `utils.parseClosureTemplateTag`, so first try a raw
367
380
  // value; we really need a proper parser instead, however.
368
381
  tag.name.trim().replace(/^\[?(?<name>.*?)=.*$/v, '$<name>'),
382
+ mode,
369
383
  )) {
370
384
  for (const namepath of utils.parseClosureTemplateTag(tag)) {
371
385
  validNamepathParsing(namepath);
@@ -376,6 +390,12 @@ export default iterateJsdoc(({
376
390
  }
377
391
  }
378
392
 
393
+ const hasNamePosition = utils.tagMightHaveName(tag.tag) &&
394
+ Boolean(tag.name);
395
+ if (hasNamePosition && !tryParseNameIgnoreError(tag.name, mode)) {
396
+ report(`Syntax error in name: ${tag.name}`, null, tag);
397
+ }
398
+
379
399
  for (const inlineTag of tag.inlineTags) {
380
400
  if (inlineTags.has(inlineTag.tag) && !inlineTag.text && !inlineTag.namepathOrURL) {
381
401
  report(`Inline tag "${inlineTag.tag}" missing content`, null, tag);