eslint-plugin-jsdoc 48.1.0 → 48.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
13
  * @param {boolean} checkRestProperty
14
14
  * @param {RegExp} checkTypesRegex
15
15
  * @param {boolean} disableExtraPropertyReporting
16
+ * @param {boolean} disableMissingParamChecks
16
17
  * @param {boolean} enableFixer
17
18
  * @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames
18
19
  * @param {import('comment-parser').Block} jsdoc
@@ -20,7 +21,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
20
21
  * @param {import('../iterateJsdoc.js').Report} report
21
22
  * @returns {boolean}
22
23
  */
23
- const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, enableFixer, functionParameterNames, jsdoc, utils, report) => {
24
+ const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, disableMissingParamChecks, enableFixer, functionParameterNames, jsdoc, utils, report) => {
24
25
  const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
25
26
  return tag.tag === targetTagName;
26
27
  });
@@ -183,8 +184,18 @@ const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, chec
183
184
  return item;
184
185
  }).filter(item => {
185
186
  return item !== 'this';
186
- }).join(', ');
187
- report(`Expected @${targetTagName} names to be "${expectedNames}". Got "${actualNames.join(', ')}".`, null, tag);
187
+ });
188
+
189
+ // When disableMissingParamChecks is true tag names can be omitted.
190
+ // Report when the tag names do not match the expected names or they are used out of order.
191
+ if (disableMissingParamChecks) {
192
+ const usedExpectedNames = expectedNames.map(a => a === null || a === void 0 ? void 0 : a.toString()).filter(expectedName => expectedName && actualNames.includes(expectedName));
193
+ const usedInOrder = actualNames.every((actualName, idx) => actualName === usedExpectedNames[idx]);
194
+ if (usedInOrder) {
195
+ return false;
196
+ }
197
+ }
198
+ report(`Expected @${targetTagName} names to be "${expectedNames.join(', ')}". Got "${actualNames.join(', ')}".`, null, tag);
188
199
  return true;
189
200
  }
190
201
  return false;
@@ -242,7 +253,8 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
242
253
  checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',
243
254
  enableFixer = false,
244
255
  useDefaultObjectProperties = false,
245
- disableExtraPropertyReporting = false
256
+ disableExtraPropertyReporting = false,
257
+ disableMissingParamChecks = false
246
258
  } = context.options[0] || {};
247
259
  const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);
248
260
  const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');
@@ -253,7 +265,7 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
253
265
  const targetTagName = /** @type {string} */utils.getPreferredTagName({
254
266
  tagName: 'param'
255
267
  });
256
- const isError = validateParameterNames(targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, enableFixer, functionParameterNames, jsdoc, utils, report);
268
+ const isError = validateParameterNames(targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, disableMissingParamChecks, enableFixer, functionParameterNames, jsdoc, utils, report);
257
269
  if (isError || !checkDestructured) {
258
270
  return;
259
271
  }
@@ -283,6 +295,9 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
283
295
  disableExtraPropertyReporting: {
284
296
  type: 'boolean'
285
297
  },
298
+ disableMissingParamChecks: {
299
+ type: 'boolean'
300
+ },
286
301
  enableFixer: {
287
302
  type: 'boolean'
288
303
  },
@@ -1 +1 @@
1
- {"version":3,"file":"checkParamNames.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validateParameterNames","targetTagName","allowExtraTrailingParamDocs","checkDestructured","checkRestProperty","checkTypesRegex","disableExtraPropertyReporting","enableFixer","functionParameterNames","jsdoc","utils","report","paramTags","Object","entries","tags","filter","tag","paramTagsNonNested","name","includes","dotted","thisOffset","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","Number","reportJSDoc","removeTag","functionParameterName","trim","Array","isArray","type","search","parameterName","names","properties","hasPropertyRest","rests","annotationParamName","undefined","tagName","expectedNames","map","actualNames","paramTag","actualTypes","missingProperties","notCheckingNames","notCheckingName","startsWith","actualNameIdx","findIndex","actualName","comparePaths","missingIndex","pathDoesNotBeginWith","line","source","number","length","push","tagPlacement","hasMissing","missingProperty","extraProperties","match","prop","split","extraProperty","funcParamName","item","_item$","join","validateParameterNamesDeep","_allowExtraTrailingParamDocs","jsdocParameterNames","lastRealParameter","jsdocParameterName","isPropertyPath","pathRootNodeName","slice","indexOf","endsWith","_default","exports","iterateJsdoc","context","checkTypesPattern","useDefaultObjectProperties","options","getRegexFromString","jsdocParameterNamesDeep","getJsdocTagsDeep","getFunctionParameterNames","getPreferredTagName","isError","meta","docs","description","url","fixable","schema","additionalProperties","module"],"sources":["../../src/rules/checkParamNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} allowExtraTrailingParamDocs\n * @param {boolean} checkDestructured\n * @param {boolean} checkRestProperty\n * @param {RegExp} checkTypesRegex\n * @param {boolean} disableExtraPropertyReporting\n * @param {boolean} enableFixer\n * @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {import('../iterateJsdoc.js').Report} report\n * @returns {boolean}\n */\nconst validateParameterNames = (\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n enableFixer,\n functionParameterNames, jsdoc, utils, report,\n) => {\n const paramTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n const paramTagsNonNested = paramTags.filter(([\n , tag,\n ]) => {\n return !tag.name.includes('.');\n });\n\n let dotted = 0;\n let thisOffset = 0;\n\n // eslint-disable-next-line complexity\n return paramTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = paramTags.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 if (tag.name.includes('.')) {\n dotted++;\n\n return false;\n }\n\n let functionParameterName = functionParameterNames[index - dotted + thisOffset];\n if (functionParameterName === 'this' && tag.name.trim() !== 'this') {\n ++thisOffset;\n functionParameterName = functionParameterNames[index - dotted + thisOffset];\n }\n\n if (!functionParameterName) {\n if (allowExtraTrailingParamDocs) {\n return false;\n }\n\n report(\n `@${targetTagName} \"${tag.name}\" does not match an existing function parameter.`,\n null,\n tag,\n );\n\n return true;\n }\n\n if (Array.isArray(functionParameterName)) {\n if (!checkDestructured) {\n return false;\n }\n\n if (tag.type && tag.type.search(checkTypesRegex) === -1) {\n return false;\n }\n\n const [\n parameterName,\n {\n names: properties,\n hasPropertyRest,\n rests,\n annotationParamName,\n },\n ] =\n /**\n * @type {[string | undefined, import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string | undefined;\n }]} */ (functionParameterName);\n if (annotationParamName !== undefined) {\n const name = tag.name.trim();\n if (name !== annotationParamName) {\n report(`@${targetTagName} \"${name}\" does not match parameter name \"${annotationParamName}\"`, null, tag);\n }\n }\n\n const tagName = parameterName === undefined ? tag.name.trim() : parameterName;\n const expectedNames = properties.map((name) => {\n return `${tagName}.${name}`;\n });\n const actualNames = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.name.trim();\n });\n const actualTypes = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.type;\n });\n\n const missingProperties = [];\n\n /** @type {string[]} */\n const notCheckingNames = [];\n\n for (const [\n idx,\n name,\n ] of expectedNames.entries()) {\n if (notCheckingNames.some((notCheckingName) => {\n return name.startsWith(notCheckingName);\n })) {\n continue;\n }\n\n const actualNameIdx = actualNames.findIndex((actualName) => {\n return utils.comparePaths(name)(actualName);\n });\n if (actualNameIdx === -1) {\n if (!checkRestProperty && rests[idx]) {\n continue;\n }\n\n const missingIndex = actualNames.findIndex((actualName) => {\n return utils.pathDoesNotBeginWith(name, actualName);\n });\n const line = tag.source[0].number - 1 + (missingIndex > -1 ? missingIndex : actualNames.length);\n missingProperties.push({\n name,\n tagPlacement: {\n line: line === 0 ? 1 : line,\n },\n });\n } else if (actualTypes[actualNameIdx].search(checkTypesRegex) === -1 && actualTypes[actualNameIdx] !== '') {\n notCheckingNames.push(name);\n }\n }\n\n const hasMissing = missingProperties.length;\n if (hasMissing) {\n for (const {\n tagPlacement,\n name: missingProperty,\n } of missingProperties) {\n report(`Missing @${targetTagName} \"${missingProperty}\"`, null, tagPlacement);\n }\n }\n\n if (!hasPropertyRest || checkRestProperty) {\n /** @type {[string, import('comment-parser').Spec][]} */\n const extraProperties = [];\n for (const [\n idx,\n name,\n ] of actualNames.entries()) {\n const match = name.startsWith(tag.name.trim() + '.');\n if (\n match && !expectedNames.some(\n utils.comparePaths(name),\n ) && !utils.comparePaths(name)(tag.name) &&\n (!disableExtraPropertyReporting || properties.some((prop) => {\n return prop.split('.').length >= name.split('.').length - 1;\n }))\n ) {\n extraProperties.push([\n name, paramTags[idx][1],\n ]);\n }\n }\n\n if (extraProperties.length) {\n for (const [\n extraProperty,\n tg,\n ] of extraProperties) {\n report(`@${targetTagName} \"${extraProperty}\" does not exist on ${tag.name}`, null, tg);\n }\n\n return true;\n }\n }\n\n return hasMissing;\n }\n\n let funcParamName;\n if (typeof functionParameterName === 'object') {\n const {\n name,\n } = functionParameterName;\n funcParamName = name;\n } else {\n funcParamName = functionParameterName;\n }\n\n if (funcParamName !== tag.name.trim()) {\n // Todo: Improve for array or object child items\n const actualNames = paramTagsNonNested.map(([\n , {\n name,\n },\n ]) => {\n return name.trim();\n });\n const expectedNames = functionParameterNames.map((item, idx) => {\n if (/**\n * @type {[string|undefined, (import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string,\n })]} */ (item)?.[1]?.names) {\n return actualNames[idx];\n }\n\n return item;\n }).filter((item) => {\n return item !== 'this';\n }).join(', ');\n\n report(\n `Expected @${targetTagName} names to be \"${expectedNames}\". Got \"${actualNames.join(', ')}\".`,\n null,\n tag,\n );\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {boolean} _allowExtraTrailingParamDocs\n * @param {{\n * name: string,\n * idx: import('../iterateJsdoc.js').Integer\n * }[]} jsdocParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n * @returns {boolean}\n */\nconst validateParameterNamesDeep = (\n targetTagName, _allowExtraTrailingParamDocs,\n jsdocParameterNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealParameter;\n\n return jsdocParameterNames.some(({\n name: jsdocParameterName,\n idx,\n }) => {\n const isPropertyPath = jsdocParameterName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealParameter) {\n report(`@${targetTagName} path declaration (\"${jsdocParameterName}\") appears before any real parameter.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealParameter) {\n report(\n `@${targetTagName} path declaration (\"${jsdocParameterName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real parameter name (\"${lastRealParameter}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealParameter = jsdocParameterName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n allowExtraTrailingParamDocs,\n checkDestructured = true,\n checkRestProperty = false,\n checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',\n enableFixer = false,\n useDefaultObjectProperties = false,\n disableExtraPropertyReporting = false,\n } = context.options[0] || {};\n\n const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);\n\n const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');\n if (!jsdocParameterNamesDeep || !jsdocParameterNamesDeep.length) {\n return;\n }\n\n const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n const isError = validateParameterNames(\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n enableFixer,\n functionParameterNames,\n jsdoc,\n utils,\n report,\n );\n\n if (isError || !checkDestructured) {\n return;\n }\n\n validateParameterNamesDeep(\n targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report,\n );\n}, {\n meta: {\n docs: {\n description: 'Ensures that parameter names in JSDoc match those in the function declaration.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-param-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowExtraTrailingParamDocs: {\n type: 'boolean',\n },\n checkDestructured: {\n type: 'boolean',\n },\n checkRestProperty: {\n type: 'boolean',\n },\n checkTypesPattern: {\n type: 'string',\n },\n disableExtraPropertyReporting: {\n type: 'boolean',\n },\n enableFixer: {\n type: 'boolean',\n },\n useDefaultObjectProperties: {\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":"checkParamNames.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validateParameterNames","targetTagName","allowExtraTrailingParamDocs","checkDestructured","checkRestProperty","checkTypesRegex","disableExtraPropertyReporting","disableMissingParamChecks","enableFixer","functionParameterNames","jsdoc","utils","report","paramTags","Object","entries","tags","filter","tag","paramTagsNonNested","name","includes","dotted","thisOffset","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","Number","reportJSDoc","removeTag","functionParameterName","trim","Array","isArray","type","search","parameterName","names","properties","hasPropertyRest","rests","annotationParamName","undefined","tagName","expectedNames","map","actualNames","paramTag","actualTypes","missingProperties","notCheckingNames","notCheckingName","startsWith","actualNameIdx","findIndex","actualName","comparePaths","missingIndex","pathDoesNotBeginWith","line","source","number","length","push","tagPlacement","hasMissing","missingProperty","extraProperties","match","prop","split","extraProperty","funcParamName","item","_item$","usedExpectedNames","a","toString","expectedName","usedInOrder","every","join","validateParameterNamesDeep","_allowExtraTrailingParamDocs","jsdocParameterNames","lastRealParameter","jsdocParameterName","isPropertyPath","pathRootNodeName","slice","indexOf","endsWith","_default","exports","iterateJsdoc","context","checkTypesPattern","useDefaultObjectProperties","options","getRegexFromString","jsdocParameterNamesDeep","getJsdocTagsDeep","getFunctionParameterNames","getPreferredTagName","isError","meta","docs","description","url","fixable","schema","additionalProperties","module"],"sources":["../../src/rules/checkParamNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} allowExtraTrailingParamDocs\n * @param {boolean} checkDestructured\n * @param {boolean} checkRestProperty\n * @param {RegExp} checkTypesRegex\n * @param {boolean} disableExtraPropertyReporting\n * @param {boolean} disableMissingParamChecks\n * @param {boolean} enableFixer\n * @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {import('../iterateJsdoc.js').Report} report\n * @returns {boolean}\n */\nconst validateParameterNames = (\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n disableMissingParamChecks,\n enableFixer,\n functionParameterNames, jsdoc, utils, report,\n) => {\n const paramTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n const paramTagsNonNested = paramTags.filter(([\n , tag,\n ]) => {\n return !tag.name.includes('.');\n });\n\n let dotted = 0;\n let thisOffset = 0;\n\n // eslint-disable-next-line complexity\n return paramTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = paramTags.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 if (tag.name.includes('.')) {\n dotted++;\n\n return false;\n }\n\n let functionParameterName = functionParameterNames[index - dotted + thisOffset];\n if (functionParameterName === 'this' && tag.name.trim() !== 'this') {\n ++thisOffset;\n functionParameterName = functionParameterNames[index - dotted + thisOffset];\n }\n\n if (!functionParameterName) {\n if (allowExtraTrailingParamDocs) {\n return false;\n }\n\n report(\n `@${targetTagName} \"${tag.name}\" does not match an existing function parameter.`,\n null,\n tag,\n );\n\n return true;\n }\n\n if (Array.isArray(functionParameterName)) {\n if (!checkDestructured) {\n return false;\n }\n\n if (tag.type && tag.type.search(checkTypesRegex) === -1) {\n return false;\n }\n\n const [\n parameterName,\n {\n names: properties,\n hasPropertyRest,\n rests,\n annotationParamName,\n },\n ] =\n /**\n * @type {[string | undefined, import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string | undefined;\n }]} */ (functionParameterName);\n if (annotationParamName !== undefined) {\n const name = tag.name.trim();\n if (name !== annotationParamName) {\n report(`@${targetTagName} \"${name}\" does not match parameter name \"${annotationParamName}\"`, null, tag);\n }\n }\n\n const tagName = parameterName === undefined ? tag.name.trim() : parameterName;\n const expectedNames = properties.map((name) => {\n return `${tagName}.${name}`;\n });\n const actualNames = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.name.trim();\n });\n const actualTypes = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.type;\n });\n\n const missingProperties = [];\n\n /** @type {string[]} */\n const notCheckingNames = [];\n\n for (const [\n idx,\n name,\n ] of expectedNames.entries()) {\n if (notCheckingNames.some((notCheckingName) => {\n return name.startsWith(notCheckingName);\n })) {\n continue;\n }\n\n const actualNameIdx = actualNames.findIndex((actualName) => {\n return utils.comparePaths(name)(actualName);\n });\n if (actualNameIdx === -1) {\n if (!checkRestProperty && rests[idx]) {\n continue;\n }\n\n const missingIndex = actualNames.findIndex((actualName) => {\n return utils.pathDoesNotBeginWith(name, actualName);\n });\n const line = tag.source[0].number - 1 + (missingIndex > -1 ? missingIndex : actualNames.length);\n missingProperties.push({\n name,\n tagPlacement: {\n line: line === 0 ? 1 : line,\n },\n });\n } else if (actualTypes[actualNameIdx].search(checkTypesRegex) === -1 && actualTypes[actualNameIdx] !== '') {\n notCheckingNames.push(name);\n }\n }\n\n const hasMissing = missingProperties.length;\n if (hasMissing) {\n for (const {\n tagPlacement,\n name: missingProperty,\n } of missingProperties) {\n report(`Missing @${targetTagName} \"${missingProperty}\"`, null, tagPlacement);\n }\n }\n\n if (!hasPropertyRest || checkRestProperty) {\n /** @type {[string, import('comment-parser').Spec][]} */\n const extraProperties = [];\n for (const [\n idx,\n name,\n ] of actualNames.entries()) {\n const match = name.startsWith(tag.name.trim() + '.');\n if (\n match && !expectedNames.some(\n utils.comparePaths(name),\n ) && !utils.comparePaths(name)(tag.name) &&\n (!disableExtraPropertyReporting || properties.some((prop) => {\n return prop.split('.').length >= name.split('.').length - 1;\n }))\n ) {\n extraProperties.push([\n name, paramTags[idx][1],\n ]);\n }\n }\n\n if (extraProperties.length) {\n for (const [\n extraProperty,\n tg,\n ] of extraProperties) {\n report(`@${targetTagName} \"${extraProperty}\" does not exist on ${tag.name}`, null, tg);\n }\n\n return true;\n }\n }\n\n return hasMissing;\n }\n\n let funcParamName;\n if (typeof functionParameterName === 'object') {\n const {\n name,\n } = functionParameterName;\n funcParamName = name;\n } else {\n funcParamName = functionParameterName;\n }\n\n if (funcParamName !== tag.name.trim()) {\n // Todo: Improve for array or object child items\n const actualNames = paramTagsNonNested.map(([\n , {\n name,\n },\n ]) => {\n return name.trim();\n });\n const expectedNames = functionParameterNames.map((item, idx) => {\n if (/**\n * @type {[string|undefined, (import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string,\n })]} */ (item)?.[1]?.names) {\n return actualNames[idx];\n }\n\n return item;\n }).filter((item) => {\n return item !== 'this';\n });\n\n // When disableMissingParamChecks is true tag names can be omitted.\n // Report when the tag names do not match the expected names or they are used out of order.\n if (disableMissingParamChecks) {\n const usedExpectedNames = expectedNames.map(a => a?.toString()).filter(expectedName => expectedName && actualNames.includes(expectedName));\n const usedInOrder = actualNames.every((actualName, idx) => actualName === usedExpectedNames[idx]);\n if (usedInOrder) {\n return false;\n }\n }\n\n report(\n `Expected @${targetTagName} names to be \"${expectedNames.join(', ')}\". Got \"${actualNames.join(', ')}\".`,\n null,\n tag,\n );\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {boolean} _allowExtraTrailingParamDocs\n * @param {{\n * name: string,\n * idx: import('../iterateJsdoc.js').Integer\n * }[]} jsdocParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n * @returns {boolean}\n */\nconst validateParameterNamesDeep = (\n targetTagName, _allowExtraTrailingParamDocs,\n jsdocParameterNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealParameter;\n\n return jsdocParameterNames.some(({\n name: jsdocParameterName,\n idx,\n }) => {\n const isPropertyPath = jsdocParameterName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealParameter) {\n report(`@${targetTagName} path declaration (\"${jsdocParameterName}\") appears before any real parameter.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealParameter) {\n report(\n `@${targetTagName} path declaration (\"${jsdocParameterName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real parameter name (\"${lastRealParameter}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealParameter = jsdocParameterName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n allowExtraTrailingParamDocs,\n checkDestructured = true,\n checkRestProperty = false,\n checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',\n enableFixer = false,\n useDefaultObjectProperties = false,\n disableExtraPropertyReporting = false,\n disableMissingParamChecks = false,\n } = context.options[0] || {};\n\n const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);\n\n const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');\n if (!jsdocParameterNamesDeep || !jsdocParameterNamesDeep.length) {\n return;\n }\n\n const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n const isError = validateParameterNames(\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n disableMissingParamChecks,\n enableFixer,\n functionParameterNames,\n jsdoc,\n utils,\n report,\n );\n\n if (isError || !checkDestructured) {\n return;\n }\n\n validateParameterNamesDeep(\n targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report,\n );\n}, {\n meta: {\n docs: {\n description: 'Ensures that parameter names in JSDoc match those in the function declaration.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-param-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowExtraTrailingParamDocs: {\n type: 'boolean',\n },\n checkDestructured: {\n type: 'boolean',\n },\n checkRestProperty: {\n type: 'boolean',\n },\n checkTypesPattern: {\n type: 'string',\n },\n disableExtraPropertyReporting: {\n type: 'boolean',\n },\n disableMissingParamChecks: {\n type: 'boolean',\n },\n enableFixer: {\n type: 'boolean',\n },\n useDefaultObjectProperties: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -141,5 +141,5 @@
141
141
  "test-cov": "cross-env TIMING=1 c8 --reporter text npm run test-no-cov",
142
142
  "test-index": "npm run test-no-cov -- test/rules/index.js"
143
143
  },
144
- "version": "48.1.0"
144
+ "version": "48.2.0"
145
145
  }
@@ -7,6 +7,7 @@ import iterateJsdoc from '../iterateJsdoc.js';
7
7
  * @param {boolean} checkRestProperty
8
8
  * @param {RegExp} checkTypesRegex
9
9
  * @param {boolean} disableExtraPropertyReporting
10
+ * @param {boolean} disableMissingParamChecks
10
11
  * @param {boolean} enableFixer
11
12
  * @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames
12
13
  * @param {import('comment-parser').Block} jsdoc
@@ -21,6 +22,7 @@ const validateParameterNames = (
21
22
  checkRestProperty,
22
23
  checkTypesRegex,
23
24
  disableExtraPropertyReporting,
25
+ disableMissingParamChecks,
24
26
  enableFixer,
25
27
  functionParameterNames, jsdoc, utils, report,
26
28
  ) => {
@@ -245,10 +247,20 @@ const validateParameterNames = (
245
247
  return item;
246
248
  }).filter((item) => {
247
249
  return item !== 'this';
248
- }).join(', ');
250
+ });
251
+
252
+ // When disableMissingParamChecks is true tag names can be omitted.
253
+ // Report when the tag names do not match the expected names or they are used out of order.
254
+ if (disableMissingParamChecks) {
255
+ const usedExpectedNames = expectedNames.map(a => a?.toString()).filter(expectedName => expectedName && actualNames.includes(expectedName));
256
+ const usedInOrder = actualNames.every((actualName, idx) => actualName === usedExpectedNames[idx]);
257
+ if (usedInOrder) {
258
+ return false;
259
+ }
260
+ }
249
261
 
250
262
  report(
251
- `Expected @${targetTagName} names to be "${expectedNames}". Got "${actualNames.join(', ')}".`,
263
+ `Expected @${targetTagName} names to be "${expectedNames.join(', ')}". Got "${actualNames.join(', ')}".`,
252
264
  null,
253
265
  tag,
254
266
  );
@@ -329,6 +341,7 @@ export default iterateJsdoc(({
329
341
  enableFixer = false,
330
342
  useDefaultObjectProperties = false,
331
343
  disableExtraPropertyReporting = false,
344
+ disableMissingParamChecks = false,
332
345
  } = context.options[0] || {};
333
346
 
334
347
  const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);
@@ -349,6 +362,7 @@ export default iterateJsdoc(({
349
362
  checkRestProperty,
350
363
  checkTypesRegex,
351
364
  disableExtraPropertyReporting,
365
+ disableMissingParamChecks,
352
366
  enableFixer,
353
367
  functionParameterNames,
354
368
  jsdoc,
@@ -389,6 +403,9 @@ export default iterateJsdoc(({
389
403
  disableExtraPropertyReporting: {
390
404
  type: 'boolean',
391
405
  },
406
+ disableMissingParamChecks: {
407
+ type: 'boolean',
408
+ },
392
409
  enableFixer: {
393
410
  type: 'boolean',
394
411
  },