{"version":3,"file":"requireTemplate.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","_default","exports","iterateJsdoc","context","node","report","settings","utils","avoidDocs","requireSeparateTemplates","options","mode","usedNames","Set","tgName","getPreferredTagName","tagName","templateTags","getTags","templateNames","flatMap","tag","parseClosureTemplateTag","names","length","checkTypeParams","aliasDeclaration","params","typeParameters","name","add","usedName","includes","handleTypes","nde","type","declaration","usedNameToTag","Map","checkForUsedTypes","potentialTag","parsedType","tryParseType","parseType","traverse","push","value","element","test","has","set","checkTagsAndTemplates","tagNames","preferredTagName","matchingTags","matchingTag","get","callbackTags","functionTags","typedefTags","potentialTypedef","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","exemptedBy","items","module"],"sources":["../../src/rules/requireTemplate.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n  parse as parseType,\n  traverse,\n  tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\n\nexport default iterateJsdoc(({\n  context,\n  node,\n  report,\n  settings,\n  utils,\n}) => {\n  if (utils.avoidDocs()) {\n    return;\n  }\n\n  const {\n    requireSeparateTemplates = false,\n  } = context.options[0] || {};\n\n  const {\n    mode,\n  } = settings;\n\n  const usedNames = new Set();\n\n  const tgName = /** @type {string} */ (utils.getPreferredTagName({\n    tagName: 'template',\n  }));\n  if (!tgName) {\n    return;\n  }\n\n  const templateTags = utils.getTags(tgName);\n\n  const templateNames = templateTags.flatMap((tag) => {\n    return utils.parseClosureTemplateTag(tag);\n  });\n\n  if (requireSeparateTemplates) {\n    for (const tag of templateTags) {\n      const names = utils.parseClosureTemplateTag(tag);\n      if (names.length > 1) {\n        report(`Missing separate @${tgName} for ${names[1]}`, null, tag);\n      }\n    }\n  }\n\n  /**\n   * @param {import('@typescript-eslint/types').TSESTree.FunctionDeclaration|\n   *   import('@typescript-eslint/types').TSESTree.ClassDeclaration|\n   *   import('@typescript-eslint/types').TSESTree.TSDeclareFunction|\n   *   import('@typescript-eslint/types').TSESTree.TSInterfaceDeclaration|\n   *   import('@typescript-eslint/types').TSESTree.TSTypeAliasDeclaration} aliasDeclaration\n   */\n  const checkTypeParams = (aliasDeclaration) => {\n    const {\n      params,\n      /* c8 ignore next -- Guard */\n    } = aliasDeclaration.typeParameters ?? {\n      /* c8 ignore next -- Guard */\n      params: [],\n    };\n    for (const {\n      name: {\n        name,\n      },\n    } of params) {\n      usedNames.add(name);\n    }\n\n    for (const usedName of usedNames) {\n      if (!templateNames.includes(usedName)) {\n        report(`Missing @${tgName} ${usedName}`);\n      }\n    }\n  };\n\n  const handleTypes = () => {\n    const nde = /** @type {import('@typescript-eslint/types').TSESTree.Node} */ (\n      node\n    );\n    if (!nde) {\n      return;\n    }\n\n    switch (nde.type) {\n      case 'ClassDeclaration':\n      case 'FunctionDeclaration':\n      case 'TSDeclareFunction':\n      case 'TSInterfaceDeclaration':\n      case 'TSTypeAliasDeclaration':\n        checkTypeParams(nde);\n        break;\n      case 'ExportDefaultDeclaration':\n        switch (nde.declaration?.type) {\n          case 'ClassDeclaration':\n          case 'FunctionDeclaration':\n          case 'TSInterfaceDeclaration':\n            checkTypeParams(nde.declaration);\n            break;\n        }\n\n        break;\n      case 'ExportNamedDeclaration':\n        switch (nde.declaration?.type) {\n          case 'ClassDeclaration':\n          case 'FunctionDeclaration':\n          case 'TSDeclareFunction':\n          case 'TSInterfaceDeclaration':\n          case 'TSTypeAliasDeclaration':\n            checkTypeParams(nde.declaration);\n            break;\n        }\n\n        break;\n    }\n  };\n\n  const usedNameToTag = new Map();\n\n  /**\n   * @param {import('comment-parser').Spec} potentialTag\n   */\n  const checkForUsedTypes = (potentialTag) => {\n    let parsedType;\n    try {\n      parsedType = mode === 'permissive' ?\n        tryParseType(/** @type {string} */ (potentialTag.type)) :\n        parseType(/** @type {string} */ (potentialTag.type), mode);\n    } catch {\n      return;\n    }\n\n    traverse(parsedType, (nde) => {\n      if (nde.type === 'JsdocTypeTypeParameter') {\n        templateNames.push(nde.name.value);\n        return;\n      }\n\n      if (nde.type === 'JsdocTypeInfer') {\n        templateNames.push(nde.element.value);\n        return;\n      }\n\n      const {\n        type,\n        value,\n      } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n\n      if (type === 'JsdocTypeName' && (/^[A-Z]$/v).test(value)) {\n        usedNames.add(value);\n        if (!usedNameToTag.has(value)) {\n          usedNameToTag.set(value, potentialTag);\n        }\n      }\n    });\n  };\n\n  /**\n   * @param {string[]} tagNames\n   */\n  const checkTagsAndTemplates = (tagNames) => {\n    for (const tagName of tagNames) {\n      const preferredTagName = /** @type {string} */ (utils.getPreferredTagName({\n        tagName,\n      }));\n      const matchingTags = utils.getTags(preferredTagName);\n      for (const matchingTag of matchingTags) {\n        checkForUsedTypes(matchingTag);\n      }\n    }\n\n    // Could check against whitelist/blacklist\n    for (const usedName of usedNames) {\n      if (!templateNames.includes(usedName)) {\n        report(`Missing @${tgName} ${usedName}`, null, usedNameToTag.get(usedName));\n      }\n    }\n  };\n\n  const callbackTags = utils.getTags('callback');\n  const functionTags = utils.getTags('function');\n  if (callbackTags.length || functionTags.length) {\n    checkTagsAndTemplates([\n      'param', 'returns',\n    ]);\n    return;\n  }\n\n  const typedefTags = utils.getTags('typedef');\n  if (!typedefTags.length || typedefTags.length >= 2) {\n    handleTypes();\n    return;\n  }\n\n  const potentialTypedef = typedefTags[0];\n  checkForUsedTypes(potentialTypedef);\n\n  checkTagsAndTemplates([\n    'property',\n  ]);\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    docs: {\n      description: 'Requires `@template` tags be present when type parameters are used.',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-template.md#repos-sticky-header',\n    },\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          exemptedBy: {\n            description: `Array of tags (e.g., \\`['type']\\`) whose presence on the document\nblock avoids the need for a \\`@template\\`. Defaults to an array with\n\\`inheritdoc\\`. If you set this array, it will overwrite the default,\nso be sure to add back \\`inheritdoc\\` if you wish its presence to cause\nexemption of the rule.`,\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          requireSeparateTemplates: {\n            description: `Requires that each template have its own separate line, i.e., preventing\ntemplates of this format:\n\n\\`\\`\\`js\n/**\n * @template T, U, V\n */\n\\`\\`\\`\n\nDefaults to \\`false\\`.`,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}