@monorepolint/rules 0.5.0-alpha.98 → 0.5.0-beta.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.
- package/CHANGELOG.md +14 -0
- package/package.json +47 -26
- package/src/__tests__/alphabeticalScripts.spec.ts +6 -5
- package/src/__tests__/bannedDependencies.spec.ts +5 -7
- package/src/__tests__/consistentDependencies.spec.ts +6 -5
- package/src/__tests__/consistentVersions.spec.ts +5 -4
- package/src/__tests__/fileContents.spec.ts +44 -17
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +39 -38
- package/src/__tests__/nestedWorkspaces.spec.ts +5 -4
- package/src/__tests__/packageEntry.spec.ts +43 -32
- package/src/__tests__/packageOrder.spec.ts +23 -14
- package/src/__tests__/packageScript.spec.ts +61 -43
- package/src/__tests__/requireDependency.spec.ts +8 -7
- package/src/__tests__/utils.ts +8 -4
- package/src/alphabeticalDependencies.ts +7 -12
- package/src/alphabeticalScripts.ts +7 -12
- package/src/bannedDependencies.ts +9 -12
- package/src/consistentDependencies.ts +9 -10
- package/src/consistentVersions.ts +6 -8
- package/src/fileContents.ts +17 -16
- package/src/index.ts +13 -13
- package/src/mustSatisfyPeerDependencies.ts +16 -17
- package/src/nestedWorkspaces.ts +10 -12
- package/src/packageEntry.ts +7 -9
- package/src/packageOrder.ts +12 -10
- package/src/packageScript.ts +12 -19
- package/src/public/util.ts +1 -0
- package/src/requireDependency.ts +9 -10
- package/src/standardTsconfig.ts +10 -11
- package/src/util/checkAlpha.ts +1 -1
- package/src/util/makeRule.ts +29 -0
- package/src/util/packageDependencyGraphService.ts +2 -2
- package/tsconfig.json +7 -2
- package/lib/__tests__/alphabeticalScripts.spec.d.ts +0 -8
- package/lib/__tests__/alphabeticalScripts.spec.d.ts.map +0 -1
- package/lib/__tests__/alphabeticalScripts.spec.js +0 -61
- package/lib/__tests__/alphabeticalScripts.spec.js.map +0 -1
- package/lib/__tests__/bannedDependencies.spec.d.ts +0 -2
- package/lib/__tests__/bannedDependencies.spec.d.ts.map +0 -1
- package/lib/__tests__/bannedDependencies.spec.js +0 -161
- package/lib/__tests__/bannedDependencies.spec.js.map +0 -1
- package/lib/__tests__/consistentDependencies.spec.d.ts +0 -2
- package/lib/__tests__/consistentDependencies.spec.d.ts.map +0 -1
- package/lib/__tests__/consistentDependencies.spec.js +0 -115
- package/lib/__tests__/consistentDependencies.spec.js.map +0 -1
- package/lib/__tests__/consistentVersions.spec.d.ts +0 -8
- package/lib/__tests__/consistentVersions.spec.d.ts.map +0 -1
- package/lib/__tests__/consistentVersions.spec.js +0 -183
- package/lib/__tests__/consistentVersions.spec.js.map +0 -1
- package/lib/__tests__/fileContents.spec.d.ts +0 -8
- package/lib/__tests__/fileContents.spec.d.ts.map +0 -1
- package/lib/__tests__/fileContents.spec.js +0 -59
- package/lib/__tests__/fileContents.spec.js.map +0 -1
- package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts +0 -8
- package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +0 -1
- package/lib/__tests__/mustSatisfyPeerDependencies.spec.js +0 -1063
- package/lib/__tests__/mustSatisfyPeerDependencies.spec.js.map +0 -1
- package/lib/__tests__/nestedWorkspaces.spec.d.ts +0 -2
- package/lib/__tests__/nestedWorkspaces.spec.d.ts.map +0 -1
- package/lib/__tests__/nestedWorkspaces.spec.js +0 -124
- package/lib/__tests__/nestedWorkspaces.spec.js.map +0 -1
- package/lib/__tests__/packageEntry.spec.d.ts +0 -8
- package/lib/__tests__/packageEntry.spec.d.ts.map +0 -1
- package/lib/__tests__/packageEntry.spec.js +0 -144
- package/lib/__tests__/packageEntry.spec.js.map +0 -1
- package/lib/__tests__/packageOrder.spec.d.ts +0 -8
- package/lib/__tests__/packageOrder.spec.d.ts.map +0 -1
- package/lib/__tests__/packageOrder.spec.js +0 -116
- package/lib/__tests__/packageOrder.spec.js.map +0 -1
- package/lib/__tests__/packageScript.spec.d.ts +0 -8
- package/lib/__tests__/packageScript.spec.d.ts.map +0 -1
- package/lib/__tests__/packageScript.spec.js +0 -171
- package/lib/__tests__/packageScript.spec.js.map +0 -1
- package/lib/__tests__/requireDependency.spec.d.ts +0 -2
- package/lib/__tests__/requireDependency.spec.d.ts.map +0 -1
- package/lib/__tests__/requireDependency.spec.js +0 -123
- package/lib/__tests__/requireDependency.spec.js.map +0 -1
- package/lib/__tests__/utils.d.ts +0 -76
- package/lib/__tests__/utils.d.ts.map +0 -1
- package/lib/__tests__/utils.js +0 -83
- package/lib/__tests__/utils.js.map +0 -1
- package/lib/alphabeticalDependencies.d.ts +0 -23
- package/lib/alphabeticalDependencies.d.ts.map +0 -1
- package/lib/alphabeticalDependencies.js +0 -24
- package/lib/alphabeticalDependencies.js.map +0 -1
- package/lib/alphabeticalScripts.d.ts +0 -23
- package/lib/alphabeticalScripts.d.ts.map +0 -1
- package/lib/alphabeticalScripts.js +0 -22
- package/lib/alphabeticalScripts.js.map +0 -1
- package/lib/bannedDependencies.d.ts +0 -134
- package/lib/bannedDependencies.d.ts.map +0 -1
- package/lib/bannedDependencies.js +0 -133
- package/lib/bannedDependencies.js.map +0 -1
- package/lib/consistentDependencies.d.ts +0 -38
- package/lib/consistentDependencies.d.ts.map +0 -1
- package/lib/consistentDependencies.js +0 -77
- package/lib/consistentDependencies.js.map +0 -1
- package/lib/consistentVersions.d.ts +0 -47
- package/lib/consistentVersions.d.ts.map +0 -1
- package/lib/consistentVersions.js +0 -96
- package/lib/consistentVersions.js.map +0 -1
- package/lib/fileContents.d.ts +0 -111
- package/lib/fileContents.d.ts.map +0 -1
- package/lib/fileContents.js +0 -84
- package/lib/fileContents.js.map +0 -1
- package/lib/index.d.ts +0 -20
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -49
- package/lib/index.js.map +0 -1
- package/lib/mustSatisfyPeerDependencies.d.ts +0 -721
- package/lib/mustSatisfyPeerDependencies.d.ts.map +0 -1
- package/lib/mustSatisfyPeerDependencies.js +0 -638
- package/lib/mustSatisfyPeerDependencies.js.map +0 -1
- package/lib/nestedWorkspaces.d.ts +0 -24
- package/lib/nestedWorkspaces.d.ts.map +0 -1
- package/lib/nestedWorkspaces.js +0 -52
- package/lib/nestedWorkspaces.js.map +0 -1
- package/lib/packageEntry.d.ts +0 -115
- package/lib/packageEntry.d.ts.map +0 -1
- package/lib/packageEntry.js +0 -77
- package/lib/packageEntry.js.map +0 -1
- package/lib/packageOrder.d.ts +0 -33
- package/lib/packageOrder.d.ts.map +0 -1
- package/lib/packageOrder.js +0 -105
- package/lib/packageOrder.js.map +0 -1
- package/lib/packageScript.d.ts +0 -102
- package/lib/packageScript.d.ts.map +0 -1
- package/lib/packageScript.js +0 -92
- package/lib/packageScript.js.map +0 -1
- package/lib/requireDependency.d.ts +0 -99
- package/lib/requireDependency.d.ts.map +0 -1
- package/lib/requireDependency.js +0 -67
- package/lib/requireDependency.js.map +0 -1
- package/lib/standardTsconfig.d.ts +0 -113
- package/lib/standardTsconfig.d.ts.map +0 -1
- package/lib/standardTsconfig.js +0 -118
- package/lib/standardTsconfig.js.map +0 -1
- package/lib/util/checkAlpha.d.ts +0 -10
- package/lib/util/checkAlpha.d.ts.map +0 -1
- package/lib/util/checkAlpha.js +0 -51
- package/lib/util/checkAlpha.js.map +0 -1
- package/lib/util/createNewRuleConversion.d.ts +0 -30
- package/lib/util/createNewRuleConversion.d.ts.map +0 -1
- package/lib/util/createNewRuleConversion.js +0 -33
- package/lib/util/createNewRuleConversion.js.map +0 -1
- package/lib/util/makeDirectory.d.ts +0 -8
- package/lib/util/makeDirectory.d.ts.map +0 -1
- package/lib/util/makeDirectory.js +0 -28
- package/lib/util/makeDirectory.js.map +0 -1
- package/lib/util/packageDependencyGraphService.d.ts +0 -37
- package/lib/util/packageDependencyGraphService.d.ts.map +0 -1
- package/lib/util/packageDependencyGraphService.js +0 -70
- package/lib/util/packageDependencyGraphService.js.map +0 -1
- package/src/util/createNewRuleConversion.ts +0 -38
- package/tsconfig.tsbuildinfo +0 -1
- /package/{jest.config.js → jest.config.cjs} +0 -0
package/src/fileContents.ts
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Copyright
|
|
2
|
+
* Copyright 2023 Palantir Technologies, Inc.
|
|
3
3
|
*
|
|
4
4
|
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context
|
|
9
|
-
import diff from "jest-diff";
|
|
8
|
+
import { Context } from "@monorepolint/config";
|
|
9
|
+
import { diff } from "jest-diff";
|
|
10
10
|
import * as path from "path";
|
|
11
11
|
import * as r from "runtypes";
|
|
12
|
-
import {
|
|
13
|
-
|
|
12
|
+
import { makeRule } from "./util/makeRule.js";
|
|
14
13
|
const Options = r.Union(
|
|
15
14
|
r.Record({
|
|
16
15
|
file: r.String,
|
|
17
|
-
generator: r.Function,
|
|
16
|
+
generator: r.Function.withGuard((x): x is (context: Context) => string | Promise<string> => x != undefined),
|
|
18
17
|
template: r.Undefined.optional(),
|
|
19
18
|
templateFile: r.Undefined.optional(),
|
|
20
19
|
}),
|
|
@@ -36,10 +35,11 @@ const Options = r.Union(
|
|
|
36
35
|
|
|
37
36
|
type Options = r.Static<typeof Options>;
|
|
38
37
|
|
|
39
|
-
export const fileContents = {
|
|
40
|
-
|
|
38
|
+
export const fileContents = makeRule<Options>({
|
|
39
|
+
name: "fileContents",
|
|
40
|
+
check: async (context, opts) => {
|
|
41
41
|
const fullPath = path.join(context.packageDir, opts.file);
|
|
42
|
-
const expectedContent = getExpectedContents(context, opts);
|
|
42
|
+
const expectedContent = await getExpectedContents(context, opts);
|
|
43
43
|
|
|
44
44
|
const pathExists = context.host.exists(fullPath);
|
|
45
45
|
const actualContent = pathExists ? context.host.readFile(fullPath, { encoding: "utf-8" }) : undefined;
|
|
@@ -59,12 +59,15 @@ export const fileContents = {
|
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
|
-
|
|
63
|
-
}
|
|
62
|
+
validateOptions: Options.check,
|
|
63
|
+
});
|
|
64
64
|
|
|
65
|
-
const optionsCache = new Map<
|
|
65
|
+
const optionsCache = new Map<
|
|
66
|
+
Options,
|
|
67
|
+
((context: Context) => Promise<string> | string | undefined) | string | undefined
|
|
68
|
+
>();
|
|
66
69
|
|
|
67
|
-
function getExpectedContents(context: Context, opts: Options) {
|
|
70
|
+
async function getExpectedContents(context: Context, opts: Options) {
|
|
68
71
|
// we need to use has because undefined is a valid value in the cache
|
|
69
72
|
if (optionsCache.has(opts)) {
|
|
70
73
|
const cachedEntry = optionsCache.get(opts);
|
|
@@ -76,7 +79,7 @@ function getExpectedContents(context: Context, opts: Options) {
|
|
|
76
79
|
|
|
77
80
|
if (opts.generator) {
|
|
78
81
|
optionsCache.set(opts, opts.generator);
|
|
79
|
-
return opts.generator(context)
|
|
82
|
+
return opts.generator(context);
|
|
80
83
|
} else if (opts.templateFile) {
|
|
81
84
|
const { packageDir: workspacePackageDir } = context.getWorkspaceContext();
|
|
82
85
|
const fullPath = path.resolve(workspacePackageDir, opts.templateFile);
|
|
@@ -89,5 +92,3 @@ function getExpectedContents(context: Context, opts: Options) {
|
|
|
89
92
|
return opts.template;
|
|
90
93
|
}
|
|
91
94
|
}
|
|
92
|
-
|
|
93
|
-
export const FileContents = createNewRuleConversion("FileContents", fileContents);
|
package/src/index.ts
CHANGED
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
export { alphabeticalDependencies
|
|
9
|
-
export { alphabeticalScripts
|
|
10
|
-
export { bannedDependencies
|
|
11
|
-
export { consistentDependencies
|
|
12
|
-
export { consistentVersions
|
|
13
|
-
export { fileContents
|
|
14
|
-
export { mustSatisfyPeerDependencies
|
|
15
|
-
export { packageOrder
|
|
16
|
-
export { packageEntry
|
|
17
|
-
export { packageScript
|
|
18
|
-
export { standardTsconfig
|
|
19
|
-
export { nestedWorkspaces
|
|
20
|
-
export { requireDependency
|
|
8
|
+
export { alphabeticalDependencies } from "./alphabeticalDependencies.js";
|
|
9
|
+
export { alphabeticalScripts } from "./alphabeticalScripts.js";
|
|
10
|
+
export { bannedDependencies } from "./bannedDependencies.js";
|
|
11
|
+
export { consistentDependencies } from "./consistentDependencies.js";
|
|
12
|
+
export { consistentVersions } from "./consistentVersions.js";
|
|
13
|
+
export { fileContents } from "./fileContents.js";
|
|
14
|
+
export { mustSatisfyPeerDependencies } from "./mustSatisfyPeerDependencies.js";
|
|
15
|
+
export { packageOrder } from "./packageOrder.js";
|
|
16
|
+
export { packageEntry } from "./packageEntry.js";
|
|
17
|
+
export { packageScript } from "./packageScript.js";
|
|
18
|
+
export { standardTsconfig } from "./standardTsconfig.js";
|
|
19
|
+
export { nestedWorkspaces } from "./nestedWorkspaces.js";
|
|
20
|
+
export { requireDependency } from "./requireDependency.js";
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context
|
|
8
|
+
import { Context } from "@monorepolint/config";
|
|
9
9
|
import { Host, mutateJson, PackageJson } from "@monorepolint/utils";
|
|
10
|
-
import path from "path";
|
|
11
|
-
import resolvePackagePath from "resolve-package-path";
|
|
10
|
+
import * as path from "node:path";
|
|
12
11
|
import * as r from "runtypes";
|
|
13
12
|
import { coerce } from "semver";
|
|
14
|
-
import
|
|
13
|
+
import resolvePackagePath from "resolve-package-path";
|
|
14
|
+
import { makeRule } from "./util/makeRule.js";
|
|
15
15
|
|
|
16
16
|
const Options = r.Union(
|
|
17
17
|
r.Partial({
|
|
@@ -184,15 +184,11 @@ const Options = r.Union(
|
|
|
184
184
|
|
|
185
185
|
export type Options = r.Static<typeof Options>;
|
|
186
186
|
|
|
187
|
-
export const mustSatisfyPeerDependencies
|
|
187
|
+
export const mustSatisfyPeerDependencies = makeRule({
|
|
188
|
+
name: "mustSatisfyPeerDependencies",
|
|
188
189
|
check: checkSatisfyPeerDependencies,
|
|
189
|
-
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export const MustSatisfyPeerDependencies = createNewRuleConversion(
|
|
193
|
-
"MustSatisfyPeerDependencies",
|
|
194
|
-
mustSatisfyPeerDependencies
|
|
195
|
-
);
|
|
190
|
+
validateOptions: Options.check,
|
|
191
|
+
});
|
|
196
192
|
|
|
197
193
|
/**
|
|
198
194
|
* separating on `|`, this regex allows any of the following formats:
|
|
@@ -219,7 +215,8 @@ export const MATCH_ANY_VERSION_RANGE = /^(\*|x)$/;
|
|
|
219
215
|
*
|
|
220
216
|
* More info: https://docs.npmjs.com/about-semantic-versioning
|
|
221
217
|
*/
|
|
222
|
-
export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =
|
|
218
|
+
export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =
|
|
219
|
+
/^>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?$/;
|
|
223
220
|
|
|
224
221
|
/**
|
|
225
222
|
* This regex allows any of the following formats:
|
|
@@ -243,7 +240,8 @@ export const MATCH_GREATER_OR_EQUAL_VERSION_RANGE = /^>= ?\d+(?:\.\d+|\.\d+\.\d+
|
|
|
243
240
|
*
|
|
244
241
|
* More info: https://docs.npmjs.com/about-semantic-versioning
|
|
245
242
|
*/
|
|
246
|
-
export const MATCH_MAJOR_VERSION_RANGE =
|
|
243
|
+
export const MATCH_MAJOR_VERSION_RANGE =
|
|
244
|
+
/^(?:\^?\d+|\^?\d+\.x|\^?\d+\.x\.x|\^\d+\.\d+|\^\d+\.\d+\.x|\^\d+\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$/;
|
|
247
245
|
|
|
248
246
|
/**
|
|
249
247
|
* Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),
|
|
@@ -258,7 +256,8 @@ export const MATCH_MAJOR_VERSION_RANGE = /^(?:\^?\d+|\^?\d+\.x|\^?\d+\.x\.x|\^\d
|
|
|
258
256
|
*
|
|
259
257
|
* TODO: accept minor pins `~4.2.1`
|
|
260
258
|
*/
|
|
261
|
-
export const RANGE_REGEX =
|
|
259
|
+
export const RANGE_REGEX =
|
|
260
|
+
/^(\*|x|>= ?\d+(?:\.\d+|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?|\^?\d+(\.x|\.x\.x|\.\d+|\.\d+\.x|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?( \|\| \^?\d+(\.x|\.x\.x|\.\d+|\.\d+\.x|\.\d+\.\d+(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)?)*)$/;
|
|
262
261
|
|
|
263
262
|
interface IPeerDependencyRequirement {
|
|
264
263
|
fromPackageName: string;
|
|
@@ -273,7 +272,7 @@ interface IResolvedPeerDependencyRequirement {
|
|
|
273
272
|
function checkSatisfyPeerDependencies(context: Context, opts: Options) {
|
|
274
273
|
const { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;
|
|
275
274
|
const packageJsonPath = path.resolve(context.getPackageJsonPath());
|
|
276
|
-
const packageJson
|
|
275
|
+
const packageJson = context.host.readJson(packageJsonPath) as PackageJson;
|
|
277
276
|
const packageDependencies = packageJson.dependencies || {};
|
|
278
277
|
const packageDevDependencies = packageJson.devDependencies || {};
|
|
279
278
|
const packagePeerDependencies = packageJson.peerDependencies || {};
|
|
@@ -308,7 +307,7 @@ function checkSatisfyPeerDependencies(context: Context, opts: Options) {
|
|
|
308
307
|
if (dependencyPackageJsonPath == null) {
|
|
309
308
|
throw new Error(`Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`);
|
|
310
309
|
}
|
|
311
|
-
const dependencyPackageJson
|
|
310
|
+
const dependencyPackageJson = context.host.readJson(dependencyPackageJsonPath) as PackageJson;
|
|
312
311
|
const requiredPeerDependencies = dependencyPackageJson.peerDependencies;
|
|
313
312
|
if (requiredPeerDependencies == null) {
|
|
314
313
|
continue;
|
package/src/nestedWorkspaces.ts
CHANGED
|
@@ -5,23 +5,23 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import path from "path";
|
|
8
|
+
import * as globby from "globby";
|
|
9
|
+
import * as path from "node:path";
|
|
11
10
|
import * as r from "runtypes";
|
|
12
|
-
import {
|
|
11
|
+
import { makeRule } from "./util/makeRule.js";
|
|
13
12
|
|
|
14
13
|
export const Options = r.Undefined;
|
|
15
14
|
|
|
16
15
|
type Options = r.Static<typeof Options>;
|
|
17
16
|
|
|
18
17
|
// Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)
|
|
19
|
-
export const nestedWorkspaces
|
|
20
|
-
|
|
18
|
+
export const nestedWorkspaces = makeRule({
|
|
19
|
+
name: "nestedWorkspaces",
|
|
20
|
+
check: (context) => {
|
|
21
21
|
const rootPackageJson = context.getWorkspaceContext().getPackageJson();
|
|
22
22
|
|
|
23
23
|
// Expand a set of globs covering all package.json files in the entire repo (except the root)
|
|
24
|
-
const packageJsonPaths = globby.
|
|
24
|
+
const packageJsonPaths = globby.globbySync(["*/**/package.json", "!**/node_modules/**"]);
|
|
25
25
|
|
|
26
26
|
const workspaces = Array.isArray(rootPackageJson.workspaces)
|
|
27
27
|
? rootPackageJson.workspaces
|
|
@@ -41,7 +41,7 @@ export const nestedWorkspaces: RuleModule<typeof Options> = {
|
|
|
41
41
|
const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);
|
|
42
42
|
|
|
43
43
|
// Expand the globs to get an array of all package.json files that are in packages specified by a workspace.
|
|
44
|
-
const expandedWorkspacesGlobs = globby.
|
|
44
|
+
const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, "!**/node_modules/**"]);
|
|
45
45
|
|
|
46
46
|
// Ensure there are no package.jsons which are not included in the globbed workspaces set
|
|
47
47
|
const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));
|
|
@@ -56,7 +56,5 @@ export const nestedWorkspaces: RuleModule<typeof Options> = {
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
|
-
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const NestedWorkspaces = createNewRuleConversion("NestedWorkspaces", nestedWorkspaces);
|
|
59
|
+
validateOptions: Options.check,
|
|
60
|
+
});
|
package/src/packageEntry.ts
CHANGED
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context, RuleModule } from "@monorepolint/config";
|
|
9
8
|
import { mutateJson, PackageJson } from "@monorepolint/utils";
|
|
10
|
-
import diff from "jest-diff";
|
|
9
|
+
import { diff } from "jest-diff";
|
|
11
10
|
import * as r from "runtypes";
|
|
12
|
-
import {
|
|
11
|
+
import { makeRule } from "./util/makeRule.js";
|
|
13
12
|
|
|
14
13
|
export const Options = r.Union(
|
|
15
14
|
r
|
|
@@ -38,8 +37,9 @@ export const Options = r.Union(
|
|
|
38
37
|
|
|
39
38
|
export type Options = r.Static<typeof Options>;
|
|
40
39
|
|
|
41
|
-
export const packageEntry
|
|
42
|
-
|
|
40
|
+
export const packageEntry = makeRule<Options>({
|
|
41
|
+
name: "packageEntry",
|
|
42
|
+
check: (context, options) => {
|
|
43
43
|
const packageJson = context.getPackageJson();
|
|
44
44
|
|
|
45
45
|
if (options.entries) {
|
|
@@ -78,10 +78,8 @@ export const packageEntry: RuleModule<typeof Options> = {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
|
-
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export const PackageEntry = createNewRuleConversion("PackageEntry", packageEntry);
|
|
81
|
+
validateOptions: Options.check,
|
|
82
|
+
});
|
|
85
83
|
|
|
86
84
|
export function createStandardizedEntryErrorMessage(key: string) {
|
|
87
85
|
return `Expected standardized entry for '${key}'`;
|
package/src/packageOrder.ts
CHANGED
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context
|
|
9
|
-
import diff from "jest-diff";
|
|
8
|
+
import { Context } from "@monorepolint/config";
|
|
9
|
+
import { diff } from "jest-diff";
|
|
10
10
|
import * as r from "runtypes";
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import { makeRule } from "./util/makeRule.js";
|
|
13
12
|
type OrderFunction = (context: Context) => (a: string, b: string) => number;
|
|
14
13
|
|
|
15
14
|
const Options = r
|
|
@@ -28,9 +27,12 @@ const defaultKeyOrder = [
|
|
|
28
27
|
"contributors",
|
|
29
28
|
"url",
|
|
30
29
|
"license",
|
|
30
|
+
"type",
|
|
31
|
+
"exports",
|
|
31
32
|
"private",
|
|
32
33
|
"engines",
|
|
33
34
|
"bin",
|
|
35
|
+
"types",
|
|
34
36
|
"main",
|
|
35
37
|
"module",
|
|
36
38
|
"typings",
|
|
@@ -49,8 +51,9 @@ const defaultKeyOrder = [
|
|
|
49
51
|
"publishConfig",
|
|
50
52
|
];
|
|
51
53
|
|
|
52
|
-
export const packageOrder = {
|
|
53
|
-
|
|
54
|
+
export const packageOrder = makeRule<Options>({
|
|
55
|
+
name: "packageOrder",
|
|
56
|
+
check: (context, opts) => {
|
|
54
57
|
const packageJson = context.getPackageJson();
|
|
55
58
|
const packagePath = context.getPackageJsonPath();
|
|
56
59
|
|
|
@@ -67,6 +70,7 @@ export const packageOrder = {
|
|
|
67
70
|
message: "Incorrect order of fields in package.json",
|
|
68
71
|
longMessage: diff(expectedOrder, actualOrder, { expand: true }),
|
|
69
72
|
fixer: () => {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
74
|
const expectedPackageJson: Record<string, any> = {};
|
|
71
75
|
|
|
72
76
|
expectedOrder.forEach((key) => {
|
|
@@ -78,10 +82,8 @@ export const packageOrder = {
|
|
|
78
82
|
});
|
|
79
83
|
}
|
|
80
84
|
},
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export const PackageOrder = createNewRuleConversion("PackageOrder", packageOrder);
|
|
85
|
+
validateOptions: Options.check,
|
|
86
|
+
});
|
|
85
87
|
|
|
86
88
|
function arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {
|
|
87
89
|
for (let index = 0; index < a.length; index++) {
|
package/src/packageScript.ts
CHANGED
|
@@ -5,25 +5,19 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context, RuleModule } from "@monorepolint/config";
|
|
9
8
|
import { mutateJson, PackageJson } from "@monorepolint/utils";
|
|
10
|
-
import {
|
|
11
|
-
import diff from "jest-diff";
|
|
9
|
+
import { diff } from "jest-diff";
|
|
12
10
|
import * as r from "runtypes";
|
|
11
|
+
import { makeRule } from "./util/makeRule.js";
|
|
13
12
|
|
|
14
13
|
export const Options = r.Record({
|
|
15
14
|
scripts: r.Dictionary(
|
|
16
15
|
r.Union(
|
|
17
16
|
r.String,
|
|
18
|
-
r
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
.And(
|
|
23
|
-
r.Partial({
|
|
24
|
-
fixValue: r.Union(r.String, r.Undefined, r.Literal(false)),
|
|
25
|
-
})
|
|
26
|
-
)
|
|
17
|
+
r.Record({
|
|
18
|
+
options: r.Array(r.String.Or(r.Undefined)),
|
|
19
|
+
fixValue: r.Union(r.String, r.Undefined, r.Literal(false)).optional(),
|
|
20
|
+
})
|
|
27
21
|
)
|
|
28
22
|
), // string => string
|
|
29
23
|
});
|
|
@@ -32,8 +26,9 @@ export type Options = r.Static<typeof Options>;
|
|
|
32
26
|
|
|
33
27
|
export const MSG_NO_SCRIPTS_BLOCK = "No scripts block in package.json";
|
|
34
28
|
|
|
35
|
-
export const packageScript = {
|
|
36
|
-
|
|
29
|
+
export const packageScript = makeRule<Options>({
|
|
30
|
+
name: "packageScript",
|
|
31
|
+
check: (context, options) => {
|
|
37
32
|
const packageJson = context.getPackageJson();
|
|
38
33
|
if (packageJson.scripts === undefined) {
|
|
39
34
|
context.addError({
|
|
@@ -64,7 +59,7 @@ export const packageScript = {
|
|
|
64
59
|
}
|
|
65
60
|
allowedValues.add(q);
|
|
66
61
|
}
|
|
67
|
-
fixToEmpty =
|
|
62
|
+
fixToEmpty = Object.prototype.hasOwnProperty.call(value, "fixValue") && value.fixValue === undefined;
|
|
68
63
|
fixValue = value.fixValue;
|
|
69
64
|
}
|
|
70
65
|
|
|
@@ -100,7 +95,5 @@ export const packageScript = {
|
|
|
100
95
|
}
|
|
101
96
|
}
|
|
102
97
|
},
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export const PackageScript = createNewRuleConversion("PackageScript", packageScript);
|
|
98
|
+
validateOptions: Options.check,
|
|
99
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { makeRule } from "../util/makeRule.js";
|
package/src/requireDependency.ts
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context
|
|
8
|
+
import { Context } from "@monorepolint/config";
|
|
9
9
|
import { mutateJson, PackageJson } from "@monorepolint/utils";
|
|
10
|
-
import diff from "jest-diff";
|
|
10
|
+
import { diff } from "jest-diff";
|
|
11
11
|
import * as r from "runtypes";
|
|
12
|
-
import {
|
|
12
|
+
import { makeRule } from "./util/makeRule.js";
|
|
13
13
|
|
|
14
14
|
const Options = r.Partial({
|
|
15
15
|
dependencies: r.Dictionary(r.String),
|
|
@@ -20,7 +20,8 @@ const Options = r.Partial({
|
|
|
20
20
|
|
|
21
21
|
type Options = r.Static<typeof Options>;
|
|
22
22
|
|
|
23
|
-
export const requireDependency = {
|
|
23
|
+
export const requireDependency = makeRule({
|
|
24
|
+
name: "requireDependency",
|
|
24
25
|
check: function expectPackageEntry(context: Context, options: Options) {
|
|
25
26
|
const packageJson = context.getPackageJson();
|
|
26
27
|
const packageJsonPath = context.getPackageJsonPath();
|
|
@@ -50,11 +51,11 @@ export const requireDependency = {
|
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
for (const [dep, version] of Object.entries(options[type]!)) {
|
|
53
|
-
if (packageJson[type][dep] !== version) {
|
|
54
|
+
if (packageJson[type]?.[dep] !== version) {
|
|
54
55
|
context.addError({
|
|
55
56
|
file: packageJsonPath,
|
|
56
57
|
message: `Expected dependency ${dep}@${version}`,
|
|
57
|
-
longMessage: diff(`${dep}@${version}\n`, `${dep}@${packageJson[type][dep] || "missing"}\n`)!,
|
|
58
|
+
longMessage: diff(`${dep}@${version}\n`, `${dep}@${packageJson[type]![dep] || "missing"}\n`)!,
|
|
58
59
|
fixer: () => {
|
|
59
60
|
mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {
|
|
60
61
|
input[type] = { ...input[type], [dep]: version };
|
|
@@ -66,7 +67,5 @@ export const requireDependency = {
|
|
|
66
67
|
}
|
|
67
68
|
});
|
|
68
69
|
},
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const RequireDependency = createNewRuleConversion("RequireDependency", requireDependency);
|
|
70
|
+
validateOptions: Options.check,
|
|
71
|
+
});
|
package/src/standardTsconfig.ts
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { Context
|
|
8
|
+
import { Context } from "@monorepolint/config";
|
|
9
9
|
import { matchesAnyGlob } from "@monorepolint/utils";
|
|
10
|
-
import diff from "jest-diff";
|
|
11
|
-
import { createNewRuleConversion } from "./util/createNewRuleConversion";
|
|
10
|
+
import { diff } from "jest-diff";
|
|
12
11
|
import * as path from "path";
|
|
13
12
|
import * as r from "runtypes";
|
|
13
|
+
import { makeRule } from "./util/makeRule.js";
|
|
14
14
|
|
|
15
15
|
const DEFAULT_TSCONFIG_FILENAME = "tsconfig.json";
|
|
16
16
|
|
|
@@ -41,8 +41,9 @@ const Options = r
|
|
|
41
41
|
|
|
42
42
|
export interface Options extends r.Static<typeof Options> {}
|
|
43
43
|
|
|
44
|
-
export const standardTsconfig = {
|
|
45
|
-
|
|
44
|
+
export const standardTsconfig = makeRule<Options>({
|
|
45
|
+
name: "standardTsconfig",
|
|
46
|
+
check: async (context, opts) => {
|
|
46
47
|
const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;
|
|
47
48
|
const fullPath = path.resolve(context.packageDir, tsconfigFileName);
|
|
48
49
|
const generator = getGenerator(context, opts);
|
|
@@ -73,10 +74,8 @@ export const standardTsconfig = {
|
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
},
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export const StandardTsConfig = createNewRuleConversion("StandardTsconfig", standardTsconfig);
|
|
77
|
+
validateOptions: Options.check,
|
|
78
|
+
});
|
|
80
79
|
|
|
81
80
|
function getGenerator(context: Context, opts: Options) {
|
|
82
81
|
if (opts.generator) {
|
|
@@ -95,6 +94,7 @@ function getGenerator(context: Context, opts: Options) {
|
|
|
95
94
|
}
|
|
96
95
|
|
|
97
96
|
function makeGenerator(
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
98
|
template: any,
|
|
99
99
|
excludedReferences: ReadonlyArray<string> | undefined,
|
|
100
100
|
additionalReferences: ReadonlyArray<string> | undefined,
|
|
@@ -110,10 +110,9 @@ function makeGenerator(
|
|
|
110
110
|
|
|
111
111
|
const packageJson = context.getPackageJson();
|
|
112
112
|
const deps = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];
|
|
113
|
-
|
|
114
113
|
for (const dep of deps) {
|
|
115
114
|
const packageDir = nameToDirectory.get(dep);
|
|
116
|
-
if (packageDir !== undefined && (excludedReferences === undefined || matchesAnyGlob(dep, excludedReferences))) {
|
|
115
|
+
if (packageDir !== undefined && (excludedReferences === undefined || !matchesAnyGlob(dep, excludedReferences))) {
|
|
117
116
|
const absoluteReferencePath =
|
|
118
117
|
tsconfigReferenceFile !== undefined ? path.join(packageDir, tsconfigReferenceFile) : packageDir;
|
|
119
118
|
template.references.push({
|
package/src/util/checkAlpha.ts
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Context, RuleEntry, RuleModule } from "@monorepolint/config";
|
|
2
|
+
|
|
3
|
+
let globalId = 0;
|
|
4
|
+
export function makeRule<X>({
|
|
5
|
+
name,
|
|
6
|
+
check,
|
|
7
|
+
validateOptions,
|
|
8
|
+
printStats,
|
|
9
|
+
}: {
|
|
10
|
+
name: string;
|
|
11
|
+
check: (context: Context, options: X, extra: { id: string }) => Promise<unknown> | unknown;
|
|
12
|
+
printStats?: () => void;
|
|
13
|
+
validateOptions: (options: unknown) => asserts options is X;
|
|
14
|
+
}): RuleFunction<X> {
|
|
15
|
+
return function (ruleEntry) {
|
|
16
|
+
const id = `${name} :: ${globalId++}`;
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion
|
|
20
|
+
check: (context) => check(context, ruleEntry.options!!, { id }),
|
|
21
|
+
name,
|
|
22
|
+
validateOptions,
|
|
23
|
+
ruleEntry,
|
|
24
|
+
printStats,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type RuleFunction<T> = (ruleEntry: RuleEntry<T>) => RuleModule<T>;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { Host, PackageJson } from "@monorepolint/utils";
|
|
6
|
-
import path from "path";
|
|
6
|
+
import * as path from "node:path";
|
|
7
7
|
import resolvePackagePath from "resolve-package-path";
|
|
8
8
|
|
|
9
9
|
/** Interface for a node in a package dependency graph. */
|
|
@@ -45,7 +45,7 @@ export class PackageDependencyGraphService implements IPackageDependencyGraphSer
|
|
|
45
45
|
return nodes.get(packageJsonPath)!;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
const packageJson
|
|
48
|
+
const packageJson = host.readJson(packageJsonPath) as PackageJson;
|
|
49
49
|
const node: IPackageDependencyGraphNode = {
|
|
50
50
|
packageJson,
|
|
51
51
|
dependencies: new Map<string, IPackageDependencyGraphNode>(),
|
package/tsconfig.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"extends": "../../tsconfig.base.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
|
-
"outDir": "./
|
|
5
|
-
"rootDir": "./src"
|
|
4
|
+
"outDir": "./build/js",
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"declarationDir": "./build/types",
|
|
7
|
+
"tsBuildInfoFile": "./build/tsconfig.tsbuildinfo"
|
|
6
8
|
},
|
|
9
|
+
"include": [
|
|
10
|
+
"src"
|
|
11
|
+
],
|
|
7
12
|
"references": [
|
|
8
13
|
{
|
|
9
14
|
"path": "../config"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alphabeticalScripts.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/alphabeticalScripts.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|