{"version":3,"file":"preferImportTag.cjs","names":["iterateJsdoc","commentParserToESTree","parseComment","semver","Linter","tryParseType","parseType","traverse","stringify","toValidIdentifier","parseImportsExports","estreeToString"],"sources":["../../src/rules/preferImportTag.js"],"sourcesContent":["import iterateJsdoc, {\n  parseComment,\n} from '../iterateJsdoc.js';\nimport {\n  commentParserToESTree,\n  estreeToString,\n  // getJSDocComment,\n  parse as parseType,\n  stringify,\n  traverse,\n  tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\nimport {\n  Linter,\n} from 'eslint';\nimport {\n  parseImportsExports,\n} from 'parse-imports-exports';\nimport semver from 'semver';\nimport toValidIdentifier from 'to-valid-identifier';\n\nexport default iterateJsdoc(({\n  context,\n  indent,\n  jsdoc,\n  settings,\n  sourceCode,\n  utils,\n}) => {\n  const {\n    mode,\n  } = settings;\n\n  const {\n    enableFixer = true,\n    exemptTypedefs = true,\n    outputType = 'namespaced-import',\n  } = context.options[0] || {};\n\n  const allComments = sourceCode.getAllComments();\n  const comments = allComments\n    .filter((comment) => {\n      return (/^\\*(?!\\*)/v).test(comment.value);\n    })\n    .map((commentNode) => {\n      return commentParserToESTree(\n        parseComment(commentNode, ''), mode === 'permissive' ? 'typescript' : mode,\n      );\n    });\n\n  const typedefs = comments\n    .flatMap((doc) => {\n      return doc.tags.filter(({\n        tag,\n      }) => {\n        return utils.isNameOrNamepathDefiningTag(tag);\n      });\n    });\n\n  const imports = comments\n    .flatMap((doc) => {\n      return doc.tags.filter(({\n        tag,\n      }) => {\n        return tag === 'import';\n      });\n    }).map((tag) => {\n      // Causes problems with stringification otherwise\n      tag.delimiter = '';\n      return tag;\n    });\n\n  /**\n   * Helper to insert an import statement at the top of the file.\n   * @param {string} importText - The import statement text (without newline)\n   * @returns {((fixer: import('eslint').Rule.RuleFixer) => import('eslint').Rule.Fix|void)} - Fixer function for ESLint\n   */\n  const createImportInserter = (importText) => {\n    return (fixer) => {\n      const programNode = sourceCode.ast;\n      const commentNodes = sourceCode.getCommentsBefore(programNode);\n\n      /* c8 ignore start -- ESLint < 10 */\n      if (commentNodes[0]) {\n        return fixer.insertTextBefore(\n          // @ts-expect-error - Comment is compatible with Node in practice\n          commentNodes[0],\n          `${importText}\\n${indent}`,\n        );\n      }\n\n      // For ESLint < 10, use the simple approach of inserting before programNode\n      if (semver.lt(Linter.version, '10.0.0')) {\n        return fixer.insertTextBefore(\n          programNode,\n          importText,\n        );\n      }\n\n      // For ESLint 10+, handle the changed Program node range\n      const sourceText = sourceCode.getText();\n      const hasCode = programNode.body && programNode.body.length > 0;\n      const leadingMatch = hasCode ? sourceText.match(/^(\\n[ \\t]*)/v) : null;\n      if (leadingMatch) {\n        const leading = leadingMatch[1];\n        return fixer.replaceTextRange(\n          [\n            leading.length, leading.length,\n          ],\n          `${importText}\\n${leading.slice(1)}`,\n        );\n      }\n\n      const startsWithNewline = sourceText[0] === '\\n';\n      return fixer.replaceTextRange(\n        startsWithNewline ? [\n          0, 1,\n        ] : [\n          0, 0,\n        ],\n        `${importText}\\n`,\n      );\n      /* c8 ignore end -- ESLint < 10 */\n    };\n  };\n\n  /**\n   * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} tag\n   */\n  const iterateInlineImports = (tag) => {\n    const potentialType = tag.type;\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, parentNode) => {\n      // @ts-expect-error Adding our own property for use below\n      nde.parentNode = parentNode;\n    });\n\n    traverse(parsedType, (nde) => {\n      const {\n        element,\n        type,\n      } = /** @type {import('jsdoc-type-pratt-parser').ImportResult} */ (nde);\n      if (type !== 'JsdocTypeImport') {\n        return;\n      }\n\n      let currentNode = nde;\n\n      /** @type {string[]} */\n      const pathSegments = [];\n\n      /** @type {import('jsdoc-type-pratt-parser').NamePathResult[]} */\n      const nodes = [];\n\n      /** @type {string[]} */\n      const extraPathSegments = [];\n\n      /** @type {(import('jsdoc-type-pratt-parser').QuoteStyle|undefined)[]} */\n      const quotes = [];\n\n      const propertyOrBrackets = /** @type {import('jsdoc-type-pratt-parser').NamePathResult['pathType'][]} */ ([]);\n\n      // @ts-expect-error Referencing our own property added above\n      while (currentNode && currentNode.parentNode) {\n        // @ts-expect-error Referencing our own property added above\n        currentNode = currentNode.parentNode;\n        /* c8 ignore next 3 -- Guard */\n        if (currentNode.type !== 'JsdocTypeNamePath') {\n          break;\n        }\n\n        pathSegments.unshift(\n          currentNode.right.type === 'JsdocTypeIndexedAccessIndex' ?\n            stringify(currentNode.right.right) :\n            currentNode.right.value,\n        );\n        nodes.unshift(currentNode);\n        propertyOrBrackets.unshift(currentNode.pathType);\n        quotes.unshift(\n          currentNode.right.type === 'JsdocTypeIndexedAccessIndex' ?\n            undefined :\n            currentNode.right.meta.quote,\n        );\n      }\n\n      /**\n       * @param {string} name\n       * @param {string[]} extrPathSegments\n       */\n      const getFixer = (name, extrPathSegments) => {\n        const matchingName = toValidIdentifier(name);\n        return () => {\n          /** @type {import('jsdoc-type-pratt-parser').NamePathResult|undefined} */\n          let node = nodes.at(0);\n          if (!node) {\n            // Not really a NamePathResult, but will be converted later anyways\n            node = /** @type {import('jsdoc-type-pratt-parser').NamePathResult} */ (\n              /** @type {unknown} */\n              (nde)\n            );\n          }\n\n          const keys = /** @type {(keyof import('jsdoc-type-pratt-parser').NamePathResult)[]} */ (\n            Object.keys(node)\n          );\n\n          for (const key of keys) {\n            delete node[key];\n          }\n\n          if (extrPathSegments.length) {\n            let newNode = /** @type {import('jsdoc-type-pratt-parser').NamePathResult} */ (\n              /** @type {unknown} */\n              (node)\n            );\n            while (extrPathSegments.length && newNode) {\n              newNode.type = 'JsdocTypeNamePath';\n              newNode.right = {\n                meta: {\n                  quote: quotes.shift(),\n                },\n                type: 'JsdocTypeProperty',\n                value: /** @type {string} */ (extrPathSegments.shift()),\n              };\n\n              newNode.pathType = /** @type {import('jsdoc-type-pratt-parser').NamePathResult['pathType']} */ (\n                propertyOrBrackets.shift()\n              );\n              // @ts-expect-error Temporary\n              newNode.left = {};\n              newNode = /** @type {import('jsdoc-type-pratt-parser').NamePathResult} */ (\n                newNode.left\n              );\n            }\n\n            const nameNode = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (\n              /** @type {unknown} */\n              (newNode)\n            );\n            nameNode.type = 'JsdocTypeName';\n            nameNode.value = matchingName;\n          } else {\n            const newNode = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (\n              /** @type {unknown} */\n              (node)\n            );\n            newNode.type = 'JsdocTypeName';\n            newNode.value = matchingName;\n          }\n\n          for (const src of tag.source) {\n            if (src.tokens.type) {\n              src.tokens.type = `{${stringify(parsedType)}}`;\n              break;\n            }\n          }\n        };\n      };\n\n      /** @type {string[]} */\n      let unusedPathSegments = [];\n\n      const findMatchingTypedef = () => {\n        // Don't want typedefs to find themselves\n        if (!exemptTypedefs) {\n          return undefined;\n        }\n\n        const pthSegments = [\n          ...pathSegments,\n        ];\n        return typedefs.find((typedef) => {\n          let typedefNode = typedef.parsedType;\n          let namepathMatch;\n          while (typedefNode && typedefNode.type === 'JsdocTypeNamePath') {\n            const pathSegment = pthSegments.shift();\n            if (!pathSegment) {\n              namepathMatch = false;\n              break;\n            }\n\n            if (\n              (typedefNode.right.type === 'JsdocTypeIndexedAccessIndex' &&\n                stringify(typedefNode.right.right) !== pathSegment) ||\n              (typedefNode.right.type !== 'JsdocTypeIndexedAccessIndex' &&\n                typedefNode.right.value !== pathSegment)\n            ) {\n              if (namepathMatch === true) {\n                // It stopped matching, so stop\n                break;\n              }\n\n              extraPathSegments.push(pathSegment);\n              namepathMatch = false;\n              continue;\n            }\n\n            namepathMatch = true;\n\n            unusedPathSegments = pthSegments;\n\n            typedefNode = typedefNode.left;\n          }\n\n          return namepathMatch &&\n            // `import('eslint')` matches\n            typedefNode &&\n            typedefNode.type === 'JsdocTypeImport' &&\n            typedefNode.element.value === element.value;\n        });\n      };\n\n      // Check @typedef's first as should be longest match, allowing\n      //   for shorter abbreviations\n      const matchingTypedef = findMatchingTypedef();\n      if (matchingTypedef) {\n        utils.reportJSDoc(\n          'Inline `import()` found; using `@typedef`',\n          tag,\n          enableFixer ? getFixer(matchingTypedef.name, [\n            ...extraPathSegments,\n            ...unusedPathSegments.slice(-1),\n            ...unusedPathSegments.slice(0, -1),\n          ]) : null,\n        );\n        return;\n      }\n\n      const findMatchingImport = () => {\n        for (const imprt of imports) {\n          const parsedImport = parseImportsExports(\n            estreeToString(imprt).replace(/^\\s*@/v, '').trim(),\n          );\n\n          const namedImportsModuleSpecifier = Object.keys(parsedImport.namedImports || {})[0];\n\n          const namedImports = Object.values(parsedImport.namedImports || {})[0]?.[0];\n          const namedImportNames = (namedImports && namedImports.names && Object.keys(namedImports.names)) ?? [];\n\n          const namespaceImports = Object.values(parsedImport.namespaceImports || {})[0]?.[0];\n\n          const namespaceImportsDefault = namespaceImports && namespaceImports.default;\n          const namespaceImportsNamespace = namespaceImports && namespaceImports.namespace;\n          const namespaceImportsModuleSpecifier = Object.keys(parsedImport.namespaceImports || {})[0];\n\n          const lastPathSegment = pathSegments.at(-1);\n\n          if (\n            (namespaceImportsDefault &&\n                namespaceImportsModuleSpecifier === element.value) ||\n              (element.value === namedImportsModuleSpecifier && (\n                (lastPathSegment && namedImportNames.includes(lastPathSegment)) ||\n                lastPathSegment === 'default'\n              )) ||\n              (namespaceImportsNamespace &&\n                namespaceImportsModuleSpecifier === element.value)\n          ) {\n            return {\n              namedImportNames,\n              namedImports,\n              namedImportsModuleSpecifier,\n              namespaceImports,\n              namespaceImportsDefault,\n              namespaceImportsModuleSpecifier,\n              namespaceImportsNamespace,\n            };\n          }\n        }\n\n        return undefined;\n      };\n\n      const matchingImport = findMatchingImport();\n      if (matchingImport) {\n        const {\n          namedImportNames,\n          namedImports,\n          namedImportsModuleSpecifier,\n          namespaceImportsNamespace,\n        } = matchingImport;\n        if (!namedImportNames.length && namedImportsModuleSpecifier && namedImports.default) {\n          utils.reportJSDoc(\n            'Inline `import()` found; prefer `@import`',\n            tag,\n            enableFixer ? getFixer(namedImports.default, []) : null,\n          );\n          return;\n        }\n\n        const lastPthSegment = pathSegments.at(-1);\n        if (lastPthSegment && namedImportNames.includes(lastPthSegment)) {\n          utils.reportJSDoc(\n            'Inline `import()` found; prefer `@import`',\n            tag,\n            enableFixer ? getFixer(lastPthSegment, pathSegments.slice(0, -1)) : null,\n          );\n          return;\n        }\n\n        if (namespaceImportsNamespace) {\n          utils.reportJSDoc(\n            'Inline `import()` found; prefer `@import`',\n            tag,\n            enableFixer ? getFixer(namespaceImportsNamespace, [\n              ...pathSegments,\n            ]) : null,\n          );\n          return;\n        }\n      }\n\n      if (!pathSegments.length) {\n        utils.reportJSDoc(\n          'Inline `import()` found; prefer `@import`',\n          tag,\n          enableFixer ? (fixer) => {\n            getFixer(element.value, [])();\n            return createImportInserter(\n              `/** @import * as ${toValidIdentifier(element.value)} from '${element.value}'; */`,\n            )(fixer);\n          } : null,\n        );\n        return;\n      }\n\n      const lstPathSegment = pathSegments.at(-1);\n      if (lstPathSegment && lstPathSegment === 'default') {\n        utils.reportJSDoc(\n          'Inline `import()` found; prefer `@import`',\n          tag,\n          enableFixer ? (fixer) => {\n            getFixer(element.value, [])();\n            return createImportInserter(\n              `/** @import ${element.value} from '${element.value}'; */`,\n            )(fixer);\n          } : null,\n        );\n        return;\n      }\n\n      utils.reportJSDoc(\n        'Inline `import()` found; prefer `@import`',\n        tag,\n        enableFixer ? (fixer) => {\n          if (outputType === 'namespaced-import') {\n            getFixer(element.value, [\n              ...pathSegments,\n            ])();\n          } else {\n            getFixer(\n              /** @type {string} */ (pathSegments.at(-1)),\n              pathSegments.slice(0, -1),\n            )();\n          }\n\n          const importText = outputType === 'namespaced-import' ?\n            `/** @import * as ${toValidIdentifier(element.value)} from '${element.value}'; */` :\n            `/** @import { ${toValidIdentifier(\n              /* c8 ignore next -- TS */\n              pathSegments.at(-1) ?? '',\n            )} } from '${element.value}'; */`;\n\n          return createImportInserter(importText)(fixer);\n        } : null,\n      );\n    });\n  };\n\n  for (const tag of jsdoc.tags) {\n    const mightHaveTypePosition = utils.tagMightHaveTypePosition(tag.tag);\n    const hasTypePosition = mightHaveTypePosition === true && Boolean(tag.type);\n    if (hasTypePosition && (!exemptTypedefs || !utils.isNameOrNamepathDefiningTag(tag.tag))) {\n      iterateInlineImports(tag);\n    }\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    docs: {\n      description: 'Prefer `@import` tags to inline `import()` statements.',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/prefer-import-tag.md#repos-sticky-header',\n    },\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          enableFixer: {\n            description: 'Whether or not to enable the fixer to add `@import` tags.',\n            type: 'boolean',\n          },\n          exemptTypedefs: {\n            description: 'Whether to allow `import()` statements within `@typedef`',\n            type: 'boolean',\n          },\n\n          // We might add `typedef` and `typedef-local-only`, but also raises\n          //   question of how deep the generated typedef should be\n          outputType: {\n            description: 'What kind of `@import` to generate when no matching `@typedef` or `@import` is found',\n            enum: [\n              'named-import',\n              'namespaced-import',\n            ],\n            type: 'string',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}