{"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","name","split","tag","names","length","checkTypeParams","aliasDeclaration","params","typeParameters","add","usedName","includes","handleTypes","_nde$declaration","_nde$declaration2","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(({\n    name,\n  }) => {\n    return name.split(/,\\s*/u);\n  });\n\n  for (const tag of templateTags) {\n    const {\n      name,\n    } = tag;\n    const names = name.split(/,\\s*/u);\n    if (requireSeparateTemplates && names.length > 1) {\n      report(`Missing separate @template for ${names[1]}`, null, tag);\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":[]}