eslint-plugin-jsdoc
Version:
JSDoc linting rules for ESLint.
1 lines • 8.03 kB
Source Map (JSON)
{"version":3,"file":"checkPropertyNames.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__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","exports","iterateJsdoc","context","options","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","module"],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\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 {import('../iterateJsdoc.js').Report} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n idx,\n name: jsdocPropertyName,\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/blob/main/docs/rules/check-property-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n description: `Set to \\`true\\` to auto-remove \\`@property\\` duplicates (based on\nidentical names).\n\nNote that this option will remove duplicates of the same name even if\nthe definitions do not match in other ways (e.g., the second property will\nbe removed even if it has a different type or description).`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}