eslint-plugin-jsdoc 51.0.5 → 51.0.7

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.
@@ -4,13 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
7
+ var _iterateJsdoc = _interopRequireWildcard(require("../iterateJsdoc.cjs"));
8
+ var _jsdocUtils = require("../jsdocUtils.cjs");
8
9
  var _jsdoccomment = require("@es-joy/jsdoccomment");
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
11
  var _default = exports.default = (0, _iterateJsdoc.default)(({
12
+ jsdoc,
11
13
  node,
12
14
  report,
13
15
  settings,
16
+ sourceCode,
14
17
  utils
15
18
  }) => {
16
19
  const {
@@ -38,18 +41,18 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
38
41
  }
39
42
  });
40
43
  };
41
- const checkParamsAndReturnsTags = () => {
44
+ const checkParamsAndReturnsTags = (jsdc = jsdoc) => {
42
45
  const paramName = /** @type {string} */utils.getPreferredTagName({
43
46
  tagName: 'param'
44
47
  });
45
- const paramTags = utils.getTags(paramName);
48
+ const paramTags = (0, _jsdocUtils.getTags)(jsdc, paramName);
46
49
  for (const paramTag of paramTags) {
47
50
  checkForUsedTypes(paramTag.type);
48
51
  }
49
52
  const returnsName = /** @type {string} */utils.getPreferredTagName({
50
53
  tagName: 'returns'
51
54
  });
52
- const returnsTags = utils.getTags(returnsName);
55
+ const returnsTags = (0, _jsdocUtils.getTags)(jsdc, returnsName);
53
56
  for (const returnsTag of returnsTags) {
54
57
  checkForUsedTypes(returnsTag.type);
55
58
  }
@@ -91,6 +94,24 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
91
94
  }
92
95
  if (checkParamsAndReturns) {
93
96
  checkParamsAndReturnsTags();
97
+ } else if (aliasDeclaration.type === 'ClassDeclaration') {
98
+ /* c8 ignore next -- TS */
99
+ for (const nde of aliasDeclaration?.body?.body ?? []) {
100
+ // @ts-expect-error Should be ok
101
+ const commentNode = (0, _jsdoccomment.getJSDocComment)(sourceCode, nde, settings);
102
+ if (!commentNode) {
103
+ continue;
104
+ }
105
+ const innerJsdoc = (0, _iterateJsdoc.parseComment)(commentNode, '');
106
+ checkParamsAndReturnsTags(innerJsdoc);
107
+ const typeName = /** @type {string} */utils.getPreferredTagName({
108
+ tagName: 'type'
109
+ });
110
+ const typeTags = (0, _jsdocUtils.getTags)(innerJsdoc, typeName);
111
+ for (const typeTag of typeTags) {
112
+ checkForUsedTypes(typeTag.type);
113
+ }
114
+ }
94
115
  }
95
116
  checkTemplateTags();
96
117
  };
@@ -145,17 +166,7 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
145
166
  for (const propertyTag of propertyTags) {
146
167
  checkForUsedTypes(propertyTag.type);
147
168
  }
148
- for (const tag of templateTags) {
149
- const {
150
- name
151
- } = tag;
152
- const names = name.split(/,\s*/u);
153
- for (const nme of names) {
154
- if (!usedNames.has(nme)) {
155
- report(`@template ${nme} not in use`, null, tag);
156
- }
157
- }
158
- }
169
+ checkTemplateTags();
159
170
  }, {
160
171
  iterateAllJsdocs: true,
161
172
  meta: {
@@ -1 +1 @@
1
- {"version":3,"file":"checkTemplateNames.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","_default","exports","iterateJsdoc","node","report","settings","utils","mode","templateTags","getTags","usedNames","Set","checkForUsedTypes","potentialType","parsedType","tryParseType","parseType","traverse","nde","type","value","add","checkParamsAndReturnsTags","paramName","getPreferredTagName","tagName","paramTags","paramTag","returnsName","returnsTags","returnsTag","checkTemplateTags","tag","name","names","split","nme","has","checkParameters","aliasDeclaration","checkParamsAndReturns","params","typeParameters","handleTypeAliases","declaration","callbackTags","functionTags","length","typedefTags","potentialTypedefType","propertyName","propertyTags","propertyTag","iterateAllJsdocs","meta","docs","description","url","schema","module"],"sources":["../../src/rules/checkTemplateNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse as parseType,\n traverse,\n tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\n\nexport default iterateJsdoc(({\n node,\n report,\n settings,\n utils,\n}) => {\n const {\n mode,\n } = settings;\n\n const templateTags = utils.getTags('template');\n\n const usedNames = new Set();\n /**\n * @param {string} potentialType\n */\n const checkForUsedTypes = (potentialType) => {\n let parsedType;\n try {\n parsedType = mode === 'permissive' ?\n tryParseType(/** @type {string} */ (potentialType)) :\n parseType(/** @type {string} */ (potentialType), mode);\n } catch {\n return;\n }\n\n traverse(parsedType, (nde) => {\n const {\n type,\n value,\n } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n if (type === 'JsdocTypeName') {\n usedNames.add(value);\n }\n });\n };\n\n const checkParamsAndReturnsTags = () => {\n const paramName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n const paramTags = utils.getTags(paramName);\n for (const paramTag of paramTags) {\n checkForUsedTypes(paramTag.type);\n }\n\n const returnsName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'returns',\n }));\n const returnsTags = utils.getTags(returnsName);\n for (const returnsTag of returnsTags) {\n checkForUsedTypes(returnsTag.type);\n }\n };\n\n const checkTemplateTags = () => {\n for (const tag of templateTags) {\n const {\n name,\n } = tag;\n const names = name.split(/,\\s*/u);\n for (const nme of names) {\n if (!usedNames.has(nme)) {\n report(`@template ${nme} not in use`, null, tag);\n }\n }\n }\n };\n\n /**\n * @param {import('@typescript-eslint/types').TSESTree.FunctionDeclaration|\n * import('@typescript-eslint/types').TSESTree.ClassDeclaration|\n * import('@typescript-eslint/types').TSESTree.TSInterfaceDeclaration|\n * import('@typescript-eslint/types').TSESTree.TSTypeAliasDeclaration} aliasDeclaration\n * @param {boolean} [checkParamsAndReturns]\n */\n const checkParameters = (aliasDeclaration, checkParamsAndReturns) => {\n /* c8 ignore next -- Guard */\n const {\n params,\n } = aliasDeclaration.typeParameters ?? {\n params: [],\n };\n for (const {\n name: {\n name,\n },\n } of params) {\n usedNames.add(name);\n }\n\n if (checkParamsAndReturns) {\n checkParamsAndReturnsTags();\n }\n\n checkTemplateTags();\n };\n\n const handleTypeAliases = () => {\n const nde = /** @type {import('@typescript-eslint/types').TSESTree.Node} */ (\n node\n );\n if (!nde) {\n return;\n }\n\n switch (nde.type) {\n case 'ClassDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n checkParameters(nde);\n break;\n case 'ExportDefaultDeclaration':\n case 'ExportNamedDeclaration':\n switch (nde.declaration?.type) {\n case 'ClassDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n checkParameters(nde.declaration);\n break;\n case 'FunctionDeclaration':\n checkParameters(nde.declaration, true);\n break;\n }\n\n break;\n case 'FunctionDeclaration':\n checkParameters(nde, true);\n break;\n }\n };\n\n const callbackTags = utils.getTags('callback');\n const functionTags = utils.getTags('function');\n if (callbackTags.length || functionTags.length) {\n checkParamsAndReturnsTags();\n checkTemplateTags();\n return;\n }\n\n const typedefTags = utils.getTags('typedef');\n if (!typedefTags.length || typedefTags.length >= 2) {\n handleTypeAliases();\n return;\n }\n\n const potentialTypedefType = typedefTags[0].type;\n checkForUsedTypes(potentialTypedefType);\n\n const propertyName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'property',\n }));\n const propertyTags = utils.getTags(propertyName);\n for (const propertyTag of propertyTags) {\n checkForUsedTypes(propertyTag.type);\n }\n\n for (const tag of templateTags) {\n const {\n name,\n } = tag;\n const names = name.split(/,\\s*/u);\n for (const nme of names) {\n if (!usedNames.has(nme)) {\n report(`@template ${nme} not in use`, null, tag);\n }\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that any `@template` names are actually used in the connected `@typedef` or type alias.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-template-names.md#repos-sticky-header',\n },\n schema: [],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"checkTemplateNames.cjs","names":["_iterateJsdoc","_interopRequireWildcard","require","_jsdocUtils","_jsdoccomment","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","exports","iterateJsdoc","jsdoc","node","report","settings","sourceCode","utils","mode","templateTags","getTags","usedNames","Set","checkForUsedTypes","potentialType","parsedType","tryParseType","parseType","traverse","nde","type","value","add","checkParamsAndReturnsTags","jsdc","paramName","getPreferredTagName","tagName","paramTags","paramTag","returnsName","returnsTags","returnsTag","checkTemplateTags","tag","name","names","split","nme","checkParameters","aliasDeclaration","checkParamsAndReturns","params","typeParameters","body","commentNode","getJSDocComment","innerJsdoc","parseComment","typeName","typeTags","typeTag","handleTypeAliases","declaration","callbackTags","functionTags","length","typedefTags","potentialTypedefType","propertyName","propertyTags","propertyTag","iterateAllJsdocs","meta","docs","description","url","schema","module"],"sources":["../../src/rules/checkTemplateNames.js"],"sourcesContent":["import iterateJsdoc, {\n parseComment,\n} from '../iterateJsdoc.js';\nimport {\n getTags,\n} from '../jsdocUtils.js';\nimport {\n getJSDocComment,\n parse as parseType,\n traverse,\n tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\n\nexport default iterateJsdoc(({\n jsdoc,\n node,\n report,\n settings,\n sourceCode,\n utils,\n}) => {\n const {\n mode,\n } = settings;\n\n const templateTags = utils.getTags('template');\n\n const usedNames = new Set();\n /**\n * @param {string} potentialType\n */\n const checkForUsedTypes = (potentialType) => {\n let parsedType;\n try {\n parsedType = mode === 'permissive' ?\n tryParseType(/** @type {string} */ (potentialType)) :\n parseType(/** @type {string} */ (potentialType), mode);\n } catch {\n return;\n }\n\n traverse(parsedType, (nde) => {\n const {\n type,\n value,\n } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n if (type === 'JsdocTypeName') {\n usedNames.add(value);\n }\n });\n };\n\n const checkParamsAndReturnsTags = (jsdc = jsdoc) => {\n const paramName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n const paramTags = getTags(jsdc, paramName);\n for (const paramTag of paramTags) {\n checkForUsedTypes(paramTag.type);\n }\n\n const returnsName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'returns',\n }));\n const returnsTags = getTags(jsdc, returnsName);\n for (const returnsTag of returnsTags) {\n checkForUsedTypes(returnsTag.type);\n }\n };\n\n const checkTemplateTags = () => {\n for (const tag of templateTags) {\n const {\n name,\n } = tag;\n const names = name.split(/,\\s*/u);\n for (const nme of names) {\n if (!usedNames.has(nme)) {\n report(`@template ${nme} not in use`, null, tag);\n }\n }\n }\n };\n\n /**\n * @param {import('@typescript-eslint/types').TSESTree.FunctionDeclaration|\n * import('@typescript-eslint/types').TSESTree.ClassDeclaration|\n * import('@typescript-eslint/types').TSESTree.TSInterfaceDeclaration|\n * import('@typescript-eslint/types').TSESTree.TSTypeAliasDeclaration} aliasDeclaration\n * @param {boolean} [checkParamsAndReturns]\n */\n const checkParameters = (aliasDeclaration, checkParamsAndReturns) => {\n /* c8 ignore next -- Guard */\n const {\n params,\n } = aliasDeclaration.typeParameters ?? {\n params: [],\n };\n for (const {\n name: {\n name,\n },\n } of params) {\n usedNames.add(name);\n }\n\n if (checkParamsAndReturns) {\n checkParamsAndReturnsTags();\n } else if (aliasDeclaration.type === 'ClassDeclaration') {\n /* c8 ignore next -- TS */\n for (const nde of aliasDeclaration?.body?.body ?? []) {\n // @ts-expect-error Should be ok\n const commentNode = getJSDocComment(sourceCode, nde, settings);\n if (!commentNode) {\n continue;\n }\n\n const innerJsdoc = parseComment(commentNode, '');\n checkParamsAndReturnsTags(innerJsdoc);\n\n const typeName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'type',\n }));\n const typeTags = getTags(innerJsdoc, typeName);\n for (const typeTag of typeTags) {\n checkForUsedTypes(typeTag.type);\n }\n }\n }\n\n checkTemplateTags();\n };\n\n const handleTypeAliases = () => {\n const nde = /** @type {import('@typescript-eslint/types').TSESTree.Node} */ (\n node\n );\n if (!nde) {\n return;\n }\n\n switch (nde.type) {\n case 'ClassDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n checkParameters(nde);\n break;\n case 'ExportDefaultDeclaration':\n case 'ExportNamedDeclaration':\n switch (nde.declaration?.type) {\n case 'ClassDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n checkParameters(nde.declaration);\n break;\n case 'FunctionDeclaration':\n checkParameters(nde.declaration, true);\n break;\n }\n\n break;\n case 'FunctionDeclaration':\n checkParameters(nde, true);\n break;\n }\n };\n\n const callbackTags = utils.getTags('callback');\n const functionTags = utils.getTags('function');\n if (callbackTags.length || functionTags.length) {\n checkParamsAndReturnsTags();\n checkTemplateTags();\n return;\n }\n\n const typedefTags = utils.getTags('typedef');\n if (!typedefTags.length || typedefTags.length >= 2) {\n handleTypeAliases();\n return;\n }\n\n const potentialTypedefType = typedefTags[0].type;\n checkForUsedTypes(potentialTypedefType);\n\n const propertyName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'property',\n }));\n const propertyTags = utils.getTags(propertyName);\n for (const propertyTag of propertyTags) {\n checkForUsedTypes(propertyTag.type);\n }\n\n checkTemplateTags();\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that any `@template` names are actually used in the connected `@typedef` or type alias.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-template-names.md#repos-sticky-header',\n },\n schema: [],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -5,12 +5,12 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "~0.50.2",
8
+ "@es-joy/jsdoccomment": "~0.51.1",
9
9
  "are-docs-informative": "^0.0.2",
10
10
  "comment-parser": "1.4.1",
11
11
  "debug": "^4.4.1",
12
12
  "escape-string-regexp": "^4.0.0",
13
- "espree": "^10.3.0",
13
+ "espree": "^10.4.0",
14
14
  "esquery": "^1.6.0",
15
15
  "parse-imports-exports": "^0.2.4",
16
16
  "semver": "^7.7.2",
@@ -20,7 +20,7 @@
20
20
  "devDependencies": {
21
21
  "@babel/cli": "^7.27.2",
22
22
  "@babel/core": "^7.27.4",
23
- "@babel/eslint-parser": "^7.27.1",
23
+ "@babel/eslint-parser": "^7.27.5",
24
24
  "@babel/node": "^7.27.1",
25
25
  "@babel/plugin-syntax-class-properties": "^7.12.13",
26
26
  "@babel/plugin-transform-flow-strip-types": "^7.27.1",
@@ -36,39 +36,39 @@
36
36
  "@types/eslint": "^9.6.1",
37
37
  "@types/espree": "^10.1.0",
38
38
  "@types/esquery": "^1.5.4",
39
- "@types/estree": "^1.0.7",
39
+ "@types/estree": "^1.0.8",
40
40
  "@types/json-schema": "^7.0.15",
41
41
  "@types/lodash.defaultsdeep": "^4.6.9",
42
42
  "@types/mocha": "^10.0.10",
43
- "@types/node": "^22.15.29",
43
+ "@types/node": "^24.0.3",
44
44
  "@types/semver": "^7.7.0",
45
45
  "@types/spdx-expression-parse": "^3.0.5",
46
- "@typescript-eslint/types": "^8.33.0",
46
+ "@typescript-eslint/types": "^8.34.1",
47
47
  "babel-plugin-add-module-exports": "^1.0.4",
48
48
  "babel-plugin-istanbul": "^7.0.0",
49
- "babel-plugin-transform-import-meta": "^2.3.2",
49
+ "babel-plugin-transform-import-meta": "^2.3.3",
50
50
  "c8": "^10.1.3",
51
51
  "camelcase": "^8.0.0",
52
52
  "chai": "^5.2.0",
53
53
  "cross-env": "^7.0.3",
54
54
  "decamelize": "^6.0.0",
55
- "eslint": "9.28.0",
55
+ "eslint": "9.29.0",
56
56
  "eslint-config-canonical": "~44.9.5",
57
57
  "gitdown": "^4.1.1",
58
- "glob": "^11.0.2",
58
+ "glob": "^11.0.3",
59
59
  "globals": "^16.2.0",
60
60
  "husky": "^9.1.7",
61
61
  "jsdoc-type-pratt-parser": "^4.1.0",
62
62
  "json-schema": "^0.4.0",
63
- "lint-staged": "^16.1.0",
63
+ "lint-staged": "^16.1.2",
64
64
  "lodash.defaultsdeep": "^4.6.1",
65
- "mocha": "^11.5.0",
65
+ "mocha": "^11.7.0",
66
66
  "open-editor": "^5.1.0",
67
67
  "replace": "^1.2.2",
68
68
  "rimraf": "^6.0.1",
69
69
  "semantic-release": "^24.2.5",
70
70
  "typescript": "5.8.3",
71
- "typescript-eslint": "^8.33.0"
71
+ "typescript-eslint": "^8.34.1"
72
72
  },
73
73
  "engines": {
74
74
  "node": ">=20.11.0"
@@ -160,5 +160,5 @@
160
160
  "test-cov": "cross-env TIMING=1 c8 --reporter text npm run test-no-cov",
161
161
  "test-index": "npm run test-no-cov -- test/rules/index.js"
162
162
  },
163
- "version": "51.0.5"
163
+ "version": "51.0.7"
164
164
  }
@@ -1,14 +1,22 @@
1
- import iterateJsdoc from '../iterateJsdoc.js';
1
+ import iterateJsdoc, {
2
+ parseComment,
3
+ } from '../iterateJsdoc.js';
2
4
  import {
5
+ getTags,
6
+ } from '../jsdocUtils.js';
7
+ import {
8
+ getJSDocComment,
3
9
  parse as parseType,
4
10
  traverse,
5
11
  tryParse as tryParseType,
6
12
  } from '@es-joy/jsdoccomment';
7
13
 
8
14
  export default iterateJsdoc(({
15
+ jsdoc,
9
16
  node,
10
17
  report,
11
18
  settings,
19
+ sourceCode,
12
20
  utils,
13
21
  }) => {
14
22
  const {
@@ -42,11 +50,11 @@ export default iterateJsdoc(({
42
50
  });
43
51
  };
44
52
 
45
- const checkParamsAndReturnsTags = () => {
53
+ const checkParamsAndReturnsTags = (jsdc = jsdoc) => {
46
54
  const paramName = /** @type {string} */ (utils.getPreferredTagName({
47
55
  tagName: 'param',
48
56
  }));
49
- const paramTags = utils.getTags(paramName);
57
+ const paramTags = getTags(jsdc, paramName);
50
58
  for (const paramTag of paramTags) {
51
59
  checkForUsedTypes(paramTag.type);
52
60
  }
@@ -54,7 +62,7 @@ export default iterateJsdoc(({
54
62
  const returnsName = /** @type {string} */ (utils.getPreferredTagName({
55
63
  tagName: 'returns',
56
64
  }));
57
- const returnsTags = utils.getTags(returnsName);
65
+ const returnsTags = getTags(jsdc, returnsName);
58
66
  for (const returnsTag of returnsTags) {
59
67
  checkForUsedTypes(returnsTag.type);
60
68
  }
@@ -98,6 +106,26 @@ export default iterateJsdoc(({
98
106
 
99
107
  if (checkParamsAndReturns) {
100
108
  checkParamsAndReturnsTags();
109
+ } else if (aliasDeclaration.type === 'ClassDeclaration') {
110
+ /* c8 ignore next -- TS */
111
+ for (const nde of aliasDeclaration?.body?.body ?? []) {
112
+ // @ts-expect-error Should be ok
113
+ const commentNode = getJSDocComment(sourceCode, nde, settings);
114
+ if (!commentNode) {
115
+ continue;
116
+ }
117
+
118
+ const innerJsdoc = parseComment(commentNode, '');
119
+ checkParamsAndReturnsTags(innerJsdoc);
120
+
121
+ const typeName = /** @type {string} */ (utils.getPreferredTagName({
122
+ tagName: 'type',
123
+ }));
124
+ const typeTags = getTags(innerJsdoc, typeName);
125
+ for (const typeTag of typeTags) {
126
+ checkForUsedTypes(typeTag.type);
127
+ }
128
+ }
101
129
  }
102
130
 
103
131
  checkTemplateTags();
@@ -162,17 +190,7 @@ export default iterateJsdoc(({
162
190
  checkForUsedTypes(propertyTag.type);
163
191
  }
164
192
 
165
- for (const tag of templateTags) {
166
- const {
167
- name,
168
- } = tag;
169
- const names = name.split(/,\s*/u);
170
- for (const nme of names) {
171
- if (!usedNames.has(nme)) {
172
- report(`@template ${nme} not in use`, null, tag);
173
- }
174
- }
175
- }
193
+ checkTemplateTags();
176
194
  }, {
177
195
  iterateAllJsdocs: true,
178
196
  meta: {