{"version":3,"file":"checkTemplateNames.cjs","names":["_iterateJsdoc","_interopRequireWildcard","require","_jsdocUtils","_jsdoccomment","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","exports","iterateJsdoc","jsdoc","node","report","settings","sourceCode","utils","mode","templateTags","getTags","usedNames","Set","checkForUsedTypes","potentialType","parsedType","tryParseType","parseType","traverse","nde","type","value","add","checkParamsAndReturnsTags","jsdc","paramName","getPreferredTagName","tagName","paramTags","paramTag","returnsName","returnsTags","returnsTag","checkTemplateTags","tag","name","names","split","nme","checkParameters","aliasDeclaration","checkParamsAndReturns","params","typeParameters","body","commentNode","getJSDocComment","innerJsdoc","parseComment","typeName","typeTags","typeTag","handleTypeAliases","declaration","callbackTags","functionTags","length","typedefTags","potentialTypedefType","propertyName","propertyTags","propertyTag","iterateAllJsdocs","meta","docs","description","url","schema","module"],"sources":["../../src/rules/checkTemplateNames.js"],"sourcesContent":["import iterateJsdoc, {\n  parseComment,\n} from '../iterateJsdoc.js';\nimport {\n  getTags,\n} from '../jsdocUtils.js';\nimport {\n  getJSDocComment,\n  parse as parseType,\n  traverse,\n  tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  node,\n  report,\n  settings,\n  sourceCode,\n  utils,\n}) => {\n  const {\n    mode,\n  } = settings;\n\n  const templateTags = utils.getTags('template');\n\n  const usedNames = new Set();\n  /**\n   * @param {string} potentialType\n   */\n  const checkForUsedTypes = (potentialType) => {\n    let parsedType;\n    try {\n      parsedType = mode === 'permissive' ?\n        tryParseType(/** @type {string} */ (potentialType)) :\n        parseType(/** @type {string} */ (potentialType), mode);\n    } catch {\n      return;\n    }\n\n    traverse(parsedType, (nde) => {\n      const {\n        type,\n        value,\n      } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n      if (type === 'JsdocTypeName') {\n        usedNames.add(value);\n      }\n    });\n  };\n\n  const checkParamsAndReturnsTags = (jsdc = jsdoc) => {\n    const paramName = /** @type {string} */ (utils.getPreferredTagName({\n      tagName: 'param',\n    }));\n    const paramTags = getTags(jsdc, paramName);\n    for (const paramTag of paramTags) {\n      checkForUsedTypes(paramTag.type);\n    }\n\n    const returnsName = /** @type {string} */ (utils.getPreferredTagName({\n      tagName: 'returns',\n    }));\n    const returnsTags = getTags(jsdc, returnsName);\n    for (const returnsTag of returnsTags) {\n      checkForUsedTypes(returnsTag.type);\n    }\n  };\n\n  const checkTemplateTags = () => {\n    for (const tag of templateTags) {\n      const {\n        name,\n      } = tag;\n      const names = name.split(/,\\s*/u);\n      for (const nme of names) {\n        if (!usedNames.has(nme)) {\n          report(`@template ${nme} not in use`, null, tag);\n        }\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.TSInterfaceDeclaration|\n   *   import('@typescript-eslint/types').TSESTree.TSTypeAliasDeclaration} aliasDeclaration\n   * @param {boolean} [checkParamsAndReturns]\n   */\n  const checkParameters = (aliasDeclaration, checkParamsAndReturns) => {\n    /* c8 ignore next -- Guard */\n    const {\n      params,\n    } = aliasDeclaration.typeParameters ?? {\n      params: [],\n    };\n    for (const {\n      name: {\n        name,\n      },\n    } of params) {\n      usedNames.add(name);\n    }\n\n    if (checkParamsAndReturns) {\n      checkParamsAndReturnsTags();\n    } else if (aliasDeclaration.type === 'ClassDeclaration') {\n      /* c8 ignore next -- TS */\n      for (const nde of aliasDeclaration?.body?.body ?? []) {\n        // @ts-expect-error Should be ok\n        const commentNode = getJSDocComment(sourceCode, nde, settings);\n        if (!commentNode) {\n          continue;\n        }\n\n        const innerJsdoc = parseComment(commentNode, '');\n        checkParamsAndReturnsTags(innerJsdoc);\n\n        const typeName = /** @type {string} */ (utils.getPreferredTagName({\n          tagName: 'type',\n        }));\n        const typeTags = getTags(innerJsdoc, typeName);\n        for (const typeTag of typeTags) {\n          checkForUsedTypes(typeTag.type);\n        }\n      }\n    }\n\n    checkTemplateTags();\n  };\n\n  const handleTypeAliases = () => {\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 'TSInterfaceDeclaration':\n      case 'TSTypeAliasDeclaration':\n        checkParameters(nde);\n        break;\n      case 'ExportDefaultDeclaration':\n      case 'ExportNamedDeclaration':\n        switch (nde.declaration?.type) {\n          case 'ClassDeclaration':\n          case 'TSInterfaceDeclaration':\n          case 'TSTypeAliasDeclaration':\n            checkParameters(nde.declaration);\n            break;\n          case 'FunctionDeclaration':\n            checkParameters(nde.declaration, true);\n            break;\n        }\n\n        break;\n      case 'FunctionDeclaration':\n        checkParameters(nde, true);\n        break;\n    }\n  };\n\n  const callbackTags = utils.getTags('callback');\n  const functionTags = utils.getTags('function');\n  if (callbackTags.length || functionTags.length) {\n    checkParamsAndReturnsTags();\n    checkTemplateTags();\n    return;\n  }\n\n  const typedefTags = utils.getTags('typedef');\n  if (!typedefTags.length || typedefTags.length >= 2) {\n    handleTypeAliases();\n    return;\n  }\n\n  const potentialTypedefType = typedefTags[0].type;\n  checkForUsedTypes(potentialTypedefType);\n\n  const propertyName = /** @type {string} */ (utils.getPreferredTagName({\n    tagName: 'property',\n  }));\n  const propertyTags = utils.getTags(propertyName);\n  for (const propertyTag of propertyTags) {\n    checkForUsedTypes(propertyTag.type);\n  }\n\n  checkTemplateTags();\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    docs: {\n      description: 'Checks that any `@template` names are actually used in the connected `@typedef` or type alias.',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-template-names.md#repos-sticky-header',\n    },\n    schema: [],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}