eslint-plugin-jsdoc 44.2.2 → 44.2.4

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.
Files changed (117) hide show
  1. package/dist/alignTransform.js +86 -4
  2. package/dist/alignTransform.js.map +1 -1
  3. package/dist/exportParser.js +134 -4
  4. package/dist/exportParser.js.map +1 -1
  5. package/dist/getDefaultTagStructureForMode.js +71 -62
  6. package/dist/getDefaultTagStructureForMode.js.map +1 -1
  7. package/dist/index.js +7 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/iterateJsdoc.js +1081 -111
  10. package/dist/iterateJsdoc.js.map +1 -1
  11. package/dist/jsdocUtils.js +381 -132
  12. package/dist/jsdocUtils.js.map +1 -1
  13. package/dist/rules/checkAlignment.js +6 -0
  14. package/dist/rules/checkAlignment.js.map +1 -1
  15. package/dist/rules/checkExamples.js +70 -6
  16. package/dist/rules/checkExamples.js.map +1 -1
  17. package/dist/rules/checkIndentation.js +11 -1
  18. package/dist/rules/checkIndentation.js.map +1 -1
  19. package/dist/rules/checkLineAlignment.js +69 -5
  20. package/dist/rules/checkLineAlignment.js.map +1 -1
  21. package/dist/rules/checkParamNames.js +12 -7
  22. package/dist/rules/checkParamNames.js.map +1 -1
  23. package/dist/rules/checkPropertyNames.js +13 -7
  24. package/dist/rules/checkPropertyNames.js.map +1 -1
  25. package/dist/rules/checkTagNames.js +45 -5
  26. package/dist/rules/checkTagNames.js.map +1 -1
  27. package/dist/rules/checkTypes.js +97 -36
  28. package/dist/rules/checkTypes.js.map +1 -1
  29. package/dist/rules/checkValues.js +6 -6
  30. package/dist/rules/checkValues.js.map +1 -1
  31. package/dist/rules/emptyTags.js +8 -1
  32. package/dist/rules/emptyTags.js.map +1 -1
  33. package/dist/rules/informativeDocs.js +26 -7
  34. package/dist/rules/informativeDocs.js.map +1 -1
  35. package/dist/rules/matchDescription.js +19 -2
  36. package/dist/rules/matchDescription.js.map +1 -1
  37. package/dist/rules/matchName.js +2 -2
  38. package/dist/rules/matchName.js.map +1 -1
  39. package/dist/rules/multilineBlocks.js +12 -1
  40. package/dist/rules/multilineBlocks.js.map +1 -1
  41. package/dist/rules/noBadBlocks.js +4 -6
  42. package/dist/rules/noBadBlocks.js.map +1 -1
  43. package/dist/rules/noBlankBlockDescriptions.js +2 -0
  44. package/dist/rules/noBlankBlockDescriptions.js.map +1 -1
  45. package/dist/rules/noMissingSyntax.js +58 -15
  46. package/dist/rules/noMissingSyntax.js.map +1 -1
  47. package/dist/rules/noMultiAsterisks.js +1 -6
  48. package/dist/rules/noMultiAsterisks.js.map +1 -1
  49. package/dist/rules/noRestrictedSyntax.js +17 -4
  50. package/dist/rules/noRestrictedSyntax.js.map +1 -1
  51. package/dist/rules/noTypes.js +3 -0
  52. package/dist/rules/noTypes.js.map +1 -1
  53. package/dist/rules/noUndefinedTypes.js +61 -20
  54. package/dist/rules/noUndefinedTypes.js.map +1 -1
  55. package/dist/rules/requireAsteriskPrefix.js +20 -0
  56. package/dist/rules/requireAsteriskPrefix.js.map +1 -1
  57. package/dist/rules/requireDescription.js +6 -2
  58. package/dist/rules/requireDescription.js.map +1 -1
  59. package/dist/rules/requireDescriptionCompleteSentence.js +73 -10
  60. package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
  61. package/dist/rules/requireFileOverview.js +9 -4
  62. package/dist/rules/requireFileOverview.js.map +1 -1
  63. package/dist/rules/requireHyphenBeforeParamDescription.js +23 -6
  64. package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
  65. package/dist/rules/requireJsdoc.js +148 -30
  66. package/dist/rules/requireJsdoc.js.map +1 -1
  67. package/dist/rules/requireParam.js +46 -2
  68. package/dist/rules/requireParam.js.map +1 -1
  69. package/dist/rules/requireProperty.js +1 -1
  70. package/dist/rules/requireProperty.js.map +1 -1
  71. package/dist/rules/requireReturns.js +2 -2
  72. package/dist/rules/requireReturns.js.map +1 -1
  73. package/dist/rules/requireReturnsCheck.js +9 -2
  74. package/dist/rules/requireReturnsCheck.js.map +1 -1
  75. package/dist/rules/requireThrows.js +2 -2
  76. package/dist/rules/requireThrows.js.map +1 -1
  77. package/dist/rules/requireYields.js +9 -2
  78. package/dist/rules/requireYields.js.map +1 -1
  79. package/dist/rules/requireYieldsCheck.js +19 -5
  80. package/dist/rules/requireYieldsCheck.js.map +1 -1
  81. package/dist/rules/sortTags.js +67 -9
  82. package/dist/rules/sortTags.js.map +1 -1
  83. package/dist/rules/tagLines.js +22 -3
  84. package/dist/rules/tagLines.js.map +1 -1
  85. package/dist/rules/textEscaping.js +16 -2
  86. package/dist/rules/textEscaping.js.map +1 -1
  87. package/dist/rules/validTypes.js +25 -8
  88. package/dist/rules/validTypes.js.map +1 -1
  89. package/dist/tagNames.js +27 -0
  90. package/dist/tagNames.js.map +1 -1
  91. package/dist/utils/hasReturnValue.js +87 -42
  92. package/dist/utils/hasReturnValue.js.map +1 -1
  93. package/docs/rules/check-tag-names.md +15 -0
  94. package/docs/rules/no-missing-syntax.md +6 -0
  95. package/docs/rules/no-undefined-types.md +18 -0
  96. package/docs/rules/require-description-complete-sentence.md +525 -289
  97. package/docs/rules/require-description.md +289 -525
  98. package/docs/rules/require-file-overview.md +7 -0
  99. package/docs/rules/require-jsdoc.md +1 -1
  100. package/docs/rules/require-param-description.md +116 -1694
  101. package/docs/rules/require-param-name.md +58 -133
  102. package/docs/rules/require-param-type.md +119 -55
  103. package/docs/rules/require-param.md +1700 -111
  104. package/docs/rules/require-property-description.md +39 -79
  105. package/docs/rules/require-property-name.md +21 -30
  106. package/docs/rules/require-property-type.md +21 -21
  107. package/docs/rules/require-property.md +82 -33
  108. package/docs/rules/require-returns-check.md +636 -747
  109. package/docs/rules/require-returns-description.md +61 -933
  110. package/docs/rules/require-returns-type.md +42 -79
  111. package/docs/rules/require-returns.md +1081 -61
  112. package/docs/rules/require-yields-check.md +238 -517
  113. package/docs/rules/require-yields.md +517 -238
  114. package/docs/rules/valid-types.md +1 -1
  115. package/docs/settings.md +1 -1
  116. package/package.json +13 -5
  117. package/tsconfig.json +5 -2
@@ -9,8 +9,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
9
9
  /**
10
10
  * @param {string} targetTagName
11
11
  * @param {boolean} enableFixer
12
- * @param jsdoc
13
- * @param utils
12
+ * @param {import('comment-parser').Block} jsdoc
13
+ * @param {import('../iterateJsdoc.js').Utils} utils
14
14
  * @returns {boolean}
15
15
  */
16
16
  const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
@@ -18,9 +18,10 @@ const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
18
18
  return tag.tag === targetTagName;
19
19
  });
20
20
  return propertyTags.some(([, tag], index) => {
21
+ /** @type {import('../iterateJsdoc.js').Integer} */
21
22
  let tagsIndex;
22
23
  const dupeTagInfo = propertyTags.find(([tgsIndex, tg], idx) => {
23
- tagsIndex = tgsIndex;
24
+ tagsIndex = Number(tgsIndex);
24
25
  return tg.name === tag.name && idx !== index;
25
26
  });
26
27
  if (dupeTagInfo) {
@@ -35,11 +36,16 @@ const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
35
36
 
36
37
  /**
37
38
  * @param {string} targetTagName
38
- * @param {string[]} jsdocPropertyNames
39
- * @param jsdoc
39
+ * @param {{
40
+ * idx: number;
41
+ * name: string;
42
+ * type: string;
43
+ * }[]} jsdocPropertyNames
44
+ * @param {import('comment-parser').Block} jsdoc
40
45
  * @param {Function} report
41
46
  */
42
47
  const validatePropertyNamesDeep = (targetTagName, jsdocPropertyNames, jsdoc, report) => {
48
+ /** @type {string} */
43
49
  let lastRealProperty;
44
50
  return jsdocPropertyNames.some(({
45
51
  name: jsdocPropertyName,
@@ -75,10 +81,10 @@ var _default = (0, _iterateJsdoc.default)(({
75
81
  enableFixer = false
76
82
  } = context.options[0] || {};
77
83
  const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');
78
- if (!jsdocPropertyNamesDeep.length) {
84
+ if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) {
79
85
  return;
80
86
  }
81
- const targetTagName = utils.getPreferredTagName({
87
+ const targetTagName = /** @type {string} */utils.getPreferredTagName({
82
88
  tagName: 'property'
83
89
  });
84
90
  const isError = validatePropertyNames(targetTagName, enableFixer, jsdoc, utils);
@@ -1 +1 @@
1
- {"version":3,"file":"checkPropertyNames.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validatePropertyNames","targetTagName","enableFixer","jsdoc","utils","propertyTags","Object","entries","tags","filter","tag","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","name","reportJSDoc","removeTag","validatePropertyNamesDeep","jsdocPropertyNames","report","lastRealProperty","jsdocPropertyName","isPropertyPath","includes","pathRootNodeName","slice","indexOf","endsWith","_default","iterateJsdoc","context","options","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","exports","module"],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} enableFixer\n * @param jsdoc\n * @param utils\n * @returns {boolean}\n */\nconst validatePropertyNames = (\n targetTagName,\n enableFixer,\n jsdoc, utils,\n) => {\n const propertyTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n\n return propertyTags.some(([\n , tag,\n ], index) => {\n let tagsIndex;\n const dupeTagInfo = propertyTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = tgsIndex;\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {string[]} jsdocPropertyNames\n * @param jsdoc\n * @param {Function} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n name: jsdocPropertyName,\n idx,\n }) => {\n const isPropertyPath = jsdocPropertyName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealProperty) {\n report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealProperty) {\n report(\n `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real property name (\"${lastRealProperty}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealProperty = jsdocPropertyName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n enableFixer = false,\n } = context.options[0] || {};\n const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n if (!jsdocPropertyNamesDeep.length) {\n return;\n }\n\n const targetTagName = utils.getPreferredTagName({\n tagName: 'property',\n });\n const isError = validatePropertyNames(\n targetTagName,\n enableFixer,\n jsdoc,\n utils,\n );\n\n if (isError) {\n return;\n }\n\n validatePropertyNamesDeep(\n targetTagName, jsdocPropertyNamesDeep, jsdoc, report,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-property-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\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":"checkPropertyNames.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validatePropertyNames","targetTagName","enableFixer","jsdoc","utils","propertyTags","Object","entries","tags","filter","tag","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","Number","name","reportJSDoc","removeTag","validatePropertyNamesDeep","jsdocPropertyNames","report","lastRealProperty","jsdocPropertyName","isPropertyPath","includes","pathRootNodeName","slice","indexOf","endsWith","_default","iterateJsdoc","context","options","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","exports","module"],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} enableFixer\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @returns {boolean}\n */\nconst validatePropertyNames = (\n targetTagName,\n enableFixer,\n jsdoc, utils,\n) => {\n const propertyTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n\n return propertyTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = propertyTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = Number(tgsIndex);\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {{\n * idx: number;\n * name: string;\n * type: string;\n * }[]} jsdocPropertyNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n name: jsdocPropertyName,\n idx,\n }) => {\n const isPropertyPath = jsdocPropertyName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealProperty) {\n report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealProperty) {\n report(\n `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real property name (\"${lastRealProperty}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealProperty = jsdocPropertyName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n enableFixer = false,\n } = context.options[0] || {};\n const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) {\n return;\n }\n\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'property',\n }));\n const isError = validatePropertyNames(\n targetTagName,\n enableFixer,\n jsdoc,\n utils,\n );\n\n if (isError) {\n return;\n }\n\n validatePropertyNamesDeep(\n targetTagName, jsdocPropertyNamesDeep, jsdoc, report,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-property-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
@@ -22,12 +22,22 @@ var _default = (0, _iterateJsdoc.default)(({
22
22
  settings,
23
23
  jsdocNode
24
24
  }) => {
25
- const {
25
+ const
26
+ /**
27
+ * @type {{
28
+ * definedTags: string[],
29
+ * enableFixer: boolean,
30
+ * jsxTags: boolean,
31
+ * typed: boolean
32
+ }} */
33
+ {
26
34
  definedTags = [],
27
35
  enableFixer = true,
28
36
  jsxTags,
29
37
  typed
30
38
  } = context.options[0] || {};
39
+
40
+ /** @type {(string|undefined)[]} */
31
41
  let definedPreferredTags = [];
32
42
  const {
33
43
  tagNamePreference,
@@ -52,9 +62,19 @@ var _default = (0, _iterateJsdoc.default)(({
52
62
  return preferredType;
53
63
  });
54
64
  }
65
+
66
+ /**
67
+ * @param {import('eslint').Rule.Node} subNode
68
+ * @returns {boolean}
69
+ */
55
70
  const isInAmbientContext = subNode => {
56
- return subNode.type === 'Program' ? context.getFilename().endsWith('.d.ts') : Boolean(subNode.declare) || isInAmbientContext(subNode.parent);
71
+ return subNode.type === 'Program' ? context.getFilename().endsWith('.d.ts') : Boolean( /** @type {import('@typescript-eslint/types').TSESTree.VariableDeclaration} */subNode.declare) || isInAmbientContext(subNode.parent);
57
72
  };
73
+
74
+ /**
75
+ * @param {import('comment-parser').Spec} jsdocTag
76
+ * @returns {boolean}
77
+ */
58
78
  const tagIsRedundantWhenTyped = jsdocTag => {
59
79
  var _node$parent;
60
80
  if (!typedTagsUnnecessaryOutsideDeclare.has(jsdocTag.tag)) {
@@ -63,15 +83,28 @@ var _default = (0, _iterateJsdoc.default)(({
63
83
  if (jsdocTag.tag === 'default') {
64
84
  return false;
65
85
  }
86
+ if (node === null) {
87
+ return false;
88
+ }
66
89
  if (context.getFilename().endsWith('.d.ts') && ['Program', null, undefined].includes(node === null || node === void 0 ? void 0 : (_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type)) {
67
90
  return false;
68
91
  }
69
- if (isInAmbientContext(node)) {
92
+ if (isInAmbientContext( /** @type {import('eslint').Rule.Node} */node)) {
70
93
  return false;
71
94
  }
72
95
  return true;
73
96
  };
97
+
98
+ /* eslint-disable jsdoc/no-undefined-types -- TS */
99
+ /**
100
+ * @param {string} message
101
+ * @param {import('comment-parser').Spec} jsdocTag
102
+ * @param {import('../iterateJsdoc.js').Integer} tagIndex
103
+ * @param {Partial<import('comment-parser').Tokens>} [additionalTagChanges]
104
+ * @returns {void}
105
+ */
74
106
  const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {
107
+ /* eslint-enable jsdoc/no-undefined-types -- TS */
75
108
  utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {
76
109
  if (jsdocTag.description.trim()) {
77
110
  utils.changeTag(jsdocTag, {
@@ -86,6 +119,12 @@ var _default = (0, _iterateJsdoc.default)(({
86
119
  }
87
120
  } : null, true);
88
121
  };
122
+
123
+ /**
124
+ * @param {import('comment-parser').Spec} jsdocTag
125
+ * @param {import('../iterateJsdoc.js').Integer} tagIndex
126
+ * @returns {boolean}
127
+ */
89
128
  const checkTagForTypedValidity = (jsdocTag, tagIndex) => {
90
129
  if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {
91
130
  reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant when using a type system.`, jsdocTag, tagIndex, {
@@ -113,7 +152,7 @@ var _default = (0, _iterateJsdoc.default)(({
113
152
  if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {
114
153
  continue;
115
154
  }
116
- const validTags = [...definedTags, ...definedPreferredTags, ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
155
+ const validTags = [...definedTags, ... /** @type {string[]} */definedPreferredTags, ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
117
156
  if (utils.isValidTag(tagName, validTags)) {
118
157
  let preferredTagName = utils.getPreferredTagName({
119
158
  allowObjectReturn: true,
@@ -128,7 +167,8 @@ var _default = (0, _iterateJsdoc.default)(({
128
167
  ({
129
168
  message,
130
169
  replacement: preferredTagName
131
- } = preferredTagName);
170
+ } = /** @type {{message: string; replacement?: string | undefined;}} */
171
+ preferredTagName);
132
172
  }
133
173
  if (!message) {
134
174
  message = `Invalid JSDoc tag (preference). Replace "${tagName}" JSDoc tag with "${preferredTagName}".`;
@@ -1 +1 @@
1
- {"version":3,"file":"checkTagNames.js","names":["_escapeStringRegexp","_interopRequireDefault","require","_iterateJsdoc","obj","__esModule","default","jsxTagNames","Set","typedTagsAlwaysUnnecessary","typedTagsNeedingName","typedTagsUnnecessaryOutsideDeclare","_default","iterateJsdoc","sourceCode","jsdoc","report","utils","context","node","settings","jsdocNode","definedTags","enableFixer","jsxTags","typed","options","definedPreferredTags","tagNamePreference","structuredTags","definedStructuredTags","Object","keys","definedNonPreferredTags","length","values","map","preferredTag","undefined","reportSettings","replacement","filter","preferredType","isInAmbientContext","subNode","type","getFilename","endsWith","Boolean","declare","parent","tagIsRedundantWhenTyped","jsdocTag","_node$parent","has","tag","includes","reportWithTagRemovalFixer","message","tagIndex","additionalTagChanges","reportJSDoc","description","trim","changeTag","postType","removeTag","removeEmptyBlock","checkTagForTypedValidity","postTag","name","tags","tagName","validTags","isValidTag","preferredTagName","getPreferredTagName","allowObjectReturn","defaultMessage","fixer","getText","replace","RegExp","escapeStringRegexp","replaceText","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","exports","module"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import escapeStringRegexp from 'escape-string-regexp';\nimport iterateJsdoc from '../iterateJsdoc';\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 sourceCode,\n jsdoc,\n report,\n utils,\n context,\n node,\n settings,\n jsdocNode,\n}) => {\n const {\n definedTags = [],\n enableFixer = true,\n jsxTags,\n typed,\n } = context.options[0] || {};\n\n let definedPreferredTags = [];\n const {\n tagNamePreference,\n structuredTags,\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((preferredType) => {\n return preferredType;\n });\n }\n\n const isInAmbientContext = (subNode) => {\n return subNode.type === 'Program' ?\n context.getFilename().endsWith('.d.ts') :\n Boolean(subNode.declare) || isInAmbientContext(subNode.parent);\n };\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 (context.getFilename().endsWith('.d.ts') && [\n 'Program', null, undefined,\n ].includes(node?.parent?.type)) {\n return false;\n }\n\n if (isInAmbientContext(node)) {\n return false;\n }\n\n return true;\n };\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 const checkTagForTypedValidity = (jsdocTag, tagIndex) => {\n if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant when using a type system.`, jsdocTag, tagIndex, {\n postTag: '',\n tag: '',\n });\n return true;\n }\n\n if (tagIsRedundantWhenTyped(jsdocTag)) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant outside of ambient (\\`declare\\`/\\`.d.ts\\`) contexts when using a type system.`, jsdocTag, tagIndex);\n return true;\n }\n\n if (typedTagsNeedingName.has(jsdocTag.tag) && !jsdocTag.name) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' without a name is redundant when using a type system.`, jsdocTag, tagIndex);\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 ...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 } = preferredTagName);\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`, 'u'),\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 iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid block tag names.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n enableFixer: {\n type: 'boolean',\n },\n jsxTags: {\n type: 'boolean',\n },\n typed: {\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":"checkTagNames.js","names":["_escapeStringRegexp","_interopRequireDefault","require","_iterateJsdoc","obj","__esModule","default","jsxTagNames","Set","typedTagsAlwaysUnnecessary","typedTagsNeedingName","typedTagsUnnecessaryOutsideDeclare","_default","iterateJsdoc","sourceCode","jsdoc","report","utils","context","node","settings","jsdocNode","definedTags","enableFixer","jsxTags","typed","options","definedPreferredTags","tagNamePreference","structuredTags","definedStructuredTags","Object","keys","definedNonPreferredTags","length","values","map","preferredTag","undefined","reportSettings","replacement","filter","preferredType","isInAmbientContext","subNode","type","getFilename","endsWith","Boolean","declare","parent","tagIsRedundantWhenTyped","jsdocTag","_node$parent","has","tag","includes","reportWithTagRemovalFixer","message","tagIndex","additionalTagChanges","reportJSDoc","description","trim","changeTag","postType","removeTag","removeEmptyBlock","checkTagForTypedValidity","postTag","name","tags","tagName","validTags","isValidTag","preferredTagName","getPreferredTagName","allowObjectReturn","defaultMessage","fixer","getText","replace","RegExp","escapeStringRegexp","replaceText","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","exports","module"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import escapeStringRegexp from 'escape-string-regexp';\nimport iterateJsdoc from '../iterateJsdoc';\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 sourceCode,\n jsdoc,\n report,\n utils,\n context,\n node,\n settings,\n jsdocNode,\n}) => {\n const\n /**\n * @type {{\n * definedTags: string[],\n * enableFixer: boolean,\n * jsxTags: boolean,\n * typed: boolean\n }} */ {\n definedTags = [],\n enableFixer = true,\n jsxTags,\n typed,\n } = context.options[0] || {};\n\n /** @type {(string|undefined)[]} */\n let definedPreferredTags = [];\n const {\n tagNamePreference,\n structuredTags,\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((preferredType) => {\n return preferredType;\n });\n }\n\n /**\n * @param {import('eslint').Rule.Node} subNode\n * @returns {boolean}\n */\n const isInAmbientContext = (subNode) => {\n return subNode.type === 'Program' ?\n 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 if (context.getFilename().endsWith('.d.ts') && [\n 'Program', null, 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 /* eslint-disable jsdoc/no-undefined-types -- TS */\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 /* eslint-enable jsdoc/no-undefined-types -- TS */\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`, 'u'),\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 iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid block tag names.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n enableFixer: {\n type: 'boolean',\n },\n jsxTags: {\n type: 'boolean',\n },\n typed: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
@@ -17,46 +17,53 @@ const strictNativeTypes = ['undefined', 'null', 'boolean', 'number', 'bigint', '
17
17
  * @param {string} preferred The preferred type
18
18
  * @param {boolean} isGenericMatch
19
19
  * @param {string} typeNodeName
20
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} node
21
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} parentNode
20
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult} node
21
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
22
22
  * @returns {void}
23
23
  */
24
24
  const adjustNames = (type, preferred, isGenericMatch, typeNodeName, node, parentNode) => {
25
25
  let ret = preferred;
26
26
  if (isGenericMatch) {
27
+ const parentMeta = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode.meta;
27
28
  if (preferred === '[]') {
28
- parentNode.meta.brackets = 'square';
29
- parentNode.meta.dot = false;
29
+ parentMeta.brackets = 'square';
30
+ parentMeta.dot = false;
30
31
  ret = 'Array';
31
32
  } else {
32
33
  const dotBracketEnd = preferred.match(/\.(?:<>)?$/u);
33
34
  if (dotBracketEnd) {
34
- parentNode.meta.brackets = 'angle';
35
- parentNode.meta.dot = true;
35
+ parentMeta.brackets = 'angle';
36
+ parentMeta.dot = true;
36
37
  ret = preferred.slice(0, -dotBracketEnd[0].length);
37
38
  } else {
38
- var _parentNode$meta;
39
39
  const bracketEnd = preferred.endsWith('<>');
40
40
  if (bracketEnd) {
41
- parentNode.meta.brackets = 'angle';
42
- parentNode.meta.dot = false;
41
+ parentMeta.brackets = 'angle';
42
+ parentMeta.dot = false;
43
43
  ret = preferred.slice(0, -2);
44
- } else if (((_parentNode$meta = parentNode.meta) === null || _parentNode$meta === void 0 ? void 0 : _parentNode$meta.brackets) === 'square' && (typeNodeName === '[]' || typeNodeName === 'Array')) {
45
- parentNode.meta.brackets = 'angle';
46
- parentNode.meta.dot = false;
44
+ } else if ((parentMeta === null || parentMeta === void 0 ? void 0 : parentMeta.brackets) === 'square' && (typeNodeName === '[]' || typeNodeName === 'Array')) {
45
+ parentMeta.brackets = 'angle';
46
+ parentMeta.dot = false;
47
47
  }
48
48
  }
49
49
  }
50
50
  } else if (type === 'JsdocTypeAny') {
51
51
  node.type = 'JsdocTypeName';
52
52
  }
53
+
54
+ /** @type {import('jsdoc-type-pratt-parser').NameResult} */
53
55
  node.value = ret.replace(/(?:\.|<>|\.<>|\[\])$/u, '');
54
56
 
55
57
  // For bare pseudo-types like `<>`
56
58
  if (!ret) {
57
- node.value = typeNodeName;
59
+ /** @type {import('jsdoc-type-pratt-parser').NameResult} */node.value = typeNodeName;
58
60
  }
59
61
  };
62
+
63
+ /**
64
+ * @param {boolean} [upperCase]
65
+ * @returns {string}
66
+ */
60
67
  const getMessage = upperCase => {
61
68
  return 'Use object shorthand or index signatures instead of ' + '`' + (upperCase ? 'O' : 'o') + 'bject`, e.g., `{[key: string]: string}`';
62
69
  };
@@ -69,22 +76,48 @@ var _default = (0, _iterateJsdoc.default)(({
69
76
  context
70
77
  }) => {
71
78
  const jsdocTagsWithPossibleType = utils.filterTags(tag => {
72
- return utils.tagMightHaveTypePosition(tag.tag);
79
+ return Boolean(utils.tagMightHaveTypePosition(tag.tag));
73
80
  });
74
- const {
81
+ const
82
+ /**
83
+ * @type {{
84
+ * preferredTypes: import('../iterateJsdoc.js').PreferredTypes,
85
+ * structuredTags: import('../iterateJsdoc.js').StructuredTags,
86
+ * mode: import('../jsdocUtils.js').ParserMode
87
+ * }}
88
+ */
89
+ {
75
90
  preferredTypes: preferredTypesOriginal,
76
91
  structuredTags,
77
92
  mode
78
93
  } = settings;
94
+ /* eslint-enable jsdoc/valid-types -- Old version */
95
+
79
96
  const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal || 'object' in preferredTypesOriginal || 'object.<>' in preferredTypesOriginal || 'Object.<>' in preferredTypesOriginal || 'object<>' in preferredTypesOriginal);
97
+
98
+ /**
99
+ * @type {{
100
+ * message: string,
101
+ * replacement: false
102
+ * }}
103
+ */
80
104
  const info = {
81
105
  message: getMessage(),
82
106
  replacement: false
83
107
  };
108
+
109
+ /**
110
+ * @type {{
111
+ * message: string,
112
+ * replacement: false
113
+ * }}
114
+ */
84
115
  const infoUC = {
85
116
  message: getMessage(true),
86
117
  replacement: false
87
118
  };
119
+
120
+ /** @type {import('../iterateJsdoc.js').PreferredTypes} */
88
121
  const typeToInject = mode === 'typescript' ? {
89
122
  Object: 'object',
90
123
  'object.<>': info,
@@ -97,11 +130,24 @@ var _default = (0, _iterateJsdoc.default)(({
97
130
  'Object.<>': 'Object<>',
98
131
  'object<>': 'Object<>'
99
132
  };
133
+
134
+ /** @type {import('../iterateJsdoc.js').PreferredTypes} */
100
135
  const preferredTypes = {
101
136
  ...(injectObjectPreferredTypes ? typeToInject : {}),
102
137
  ...preferredTypesOriginal
103
138
  };
104
- const {
139
+ const
140
+ /**
141
+ * @type {{
142
+ * noDefaults: boolean,
143
+ * unifyParentAndChildTypeChecks: boolean,
144
+ * exemptTagContexts: ({
145
+ * tag: string,
146
+ * types: true|string[]
147
+ * })[]
148
+ * }}
149
+ */
150
+ {
105
151
  noDefaults,
106
152
  unifyParentAndChildTypeChecks,
107
153
  exemptTagContexts = []
@@ -113,8 +159,8 @@ var _default = (0, _iterateJsdoc.default)(({
113
159
  *
114
160
  * @param {string} _type Not currently in use
115
161
  * @param {string} typeNodeName
116
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} parentNode
117
- * @param {string} property
162
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
163
+ * @param {string|undefined} property
118
164
  * @returns {[hasMatchingPreferredType: boolean, typeName: string, isGenericMatch: boolean]}
119
165
  */
120
166
  const getPreferredTypeInfo = (_type, typeNodeName, parentNode, property) => {
@@ -123,9 +169,9 @@ var _default = (0, _iterateJsdoc.default)(({
123
169
  let typeName = typeNodeName;
124
170
  const isNameOfGeneric = parentNode !== undefined && parentNode.type === 'JsdocTypeGeneric' && property === 'left';
125
171
  if (unifyParentAndChildTypeChecks || isNameOfGeneric) {
126
- var _parentNode$meta2, _parentNode$meta3;
127
- const brackets = parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta2 = parentNode.meta) === null || _parentNode$meta2 === void 0 ? void 0 : _parentNode$meta2.brackets;
128
- const dot = parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta3 = parentNode.meta) === null || _parentNode$meta3 === void 0 ? void 0 : _parentNode$meta3.dot;
172
+ var _parentNode$meta, _parentNode$meta2;
173
+ const brackets = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta = parentNode.meta) === null || _parentNode$meta === void 0 ? void 0 : _parentNode$meta.brackets;
174
+ const dot = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta2 = parentNode.meta) === null || _parentNode$meta2 === void 0 ? void 0 : _parentNode$meta2.dot;
129
175
  if (brackets === 'angle') {
130
176
  const checkPostFixes = dot ? ['.', '.<>'] : ['<>'];
131
177
  isGenericMatch = checkPostFixes.some(checkPostFix => {
@@ -136,7 +182,7 @@ var _default = (0, _iterateJsdoc.default)(({
136
182
  return false;
137
183
  });
138
184
  }
139
- if (!isGenericMatch && property && parentNode.type === 'JsdocTypeGeneric') {
185
+ if (!isGenericMatch && property && /** @type {import('jsdoc-type-pratt-parser').NonRootResult} */parentNode.type === 'JsdocTypeGeneric') {
140
186
  const checkPostFixes = dot ? ['.', '.<>'] : [brackets === 'angle' ? '<>' : '[]'];
141
187
  isGenericMatch = checkPostFixes.some(checkPostFix => {
142
188
  if ((preferredTypes === null || preferredTypes === void 0 ? void 0 : preferredTypes[checkPostFix]) !== undefined) {
@@ -149,7 +195,7 @@ var _default = (0, _iterateJsdoc.default)(({
149
195
  }
150
196
  const directNameMatch = (preferredTypes === null || preferredTypes === void 0 ? void 0 : preferredTypes[typeNodeName]) !== undefined && !Object.values(preferredTypes).includes(typeNodeName);
151
197
  const unifiedSyntaxParentMatch = property && directNameMatch && unifyParentAndChildTypeChecks;
152
- isGenericMatch = isGenericMatch || unifiedSyntaxParentMatch;
198
+ isGenericMatch = isGenericMatch || Boolean(unifiedSyntaxParentMatch);
153
199
  hasMatchingPreferredType = isGenericMatch || directNameMatch && !property;
154
200
  return [hasMatchingPreferredType, typeName, isGenericMatch];
155
201
  };
@@ -159,10 +205,10 @@ var _default = (0, _iterateJsdoc.default)(({
159
205
  * the the relevant strict type returned as the new preferred type).
160
206
  *
161
207
  * @param {string} typeNodeName
162
- * @param {string} preferred
163
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} parentNode
164
- * @param {string[]} invalidTypes
165
- * @returns {string} The `preferred` type string, optionally changed
208
+ * @param {string|undefined} preferred
209
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
210
+ * @param {(string|false|undefined)[][]} invalidTypes
211
+ * @returns {string|undefined} The `preferred` type string, optionally changed
166
212
  */
167
213
  const checkNativeTypes = (typeNodeName, preferred, parentNode, invalidTypes) => {
168
214
  let changedPreferred = preferred;
@@ -176,7 +222,18 @@ var _default = (0, _iterateJsdoc.default)(({
176
222
  // parent object without a parent match (and not
177
223
  // `unifyParentAndChildTypeChecks`) and we don't want
178
224
  // `object<>` given TypeScript issue https://github.com/microsoft/TypeScript/issues/20555
179
- parentNode !== null && parentNode !== void 0 && (_parentNode$elements = parentNode.elements) !== null && _parentNode$elements !== void 0 && _parentNode$elements.length && (parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left = parentNode.left) === null || _parentNode$left === void 0 ? void 0 : _parentNode$left.type) === 'JsdocTypeName' && (parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left2 = parentNode.left) === null || _parentNode$left2 === void 0 ? void 0 : _parentNode$left2.value) === 'Object')) {
225
+ /**
226
+ * @type {import('jsdoc-type-pratt-parser').GenericResult}
227
+ */
228
+ parentNode !== null && parentNode !== void 0 && (_parentNode$elements = parentNode.elements) !== null && _parentNode$elements !== void 0 && _parentNode$elements.length &&
229
+ /**
230
+ * @type {import('jsdoc-type-pratt-parser').GenericResult}
231
+ */
232
+ (parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left = parentNode.left) === null || _parentNode$left === void 0 ? void 0 : _parentNode$left.type) === 'JsdocTypeName' &&
233
+ /**
234
+ * @type {import('jsdoc-type-pratt-parser').GenericResult}
235
+ */
236
+ (parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left2 = parentNode.left) === null || _parentNode$left2 === void 0 ? void 0 : _parentNode$left2.value) === 'Object')) {
180
237
  continue;
181
238
  }
182
239
  if (strictNativeType !== typeNodeName && strictNativeType.toLowerCase() === typeNodeName.toLowerCase() && (
@@ -198,10 +255,10 @@ var _default = (0, _iterateJsdoc.default)(({
198
255
  * @param {string} tagName
199
256
  * @param {string} nameInTag
200
257
  * @param {number} idx
201
- * @param {string} property
202
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} node
203
- * @param {import('jsdoc-type-pratt-parser/dist/src/index.d.ts').NonTerminalResult} parentNode
204
- * @param {string[]} invalidTypes
258
+ * @param {string|undefined} property
259
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult} node
260
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
261
+ * @param {(string|false|undefined)[][]} invalidTypes
205
262
  * @returns {void}
206
263
  */
207
264
  const getInvalidTypes = (type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes) => {
@@ -244,6 +301,7 @@ var _default = (0, _iterateJsdoc.default)(({
244
301
  }
245
302
  };
246
303
  for (const [idx, jsdocTag] of jsdocTagsWithPossibleType.entries()) {
304
+ /** @type {(string|false|undefined)[][]} */
247
305
  const invalidTypes = [];
248
306
  let typeAst;
249
307
  try {
@@ -259,7 +317,11 @@ var _default = (0, _iterateJsdoc.default)(({
259
317
  const {
260
318
  type,
261
319
  value
262
- } = node;
320
+ } =
321
+ /**
322
+ * @type {import('jsdoc-type-pratt-parser').NameResult}
323
+ */
324
+ node;
263
325
  if (!['JsdocTypeName', 'JsdocTypeAny'].includes(type)) {
264
326
  return;
265
327
  }
@@ -269,8 +331,7 @@ var _default = (0, _iterateJsdoc.default)(({
269
331
  const fixedType = (0, _jsdoccomment.stringify)(typeAst);
270
332
 
271
333
  /**
272
- * @param {any} fixer The ESLint fixer
273
- * @returns {string}
334
+ * @type {import('eslint').Rule.ReportFixer}
274
335
  */
275
336
  const fix = fixer => {
276
337
  return fixer.replaceText(jsdocNode, sourceCode.getText(jsdocNode).replace(`{${jsdocTag.type}}`, `{${fixedType}}`));
@@ -288,7 +349,7 @@ var _default = (0, _iterateJsdoc.default)(({
288
349
  report(msg || `Invalid JSDoc @${tagName}${tagValue} type "${badType}"` + (preferredType ? '; ' : '.') + (preferredType ? `prefer: ${JSON.stringify(preferredType)}.` : ''), preferredType ? fix : null, jsdocTag, msg ? {
289
350
  tagName,
290
351
  tagValue
291
- } : null);
352
+ } : undefined);
292
353
  }
293
354
  }
294
355
  }