eslint-plugin-node-dependencies 1.3.0 → 2.0.0

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.
Files changed (57) hide show
  1. package/README.md +10 -66
  2. package/dist/chunk-C7Uep-_p.mjs +20 -0
  3. package/dist/index.d.mts +28 -0
  4. package/dist/index.mjs +1633 -0
  5. package/dist/worker.d.mts +7 -0
  6. package/dist/worker.mjs +30 -0
  7. package/package.json +17 -11
  8. package/dist/configs/flat/recommended.d.ts +0 -17
  9. package/dist/configs/flat/recommended.js +0 -57
  10. package/dist/configs/recommended.d.ts +0 -9
  11. package/dist/configs/recommended.js +0 -15
  12. package/dist/configs/rules/recommended.d.ts +0 -5
  13. package/dist/configs/rules/recommended.js +0 -9
  14. package/dist/index.d.ts +0 -34
  15. package/dist/index.js +0 -54
  16. package/dist/meta.d.ts +0 -1
  17. package/dist/meta.js +0 -5
  18. package/dist/rules/absolute-version.d.ts +0 -2
  19. package/dist/rules/absolute-version.js +0 -161
  20. package/dist/rules/compat-engines.d.ts +0 -2
  21. package/dist/rules/compat-engines.js +0 -263
  22. package/dist/rules/no-deprecated.d.ts +0 -2
  23. package/dist/rules/no-deprecated.js +0 -63
  24. package/dist/rules/no-dupe-deps.d.ts +0 -2
  25. package/dist/rules/no-dupe-deps.js +0 -90
  26. package/dist/rules/no-restricted-deps.d.ts +0 -2
  27. package/dist/rules/no-restricted-deps.js +0 -259
  28. package/dist/rules/prefer-caret-range-version.d.ts +0 -2
  29. package/dist/rules/prefer-caret-range-version.js +0 -99
  30. package/dist/rules/prefer-tilde-range-version.d.ts +0 -2
  31. package/dist/rules/prefer-tilde-range-version.js +0 -100
  32. package/dist/rules/require-provenance-deps.d.ts +0 -2
  33. package/dist/rules/require-provenance-deps.js +0 -98
  34. package/dist/rules/valid-engines.d.ts +0 -2
  35. package/dist/rules/valid-engines.js +0 -11
  36. package/dist/rules/valid-semver.d.ts +0 -2
  37. package/dist/rules/valid-semver.js +0 -78
  38. package/dist/types.d.ts +0 -51
  39. package/dist/types.js +0 -2
  40. package/dist/utils/ast-utils.d.ts +0 -3
  41. package/dist/utils/ast-utils.js +0 -24
  42. package/dist/utils/index.d.ts +0 -5
  43. package/dist/utils/index.js +0 -72
  44. package/dist/utils/meta.d.ts +0 -30
  45. package/dist/utils/meta.js +0 -269
  46. package/dist/utils/package-json/index.d.ts +0 -1
  47. package/dist/utils/package-json/index.js +0 -17
  48. package/dist/utils/package-json/worker.d.mts +0 -1
  49. package/dist/utils/package-json/worker.mjs +0 -26
  50. package/dist/utils/regexp.d.ts +0 -3
  51. package/dist/utils/regexp.js +0 -20
  52. package/dist/utils/rules.d.ts +0 -2
  53. package/dist/utils/rules.js +0 -28
  54. package/dist/utils/semver-range.d.ts +0 -7
  55. package/dist/utils/semver-range.js +0 -37
  56. package/dist/utils/semver.d.ts +0 -7
  57. package/dist/utils/semver.js +0 -204
@@ -1,263 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const jsonc_eslint_parser_1 = require("jsonc-eslint-parser");
7
- const utils_1 = require("../utils");
8
- const semver_1 = __importDefault(require("semver"));
9
- const ast_utils_1 = require("../utils/ast-utils");
10
- const semver_2 = require("../utils/semver");
11
- const meta_1 = require("../utils/meta");
12
- const eslint_compat_utils_1 = require("eslint-compat-utils");
13
- class EnginesContext {
14
- constructor(engineNames, validDependencies = new Set()) {
15
- this.unprocessedEngines = new Set();
16
- this.invalidEngines = new Map();
17
- this.validEngines = new Set();
18
- this.validDependencies = new Set();
19
- this.engines = new Set(engineNames);
20
- this.unprocessedEngines = new Set(this.engines);
21
- this.validDependencies = validDependencies;
22
- }
23
- nextContext() {
24
- return new EnginesContext(this.unprocessedEngines, this.validDependencies);
25
- }
26
- markAsProcessed(module) {
27
- this.unprocessedEngines.delete(module);
28
- }
29
- isAllProcessed() {
30
- return this.unprocessedEngines.size === 0;
31
- }
32
- markAsValid(module) {
33
- this.validEngines.add(module);
34
- this.invalidEngines.delete(module);
35
- }
36
- addInvalid(module, allowedVer) {
37
- if (this.validEngines.has(module)) {
38
- return;
39
- }
40
- const vers = this.invalidEngines.get(module);
41
- if (vers) {
42
- vers.set(allowedVer.raw, allowedVer);
43
- }
44
- else {
45
- this.invalidEngines.set(module, new Map([[allowedVer.raw, allowedVer]]));
46
- }
47
- }
48
- hasInvalid() {
49
- return this.invalidEngines.size > 0;
50
- }
51
- getInvalid() {
52
- return this.invalidEngines;
53
- }
54
- markAsValidDependency(name, ver) {
55
- this.validDependencies.add(`${name}@${ver}`);
56
- }
57
- isValidDependency(name, ver) {
58
- return this.validDependencies.has(`${name}@${ver}`);
59
- }
60
- }
61
- function buildAdjustRangeForSelf(comparisonType, original) {
62
- const adjustVers = [];
63
- for (const cc of original.set) {
64
- if (cc.length === 1) {
65
- if (cc[0].operator === ">" || cc[0].operator === ">=") {
66
- adjustVers.push(`${cc[0].value} <${semver_1.default.inc(cc[0].semver.version, "premajor")}`);
67
- continue;
68
- }
69
- }
70
- adjustVers.push(cc.map((c) => c.value).join(" "));
71
- }
72
- const range = new semver_1.default.Range(adjustVers.join("||"));
73
- if (comparisonType === "normal") {
74
- return range;
75
- }
76
- if (comparisonType === "major") {
77
- return range;
78
- }
79
- throw new Error(`Illegal comparisonType: ${comparisonType}`);
80
- }
81
- function buildAdjustRangeForDeps(comparisonType, original) {
82
- if (comparisonType === "normal") {
83
- return original;
84
- }
85
- if (comparisonType === "major") {
86
- const majorVers = [];
87
- for (const cc of original.set) {
88
- majorVers.push(cc
89
- .map((c) => {
90
- if (c.operator === ">" || c.operator === ">=") {
91
- return `${c.operator}${c.semver.major}`;
92
- }
93
- return c.value;
94
- })
95
- .join(" "));
96
- }
97
- return new semver_1.default.Range(majorVers.join("||"));
98
- }
99
- throw new Error(`Illegal comparisonType: ${comparisonType}`);
100
- }
101
- function extractDependencies(metaList) {
102
- const dependencies = new Map();
103
- for (const meta of metaList) {
104
- for (const [m, v] of [
105
- ...(0, meta_1.getDependencies)(meta, "dependencies"),
106
- ...(0, meta_1.getDependencies)(meta, "peerDependencies"),
107
- ]) {
108
- const range = (0, semver_2.getSemverRange)(v);
109
- if (!range) {
110
- continue;
111
- }
112
- const ranges = dependencies.get(m);
113
- if (ranges) {
114
- ranges.push(range);
115
- }
116
- else {
117
- dependencies.set(m, [range]);
118
- }
119
- }
120
- }
121
- return [...dependencies].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
122
- }
123
- exports.default = (0, utils_1.createRule)("compat-engines", {
124
- meta: {
125
- docs: {
126
- description: "enforce the versions of the engines of the dependencies to be compatible.",
127
- category: "Possible Errors",
128
- recommended: true,
129
- },
130
- schema: [
131
- {
132
- type: "object",
133
- properties: {
134
- deep: { type: "boolean" },
135
- comparisonType: { enum: ["normal", "major"] },
136
- },
137
- additionalProperties: false,
138
- },
139
- ],
140
- messages: {},
141
- type: "problem",
142
- },
143
- create(context) {
144
- var _a, _b, _c;
145
- const sourceCode = (0, eslint_compat_utils_1.getSourceCode)(context);
146
- if (!sourceCode.parserServices.isJSON) {
147
- return {};
148
- }
149
- const deep = ((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.deep) !== false;
150
- const comparisonType = (_c = (_b = context.options[0]) === null || _b === void 0 ? void 0 : _b.comparisonType) !== null && _c !== void 0 ? _c : "normal";
151
- const selfEngines = new Map();
152
- function processMeta(ctx, meta) {
153
- const depEngines = (0, meta_1.getEngines)(meta);
154
- for (const module of ctx.engines) {
155
- const selfVer = selfEngines.get(module);
156
- const engineValue = depEngines.get(module);
157
- if (engineValue && engineValue !== "*") {
158
- ctx.markAsProcessed(module);
159
- }
160
- const depVer = (0, semver_2.getSemverRange)(engineValue || "*");
161
- if (!depVer) {
162
- continue;
163
- }
164
- if (semver_1.default.subset(selfVer.adjust, buildAdjustRangeForDeps(comparisonType, depVer))) {
165
- ctx.markAsValid(module);
166
- }
167
- else {
168
- ctx.addInvalid(module, depVer);
169
- }
170
- }
171
- }
172
- function processDependencyModule(ctx, name, ver, modules, node) {
173
- const currModules = [...modules, `${name}@${ver}`];
174
- const nodeModulesMeta = (0, meta_1.getMetaFromNodeModules)(name, ver, { context });
175
- if (nodeModulesMeta) {
176
- processMeta(ctx, nodeModulesMeta);
177
- if (!ctx.hasInvalid() && ctx.isAllProcessed()) {
178
- return;
179
- }
180
- }
181
- const metaData = (0, meta_1.getMetaFromNpm)(name, ver);
182
- for (const meta of metaData.cache) {
183
- processMeta(ctx, meta);
184
- if (!ctx.hasInvalid() && ctx.isAllProcessed()) {
185
- return;
186
- }
187
- }
188
- const metaList = metaData.get();
189
- if (!metaList) {
190
- return;
191
- }
192
- for (const meta of metaList) {
193
- processMeta(ctx, meta);
194
- if (!ctx.hasInvalid() && ctx.isAllProcessed()) {
195
- return;
196
- }
197
- }
198
- for (const [module, allowedVers] of ctx.getInvalid()) {
199
- const selfVer = selfEngines.get(module);
200
- const depVer = (0, semver_2.normalizeSemverRange)(...allowedVers.values()) ||
201
- [...allowedVers.values()].pop();
202
- if (semver_1.default.subset(selfVer.adjust, buildAdjustRangeForDeps(comparisonType, depVer))) {
203
- continue;
204
- }
205
- context.report({
206
- loc: node.loc,
207
- message: `${currModules
208
- .map((m) => `"${m}"`)
209
- .join(" >> ")} is not compatible with "${module}@${(0, semver_2.normalizeVer)(selfVer.original)}". Allowed is: "${module}@${(0, semver_2.normalizeVer)(depVer)}"`,
210
- });
211
- }
212
- if (ctx.isAllProcessed()) {
213
- return;
214
- }
215
- ctx.markAsValidDependency(name, ver);
216
- if (deep) {
217
- for (const [n, ranges] of extractDependencies(metaList)) {
218
- const v = (0, semver_2.normalizeSemverRange)(...ranges);
219
- if (v && !ctx.isValidDependency(n, v.raw)) {
220
- processDependencyModule(ctx.nextContext(), n, v.raw, currModules, node);
221
- }
222
- }
223
- }
224
- }
225
- return (0, utils_1.compositingVisitors)({
226
- JSONExpressionStatement(node) {
227
- const expr = node.expression;
228
- if (expr.type !== "JSONObjectExpression") {
229
- return;
230
- }
231
- const enginesNode = expr.properties.find((p) => (0, ast_utils_1.getKeyFromJSONProperty)(p) === "engines");
232
- if (!enginesNode) {
233
- return;
234
- }
235
- for (const [key, val] of (0, meta_1.getEngines)({
236
- engines: (0, jsonc_eslint_parser_1.getStaticJSONValue)(enginesNode.value),
237
- })) {
238
- const selfVer = (0, semver_2.getSemverRange)(val);
239
- if (!selfVer) {
240
- continue;
241
- }
242
- selfEngines.set(key, {
243
- adjust: buildAdjustRangeForSelf(comparisonType, selfVer),
244
- original: selfVer,
245
- });
246
- }
247
- },
248
- }, (0, utils_1.defineJsonVisitor)({
249
- "dependencies, peerDependencies"(node) {
250
- if (selfEngines.size === 0) {
251
- return;
252
- }
253
- const name = (0, ast_utils_1.getKeyFromJSONProperty)(node);
254
- const ver = (0, jsonc_eslint_parser_1.getStaticJSONValue)(node.value);
255
- if (typeof name !== "string" || typeof ver !== "string") {
256
- return;
257
- }
258
- const ctx = new EnginesContext(selfEngines.keys());
259
- processDependencyModule(ctx, name, ver, [], node);
260
- },
261
- }));
262
- },
263
- });
@@ -1,2 +0,0 @@
1
- declare const _default: import("../types").RuleModule;
2
- export default _default;
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const jsonc_eslint_parser_1 = require("jsonc-eslint-parser");
4
- const utils_1 = require("../utils");
5
- const ast_utils_1 = require("../utils/ast-utils");
6
- const meta_1 = require("../utils/meta");
7
- const eslint_compat_utils_1 = require("eslint-compat-utils");
8
- exports.default = (0, utils_1.createRule)("no-deprecated", {
9
- meta: {
10
- docs: {
11
- description: "disallow having dependencies on deprecate packages.",
12
- category: "Best Practices",
13
- recommended: false,
14
- },
15
- schema: [
16
- {
17
- type: "object",
18
- properties: {
19
- devDependencies: { type: "boolean" },
20
- allows: {
21
- type: "array",
22
- items: { type: "string" },
23
- uniqueItems: true,
24
- },
25
- },
26
- additionalProperties: false,
27
- },
28
- ],
29
- messages: {},
30
- type: "suggestion",
31
- },
32
- create(context) {
33
- var _a;
34
- const sourceCode = (0, eslint_compat_utils_1.getSourceCode)(context);
35
- if (!sourceCode.parserServices.isJSON) {
36
- return {};
37
- }
38
- const devDependencies = Boolean((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.devDependencies);
39
- return (0, utils_1.defineJsonVisitor)({
40
- [devDependencies
41
- ? "dependencies, peerDependencies, devDependencies"
42
- : "dependencies, peerDependencies"](node) {
43
- var _a, _b;
44
- const name = (0, ast_utils_1.getKeyFromJSONProperty)(node);
45
- const ver = (0, jsonc_eslint_parser_1.getStaticJSONValue)(node.value);
46
- if (typeof name !== "string" || typeof ver !== "string" || !ver) {
47
- return;
48
- }
49
- if ((_b = (_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.allows) === null || _b === void 0 ? void 0 : _b.includes(name)) {
50
- return;
51
- }
52
- const meta = (0, meta_1.getMetaFromNpm)(name, ver).get();
53
- const deprecated = meta && meta.length && meta[meta.length - 1].deprecated;
54
- if (deprecated) {
55
- context.report({
56
- loc: node.loc,
57
- message: `${deprecated}`,
58
- });
59
- }
60
- },
61
- });
62
- },
63
- });
@@ -1,2 +0,0 @@
1
- declare const _default: import("../types").RuleModule;
2
- export default _default;
@@ -1,90 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_1 = require("../utils");
4
- const ast_utils_1 = require("../utils/ast-utils");
5
- const eslint_compat_utils_1 = require("eslint-compat-utils");
6
- const DEPS = [
7
- "dependencies",
8
- "peerDependencies",
9
- "optionalDependencies",
10
- "devDependencies",
11
- ];
12
- class AllowDuplicates {
13
- constructor() {
14
- this.edges = [];
15
- }
16
- add(d1, d2) {
17
- this.edges.push([d1, d2]);
18
- }
19
- isAllowedDuplicate(dep1, dep2) {
20
- return this.edges.some(([d1, d2]) => (d1 === dep1 && d2 === dep2) || (d2 === dep1 && d1 === dep2));
21
- }
22
- }
23
- exports.default = (0, utils_1.createRule)("no-dupe-deps", {
24
- meta: {
25
- docs: {
26
- description: "disallow duplicate dependencies.",
27
- category: "Possible Errors",
28
- recommended: true,
29
- },
30
- schema: [],
31
- messages: {
32
- duplicated: "Duplicated dependency '{{name}}'.",
33
- },
34
- type: "problem",
35
- },
36
- create(context) {
37
- const sourceCode = (0, eslint_compat_utils_1.getSourceCode)(context);
38
- if (!sourceCode.parserServices.isJSON) {
39
- return {};
40
- }
41
- const allowDuplicates = new AllowDuplicates();
42
- allowDuplicates.add("devDependencies", "peerDependencies");
43
- allowDuplicates.add("devDependencies", "optionalDependencies");
44
- const maps = {
45
- dependencies: new Map(),
46
- peerDependencies: new Map(),
47
- optionalDependencies: new Map(),
48
- devDependencies: new Map(),
49
- };
50
- const reported = new Set();
51
- function report(name, node) {
52
- if (reported.has(node)) {
53
- return;
54
- }
55
- reported.add(node);
56
- context.report({
57
- loc: node.key.loc,
58
- messageId: "duplicated",
59
- data: {
60
- name,
61
- },
62
- });
63
- }
64
- function verify(depsName, name, node) {
65
- for (const dep of DEPS) {
66
- if (allowDuplicates.isAllowedDuplicate(dep, depsName)) {
67
- continue;
68
- }
69
- const dupeNode = maps[dep].get(name);
70
- if (dupeNode) {
71
- report(name, dupeNode);
72
- report(name, node);
73
- }
74
- }
75
- }
76
- function defineVisitor(depsName) {
77
- return (node) => {
78
- const name = String((0, ast_utils_1.getKeyFromJSONProperty)(node));
79
- verify(depsName, name, node);
80
- maps[depsName].set(name, node);
81
- };
82
- }
83
- return (0, utils_1.defineJsonVisitor)({
84
- dependencies: defineVisitor("dependencies"),
85
- peerDependencies: defineVisitor("peerDependencies"),
86
- optionalDependencies: defineVisitor("optionalDependencies"),
87
- devDependencies: defineVisitor("devDependencies"),
88
- });
89
- },
90
- });
@@ -1,2 +0,0 @@
1
- declare const _default: import("../types").RuleModule;
2
- export default _default;
@@ -1,259 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_1 = require("../utils");
4
- const regexp_1 = require("../utils/regexp");
5
- const semver_1 = require("semver");
6
- const semver_2 = require("../utils/semver");
7
- const ast_utils_1 = require("../utils/ast-utils");
8
- const jsonc_eslint_parser_1 = require("jsonc-eslint-parser");
9
- const meta_1 = require("../utils/meta");
10
- const eslint_compat_utils_1 = require("eslint-compat-utils");
11
- const DEPS = [
12
- "dependencies",
13
- "peerDependencies",
14
- "optionalDependencies",
15
- ];
16
- class Deps {
17
- constructor() {
18
- this.map = Object.create(null);
19
- this.list = [];
20
- }
21
- push(name, ver, ownerPackageJsonPath) {
22
- const range = (0, semver_2.getSemverRange)(ver);
23
- if (range) {
24
- const data = this.map[name];
25
- if (data) {
26
- const newRange = (0, semver_2.normalizeSemverRange)(data.range, range);
27
- this.map[name] = {
28
- range: newRange,
29
- ownerPackageJsonPath: ownerPackageJsonPath || data.ownerPackageJsonPath,
30
- };
31
- }
32
- else {
33
- this.map[name] = {
34
- range,
35
- ownerPackageJsonPath,
36
- };
37
- }
38
- return;
39
- }
40
- this.list.push({ name, ver, ownerPackageJsonPath });
41
- }
42
- pop() {
43
- const resultForList = this.list.shift();
44
- if (resultForList) {
45
- return resultForList;
46
- }
47
- const [key] = Object.keys(this.map);
48
- if (key) {
49
- const data = this.map[key];
50
- delete this.map[key];
51
- return {
52
- name: key,
53
- ver: (0, semver_2.normalizeVer)(data.range),
54
- ownerPackageJsonPath: data.ownerPackageJsonPath,
55
- };
56
- }
57
- return null;
58
- }
59
- }
60
- class DeepValidateContext {
61
- constructor(context, validator) {
62
- this.deepValidatedCache = new Map();
63
- this.context = context;
64
- this.validator = validator;
65
- }
66
- buildDeepValidator(deepOption) {
67
- return (n, v) => this.deepDepsValidate(n, v, deepOption);
68
- }
69
- deepDepsValidate(packageName, version, deepOption) {
70
- const { validator: validate, context } = this;
71
- const depsQueue = new Deps();
72
- depsQueue.push(packageName, version);
73
- let dep;
74
- while ((dep = depsQueue.pop())) {
75
- const key = `${dep.name}@${dep.ver}`;
76
- if (this.deepValidatedCache.has(key)) {
77
- const result = this.deepValidatedCache.get(key);
78
- if (result) {
79
- return result;
80
- }
81
- }
82
- else {
83
- const result = validateWithoutCache(dep.name, dep.ver, dep.ownerPackageJsonPath);
84
- this.deepValidatedCache.set(key, result);
85
- if (result) {
86
- return result;
87
- }
88
- }
89
- }
90
- return null;
91
- function validateWithoutCache(name, ver, ownerPackageJsonPath) {
92
- const result = validate(name, ver);
93
- if (result) {
94
- return result;
95
- }
96
- for (const { name: n, ver: v, packageJsonPath } of iterateDeps(name, ver, ownerPackageJsonPath)) {
97
- const r = validate(n, v);
98
- if (r) {
99
- return r;
100
- }
101
- depsQueue.push(n, v, packageJsonPath);
102
- }
103
- return null;
104
- }
105
- function* iterateDeps(name, ver, ownerPackageJsonPath) {
106
- yield* iterateDepsForMeta((0, meta_1.getMetaFromNodeModules)(name, ver, {
107
- context,
108
- ownerPackageJsonPath,
109
- }));
110
- if (deepOption === "server") {
111
- const metaData = (0, meta_1.getMetaFromNpm)(name, ver);
112
- for (const meta of metaData.cache) {
113
- yield* iterateDepsForMeta(meta);
114
- }
115
- const metaList = metaData.get();
116
- if (metaList) {
117
- for (const meta of metaList) {
118
- yield* iterateDepsForMeta(meta);
119
- }
120
- }
121
- }
122
- }
123
- function* iterateDepsForMeta(meta) {
124
- if (!meta) {
125
- return;
126
- }
127
- for (const depName of DEPS) {
128
- const deps = meta[depName];
129
- if (!deps) {
130
- continue;
131
- }
132
- for (const [n, v] of Object.entries(deps)) {
133
- if (typeof v === "string") {
134
- yield { name: n, ver: v, packageJsonPath: meta._where };
135
- }
136
- }
137
- }
138
- }
139
- }
140
- }
141
- exports.default = (0, utils_1.createRule)("no-restricted-deps", {
142
- meta: {
143
- docs: {
144
- description: "Disallows dependence on the specified package.",
145
- category: "Best Practices",
146
- recommended: false,
147
- },
148
- schema: {
149
- type: "array",
150
- items: {
151
- oneOf: [
152
- {
153
- type: "string",
154
- },
155
- {
156
- type: "object",
157
- properties: {
158
- package: { type: "string" },
159
- version: { type: "string" },
160
- message: { type: "string" },
161
- deep: { enum: ["local", "server"] },
162
- },
163
- required: ["package"],
164
- additionalProperties: false,
165
- },
166
- ],
167
- },
168
- uniqueItems: true,
169
- minItems: 0,
170
- },
171
- messages: {
172
- restricted: "{{message}}",
173
- },
174
- type: "suggestion",
175
- },
176
- create(context) {
177
- const sourceCode = (0, eslint_compat_utils_1.getSourceCode)(context);
178
- if (!sourceCode.parserServices.isJSON) {
179
- return {};
180
- }
181
- const validateForPackage = parseOptions(context.options);
182
- function defineVisitor(_depsName) {
183
- return (node) => {
184
- const name = String((0, ast_utils_1.getKeyFromJSONProperty)(node));
185
- const ver = String((0, jsonc_eslint_parser_1.getStaticJSONValue)(node.value));
186
- const result = validateForPackage(name, ver);
187
- if (!result) {
188
- return;
189
- }
190
- context.report({
191
- loc: node.loc,
192
- messageId: "restricted",
193
- data: result,
194
- });
195
- };
196
- }
197
- return (0, utils_1.defineJsonVisitor)({
198
- dependencies: defineVisitor("dependencies"),
199
- peerDependencies: defineVisitor("peerDependencies"),
200
- optionalDependencies: defineVisitor("optionalDependencies"),
201
- devDependencies: defineVisitor("devDependencies"),
202
- });
203
- function matchVersions(version, optionVersion) {
204
- if (!optionVersion) {
205
- return true;
206
- }
207
- const range = (0, semver_2.getSemverRange)(version);
208
- return Boolean(range && (0, semver_1.intersects)(range, optionVersion));
209
- }
210
- function parseOption(option) {
211
- if (typeof option === "string") {
212
- const regexp = (0, regexp_1.toRegExp)(option);
213
- return (n, _v) => {
214
- if (regexp.test(n)) {
215
- return {
216
- message: `Depend on '${option}' is not allowed.`,
217
- };
218
- }
219
- return null;
220
- };
221
- }
222
- const regexp = (0, regexp_1.toRegExp)(option.package);
223
- const version = option.version ? (0, semver_2.getSemverRange)(option.version) : null;
224
- const validator = (n, v) => {
225
- if (regexp.test(n) && matchVersions(v, version)) {
226
- return {
227
- message: option.message || buildDefaultMessage(option),
228
- };
229
- }
230
- return null;
231
- };
232
- if (!option.deep) {
233
- return validator;
234
- }
235
- const deepValidateContext = new DeepValidateContext(context, validator);
236
- return deepValidateContext.buildDeepValidator(option.deep);
237
- function buildDefaultMessage(objectOption) {
238
- const versionForMessage = objectOption.version
239
- ? `@${objectOption.version}`
240
- : "";
241
- if (objectOption.package.startsWith("/") && versionForMessage) {
242
- return `Depend on '${objectOption.package} ${versionForMessage}' is not allowed.`;
243
- }
244
- return `Depend on '${objectOption.package}${versionForMessage}' is not allowed.`;
245
- }
246
- }
247
- function parseOptions(options) {
248
- const validators = options.map(parseOption);
249
- return (packageName, version) => {
250
- for (const validator of validators) {
251
- const result = validator(packageName, version);
252
- if (result)
253
- return result;
254
- }
255
- return null;
256
- };
257
- }
258
- },
259
- });
@@ -1,2 +0,0 @@
1
- declare const _default: import("../types").RuleModule;
2
- export default _default;