eslint-plugin-jsdoc
Version:
JSDoc linting rules for ESLint.
1 lines • 16.4 kB
Source Map (JSON)
{"version":3,"file":"checkTagNames.cjs","names":["iterateJsdoc","escapeStringRegexp"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport escapeStringRegexp from 'escape-string-regexp';\n\n// https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/\nconst jsxTagNames = new Set([\n 'jsx',\n 'jsxFrag',\n 'jsxImportSource',\n 'jsxRuntime',\n]);\n\nconst typedTagsAlwaysUnnecessary = new Set([\n 'augments',\n 'callback',\n 'class',\n 'enum',\n 'implements',\n 'private',\n 'property',\n 'protected',\n 'public',\n 'readonly',\n 'this',\n 'type',\n 'typedef',\n]);\n\nconst typedTagsNeedingName = new Set([\n 'template',\n]);\n\nconst typedTagsUnnecessaryOutsideDeclare = new Set([\n 'abstract',\n 'access',\n 'class',\n 'constant',\n 'constructs',\n 'default',\n 'enum',\n 'export',\n 'exports',\n 'function',\n 'global',\n 'inherits',\n 'instance',\n 'interface',\n 'member',\n 'memberof',\n 'memberOf',\n 'method',\n 'mixes',\n 'mixin',\n 'module',\n 'name',\n 'namespace',\n 'override',\n 'property',\n 'requires',\n 'static',\n 'this',\n]);\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n jsdocNode,\n node,\n report,\n settings,\n sourceCode,\n utils,\n}) => {\n const\n /**\n * @type {{\n * definedTags: string[],\n * enableFixer: boolean,\n * inlineTags: string[],\n * jsxTags: boolean,\n * typed: boolean\n }} */ {\n definedTags = [],\n enableFixer = true,\n inlineTags = [\n // jsdoc\n 'link', 'linkcode', 'linkplain', 'tutorial',\n // https://tsdoc.org/pages/spec/tag_kinds/#inline-tags\n 'inheritDoc',\n 'label',\n // https://typedoc.org/documents/Tags.html#inline-tags\n 'include', 'includeCode',\n ],\n jsxTags,\n typed,\n } = context.options[0] || {};\n\n /** @type {(string|undefined)[]} */\n let definedPreferredTags = [];\n const {\n structuredTags,\n tagNamePreference,\n } = settings;\n const definedStructuredTags = Object.keys(structuredTags);\n const definedNonPreferredTags = Object.keys(tagNamePreference);\n if (definedNonPreferredTags.length) {\n definedPreferredTags = Object.values(tagNamePreference).map((preferredTag) => {\n if (typeof preferredTag === 'string') {\n // May become an empty string but will be filtered out below\n return preferredTag;\n }\n\n if (!preferredTag) {\n return undefined;\n }\n\n if (typeof preferredTag !== 'object') {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.',\n );\n }\n\n return preferredTag.replacement;\n })\n .filter(Boolean);\n }\n\n /**\n * @param {import('eslint').Rule.Node} subNode\n * @returns {boolean}\n */\n const isInAmbientContext = (subNode) => {\n return subNode.type === 'Program' ?\n /* c8 ignore next 2 -- Support old ESLint */\n // @ts-expect-error ESLint < 10\n (context.filename ?? context.getFilename()).endsWith('.d.ts') :\n Boolean(\n /** @type {import('@typescript-eslint/types').TSESTree.VariableDeclaration} */ (\n subNode\n ).declare,\n ) || isInAmbientContext(subNode.parent);\n };\n\n /**\n * @param {import('comment-parser').Spec} jsdocTag\n * @returns {boolean}\n */\n const tagIsRedundantWhenTyped = (jsdocTag) => {\n if (!typedTagsUnnecessaryOutsideDeclare.has(jsdocTag.tag)) {\n return false;\n }\n\n if (jsdocTag.tag === 'default') {\n return false;\n }\n\n if (node === null) {\n return false;\n }\n\n /* c8 ignore next 2 -- Support old ESLint */\n // @ts-expect-error ESLint < 10\n if ((context.filename ?? context.getFilename()).endsWith('.d.ts') && [\n null, 'Program', undefined,\n ].includes(node?.parent?.type)) {\n return false;\n }\n\n if (isInAmbientContext(/** @type {import('eslint').Rule.Node} */ (node))) {\n return false;\n }\n\n return true;\n };\n\n /**\n * @param {string} message\n * @param {import('comment-parser').Spec} jsdocTag\n * @param {import('../iterateJsdoc.js').Integer} tagIndex\n * @param {Partial<import('comment-parser').Tokens>} [additionalTagChanges]\n * @returns {void}\n */\n const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {\n utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {\n if (jsdocTag.description.trim()) {\n utils.changeTag(jsdocTag, {\n postType: '',\n type: '',\n ...additionalTagChanges,\n });\n } else {\n utils.removeTag(tagIndex, {\n removeEmptyBlock: true,\n });\n }\n } : null, true);\n };\n\n /**\n * @param {import('comment-parser').Spec} jsdocTag\n * @param {import('../iterateJsdoc.js').Integer} tagIndex\n * @returns {boolean}\n */\n const checkTagForTypedValidity = (jsdocTag, tagIndex) => {\n if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' is redundant when using a type system.`,\n jsdocTag,\n tagIndex,\n {\n postTag: '',\n tag: '',\n },\n );\n return true;\n }\n\n if (tagIsRedundantWhenTyped(jsdocTag)) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' is redundant outside of ambient (\\`declare\\`/\\`.d.ts\\`) contexts when using a type system.`,\n jsdocTag,\n tagIndex,\n );\n return true;\n }\n\n if (typedTagsNeedingName.has(jsdocTag.tag) && !jsdocTag.name) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' without a name is redundant when using a type system.`,\n jsdocTag,\n tagIndex,\n );\n return true;\n }\n\n return false;\n };\n\n for (let tagIndex = 0; tagIndex < jsdoc.tags.length; tagIndex += 1) {\n const jsdocTag = jsdoc.tags[tagIndex];\n const tagName = jsdocTag.tag;\n if (jsxTags && jsxTagNames.has(tagName)) {\n continue;\n }\n\n if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {\n continue;\n }\n\n const validTags = [\n ...definedTags,\n ...(/** @type {string[]} */ (definedPreferredTags)),\n ...definedNonPreferredTags,\n ...definedStructuredTags,\n ...typed ? typedTagsNeedingName : [],\n ];\n\n if (utils.isValidTag(tagName, validTags)) {\n let preferredTagName = utils.getPreferredTagName({\n allowObjectReturn: true,\n defaultMessage: `Blacklisted tag found (\\`@${tagName}\\`)`,\n tagName,\n });\n if (!preferredTagName) {\n continue;\n }\n\n let message;\n if (typeof preferredTagName === 'object') {\n ({\n message,\n replacement: preferredTagName,\n } = /** @type {{message: string; replacement?: string | undefined;}} */ (\n preferredTagName\n ));\n }\n\n if (!message) {\n message = `Invalid JSDoc tag (preference). Replace \"${tagName}\" JSDoc tag with \"${preferredTagName}\".`;\n }\n\n if (preferredTagName !== tagName) {\n report(message, (fixer) => {\n const replacement = sourceCode.getText(jsdocNode).replace(\n new RegExp(`@${escapeStringRegexp(tagName)}\\\\b`, 'v'),\n `@${preferredTagName}`,\n );\n\n return fixer.replaceText(jsdocNode, replacement);\n }, jsdocTag);\n }\n } else {\n report(`Invalid JSDoc tag name \"${tagName}\".`, null, jsdocTag);\n }\n }\n\n for (const inlineTag of utils.getInlineTags()) {\n if (!inlineTags.includes(inlineTag.tag)) {\n report(`Invalid JSDoc inline tag name \"${inlineTag.tag}\"`, null, inlineTag);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid block tag names.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-tag-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTags: {\n description: `Use an array of \\`definedTags\\` strings to configure additional, allowed tags.\nThe format is as follows:\n\n\\`\\`\\`json\n{\n \"definedTags\": [\"note\", \"record\"]\n}\n\\`\\`\\``,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n enableFixer: {\n description: 'Set to `false` to disable auto-removal of types that are redundant with the [`typed` option](#typed).',\n type: 'boolean',\n },\n inlineTags: {\n description: `List of tags to allow inline.\n\nDefaults to array of \\`'link', 'linkcode', 'linkplain', 'tutorial', 'inheritDoc', 'label', 'include', and 'includeCode'\\``,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n jsxTags: {\n description: `If this is set to \\`true\\`, all of the following tags used to control JSX output are allowed:\n\n\\`\\`\\`\njsx\njsxFrag\njsxImportSource\njsxRuntime\n\\`\\`\\`\n\nFor more information, see the [babel documentation](https://babeljs.io/docs/en/babel-plugin-transform-react-jsx).`,\n type: 'boolean',\n },\n typed: {\n description: `If this is set to \\`true\\`, additionally checks for tag names that are redundant when using a type checker such as TypeScript.\n\nThese tags are always unnecessary when using TypeScript or similar:\n\n\\`\\`\\`\naugments\ncallback\nclass\nenum\nimplements\nprivate\nproperty\nprotected\npublic\nreadonly\nthis\ntype\ntypedef\n\\`\\`\\`\n\nThese tags are unnecessary except when inside a TypeScript \\`declare\\` context:\n\n\\`\\`\\`\nabstract\naccess\nclass\nconstant\nconstructs\ndefault\nenum\nexport\nexports\nfunction\nglobal\ninherits\ninstance\ninterface\nmember\nmemberof\nmemberOf\nmethod\nmixes\nmixin\nmodule\nname\nnamespace\noverride\nproperty\nrequires\nstatic\nthis\n\\`\\`\\``,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;IAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;MACvC,MAAM,CAAC,kCAAkC,SAAS,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;IAC7E;EACF;AACF,CAAC,EAAE;EACD,gBAAgB,EAAE,IAAI;EACtB,IAAI,EAAE;IACJ,IAAI,EAAE;MACJ,WAAW,EAAE,kCAAkC;MAC/C,GAAG,EAAE;IACP,CAAC;IACD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,CACN;MACE,oBAAoB,EAAE,KAAK;MAC3B,UAAU,EAAE;QACV,WAAW,EAAE;UACX,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;UACK,KAAK,EAAE;YACL,IAAI,EAAE;UACR,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,WAAW,EAAE;UACX,WAAW,EAAE,uGAAuG;UACpH,IAAI,EAAE;QACR,CAAC;QACD,UAAU,EAAE;UACV,WAAW,EAAE;AACzB;AACA,0HAA0H;UAC9G,KAAK,EAAE;YACL,IAAI,EAAE;UACR,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,OAAO,EAAE;UACP,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kHAAkH;UACtG,IAAI,EAAE;QACR,CAAC;QACD,KAAK,EAAE;UACL,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;UACK,IAAI,EAAE;QACR;MACF,CAAC;MACD,IAAI,EAAE;IACR,CAAC,CACF;IACD,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAA","ignoreList":[]}