{"version":3,"file":"checkTagNames.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_escapeStringRegexp","e","__esModule","default","jsxTagNames","Set","typedTagsAlwaysUnnecessary","typedTagsNeedingName","typedTagsUnnecessaryOutsideDeclare","_default","exports","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","Boolean","isInAmbientContext","subNode","type","getFilename","endsWith","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","module"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport escapeStringRegexp from 'escape-string-regexp';\n\n// https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/\nconst jsxTagNames = new Set([\n  'jsx',\n  'jsxFrag',\n  'jsxImportSource',\n  'jsxRuntime',\n]);\n\nconst typedTagsAlwaysUnnecessary = new Set([\n  'augments',\n  'callback',\n  'class',\n  'enum',\n  'implements',\n  'private',\n  'property',\n  'protected',\n  'public',\n  'readonly',\n  'this',\n  'type',\n  'typedef',\n]);\n\nconst typedTagsNeedingName = new Set([\n  'template',\n]);\n\nconst typedTagsUnnecessaryOutsideDeclare = new Set([\n  'abstract',\n  'access',\n  'class',\n  'constant',\n  'constructs',\n  'default',\n  'enum',\n  'export',\n  'exports',\n  'function',\n  'global',\n  'inherits',\n  'instance',\n  'interface',\n  'member',\n  'memberof',\n  'memberOf',\n  'method',\n  'mixes',\n  'mixin',\n  'module',\n  'name',\n  'namespace',\n  'override',\n  'property',\n  'requires',\n  'static',\n  'this',\n]);\n\nexport default iterateJsdoc(({\n  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(Boolean);\n  }\n\n  /**\n   * @param {import('eslint').Rule.Node} subNode\n   * @returns {boolean}\n   */\n  const isInAmbientContext = (subNode) => {\n    return subNode.type === 'Program' ?\n      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  /**\n   * @param {string} message\n   * @param {import('comment-parser').Spec} jsdocTag\n   * @param {import('../iterateJsdoc.js').Integer} tagIndex\n   * @param {Partial<import('comment-parser').Tokens>} [additionalTagChanges]\n   * @returns {void}\n   */\n  const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {\n    utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {\n      if (jsdocTag.description.trim()) {\n        utils.changeTag(jsdocTag, {\n          postType: '',\n          type: '',\n          ...additionalTagChanges,\n        });\n      } else {\n        utils.removeTag(tagIndex, {\n          removeEmptyBlock: true,\n        });\n      }\n    } : null, true);\n  };\n\n  /**\n   * @param {import('comment-parser').Spec} jsdocTag\n   * @param {import('../iterateJsdoc.js').Integer} tagIndex\n   * @returns {boolean}\n   */\n  const checkTagForTypedValidity = (jsdocTag, tagIndex) => {\n    if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {\n      reportWithTagRemovalFixer(\n        `'@${jsdocTag.tag}' is redundant when using a type system.`,\n        jsdocTag,\n        tagIndex,\n        {\n          postTag: '',\n          tag: '',\n        },\n      );\n      return true;\n    }\n\n    if (tagIsRedundantWhenTyped(jsdocTag)) {\n      reportWithTagRemovalFixer(\n        `'@${jsdocTag.tag}' is redundant outside of ambient (\\`declare\\`/\\`.d.ts\\`) contexts when using a type system.`,\n        jsdocTag,\n        tagIndex,\n      );\n      return true;\n    }\n\n    if (typedTagsNeedingName.has(jsdocTag.tag) && !jsdocTag.name) {\n      reportWithTagRemovalFixer(\n        `'@${jsdocTag.tag}' without a name is redundant when using a type system.`,\n        jsdocTag,\n        tagIndex,\n      );\n      return true;\n    }\n\n    return false;\n  };\n\n  for (let tagIndex = 0; tagIndex < jsdoc.tags.length; tagIndex += 1) {\n    const jsdocTag = jsdoc.tags[tagIndex];\n    const tagName = jsdocTag.tag;\n    if (jsxTags && jsxTagNames.has(tagName)) {\n      continue;\n    }\n\n    if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {\n      continue;\n    }\n\n    const validTags = [\n      ...definedTags,\n      ...(/** @type {string[]} */ (definedPreferredTags)),\n      ...definedNonPreferredTags,\n      ...definedStructuredTags,\n      ...typed ? typedTagsNeedingName : [],\n    ];\n\n    if (utils.isValidTag(tagName, validTags)) {\n      let preferredTagName = utils.getPreferredTagName({\n        allowObjectReturn: true,\n        defaultMessage: `Blacklisted tag found (\\`@${tagName}\\`)`,\n        tagName,\n      });\n      if (!preferredTagName) {\n        continue;\n      }\n\n      let message;\n      if (typeof preferredTagName === 'object') {\n        ({\n          message,\n          replacement: preferredTagName,\n        } = /** @type {{message: string; replacement?: string | undefined;}} */ (\n          preferredTagName\n        ));\n      }\n\n      if (!message) {\n        message = `Invalid JSDoc tag (preference). Replace \"${tagName}\" JSDoc tag with \"${preferredTagName}\".`;\n      }\n\n      if (preferredTagName !== tagName) {\n        report(message, (fixer) => {\n          const replacement = sourceCode.getText(jsdocNode).replace(\n            new RegExp(`@${escapeStringRegexp(tagName)}\\\\b`, '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/blob/main/docs/rules/check-tag-names.md#repos-sticky-header',\n    },\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          definedTags: {\n            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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","ignoreList":[]}