importsAsDependencies.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
  7. var _jsdoccomment = require("@es-joy/jsdoccomment");
  8. var _fs = require("fs");
  9. var _isBuiltinModule = _interopRequireDefault(require("is-builtin-module"));
  10. var _path = require("path");
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  12. /**
  13. * @type {Set<string>|null}
  14. */
  15. let deps;
  16. const setDeps = function () {
  17. try {
  18. const pkg = JSON.parse(
  19. // @ts-expect-error It's ok
  20. (0, _fs.readFileSync)((0, _path.join)(process.cwd(), './package.json')));
  21. deps = new Set([...(pkg.dependencies ? Object.keys(pkg.dependencies) :
  22. // istanbul ignore next
  23. []), ...(pkg.devDependencies ? Object.keys(pkg.devDependencies) :
  24. // istanbul ignore next
  25. [])]);
  26. } catch (error) {
  27. // istanbul ignore next -- our package.json exists
  28. deps = null;
  29. /* eslint-disable no-console -- Inform user */
  30. // istanbul ignore next -- our package.json exists
  31. console.log(error);
  32. /* eslint-enable no-console -- Inform user */
  33. }
  34. };
  35. const moduleCheck = new Map();
  36. var _default = exports.default = (0, _iterateJsdoc.default)(({
  37. jsdoc,
  38. settings,
  39. utils
  40. }) => {
  41. // istanbul ignore if
  42. if (deps === undefined) {
  43. setDeps();
  44. }
  45. // istanbul ignore if -- our package.json exists
  46. if (deps === null) {
  47. return;
  48. }
  49. const {
  50. mode
  51. } = settings;
  52. for (const tag of jsdoc.tags) {
  53. let typeAst;
  54. try {
  55. typeAst = mode === 'permissive' ? (0, _jsdoccomment.tryParse)(tag.type) : (0, _jsdoccomment.parse)(tag.type, mode);
  56. } catch {
  57. continue;
  58. }
  59. // eslint-disable-next-line no-loop-func -- Safe
  60. (0, _jsdoccomment.traverse)(typeAst, nde => {
  61. // istanbul ignore if -- TS guard
  62. if (deps === null) {
  63. return;
  64. }
  65. if (nde.type === 'JsdocTypeImport') {
  66. let mod = nde.element.value.replace(/^(@[^/]+\/[^/]+|[^/]+).*$/u, '$1');
  67. if (/^[./]/u.test(mod)) {
  68. return;
  69. }
  70. if ((0, _isBuiltinModule.default)(mod)) {
  71. // mod = '@types/node';
  72. // moduleCheck.set(mod, !deps.has(mod));
  73. return;
  74. } else if (!moduleCheck.has(mod)) {
  75. let pkg;
  76. try {
  77. pkg = JSON.parse(
  78. // @ts-expect-error It's ok
  79. (0, _fs.readFileSync)((0, _path.join)(process.cwd(), 'node_modules', mod, './package.json')));
  80. } catch {
  81. // Ignore
  82. }
  83. if (!pkg || !pkg.types && !pkg.typings) {
  84. mod = `@types/${mod}`;
  85. }
  86. moduleCheck.set(mod, !deps.has(mod));
  87. }
  88. if (moduleCheck.get(mod)) {
  89. utils.reportJSDoc('import points to package which is not found in dependencies', tag);
  90. }
  91. }
  92. });
  93. }
  94. }, {
  95. iterateAllJsdocs: true,
  96. meta: {
  97. docs: {
  98. description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',
  99. url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header'
  100. },
  101. type: 'suggestion'
  102. }
  103. });
  104. module.exports = exports.default;
  105. //# sourceMappingURL=importsAsDependencies.js.map