eslint-plugin-jsdoc 46.2.3 → 46.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -103,7 +103,13 @@ export default iterateJsdoc(({
103
103
  |Settings||
104
104
  |Options||
105
105
 
106
- <!-- assertions ${camelCasedRuleName} -->
106
+ ## Failing examples
107
+
108
+ <!-- assertions-failing ${camelCasedRuleName} -->
109
+
110
+ ## Passing examples
111
+
112
+ <!-- assertions-passing ${camelCasedRuleName} -->
107
113
  `;
108
114
  const ruleReadmePath = `./.README/rules/${ruleName}.md`;
109
115
  if (!(0, _fs.existsSync)(ruleReadmePath)) {
@@ -1 +1 @@
1
- {"version":3,"file":"generateRule.js","names":["_camelcase","_interopRequireDefault","require","_fs","_promises","_openEditor","_path","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ruleName","options","process","argv","recommended","includes","console","error","test","ruleNamesPath","ruleNames","JSON","parse","fs","readFile","push","sort","writeFile","stringify","log","ruleTemplate","camelCasedRuleName","camelCase","rulePath","existsSync","ruleTestTemplate","ruleTestPath","ruleReadmeTemplate","ruleReadmePath","replaceInOrder","path","oldRegex","checkName","newLine","oldIsCamel","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","Promise","resolve","then","chdir","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n\n/**\n * @example\n *\n * ```shell\n * npm run create-rule my-new-rule -- --recommended\n * ```\n */\n\nimport camelCase from 'camelcase';\nimport {\n existsSync,\n} from 'fs';\nimport fs from 'fs/promises';\nimport open from 'open-editor';\nimport {\n resolve,\n} from 'path';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether\n// type was problem/layout, etc.\n\nconst [\n , , ruleName,\n ...options\n] = process.argv;\n\nconst recommended = options.includes('--recommended');\n\n(async () => {\n if (!ruleName) {\n console.error('Please supply a rule name');\n\n return;\n }\n\n if ((/[A-Z]/u).test(ruleName)) {\n console.error('Please ensure the rule has no capital letters');\n\n return;\n }\n\n const ruleNamesPath = './test/rules/ruleNames.json';\n // @ts-expect-error Older types?\n const ruleNames = JSON.parse(await fs.readFile(\n ruleNamesPath,\n ));\n if (!ruleNames.includes(ruleName)) {\n ruleNames.push(ruleName);\n ruleNames.sort();\n }\n\n await fs.writeFile(ruleNamesPath, JSON.stringify(ruleNames, null, 2) + '\\n');\n console.log('ruleNames', ruleNames);\n\n const ruleTemplate = `import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n utils,\n}) => {\n // Rule here\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/${ruleName}.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n // Option properties here (or remove the object)\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n`;\n\n const camelCasedRuleName = camelCase(ruleName);\n\n const rulePath = `./src/rules/${camelCasedRuleName}.js`;\n\n if (!existsSync(rulePath)) {\n await fs.writeFile(rulePath, ruleTemplate);\n }\n\n const ruleTestTemplate = `export default {\n invalid: [\n {\n code: \\`\n \\`,\n errors: [\n {\n line: 2,\n message: '',\n },\n ],\n },\n ],\n valid: [\n {\n code: \\`\n \\`,\n },\n ],\n};\n`;\n\n const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;\n if (!existsSync(ruleTestPath)) {\n await fs.writeFile(ruleTestPath, ruleTestTemplate);\n }\n\n const ruleReadmeTemplate = `### \\`${ruleName}\\`\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n<!-- assertions ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n /**\n * @param {object} cfg\n * @param {string} cfg.path\n * @param {RegExp} cfg.oldRegex\n * @param {string} cfg.checkName\n * @param {string} cfg.newLine\n * @param {boolean} [cfg.oldIsCamel]\n * @returns {Promise<void>}\n */\n const replaceInOrder = async ({\n path,\n oldRegex,\n checkName,\n newLine,\n oldIsCamel,\n }) => {\n /**\n * @typedef {number} Integer\n */\n /**\n * @typedef {{\n * matchedLine: string,\n * offset: Integer,\n * oldRule: string,\n * }} OffsetInfo\n */\n /**\n * @type {OffsetInfo[]}\n */\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n /**\n * @param {string} matchedLine\n * @param {string} n1\n * @param {Integer} offset\n * @param {string} str\n * @param {object} groups\n * @param {string} groups.oldRule\n * @returns {string}\n */\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n\n return matchedLine;\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\n return oldRule < oldRuleB ? -1 : (oldRule > oldRuleB ? 1 : 0);\n });\n\n let alreadyIncluded = false;\n const itemIndex = offsets.findIndex(({\n oldRule,\n }) => {\n alreadyIncluded ||= oldIsCamel ? camelCasedRuleName === oldRule : ruleName === oldRule;\n\n return oldIsCamel ? camelCasedRuleName < oldRule : ruleName < oldRule;\n });\n let item = itemIndex !== undefined && offsets[itemIndex];\n if (item && itemIndex === 0 &&\n\n // This property would not always be sufficient but in this case it is.\n oldIsCamel\n ) {\n item.offset = 0;\n }\n\n if (!item) {\n item = /** @type {OffsetInfo} */ (offsets.pop());\n item.offset += item.matchedLine.length;\n }\n\n if (alreadyIncluded) {\n console.log(`Rule name is already present in ${checkName}.`);\n } else {\n readme = readme.slice(0, item.offset) +\n (item.offset ? '\\n' : '') +\n newLine +\n (item.offset ? '' : '\\n') +\n readme.slice(item.offset);\n\n await fs.writeFile(path, readme);\n }\n };\n\n // await replaceInOrder({\n // checkName: 'README',\n // newLine: `{\"gitdown\": \"include\", \"file\": \"./rules/${ruleName}.md\"}`,\n // oldRegex: /\\n\\{\"gitdown\": \"include\", \"file\": \".\\/rules\\/(?<oldRule>[^.]*).md\"\\}/gu,\n // path: './.README/README.md',\n // });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1';/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(6)}'jsdoc/${ruleName}': ${recommended ? 'warnOrError' : '\\'off\\''},`,\n oldRegex: /\\n\\s{6}'jsdoc\\/(?<oldRule>[^']*)': .*?,/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(4)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{4}'(?<oldRule>[^']*)': [^,]*,/gu,\n path: './src/index.js',\n });\n\n await import('./generateDocs.js');\n\n /*\n console.log('Paths to open for further editing\\n');\n console.log(`open ${ruleReadmePath}`);\n console.log(`open ${rulePath}`);\n console.log(`open ${ruleTestPath}\\n`);\n */\n\n // Set chdir as somehow still in operation from other test\n process.chdir(resolve(__dirname, '../../'));\n await open([\n // Could even add editor line column numbers like `${rulePath}:1:1`\n ruleReadmePath,\n ruleTestPath,\n rulePath,\n ]);\n})();\n"],"mappings":"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"}
1
+ {"version":3,"file":"generateRule.js","names":["_camelcase","_interopRequireDefault","require","_fs","_promises","_openEditor","_path","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ruleName","options","process","argv","recommended","includes","console","error","test","ruleNamesPath","ruleNames","JSON","parse","fs","readFile","push","sort","writeFile","stringify","log","ruleTemplate","camelCasedRuleName","camelCase","rulePath","existsSync","ruleTestTemplate","ruleTestPath","ruleReadmeTemplate","ruleReadmePath","replaceInOrder","path","oldRegex","checkName","newLine","oldIsCamel","offsets","readme","replace","matchedLine","n1","offset","str","oldRule","oldRuleB","alreadyIncluded","itemIndex","findIndex","item","undefined","pop","length","slice","repeat","Promise","resolve","then","chdir","__dirname","open"],"sources":["../src/bin/generateRule.js"],"sourcesContent":["/* eslint-disable no-console -- CLI */\n\n/**\n * @example\n *\n * ```shell\n * npm run create-rule my-new-rule -- --recommended\n * ```\n */\n\nimport camelCase from 'camelcase';\nimport {\n existsSync,\n} from 'fs';\nimport fs from 'fs/promises';\nimport open from 'open-editor';\nimport {\n resolve,\n} from 'path';\n\n// Todo: Would ideally have prompts, e.g., to ask for whether\n// type was problem/layout, etc.\n\nconst [\n , , ruleName,\n ...options\n] = process.argv;\n\nconst recommended = options.includes('--recommended');\n\n(async () => {\n if (!ruleName) {\n console.error('Please supply a rule name');\n\n return;\n }\n\n if ((/[A-Z]/u).test(ruleName)) {\n console.error('Please ensure the rule has no capital letters');\n\n return;\n }\n\n const ruleNamesPath = './test/rules/ruleNames.json';\n // @ts-expect-error Older types?\n const ruleNames = JSON.parse(await fs.readFile(\n ruleNamesPath,\n ));\n if (!ruleNames.includes(ruleName)) {\n ruleNames.push(ruleName);\n ruleNames.sort();\n }\n\n await fs.writeFile(ruleNamesPath, JSON.stringify(ruleNames, null, 2) + '\\n');\n console.log('ruleNames', ruleNames);\n\n const ruleTemplate = `import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n utils,\n}) => {\n // Rule here\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/${ruleName}.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n // Option properties here (or remove the object)\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n`;\n\n const camelCasedRuleName = camelCase(ruleName);\n\n const rulePath = `./src/rules/${camelCasedRuleName}.js`;\n\n if (!existsSync(rulePath)) {\n await fs.writeFile(rulePath, ruleTemplate);\n }\n\n const ruleTestTemplate = `export default {\n invalid: [\n {\n code: \\`\n \\`,\n errors: [\n {\n line: 2,\n message: '',\n },\n ],\n },\n ],\n valid: [\n {\n code: \\`\n \\`,\n },\n ],\n};\n`;\n\n const ruleTestPath = `./test/rules/assertions/${camelCasedRuleName}.js`;\n if (!existsSync(ruleTestPath)) {\n await fs.writeFile(ruleTestPath, ruleTestTemplate);\n }\n\n const ruleReadmeTemplate = `### \\`${ruleName}\\`\n\n|||\n|---|---|\n|Context|everywhere|\n|Tags|\\`\\`|\n|Recommended|${recommended ? 'true' : 'false'}|\n|Settings||\n|Options||\n\n## Failing examples\n\n<!-- assertions-failing ${camelCasedRuleName} -->\n\n## Passing examples\n\n<!-- assertions-passing ${camelCasedRuleName} -->\n`;\n\n const ruleReadmePath = `./.README/rules/${ruleName}.md`;\n if (!existsSync(ruleReadmePath)) {\n await fs.writeFile(ruleReadmePath, ruleReadmeTemplate);\n }\n\n /**\n * @param {object} cfg\n * @param {string} cfg.path\n * @param {RegExp} cfg.oldRegex\n * @param {string} cfg.checkName\n * @param {string} cfg.newLine\n * @param {boolean} [cfg.oldIsCamel]\n * @returns {Promise<void>}\n */\n const replaceInOrder = async ({\n path,\n oldRegex,\n checkName,\n newLine,\n oldIsCamel,\n }) => {\n /**\n * @typedef {number} Integer\n */\n /**\n * @typedef {{\n * matchedLine: string,\n * offset: Integer,\n * oldRule: string,\n * }} OffsetInfo\n */\n /**\n * @type {OffsetInfo[]}\n */\n const offsets = [];\n\n let readme = await fs.readFile(path, 'utf8');\n readme.replace(\n oldRegex,\n /**\n * @param {string} matchedLine\n * @param {string} n1\n * @param {Integer} offset\n * @param {string} str\n * @param {object} groups\n * @param {string} groups.oldRule\n * @returns {string}\n */\n (matchedLine, n1, offset, str, {\n oldRule,\n }) => {\n offsets.push({\n matchedLine,\n offset,\n oldRule,\n });\n\n return matchedLine;\n },\n );\n\n offsets.sort(({\n oldRule,\n }, {\n oldRule: oldRuleB,\n }) => {\n return oldRule < oldRuleB ? -1 : (oldRule > oldRuleB ? 1 : 0);\n });\n\n let alreadyIncluded = false;\n const itemIndex = offsets.findIndex(({\n oldRule,\n }) => {\n alreadyIncluded ||= oldIsCamel ? camelCasedRuleName === oldRule : ruleName === oldRule;\n\n return oldIsCamel ? camelCasedRuleName < oldRule : ruleName < oldRule;\n });\n let item = itemIndex !== undefined && offsets[itemIndex];\n if (item && itemIndex === 0 &&\n\n // This property would not always be sufficient but in this case it is.\n oldIsCamel\n ) {\n item.offset = 0;\n }\n\n if (!item) {\n item = /** @type {OffsetInfo} */ (offsets.pop());\n item.offset += item.matchedLine.length;\n }\n\n if (alreadyIncluded) {\n console.log(`Rule name is already present in ${checkName}.`);\n } else {\n readme = readme.slice(0, item.offset) +\n (item.offset ? '\\n' : '') +\n newLine +\n (item.offset ? '' : '\\n') +\n readme.slice(item.offset);\n\n await fs.writeFile(path, readme);\n }\n };\n\n // await replaceInOrder({\n // checkName: 'README',\n // newLine: `{\"gitdown\": \"include\", \"file\": \"./rules/${ruleName}.md\"}`,\n // oldRegex: /\\n\\{\"gitdown\": \"include\", \"file\": \".\\/rules\\/(?<oldRule>[^.]*).md\"\\}/gu,\n // path: './.README/README.md',\n // });\n\n await replaceInOrder({\n checkName: 'index import',\n newLine: `import ${camelCasedRuleName} from './rules/${camelCasedRuleName}';`,\n oldIsCamel: true,\n oldRegex: /\\nimport (?<oldRule>[^ ]*) from '.\\/rules\\/\\1';/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index recommended',\n newLine: `${' '.repeat(6)}'jsdoc/${ruleName}': ${recommended ? 'warnOrError' : '\\'off\\''},`,\n oldRegex: /\\n\\s{6}'jsdoc\\/(?<oldRule>[^']*)': .*?,/gu,\n path: './src/index.js',\n });\n\n await replaceInOrder({\n checkName: 'index rules',\n newLine: `${' '.repeat(4)}'${ruleName}': ${camelCasedRuleName},`,\n oldRegex: /\\n\\s{4}'(?<oldRule>[^']*)': [^,]*,/gu,\n path: './src/index.js',\n });\n\n await import('./generateDocs.js');\n\n /*\n console.log('Paths to open for further editing\\n');\n console.log(`open ${ruleReadmePath}`);\n console.log(`open ${rulePath}`);\n console.log(`open ${ruleTestPath}\\n`);\n */\n\n // Set chdir as somehow still in operation from other test\n process.chdir(resolve(__dirname, '../../'));\n await open([\n // Could even add editor line column numbers like `${rulePath}:1:1`\n ruleReadmePath,\n ruleTestPath,\n rulePath,\n ]);\n})();\n"],"mappings":"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"}
@@ -52,6 +52,9 @@ var _default = (0, _iterateJsdoc.default)(({
52
52
  (0, _jsdoccomment.traverse)(typeAst, nde => {
53
53
  if (nde.type === 'JsdocTypeImport') {
54
54
  let mod = nde.element.value.replace(/^(@[^/]+\/[^/]+|[^/]+).*$/u, '$1');
55
+ if (/^[./]/u.test(mod)) {
56
+ return;
57
+ }
55
58
  if (!moduleCheck.has(mod)) {
56
59
  let pkg;
57
60
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"importsAsDependencies.js","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","_fs","_path","obj","__esModule","default","deps","pkg","JSON","parse","readFileSync","join","process","cwd","Set","dependencies","Object","keys","devDependencies","error","console","log","moduleCheck","Map","_default","iterateJsdoc","jsdoc","settings","utils","mode","tag","tags","typeAst","tryParse","type","traverse","nde","mod","element","value","replace","has","types","typings","set","get","reportJSDoc","iterateAllJsdocs","meta","docs","description","url","exports","module"],"sources":["../../src/rules/importsAsDependencies.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\nimport {\n readFileSync,\n} from 'fs';\nimport {\n join,\n} from 'path';\n\n/**\n * @type {Set<string>}\n */\nlet deps;\ntry {\n const pkg = JSON.parse(\n // @ts-expect-error It's ok\n readFileSync(join(process.cwd(), './package.json')),\n );\n deps = new Set([\n ...(pkg.dependencies ?\n Object.keys(pkg.dependencies) :\n // istanbul ignore next\n []),\n ...(pkg.devDependencies ?\n Object.keys(pkg.devDependencies) :\n // istanbul ignore next\n []),\n ]);\n} catch (error) {\n /* eslint-disable no-console -- Inform user */\n // istanbul ignore next\n console.log(error);\n /* eslint-enable no-console -- Inform user */\n}\n\nconst moduleCheck = new Map();\n\nexport default iterateJsdoc(({\n jsdoc,\n settings,\n utils,\n}) => {\n // istanbul ignore if\n if (!deps) {\n return;\n }\n\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n let typeAst;\n try {\n typeAst = mode === 'permissive' ? tryParse(tag.type) : parse(tag.type, mode);\n } catch {\n continue;\n }\n\n traverse(typeAst, (nde) => {\n if (nde.type === 'JsdocTypeImport') {\n let mod = nde.element.value.replace(\n /^(@[^/]+\\/[^/]+|[^/]+).*$/u, '$1',\n );\n\n if (!moduleCheck.has(mod)) {\n let pkg;\n try {\n pkg = JSON.parse(\n // @ts-expect-error It's ok\n readFileSync(join(process.cwd(), 'node_modules', mod, './package.json')),\n );\n } catch {\n // Ignore\n }\n\n if (!pkg || (!pkg.types && !pkg.typings)) {\n mod = `@types/${mod}`;\n }\n\n moduleCheck.set(mod, !deps.has(mod));\n }\n\n if (moduleCheck.get(mod)) {\n utils.reportJSDoc(\n 'import points to package which is not found in dependencies',\n tag,\n );\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header',\n },\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"importsAsDependencies.js","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","_fs","_path","obj","__esModule","default","deps","pkg","JSON","parse","readFileSync","join","process","cwd","Set","dependencies","Object","keys","devDependencies","error","console","log","moduleCheck","Map","_default","iterateJsdoc","jsdoc","settings","utils","mode","tag","tags","typeAst","tryParse","type","traverse","nde","mod","element","value","replace","test","has","types","typings","set","get","reportJSDoc","iterateAllJsdocs","meta","docs","description","url","exports","module"],"sources":["../../src/rules/importsAsDependencies.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\nimport {\n readFileSync,\n} from 'fs';\nimport {\n join,\n} from 'path';\n\n/**\n * @type {Set<string>}\n */\nlet deps;\ntry {\n const pkg = JSON.parse(\n // @ts-expect-error It's ok\n readFileSync(join(process.cwd(), './package.json')),\n );\n deps = new Set([\n ...(pkg.dependencies ?\n Object.keys(pkg.dependencies) :\n // istanbul ignore next\n []),\n ...(pkg.devDependencies ?\n Object.keys(pkg.devDependencies) :\n // istanbul ignore next\n []),\n ]);\n} catch (error) {\n /* eslint-disable no-console -- Inform user */\n // istanbul ignore next\n console.log(error);\n /* eslint-enable no-console -- Inform user */\n}\n\nconst moduleCheck = new Map();\n\nexport default iterateJsdoc(({\n jsdoc,\n settings,\n utils,\n}) => {\n // istanbul ignore if\n if (!deps) {\n return;\n }\n\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n let typeAst;\n try {\n typeAst = mode === 'permissive' ? tryParse(tag.type) : parse(tag.type, mode);\n } catch {\n continue;\n }\n\n traverse(typeAst, (nde) => {\n if (nde.type === 'JsdocTypeImport') {\n let mod = nde.element.value.replace(\n /^(@[^/]+\\/[^/]+|[^/]+).*$/u, '$1',\n );\n\n if ((/^[./]/u).test(mod)) {\n return;\n }\n\n if (!moduleCheck.has(mod)) {\n let pkg;\n try {\n pkg = JSON.parse(\n // @ts-expect-error It's ok\n readFileSync(join(process.cwd(), 'node_modules', mod, './package.json')),\n );\n } catch {\n // Ignore\n }\n\n if (!pkg || (!pkg.types && !pkg.typings)) {\n mod = `@types/${mod}`;\n }\n\n moduleCheck.set(mod, !deps.has(mod));\n }\n\n if (moduleCheck.get(mod)) {\n utils.reportJSDoc(\n 'import points to package which is not found in dependencies',\n tag,\n );\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header',\n },\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
@@ -13,4 +13,75 @@ which is not listed in `dependencies` or `devDependencies`.
13
13
  |Settings||
14
14
  |Options||
15
15
 
16
- <!-- assertions importsAsDependencies -->
16
+ <a name="user-content-failing-examples"></a>
17
+ <a name="failing-examples"></a>
18
+ ## Failing examples
19
+
20
+ The following patterns are considered problems:
21
+
22
+ ````js
23
+ /**
24
+ * @type {null|import('sth').SomeApi}
25
+ */
26
+ // Message: import points to package which is not found in dependencies
27
+
28
+ /**
29
+ * @type {null|import('sth').SomeApi}
30
+ */
31
+ // Settings: {"jsdoc":{"mode":"permissive"}}
32
+ // Message: import points to package which is not found in dependencies
33
+
34
+ /**
35
+ * @type {null|import('missingpackage/subpackage').SomeApi}
36
+ */
37
+ // Message: import points to package which is not found in dependencies
38
+
39
+ /**
40
+ * @type {null|import('@sth/pkg').SomeApi}
41
+ */
42
+ // Message: import points to package which is not found in dependencies
43
+ ````
44
+
45
+
46
+
47
+ <a name="user-content-passing-examples"></a>
48
+ <a name="passing-examples"></a>
49
+ ## Passing examples
50
+
51
+ The following patterns are not considered problems:
52
+
53
+ ````js
54
+ /**
55
+ * @type {null|import('eslint').ESLint}
56
+ */
57
+
58
+ /**
59
+ * @type {null|import('eslint/use-at-your-own-risk').ESLint}
60
+ */
61
+
62
+ /**
63
+ * @type {null|import('@es-joy/jsdoccomment').InlineTag}
64
+ */
65
+
66
+ /**
67
+ * @type {null|import(}
68
+ */
69
+
70
+ /**
71
+ * @type {null|import('esquery').ESQueryOptions}
72
+ */
73
+
74
+ /**
75
+ * @type {null|import('@es-joy/jsdoccomment').InlineTag|
76
+ * import('@es-joy/jsdoccomment').JsdocBlock}
77
+ */
78
+
79
+ /**
80
+ * @type {null|import('typescript').Program}
81
+ */
82
+
83
+ /**
84
+ * @type {null|import('./relativePath.js').Program}
85
+ */
86
+ ````
87
+
package/package.json CHANGED
@@ -135,5 +135,5 @@
135
135
  "test-cov": "cross-env TIMING=1 nyc --reporter text npm run test-no-cov",
136
136
  "test-index": "npm run test-no-cov -- test/rules/index.js"
137
137
  },
138
- "version": "46.2.3"
138
+ "version": "46.2.4"
139
139
  }