@monorepolint/rules 0.5.0-alpha.67 → 0.5.0-alpha.70
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.
- package/lib/__tests__/consistentDependencies.spec.js +9 -2
- package/lib/__tests__/consistentDependencies.spec.js.map +1 -1
- package/lib/bannedDependencies.js +11 -4
- package/lib/bannedDependencies.js.map +1 -1
- package/lib/consistentDependencies.d.ts +8 -1
- package/lib/consistentDependencies.d.ts.map +1 -1
- package/lib/consistentDependencies.js +24 -7
- package/lib/consistentDependencies.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/consistentDependencies.spec.ts +12 -3
- package/src/bannedDependencies.ts +13 -5
- package/src/consistentDependencies.ts +29 -8
- package/tsconfig.tsbuildinfo +4 -4
|
@@ -60,10 +60,10 @@ describe("consistentDependencies", () => {
|
|
|
60
60
|
verbose: false,
|
|
61
61
|
silent: true,
|
|
62
62
|
});
|
|
63
|
-
function checkAndSpy(q) {
|
|
63
|
+
function checkAndSpy(q, opts) {
|
|
64
64
|
const context = workspaceContext.createChildContext(path.resolve(dir.name, q));
|
|
65
65
|
const addErrorSpy = jest.spyOn(context, "addError");
|
|
66
|
-
consistentDependencies_1.consistentDependencies.check(context,
|
|
66
|
+
consistentDependencies_1.consistentDependencies.check(context, opts);
|
|
67
67
|
return { context, addErrorSpy };
|
|
68
68
|
}
|
|
69
69
|
function addFile(filePath, content) {
|
|
@@ -103,5 +103,12 @@ describe("consistentDependencies", () => {
|
|
|
103
103
|
const contents = readFile("./packages/wrong/package.json");
|
|
104
104
|
expect(contents).toEqual(PACKAGE_CHILD_WITH_RIGHT_VERSION);
|
|
105
105
|
});
|
|
106
|
+
it("ignores ignored dependencies", () => {
|
|
107
|
+
const { addFile, checkAndSpy } = makeWorkspace({ fix: false });
|
|
108
|
+
addFile("./package.json", PACKAGE_ROOT);
|
|
109
|
+
addFile("./packages/wrong/package.json", PACKAGE_CHILD_WITH_WRONG_VERSION);
|
|
110
|
+
const ignored = checkAndSpy("./packages/wrong", { ignoredDependencies: ["foo"] });
|
|
111
|
+
expect(ignored.addErrorSpy).toHaveBeenCalledTimes(0);
|
|
112
|
+
});
|
|
106
113
|
});
|
|
107
114
|
//# sourceMappingURL=consistentDependencies.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consistentDependencies.spec.js","sourceRoot":"","sources":["../../src/__tests__/consistentDependencies.spec.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6CAAsD;AACtD,2BAAiD;AACjD,mDAA6B;AAC7B,iDAA2B;AAC3B,
|
|
1
|
+
{"version":3,"file":"consistentDependencies.spec.js","sourceRoot":"","sources":["../../src/__tests__/consistentDependencies.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,15 +81,22 @@ function checkTransitives(context,
|
|
|
81
81
|
bannedDependencies) {
|
|
82
82
|
const graphService = new packageDependencyGraphService_1.PackageDependencyGraphService();
|
|
83
83
|
const root = graphService.buildDependencyGraph(path_1.default.resolve(context.getPackageJsonPath()));
|
|
84
|
-
for (const { dependencies } of graphService.traverse(root)) {
|
|
85
|
-
for (const [dependency
|
|
84
|
+
for (const { dependencies, importPath } of graphService.traverse(root)) {
|
|
85
|
+
for (const [dependency] of dependencies) {
|
|
86
86
|
if (bannedDependencies.includes(dependency)) {
|
|
87
|
+
// Remove the starting package since it's obvious in CLI output.
|
|
88
|
+
const [, ...importPathWithoutRoot] = importPath;
|
|
89
|
+
const pathing = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(" -> ");
|
|
87
90
|
context.addError({
|
|
88
|
-
file:
|
|
89
|
-
message: `Banned transitive dependencies in repo: ${
|
|
91
|
+
file: root.paths.packageJsonPath,
|
|
92
|
+
message: `Banned transitive dependencies in repo: ${pathing}`,
|
|
90
93
|
});
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
}
|
|
94
97
|
}
|
|
98
|
+
function nameOrPackageJsonPath(node) {
|
|
99
|
+
var _a;
|
|
100
|
+
return (_a = node.packageJson.name) !== null && _a !== void 0 ? _a : node.paths.packageJsonPath;
|
|
101
|
+
}
|
|
95
102
|
//# sourceMappingURL=bannedDependencies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bannedDependencies.js","sourceRoot":"","sources":["../src/bannedDependencies.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;AAGH,+CAAgD;AAChD,kEAA6B;AAC7B,kEAAkC;AAClC,wDAAwB;AACxB,oDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"bannedDependencies.js","sourceRoot":"","sources":["../src/bannedDependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,12 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { RuleModule } from "@monorepolint/core";
|
|
8
8
|
import * as r from "runtypes";
|
|
9
|
-
|
|
9
|
+
declare const Options: r.Union2<r.Record<{
|
|
10
|
+
ignoredDependencies: r.Union2<r.Array<r.String, false>, r.Literal<undefined>>;
|
|
11
|
+
}, false>, r.Literal<undefined>>;
|
|
12
|
+
export declare type Options = r.Static<typeof Options>;
|
|
13
|
+
export declare const consistentDependencies: RuleModule<r.Union2<r.Record<{
|
|
14
|
+
ignoredDependencies: r.Union2<r.Array<r.String, false>, r.Literal<undefined>>;
|
|
15
|
+
}, false>, r.Literal<undefined>>>;
|
|
16
|
+
export {};
|
|
10
17
|
//# sourceMappingURL=consistentDependencies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consistentDependencies.d.ts","sourceRoot":"","sources":["../src/consistentDependencies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"consistentDependencies.d.ts","sourceRoot":"","sources":["../src/consistentDependencies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,QAAA,MAAM,OAAO;;gCAIK,CAAC;AACnB,oBAAY,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC;AAI/C,eAAO,MAAM,sBAAsB;;iCAOJ,CAAC"}
|
|
@@ -11,28 +11,37 @@ const tslib_1 = require("tslib");
|
|
|
11
11
|
const utils_1 = require("@monorepolint/utils");
|
|
12
12
|
const jest_diff_1 = tslib_1.__importDefault(require("jest-diff"));
|
|
13
13
|
const r = tslib_1.__importStar(require("runtypes"));
|
|
14
|
-
const Options = r
|
|
14
|
+
const Options = r
|
|
15
|
+
.Record({
|
|
16
|
+
ignoredDependencies: r.Array(r.String).Or(r.Undefined),
|
|
17
|
+
})
|
|
18
|
+
.Or(r.Undefined);
|
|
15
19
|
const skippedVersions = ["*", "latest"];
|
|
16
20
|
exports.consistentDependencies = {
|
|
17
|
-
check: function expectConsistentDependencies(context) {
|
|
18
|
-
checkDeps(context, "dependencies");
|
|
19
|
-
checkDeps(context, "devDependencies");
|
|
21
|
+
check: function expectConsistentDependencies(context, args) {
|
|
22
|
+
checkDeps(context, args, "dependencies");
|
|
23
|
+
checkDeps(context, args, "devDependencies");
|
|
20
24
|
// we don't check peer deps since they can be more lenient
|
|
21
25
|
},
|
|
22
26
|
optionsRuntype: Options,
|
|
23
27
|
};
|
|
24
|
-
function checkDeps(context, block) {
|
|
28
|
+
function checkDeps(context, args, block) {
|
|
29
|
+
var _a;
|
|
25
30
|
const packageJson = context.getPackageJson();
|
|
26
31
|
const packagePath = context.getPackageJsonPath();
|
|
27
32
|
const dependencies = packageJson[block];
|
|
28
33
|
const workspacePackageJson = context.getWorkspaceContext().getPackageJson();
|
|
29
34
|
const workspaceDependencies = workspacePackageJson[block];
|
|
30
|
-
|
|
35
|
+
const ignoredDeps = (_a = args === null || args === void 0 ? void 0 : args.ignoredDependencies) !== null && _a !== void 0 ? _a : [];
|
|
36
|
+
const depsToCheck = workspaceDependencies == null || ignoredDeps.length === 0
|
|
37
|
+
? workspaceDependencies
|
|
38
|
+
: omit(workspaceDependencies, ignoredDeps);
|
|
39
|
+
if (dependencies === undefined || depsToCheck === undefined) {
|
|
31
40
|
return;
|
|
32
41
|
}
|
|
33
42
|
const expectedDependencies = {
|
|
34
43
|
...dependencies,
|
|
35
|
-
...filterKeys(
|
|
44
|
+
...filterKeys(depsToCheck, dependencies),
|
|
36
45
|
};
|
|
37
46
|
if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {
|
|
38
47
|
context.addError({
|
|
@@ -56,4 +65,12 @@ function filterKeys(ob, filterOb) {
|
|
|
56
65
|
}
|
|
57
66
|
return newOb;
|
|
58
67
|
}
|
|
68
|
+
function omit(obj, keysToOmit) {
|
|
69
|
+
const newObj = {};
|
|
70
|
+
const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));
|
|
71
|
+
for (const [key, value] of filtered) {
|
|
72
|
+
newObj[key] = value;
|
|
73
|
+
}
|
|
74
|
+
return newObj;
|
|
75
|
+
}
|
|
59
76
|
//# sourceMappingURL=consistentDependencies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consistentDependencies.js","sourceRoot":"","sources":["../src/consistentDependencies.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;AAGH,+CAAgD;AAChD,kEAA6B;AAC7B,oDAA8B;AAE9B,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"consistentDependencies.js","sourceRoot":"","sources":["../src/consistentDependencies.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monorepolint/rules",
|
|
3
|
-
"version": "0.5.0-alpha.
|
|
3
|
+
"version": "0.5.0-alpha.70+bdae352",
|
|
4
4
|
"author": "Eric L Anderson (https://github.com/ericanderson)",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Mac Lockard (https://github.com/maclockard)"
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"test:watch": "../../node_modules/.bin/jest --colors --passWithNoTests --watch"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@monorepolint/core": "^0.5.0-alpha.
|
|
23
|
-
"@monorepolint/utils": "^0.5.0-alpha.
|
|
22
|
+
"@monorepolint/core": "^0.5.0-alpha.70+bdae352",
|
|
23
|
+
"@monorepolint/utils": "^0.5.0-alpha.70+bdae352",
|
|
24
24
|
"globby": "^11.0.1",
|
|
25
25
|
"jest-diff": "^26.0.1",
|
|
26
26
|
"minimatch": "^3.0.4",
|
|
@@ -38,5 +38,5 @@
|
|
|
38
38
|
"publishConfig": {
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "bdae352c4cb61a42d5e135285b20950bbcec73bd"
|
|
42
42
|
}
|
|
@@ -8,7 +8,7 @@ import { WorkspaceContext } from "@monorepolint/core";
|
|
|
8
8
|
import { readFileSync, writeFileSync } from "fs";
|
|
9
9
|
import * as path from "path";
|
|
10
10
|
import * as tmp from "tmp";
|
|
11
|
-
import { consistentDependencies } from "../consistentDependencies";
|
|
11
|
+
import { consistentDependencies, Options } from "../consistentDependencies";
|
|
12
12
|
import { makeDirectoryRecursively } from "../util/makeDirectory";
|
|
13
13
|
import { jsonToString } from "./utils";
|
|
14
14
|
|
|
@@ -68,10 +68,10 @@ describe("consistentDependencies", () => {
|
|
|
68
68
|
silent: true,
|
|
69
69
|
});
|
|
70
70
|
|
|
71
|
-
function checkAndSpy(q: string) {
|
|
71
|
+
function checkAndSpy(q: string, opts?: Options) {
|
|
72
72
|
const context = workspaceContext.createChildContext(path.resolve(dir.name, q));
|
|
73
73
|
const addErrorSpy = jest.spyOn(context, "addError");
|
|
74
|
-
consistentDependencies.check(context,
|
|
74
|
+
consistentDependencies.check(context, opts);
|
|
75
75
|
return { context, addErrorSpy };
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -124,4 +124,13 @@ describe("consistentDependencies", () => {
|
|
|
124
124
|
const contents = readFile("./packages/wrong/package.json");
|
|
125
125
|
expect(contents).toEqual(PACKAGE_CHILD_WITH_RIGHT_VERSION);
|
|
126
126
|
});
|
|
127
|
+
|
|
128
|
+
it("ignores ignored dependencies", () => {
|
|
129
|
+
const { addFile, checkAndSpy } = makeWorkspace({ fix: false });
|
|
130
|
+
addFile("./package.json", PACKAGE_ROOT);
|
|
131
|
+
addFile("./packages/wrong/package.json", PACKAGE_CHILD_WITH_WRONG_VERSION);
|
|
132
|
+
|
|
133
|
+
const ignored = checkAndSpy("./packages/wrong", { ignoredDependencies: ["foo"] });
|
|
134
|
+
expect(ignored.addErrorSpy).toHaveBeenCalledTimes(0);
|
|
135
|
+
});
|
|
127
136
|
});
|
|
@@ -11,7 +11,7 @@ import diff from "jest-diff";
|
|
|
11
11
|
import minimatch from "minimatch";
|
|
12
12
|
import path from "path";
|
|
13
13
|
import * as r from "runtypes";
|
|
14
|
-
import { PackageDependencyGraphService } from "./util/packageDependencyGraphService";
|
|
14
|
+
import { IPackageDependencyGraphNode, PackageDependencyGraphService } from "./util/packageDependencyGraphService";
|
|
15
15
|
|
|
16
16
|
const Options = r.Union(
|
|
17
17
|
r
|
|
@@ -106,14 +106,22 @@ function checkTransitives(
|
|
|
106
106
|
) {
|
|
107
107
|
const graphService = new PackageDependencyGraphService();
|
|
108
108
|
const root = graphService.buildDependencyGraph(path.resolve(context.getPackageJsonPath()));
|
|
109
|
-
for (const { dependencies } of graphService.traverse(root)) {
|
|
110
|
-
for (const [dependency
|
|
109
|
+
for (const { dependencies, importPath } of graphService.traverse(root)) {
|
|
110
|
+
for (const [dependency] of dependencies) {
|
|
111
111
|
if (bannedDependencies.includes(dependency)) {
|
|
112
|
+
// Remove the starting package since it's obvious in CLI output.
|
|
113
|
+
const [, ...importPathWithoutRoot] = importPath;
|
|
114
|
+
const pathing = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(" -> ");
|
|
115
|
+
|
|
112
116
|
context.addError({
|
|
113
|
-
file:
|
|
114
|
-
message: `Banned transitive dependencies in repo: ${
|
|
117
|
+
file: root.paths.packageJsonPath,
|
|
118
|
+
message: `Banned transitive dependencies in repo: ${pathing}`,
|
|
115
119
|
});
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
122
|
}
|
|
119
123
|
}
|
|
124
|
+
|
|
125
|
+
function nameOrPackageJsonPath(node: IPackageDependencyGraphNode): string {
|
|
126
|
+
return node.packageJson.name ?? node.paths.packageJsonPath;
|
|
127
|
+
}
|
|
@@ -10,21 +10,25 @@ import { writeJson } from "@monorepolint/utils";
|
|
|
10
10
|
import diff from "jest-diff";
|
|
11
11
|
import * as r from "runtypes";
|
|
12
12
|
|
|
13
|
-
const Options = r
|
|
14
|
-
|
|
13
|
+
const Options = r
|
|
14
|
+
.Record({
|
|
15
|
+
ignoredDependencies: r.Array(r.String).Or(r.Undefined),
|
|
16
|
+
})
|
|
17
|
+
.Or(r.Undefined);
|
|
18
|
+
export type Options = r.Static<typeof Options>;
|
|
15
19
|
|
|
16
20
|
const skippedVersions = ["*", "latest"];
|
|
17
21
|
|
|
18
22
|
export const consistentDependencies = {
|
|
19
|
-
check: function expectConsistentDependencies(context: Context) {
|
|
20
|
-
checkDeps(context, "dependencies");
|
|
21
|
-
checkDeps(context, "devDependencies");
|
|
23
|
+
check: function expectConsistentDependencies(context: Context, args: Options) {
|
|
24
|
+
checkDeps(context, args, "dependencies");
|
|
25
|
+
checkDeps(context, args, "devDependencies");
|
|
22
26
|
// we don't check peer deps since they can be more lenient
|
|
23
27
|
},
|
|
24
28
|
optionsRuntype: Options,
|
|
25
29
|
} as RuleModule<typeof Options>;
|
|
26
30
|
|
|
27
|
-
function checkDeps(context: Context, block: "dependencies" | "devDependencies" | "peerDependencies") {
|
|
31
|
+
function checkDeps(context: Context, args: Options, block: "dependencies" | "devDependencies" | "peerDependencies") {
|
|
28
32
|
const packageJson = context.getPackageJson();
|
|
29
33
|
const packagePath = context.getPackageJsonPath();
|
|
30
34
|
const dependencies = packageJson[block];
|
|
@@ -32,13 +36,19 @@ function checkDeps(context: Context, block: "dependencies" | "devDependencies" |
|
|
|
32
36
|
const workspacePackageJson = context.getWorkspaceContext().getPackageJson();
|
|
33
37
|
const workspaceDependencies = workspacePackageJson[block];
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
const ignoredDeps = args?.ignoredDependencies ?? [];
|
|
40
|
+
const depsToCheck =
|
|
41
|
+
workspaceDependencies == null || ignoredDeps.length === 0
|
|
42
|
+
? workspaceDependencies
|
|
43
|
+
: omit(workspaceDependencies, ignoredDeps);
|
|
44
|
+
|
|
45
|
+
if (dependencies === undefined || depsToCheck === undefined) {
|
|
36
46
|
return;
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
const expectedDependencies = {
|
|
40
50
|
...dependencies,
|
|
41
|
-
...filterKeys(
|
|
51
|
+
...filterKeys(depsToCheck, dependencies),
|
|
42
52
|
};
|
|
43
53
|
|
|
44
54
|
if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {
|
|
@@ -66,3 +76,14 @@ function filterKeys(ob: Record<string, string>, filterOb: Record<string, string>
|
|
|
66
76
|
|
|
67
77
|
return newOb;
|
|
68
78
|
}
|
|
79
|
+
|
|
80
|
+
function omit<T>(obj: Record<string, T>, keysToOmit: readonly string[]): Record<string, T> {
|
|
81
|
+
const newObj: Record<string, T> = {};
|
|
82
|
+
|
|
83
|
+
const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));
|
|
84
|
+
for (const [key, value] of filtered) {
|
|
85
|
+
newObj[key] = value;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return newObj;
|
|
89
|
+
}
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -425,13 +425,13 @@
|
|
|
425
425
|
"affectsGlobalScope": false
|
|
426
426
|
},
|
|
427
427
|
"./src/bannedDependencies.ts": {
|
|
428
|
-
"version": "
|
|
428
|
+
"version": "2d87e1012d24a2cb029630e49ec33fd75c4eafc66adf27f5aa83498ca0dc4ee6",
|
|
429
429
|
"signature": "95a9767bd6498e6fff1a07abd14a94c7f333b37ed391fe8837f03e098b028b0d",
|
|
430
430
|
"affectsGlobalScope": false
|
|
431
431
|
},
|
|
432
432
|
"./src/consistentDependencies.ts": {
|
|
433
|
-
"version": "
|
|
434
|
-
"signature": "
|
|
433
|
+
"version": "c4777d9dbc4e789b260e583446a01506a29a106e4f995f4050df5f59a247a475",
|
|
434
|
+
"signature": "6790e2eaf1f170d9ed03d0b197fedde5a461ea792472d512531c2019552aea33",
|
|
435
435
|
"affectsGlobalScope": false
|
|
436
436
|
},
|
|
437
437
|
"../../node_modules/@types/node/globals.d.ts": {
|
|
@@ -1065,7 +1065,7 @@
|
|
|
1065
1065
|
"affectsGlobalScope": false
|
|
1066
1066
|
},
|
|
1067
1067
|
"./src/__tests__/consistentDependencies.spec.ts": {
|
|
1068
|
-
"version": "
|
|
1068
|
+
"version": "998aaca9ddc4374370cb505699938ce486ab9e5f72c9869e1f60b80f8aa464ff",
|
|
1069
1069
|
"signature": "235c508ef6b2125cb89b9f514fb5e85528febba3301186273fa3deb546ed8500",
|
|
1070
1070
|
"affectsGlobalScope": false
|
|
1071
1071
|
},
|