{"version":3,"file":"requireTemplate.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","_default","exports","iterateJsdoc","context","node","report","settings","utils","requireSeparateTemplates","options","mode","usedNames","Set","templateTags","getTags","templateNames","flatMap","tag","parseClosureTemplateTag","name","names","split","length","checkTypeParams","aliasDeclaration","params","typeParameters","add","usedName","includes","handleTypes","nde","type","declaration","usedNameToTag","Map","checkForUsedTypes","potentialTag","parsedType","tryParseType","parseType","traverse","value","test","has","set","checkTagsAndTemplates","tagNames","tagName","preferredTagName","getPreferredTagName","matchingTags","matchingTag","get","callbackTags","functionTags","typedefTags","potentialTypedef","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","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  const {\n    requireSeparateTemplates = false,\n  } = context.options[0] || {};\n\n  const {\n    mode,\n  } = settings;\n\n  const usedNames = new Set();\n  const templateTags = utils.getTags('template');\n  const templateNames = templateTags.flatMap((tag) => {\n    return utils.parseClosureTemplateTag(tag);\n  });\n\n  if (requireSeparateTemplates) {\n    for (const tag of templateTags) {\n      const {\n        name,\n      } = tag;\n      const names = name.split(/,\\s*/u);\n      if (names.length > 1) {\n        report(`Missing separate @template 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.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 @template ${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 '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 '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      const {\n        type,\n        value,\n      } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n      if (type === 'JsdocTypeName' && (/^[A-Z]$/u).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 @template ${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 for each generic type parameter',\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          requireSeparateTemplates: {\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}