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