@monorepolint/rules 0.6.0-alpha.2 → 0.6.0-alpha.3
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/.turbo/turbo-clean.log +1 -1
- package/.turbo/turbo-compile-typescript.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +160 -100
- package/.turbo/turbo-transpile-typescript.log +4 -4
- package/CHANGELOG.md +9 -0
- package/build/js/index.js +399 -246
- package/build/js/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/__tests__/utils.d.ts +0 -1
- package/build/types/__tests__/utils.d.ts.map +1 -1
- package/build/types/bannedDependencies.d.ts.map +1 -1
- package/build/types/fileContents.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/index.d.ts.map +1 -1
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
- package/build/types/nestedWorkspaces.d.ts.map +1 -1
- package/build/types/packageEntry.d.ts.map +1 -1
- package/build/types/packageOrder.d.ts.map +1 -1
- package/build/types/packageScript.d.ts.map +1 -1
- package/build/types/requireDependency.d.ts +12 -12
- package/build/types/requireDependency.d.ts.map +1 -1
- package/build/types/util/checkAlpha.d.ts.map +1 -1
- package/build/types/util/createRuleFactory.d.ts.map +1 -1
- package/build/types/util/packageDependencyGraphService.d.ts.map +1 -1
- package/coverage/clover.xml +1159 -818
- package/coverage/coverage-final.json +18 -18
- package/coverage/index.html +20 -20
- package/coverage/src/alphabeticalDependencies.ts.html +8 -8
- package/coverage/src/alphabeticalScripts.ts.html +5 -5
- package/coverage/src/bannedDependencies.ts.html +77 -26
- package/coverage/src/consistentDependencies.ts.html +58 -19
- package/coverage/src/consistentVersions.ts.html +169 -58
- package/coverage/src/fileContents.ts.html +47 -23
- package/coverage/src/index.html +67 -67
- package/coverage/src/index.ts.html +32 -32
- package/coverage/src/mustSatisfyPeerDependencies.ts.html +373 -85
- package/coverage/src/nestedWorkspaces.ts.html +59 -20
- package/coverage/src/packageEntry.ts.html +40 -19
- package/coverage/src/packageOrder.ts.html +30 -12
- package/coverage/src/packageScript.ts.html +81 -27
- package/coverage/src/requireDependency.ts.html +83 -32
- package/coverage/src/standardTsconfig.ts.html +81 -18
- package/coverage/src/util/checkAlpha.ts.html +18 -9
- package/coverage/src/util/createRuleFactory.ts.html +16 -4
- package/coverage/src/util/index.html +17 -17
- package/coverage/src/util/makeDirectory.ts.html +5 -5
- package/coverage/src/util/packageDependencyGraphService.ts.html +101 -20
- package/package.json +4 -5
- package/src/__tests__/alphabeticalScripts.spec.ts +12 -4
- package/src/__tests__/bannedDependencies.spec.ts +45 -16
- package/src/__tests__/consistentDependencies.spec.ts +11 -5
- package/src/__tests__/consistentVersions.spec.ts +72 -18
- package/src/__tests__/fileContents.spec.ts +9 -5
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +191 -76
- package/src/__tests__/nestedWorkspaces.spec.ts +10 -6
- package/src/__tests__/packageEntry.spec.ts +54 -48
- package/src/__tests__/packageOrder.spec.ts +77 -71
- package/src/__tests__/packageScript.spec.ts +25 -11
- package/src/__tests__/requireDependency.spec.ts +12 -6
- package/src/__tests__/utils.ts +16 -7
- package/src/bannedDependencies.ts +32 -15
- package/src/consistentDependencies.ts +22 -9
- package/src/consistentVersions.ts +84 -47
- package/src/fileContents.ts +19 -11
- package/src/index.ts +3 -3
- package/src/mustSatisfyPeerDependencies.ts +162 -66
- package/src/nestedWorkspaces.ts +23 -10
- package/src/packageEntry.ts +18 -11
- package/src/packageOrder.ts +9 -3
- package/src/packageScript.ts +37 -19
- package/src/requireDependency.ts +28 -11
- package/src/standardTsconfig.ts +31 -10
- package/src/util/checkAlpha.ts +5 -2
- package/src/util/createRuleFactory.ts +6 -2
- package/src/util/packageDependencyGraphService.ts +41 -14
- package/vitest.config.mjs +10 -7
|
@@ -28,7 +28,11 @@ export const consistentDependencies = createRuleFactory<Options>({
|
|
|
28
28
|
validateOptions: Options.check,
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
-
function checkDeps(
|
|
31
|
+
function checkDeps(
|
|
32
|
+
context: Context,
|
|
33
|
+
args: Options,
|
|
34
|
+
block: "dependencies" | "devDependencies" | "peerDependencies",
|
|
35
|
+
) {
|
|
32
36
|
const packageJson = context.getPackageJson();
|
|
33
37
|
const packagePath = context.getPackageJsonPath();
|
|
34
38
|
const dependencies = packageJson[block];
|
|
@@ -37,10 +41,9 @@ function checkDeps(context: Context, args: Options, block: "dependencies" | "dev
|
|
|
37
41
|
const workspaceDependencies = workspacePackageJson[block];
|
|
38
42
|
|
|
39
43
|
const ignoredDeps = args?.ignoredDependencies ?? [];
|
|
40
|
-
const depsToCheck =
|
|
41
|
-
workspaceDependencies
|
|
42
|
-
|
|
43
|
-
: omit(workspaceDependencies, ignoredDeps);
|
|
44
|
+
const depsToCheck = workspaceDependencies == null || ignoredDeps.length === 0
|
|
45
|
+
? workspaceDependencies
|
|
46
|
+
: omit(workspaceDependencies, ignoredDeps);
|
|
44
47
|
|
|
45
48
|
if (dependencies === undefined || depsToCheck === undefined) {
|
|
46
49
|
return;
|
|
@@ -65,12 +68,17 @@ function checkDeps(context: Context, args: Options, block: "dependencies" | "dev
|
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
70
|
|
|
68
|
-
function filterKeys(
|
|
71
|
+
function filterKeys(
|
|
72
|
+
ob: Record<string, string>,
|
|
73
|
+
filterOb: Record<string, string>,
|
|
74
|
+
) {
|
|
69
75
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
76
|
const newOb: Record<string, any> = {};
|
|
71
77
|
|
|
72
78
|
for (const key of Object.keys(filterOb)) {
|
|
73
|
-
if (
|
|
79
|
+
if (
|
|
80
|
+
ob[key] !== undefined && skippedVersions.indexOf(filterOb[key]) === -1
|
|
81
|
+
) {
|
|
74
82
|
newOb[key] = ob[key];
|
|
75
83
|
}
|
|
76
84
|
}
|
|
@@ -78,10 +86,15 @@ function filterKeys(ob: Record<string, string>, filterOb: Record<string, string>
|
|
|
78
86
|
return newOb;
|
|
79
87
|
}
|
|
80
88
|
|
|
81
|
-
function omit<T>(
|
|
89
|
+
function omit<T>(
|
|
90
|
+
obj: Record<string, T>,
|
|
91
|
+
keysToOmit: readonly string[],
|
|
92
|
+
): Record<string, T> {
|
|
82
93
|
const newObj: Record<string, T> = {};
|
|
83
94
|
|
|
84
|
-
const filtered = Object.entries(obj).filter(([key]) =>
|
|
95
|
+
const filtered = Object.entries(obj).filter(([key]) =>
|
|
96
|
+
!keysToOmit.includes(key)
|
|
97
|
+
);
|
|
85
98
|
for (const [key, value] of filtered) {
|
|
86
99
|
newObj[key] = value;
|
|
87
100
|
}
|
|
@@ -23,13 +23,24 @@ export const consistentVersions = createRuleFactory({
|
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
function checkConsistentVersions(context: Context, options: Options) {
|
|
26
|
-
for (
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
for (
|
|
27
|
+
const [dependencyPackageName, expectedPackageDependencyValue] of Object
|
|
28
|
+
.entries(
|
|
29
|
+
options.matchDependencyVersions,
|
|
30
|
+
)
|
|
31
|
+
) {
|
|
29
32
|
if (Array.isArray(expectedPackageDependencyValue)) {
|
|
30
|
-
ensurePackageMatchesSomeVersion(
|
|
33
|
+
ensurePackageMatchesSomeVersion(
|
|
34
|
+
context,
|
|
35
|
+
dependencyPackageName,
|
|
36
|
+
expectedPackageDependencyValue,
|
|
37
|
+
);
|
|
31
38
|
} else {
|
|
32
|
-
ensurePackageIsCorrectVersion(
|
|
39
|
+
ensurePackageIsCorrectVersion(
|
|
40
|
+
context,
|
|
41
|
+
dependencyPackageName,
|
|
42
|
+
expectedPackageDependencyValue,
|
|
43
|
+
);
|
|
33
44
|
}
|
|
34
45
|
}
|
|
35
46
|
}
|
|
@@ -37,48 +48,59 @@ function checkConsistentVersions(context: Context, options: Options) {
|
|
|
37
48
|
const ensurePackageIsCorrectVersion = (
|
|
38
49
|
context: Context,
|
|
39
50
|
dependencyPackageName: string,
|
|
40
|
-
expectedPackageDependencyValue: string
|
|
51
|
+
expectedPackageDependencyValue: string,
|
|
41
52
|
) => {
|
|
42
53
|
const packageJson = context.getPackageJson();
|
|
43
54
|
const packageJsonPath = context.getPackageJsonPath();
|
|
44
55
|
|
|
45
|
-
const expectedPackageDependencyVersion = coerce(
|
|
56
|
+
const expectedPackageDependencyVersion = coerce(
|
|
57
|
+
expectedPackageDependencyValue,
|
|
58
|
+
);
|
|
46
59
|
if (expectedPackageDependencyVersion == null) {
|
|
47
60
|
throw new Error(
|
|
48
|
-
`Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'
|
|
61
|
+
`Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`,
|
|
49
62
|
);
|
|
50
63
|
}
|
|
51
64
|
|
|
52
|
-
const actualPackageDependencyValue = packageJson.dependencies
|
|
65
|
+
const actualPackageDependencyValue = packageJson.dependencies
|
|
66
|
+
&& packageJson.dependencies[dependencyPackageName];
|
|
53
67
|
const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);
|
|
54
68
|
if (
|
|
55
|
-
actualPackageDependencyVersion != null
|
|
56
|
-
actualPackageDependencyVersion.raw
|
|
69
|
+
actualPackageDependencyVersion != null
|
|
70
|
+
&& actualPackageDependencyVersion.raw
|
|
71
|
+
!== expectedPackageDependencyVersion.raw
|
|
57
72
|
) {
|
|
58
73
|
context.addError({
|
|
59
74
|
file: packageJsonPath,
|
|
60
|
-
message:
|
|
75
|
+
message:
|
|
76
|
+
`Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,
|
|
61
77
|
fixer: () =>
|
|
62
78
|
mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {
|
|
63
|
-
input.dependencies![dependencyPackageName] =
|
|
79
|
+
input.dependencies![dependencyPackageName] =
|
|
80
|
+
expectedPackageDependencyValue;
|
|
64
81
|
return input;
|
|
65
82
|
}),
|
|
66
83
|
});
|
|
67
84
|
}
|
|
68
85
|
|
|
69
|
-
const actualPackageDevDependencyValue =
|
|
70
|
-
|
|
71
|
-
const actualPackageDevDependencyVersion = coerce(
|
|
86
|
+
const actualPackageDevDependencyValue = packageJson.devDependencies
|
|
87
|
+
&& packageJson.devDependencies[dependencyPackageName];
|
|
88
|
+
const actualPackageDevDependencyVersion = coerce(
|
|
89
|
+
actualPackageDevDependencyValue,
|
|
90
|
+
);
|
|
72
91
|
if (
|
|
73
|
-
actualPackageDevDependencyVersion != null
|
|
74
|
-
actualPackageDevDependencyVersion.raw
|
|
92
|
+
actualPackageDevDependencyVersion != null
|
|
93
|
+
&& actualPackageDevDependencyVersion.raw
|
|
94
|
+
!== expectedPackageDependencyVersion.raw
|
|
75
95
|
) {
|
|
76
96
|
context.addError({
|
|
77
97
|
file: packageJsonPath,
|
|
78
|
-
message:
|
|
98
|
+
message:
|
|
99
|
+
`Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,
|
|
79
100
|
fixer: () =>
|
|
80
101
|
mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {
|
|
81
|
-
input.devDependencies![dependencyPackageName] =
|
|
102
|
+
input.devDependencies![dependencyPackageName] =
|
|
103
|
+
expectedPackageDependencyValue;
|
|
82
104
|
return input;
|
|
83
105
|
}),
|
|
84
106
|
});
|
|
@@ -88,54 +110,69 @@ const ensurePackageIsCorrectVersion = (
|
|
|
88
110
|
const ensurePackageMatchesSomeVersion = (
|
|
89
111
|
context: Context,
|
|
90
112
|
dependencyPackageName: string,
|
|
91
|
-
acceptedPackageDependencyValues: string[]
|
|
113
|
+
acceptedPackageDependencyValues: string[],
|
|
92
114
|
) => {
|
|
93
115
|
const packageJson = context.getPackageJson();
|
|
94
116
|
const packageJsonPath = context.getPackageJsonPath();
|
|
95
117
|
|
|
96
|
-
const acceptedPackageDependencyVersions: SemVer[] =
|
|
97
|
-
(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
`Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`
|
|
118
|
+
const acceptedPackageDependencyVersions: SemVer[] =
|
|
119
|
+
acceptedPackageDependencyValues.map(
|
|
120
|
+
(acceptedPackageDependencyValue) => {
|
|
121
|
+
const acceptedPackageDependencyVersion = coerce(
|
|
122
|
+
acceptedPackageDependencyValue,
|
|
102
123
|
);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
124
|
+
if (acceptedPackageDependencyVersion == null) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
`Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return acceptedPackageDependencyVersion;
|
|
130
|
+
},
|
|
131
|
+
);
|
|
107
132
|
|
|
108
|
-
const actualPackageDependencyValue = packageJson.dependencies
|
|
133
|
+
const actualPackageDependencyValue = packageJson.dependencies
|
|
134
|
+
&& packageJson.dependencies[dependencyPackageName];
|
|
109
135
|
const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);
|
|
110
136
|
if (
|
|
111
|
-
actualPackageDependencyVersion != null
|
|
112
|
-
acceptedPackageDependencyVersions.every(
|
|
113
|
-
(acceptedPackageDependencyVersion) =>
|
|
137
|
+
actualPackageDependencyVersion != null
|
|
138
|
+
&& acceptedPackageDependencyVersions.every(
|
|
139
|
+
(acceptedPackageDependencyVersion) =>
|
|
140
|
+
actualPackageDependencyVersion.raw
|
|
141
|
+
!== acceptedPackageDependencyVersion.raw,
|
|
114
142
|
)
|
|
115
143
|
) {
|
|
116
144
|
context.addError({
|
|
117
145
|
file: packageJsonPath,
|
|
118
|
-
message:
|
|
119
|
-
|
|
120
|
-
|
|
146
|
+
message:
|
|
147
|
+
`Expected dependency on ${dependencyPackageName} to match one of '${
|
|
148
|
+
JSON.stringify(
|
|
149
|
+
acceptedPackageDependencyValues,
|
|
150
|
+
)
|
|
151
|
+
}', got '${actualPackageDependencyValue}' instead.`,
|
|
121
152
|
});
|
|
122
153
|
}
|
|
123
154
|
|
|
124
|
-
const actualPackageDevDependencyValue =
|
|
125
|
-
|
|
126
|
-
const actualPackageDevDependencyVersion = coerce(
|
|
155
|
+
const actualPackageDevDependencyValue = packageJson.devDependencies
|
|
156
|
+
&& packageJson.devDependencies[dependencyPackageName];
|
|
157
|
+
const actualPackageDevDependencyVersion = coerce(
|
|
158
|
+
actualPackageDevDependencyValue,
|
|
159
|
+
);
|
|
127
160
|
if (
|
|
128
|
-
actualPackageDevDependencyVersion != null
|
|
129
|
-
acceptedPackageDependencyVersions.every(
|
|
161
|
+
actualPackageDevDependencyVersion != null
|
|
162
|
+
&& acceptedPackageDependencyVersions.every(
|
|
130
163
|
(acceptedPackageDependencyVersion) =>
|
|
131
|
-
actualPackageDevDependencyVersion.raw
|
|
164
|
+
actualPackageDevDependencyVersion.raw
|
|
165
|
+
!== acceptedPackageDependencyVersion.raw,
|
|
132
166
|
)
|
|
133
167
|
) {
|
|
134
168
|
context.addError({
|
|
135
169
|
file: packageJsonPath,
|
|
136
|
-
message:
|
|
137
|
-
|
|
138
|
-
|
|
170
|
+
message:
|
|
171
|
+
`Expected devDependency on ${dependencyPackageName} to match one of '${
|
|
172
|
+
JSON.stringify(
|
|
173
|
+
acceptedPackageDependencyValues,
|
|
174
|
+
)
|
|
175
|
+
}', got '${actualPackageDevDependencyValue}' instead.`,
|
|
139
176
|
});
|
|
140
177
|
}
|
|
141
178
|
};
|
package/src/fileContents.ts
CHANGED
|
@@ -13,24 +13,24 @@ import { createRuleFactory } from "./util/createRuleFactory.js";
|
|
|
13
13
|
const Options = r.Union(
|
|
14
14
|
r.Record({
|
|
15
15
|
file: r.String,
|
|
16
|
-
generator: r.Function.withGuard((
|
|
16
|
+
generator: r.Function.withGuard((
|
|
17
|
+
x,
|
|
18
|
+
): x is (context: Context) => string | Promise<string> => x != undefined),
|
|
17
19
|
template: r.Undefined.optional(),
|
|
18
20
|
templateFile: r.Undefined.optional(),
|
|
19
21
|
}),
|
|
20
|
-
|
|
21
22
|
r.Record({
|
|
22
23
|
file: r.String,
|
|
23
24
|
generator: r.Undefined.optional(),
|
|
24
25
|
template: r.String.Or(r.Undefined),
|
|
25
26
|
templateFile: r.Undefined.optional(),
|
|
26
27
|
}),
|
|
27
|
-
|
|
28
28
|
r.Record({
|
|
29
29
|
file: r.String,
|
|
30
30
|
generator: r.Undefined.optional(),
|
|
31
31
|
template: r.Undefined.optional(),
|
|
32
32
|
templateFile: r.String,
|
|
33
|
-
})
|
|
33
|
+
}),
|
|
34
34
|
);
|
|
35
35
|
|
|
36
36
|
type Options = r.Static<typeof Options>;
|
|
@@ -42,13 +42,17 @@ export const fileContents = createRuleFactory<Options>({
|
|
|
42
42
|
const expectedContent = await getExpectedContents(context, opts);
|
|
43
43
|
|
|
44
44
|
const pathExists = context.host.exists(fullPath);
|
|
45
|
-
const actualContent = pathExists
|
|
45
|
+
const actualContent = pathExists
|
|
46
|
+
? context.host.readFile(fullPath, { encoding: "utf-8" })
|
|
47
|
+
: undefined;
|
|
46
48
|
if (actualContent !== expectedContent) {
|
|
47
|
-
const longMessage =
|
|
48
|
-
|
|
49
|
+
const longMessage = pathExists && expectedContent == undefined
|
|
50
|
+
? undefined
|
|
51
|
+
: diff(expectedContent, actualContent, { expand: true });
|
|
49
52
|
|
|
50
|
-
const message =
|
|
51
|
-
|
|
53
|
+
const message = pathExists && expectedContent == undefined
|
|
54
|
+
? "File should not exist"
|
|
55
|
+
: "Expect file contents to match";
|
|
52
56
|
|
|
53
57
|
context.addError({
|
|
54
58
|
file: fullPath,
|
|
@@ -59,7 +63,9 @@ export const fileContents = createRuleFactory<Options>({
|
|
|
59
63
|
if (pathExists) context.host.deleteFile(fullPath);
|
|
60
64
|
} else {
|
|
61
65
|
context.host.mkdir(path.dirname(fullPath), { recursive: true });
|
|
62
|
-
context.host.writeFile(fullPath, expectedContent, {
|
|
66
|
+
context.host.writeFile(fullPath, expectedContent, {
|
|
67
|
+
encoding: "utf-8",
|
|
68
|
+
});
|
|
63
69
|
}
|
|
64
70
|
},
|
|
65
71
|
});
|
|
@@ -70,7 +76,9 @@ export const fileContents = createRuleFactory<Options>({
|
|
|
70
76
|
|
|
71
77
|
const optionsCache = new Map<
|
|
72
78
|
Options,
|
|
73
|
-
((context: Context) => Promise<string> | string | undefined)
|
|
79
|
+
| ((context: Context) => Promise<string> | string | undefined)
|
|
80
|
+
| string
|
|
81
|
+
| undefined
|
|
74
82
|
>();
|
|
75
83
|
|
|
76
84
|
async function getExpectedContents(context: Context, opts: Options) {
|
package/src/index.ts
CHANGED
|
@@ -12,12 +12,12 @@ export { consistentDependencies } from "./consistentDependencies.js";
|
|
|
12
12
|
export { consistentVersions } from "./consistentVersions.js";
|
|
13
13
|
export { fileContents } from "./fileContents.js";
|
|
14
14
|
export { mustSatisfyPeerDependencies } from "./mustSatisfyPeerDependencies.js";
|
|
15
|
-
export {
|
|
15
|
+
export { nestedWorkspaces } from "./nestedWorkspaces.js";
|
|
16
16
|
export { packageEntry } from "./packageEntry.js";
|
|
17
|
+
export { packageOrder } from "./packageOrder.js";
|
|
17
18
|
export { packageScript } from "./packageScript.js";
|
|
18
|
-
export { standardTsconfig } from "./standardTsconfig.js";
|
|
19
|
-
export { nestedWorkspaces } from "./nestedWorkspaces.js";
|
|
20
19
|
export { requireDependency } from "./requireDependency.js";
|
|
20
|
+
export { standardTsconfig } from "./standardTsconfig.js";
|
|
21
21
|
|
|
22
22
|
export {
|
|
23
23
|
createRuleFactory,
|