@monorepolint/rules 0.5.0-alpha.11 → 0.5.0-alpha.124
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 +4 -0
- package/.turbo/turbo-compile-typescript.log +4 -0
- package/.turbo/turbo-lint.log +14 -0
- package/.turbo/turbo-test.log +666 -0
- package/.turbo/turbo-transpile-typescript.log +18 -0
- package/build/js/chunk-A2MUUSNE.js +26 -0
- package/build/js/chunk-A2MUUSNE.js.map +1 -0
- package/build/js/index.js +1402 -0
- package/build/js/index.js.map +1 -0
- package/build/js/public/util.js +7 -0
- package/build/js/public/util.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types/__tests__/alphabeticalScripts.spec.d.ts.map +1 -0
- package/build/types/__tests__/bannedDependencies.spec.d.ts +2 -0
- package/build/types/__tests__/bannedDependencies.spec.d.ts.map +1 -0
- package/build/types/__tests__/consistentDependencies.spec.d.ts.map +1 -0
- package/build/types/__tests__/consistentVersions.spec.d.ts +8 -0
- package/build/types/__tests__/consistentVersions.spec.d.ts.map +1 -0
- package/build/types/__tests__/fileContents.spec.d.ts +8 -0
- package/build/types/__tests__/fileContents.spec.d.ts.map +1 -0
- package/build/types/__tests__/mustSatisfyPeerDependencies.spec.d.ts +8 -0
- package/build/types/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +1 -0
- package/build/types/__tests__/nestedWorkspaces.spec.d.ts +2 -0
- package/build/types/__tests__/nestedWorkspaces.spec.d.ts.map +1 -0
- package/build/types/__tests__/packageEntry.spec.d.ts.map +1 -0
- package/build/types/__tests__/packageOrder.spec.d.ts.map +1 -0
- package/build/types/__tests__/packageScript.spec.d.ts.map +1 -0
- package/build/types/__tests__/requireDependency.spec.d.ts +2 -0
- package/build/types/__tests__/requireDependency.spec.d.ts.map +1 -0
- package/build/types/__tests__/utils.d.ts +81 -0
- package/build/types/__tests__/utils.d.ts.map +1 -0
- package/build/types/alphabeticalDependencies.d.ts +8 -0
- package/build/types/alphabeticalDependencies.d.ts.map +1 -0
- package/build/types/alphabeticalScripts.d.ts +8 -0
- package/build/types/alphabeticalScripts.d.ts.map +1 -0
- package/build/types/bannedDependencies.d.ts +66 -0
- package/build/types/bannedDependencies.d.ts.map +1 -0
- package/build/types/consistentDependencies.d.ts +18 -0
- package/build/types/consistentDependencies.d.ts.map +1 -0
- package/build/types/consistentVersions.d.ts +25 -0
- package/build/types/consistentVersions.d.ts.map +1 -0
- package/build/types/fileContents.d.ts +39 -0
- package/build/types/fileContents.d.ts.map +1 -0
- package/build/types/index.d.ts +20 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/mustSatisfyPeerDependencies.d.ts +427 -0
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -0
- package/build/types/nestedWorkspaces.d.ts +10 -0
- package/build/types/nestedWorkspaces.d.ts.map +1 -0
- package/build/types/packageEntry.d.ts +62 -0
- package/build/types/packageEntry.d.ts.map +1 -0
- package/build/types/packageOrder.d.ts +12 -0
- package/build/types/packageOrder.d.ts.map +1 -0
- package/build/types/packageScript.d.ts +47 -0
- package/build/types/packageScript.d.ts.map +1 -0
- package/build/types/public/util.d.ts +2 -0
- package/build/types/public/util.d.ts.map +1 -0
- package/build/types/requireDependency.d.ts +50 -0
- package/build/types/requireDependency.d.ts.map +1 -0
- package/build/types/standardTsconfig.d.ts +29 -0
- package/build/types/standardTsconfig.d.ts.map +1 -0
- package/{lib → build/types}/util/checkAlpha.d.ts +2 -1
- package/build/types/util/checkAlpha.d.ts.map +1 -0
- package/build/types/util/makeDirectory.d.ts +8 -0
- package/build/types/util/makeDirectory.d.ts.map +1 -0
- package/build/types/util/makeRule.d.ts +12 -0
- package/build/types/util/makeRule.d.ts.map +1 -0
- package/build/types/util/packageDependencyGraphService.d.ts +37 -0
- package/build/types/util/packageDependencyGraphService.d.ts.map +1 -0
- package/package.json +45 -20
- package/src/__tests__/alphabeticalScripts.spec.ts +33 -31
- package/src/__tests__/bannedDependencies.spec.ts +189 -0
- package/src/__tests__/consistentDependencies.spec.ts +42 -25
- package/src/__tests__/consistentVersions.spec.ts +224 -0
- package/src/__tests__/fileContents.spec.ts +101 -0
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1189 -0
- package/src/__tests__/nestedWorkspaces.spec.ts +153 -0
- package/src/__tests__/packageEntry.spec.ts +127 -49
- package/src/__tests__/packageOrder.spec.ts +68 -53
- package/src/__tests__/packageScript.spec.ts +124 -98
- package/src/__tests__/requireDependency.spec.ts +152 -0
- package/src/__tests__/utils.ts +113 -13
- package/src/alphabeticalDependencies.ts +7 -9
- package/src/alphabeticalScripts.ts +7 -9
- package/src/bannedDependencies.ts +135 -46
- package/src/consistentDependencies.ts +41 -17
- package/src/consistentVersions.ts +141 -0
- package/src/fileContents.ts +44 -37
- package/src/index.ts +13 -9
- package/src/mustSatisfyPeerDependencies.ts +744 -0
- package/src/nestedWorkspaces.ts +60 -0
- package/src/packageEntry.ts +72 -28
- package/src/packageOrder.ts +17 -13
- package/src/packageScript.ts +15 -19
- package/src/public/util.ts +1 -0
- package/src/requireDependency.ts +71 -0
- package/src/standardTsconfig.ts +51 -27
- package/src/util/checkAlpha.ts +9 -6
- package/src/util/makeDirectory.ts +24 -0
- package/src/util/makeRule.ts +29 -0
- package/src/util/packageDependencyGraphService.ts +114 -0
- package/tsconfig.json +10 -2
- 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__/consistentDependencies.spec.d.ts.map +0 -1
- package/lib/__tests__/consistentDependencies.spec.js +0 -106
- package/lib/__tests__/consistentDependencies.spec.js.map +0 -1
- package/lib/__tests__/packageEntry.spec.d.ts.map +0 -1
- package/lib/__tests__/packageEntry.spec.js +0 -99
- package/lib/__tests__/packageEntry.spec.js.map +0 -1
- package/lib/__tests__/packageOrder.spec.d.ts.map +0 -1
- package/lib/__tests__/packageOrder.spec.js +0 -115
- package/lib/__tests__/packageOrder.spec.js.map +0 -1
- package/lib/__tests__/packageScript.spec.d.ts.map +0 -1
- package/lib/__tests__/packageScript.spec.js +0 -172
- package/lib/__tests__/packageScript.spec.js.map +0 -1
- package/lib/__tests__/utils.d.ts +0 -9
- package/lib/__tests__/utils.d.ts.map +0 -1
- package/lib/__tests__/utils.js +0 -27
- package/lib/__tests__/utils.js.map +0 -1
- package/lib/alphabeticalDependencies.d.ts +0 -12
- package/lib/alphabeticalDependencies.d.ts.map +0 -1
- package/lib/alphabeticalDependencies.js +0 -21
- package/lib/alphabeticalDependencies.js.map +0 -1
- package/lib/alphabeticalScripts.d.ts +0 -12
- package/lib/alphabeticalScripts.d.ts.map +0 -1
- package/lib/alphabeticalScripts.js +0 -19
- package/lib/alphabeticalScripts.js.map +0 -1
- package/lib/bannedDependencies.d.ts +0 -15
- package/lib/bannedDependencies.d.ts.map +0 -1
- package/lib/bannedDependencies.js +0 -57
- package/lib/bannedDependencies.js.map +0 -1
- package/lib/consistentDependencies.d.ts +0 -10
- package/lib/consistentDependencies.d.ts.map +0 -1
- package/lib/consistentDependencies.js +0 -57
- package/lib/consistentDependencies.js.map +0 -1
- package/lib/fileContents.d.ts +0 -25
- package/lib/fileContents.d.ts.map +0 -1
- package/lib/fileContents.js +0 -77
- package/lib/fileContents.js.map +0 -1
- package/lib/index.d.ts +0 -16
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -27
- package/lib/index.js.map +0 -1
- package/lib/packageEntry.d.ts +0 -16
- package/lib/packageEntry.d.ts.map +0 -1
- package/lib/packageEntry.js +0 -40
- package/lib/packageEntry.js.map +0 -1
- package/lib/packageOrder.d.ts +0 -12
- package/lib/packageOrder.d.ts.map +0 -1
- package/lib/packageOrder.js +0 -103
- package/lib/packageOrder.js.map +0 -1
- package/lib/packageScript.d.ts +0 -25
- package/lib/packageScript.d.ts.map +0 -1
- package/lib/packageScript.js +0 -89
- package/lib/packageScript.js.map +0 -1
- package/lib/standardTsconfig.d.ts +0 -33
- package/lib/standardTsconfig.d.ts.map +0 -1
- package/lib/standardTsconfig.js +0 -98
- package/lib/standardTsconfig.js.map +0 -1
- package/lib/util/checkAlpha.d.ts.map +0 -1
- package/lib/util/checkAlpha.js +0 -47
- package/lib/util/checkAlpha.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -2484
- /package/{lib → build/types}/__tests__/alphabeticalScripts.spec.d.ts +0 -0
- /package/{lib → build/types}/__tests__/consistentDependencies.spec.d.ts +0 -0
- /package/{lib → build/types}/__tests__/packageEntry.spec.d.ts +0 -0
- /package/{lib → build/types}/__tests__/packageOrder.spec.d.ts +0 -0
- /package/{lib → build/types}/__tests__/packageScript.spec.d.ts +0 -0
- /package/{jest.config.js → jest.config.cjs} +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright 2019 Palantir Technologies, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
5
|
+
*
|
|
6
|
+
*/
|
|
7
|
+
import { WorkspaceContextImpl } from "@monorepolint/core";
|
|
8
|
+
import { SimpleHost } from "@monorepolint/utils";
|
|
9
|
+
import { writeFileSync } from "fs";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
import * as tmp from "tmp";
|
|
12
|
+
import { nestedWorkspaces } from "../nestedWorkspaces.js";
|
|
13
|
+
import { makeDirectoryRecursively } from "../util/makeDirectory.js";
|
|
14
|
+
import { jsonToString } from "./utils.js";
|
|
15
|
+
import { describe, expect, it, beforeEach, afterEach, jest } from "@jest/globals";
|
|
16
|
+
|
|
17
|
+
const EMPTY_PACKAGE = jsonToString({});
|
|
18
|
+
|
|
19
|
+
const PACKAGE_ROOT_WITH_PACKAGES_STAR = jsonToString({
|
|
20
|
+
workspaces: {
|
|
21
|
+
packages: ["packages/*"],
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const PACKAGE_ROOT_WITH_TWO_LEVEL = jsonToString({
|
|
26
|
+
workspaces: {
|
|
27
|
+
packages: ["packages/*", "packages/deep/*"],
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const PACKAGE_ROOT_WITH_THREE_LEVEL = jsonToString({
|
|
32
|
+
workspaces: {
|
|
33
|
+
packages: ["packages/*", "packages/deep/*", "packages/very/deep/*"],
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("nestedWorkspaces", () => {
|
|
38
|
+
tmp.setGracefulCleanup();
|
|
39
|
+
|
|
40
|
+
let cleanupJobs: Array<() => void> = [];
|
|
41
|
+
let cwd: string | undefined;
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
const dir = tmp.dirSync({ unsafeCleanup: true });
|
|
45
|
+
cleanupJobs.push(() => dir.removeCallback());
|
|
46
|
+
cwd = dir.name;
|
|
47
|
+
|
|
48
|
+
const spy = jest.spyOn(process, "cwd");
|
|
49
|
+
spy.mockReturnValue(cwd);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
for (const cleanupJob of cleanupJobs) {
|
|
54
|
+
cleanupJob();
|
|
55
|
+
}
|
|
56
|
+
cleanupJobs = [];
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
function makeWorkspace() {
|
|
60
|
+
const host = new SimpleHost();
|
|
61
|
+
const workspaceContext = new WorkspaceContextImpl(
|
|
62
|
+
cwd!,
|
|
63
|
+
{
|
|
64
|
+
rules: [],
|
|
65
|
+
fix: false,
|
|
66
|
+
verbose: false,
|
|
67
|
+
silent: true,
|
|
68
|
+
},
|
|
69
|
+
host
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
async function checkAndSpy() {
|
|
73
|
+
const addErrorSpy = jest.spyOn(workspaceContext, "addError");
|
|
74
|
+
|
|
75
|
+
await nestedWorkspaces({}).check(workspaceContext);
|
|
76
|
+
return { addErrorSpy };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function addFile(filePath: string, content: string) {
|
|
80
|
+
const dirPath = path.resolve(cwd!, path.dirname(filePath));
|
|
81
|
+
const resolvedFilePath = path.resolve(cwd!, filePath);
|
|
82
|
+
|
|
83
|
+
makeDirectoryRecursively(dirPath);
|
|
84
|
+
writeFileSync(resolvedFilePath, content);
|
|
85
|
+
return resolvedFilePath;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return { addFile, workspaceContext, checkAndSpy };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
it("checks correctly when no packages", async () => {
|
|
92
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
93
|
+
addFile("./package.json", EMPTY_PACKAGE);
|
|
94
|
+
|
|
95
|
+
expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("checks correctly when one level packages", async () => {
|
|
99
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
100
|
+
addFile("./package.json", PACKAGE_ROOT_WITH_PACKAGES_STAR);
|
|
101
|
+
addFile("./packages/star/package.json", EMPTY_PACKAGE);
|
|
102
|
+
|
|
103
|
+
expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("checks fail when one level packages with no workspaces field", async () => {
|
|
107
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
108
|
+
const packageJsonPath = addFile("./package.json", EMPTY_PACKAGE);
|
|
109
|
+
addFile("./packages/star/package.json", EMPTY_PACKAGE);
|
|
110
|
+
|
|
111
|
+
const spy = (await checkAndSpy()).addErrorSpy;
|
|
112
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
113
|
+
expect(spy).toHaveBeenCalledWith({
|
|
114
|
+
file: packageJsonPath,
|
|
115
|
+
message: 'The "workspace" field is missing, even though there are workspaces in the repository.',
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("checks correctly when two level packages with two level workspaces field", async () => {
|
|
120
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
121
|
+
addFile("./package.json", PACKAGE_ROOT_WITH_TWO_LEVEL);
|
|
122
|
+
addFile("./packages/star/package.json", EMPTY_PACKAGE);
|
|
123
|
+
addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
|
|
124
|
+
|
|
125
|
+
expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("checks fail when two level packages with one level workspaces field", async () => {
|
|
129
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
130
|
+
const packageJsonPath = addFile("./package.json", PACKAGE_ROOT_WITH_PACKAGES_STAR);
|
|
131
|
+
addFile("./packages/star/package.json", EMPTY_PACKAGE);
|
|
132
|
+
addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
|
|
133
|
+
|
|
134
|
+
const spy = (await checkAndSpy()).addErrorSpy;
|
|
135
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(spy).toHaveBeenCalledWith({
|
|
137
|
+
file: packageJsonPath,
|
|
138
|
+
message:
|
|
139
|
+
'The "workspace" field is missing one or more values: packages/deep/star. ' +
|
|
140
|
+
'You may be able to use a glob to avoid listing each workspace individually, e.g. "packages/nested-workspace/*".',
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("checks correctly when three level packages with three level workspaces field", async () => {
|
|
145
|
+
const { addFile, checkAndSpy } = makeWorkspace();
|
|
146
|
+
addFile("./package.json", PACKAGE_ROOT_WITH_THREE_LEVEL);
|
|
147
|
+
addFile("./packages/star/package.json", EMPTY_PACKAGE);
|
|
148
|
+
addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
|
|
149
|
+
addFile("./packages/very/deep/star/package.json", EMPTY_PACKAGE);
|
|
150
|
+
|
|
151
|
+
expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -6,13 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
// tslint:disable:no-console
|
|
9
|
-
import { createMockFiles } from "./utils";
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
import { packageEntry } from "../packageEntry";
|
|
10
|
+
import { Context, Failure } from "@monorepolint/config";
|
|
11
|
+
import { createExpectedEntryErrorMessage, createStandardizedEntryErrorMessage, packageEntry } from "../packageEntry.js";
|
|
12
|
+
import { AddErrorSpy, createTestingWorkspace, HOST_FACTORIES, TestingWorkspace } from "./utils.js";
|
|
13
|
+
import { describe, expect, it, beforeEach, afterEach, jest } from "@jest/globals";
|
|
16
14
|
|
|
17
15
|
const PACKAGE_MISSING_ENTRY =
|
|
18
16
|
JSON.stringify(
|
|
@@ -55,79 +53,159 @@ const PACKAGE_REPOSITORY =
|
|
|
55
53
|
2
|
|
56
54
|
) + "\n";
|
|
57
55
|
|
|
58
|
-
describe("expectPackageEntries", () => {
|
|
59
|
-
afterEach(() => {
|
|
60
|
-
mockFiles.clear();
|
|
61
|
-
});
|
|
62
|
-
|
|
56
|
+
describe.each(HOST_FACTORIES)("expectPackageEntries ($name)", (hostFactory) => {
|
|
63
57
|
describe("fix: true", () => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
58
|
+
let workspace: TestingWorkspace;
|
|
59
|
+
let spy: AddErrorSpy;
|
|
60
|
+
let context: Context;
|
|
61
|
+
|
|
62
|
+
beforeEach(async () => {
|
|
63
|
+
workspace = await createTestingWorkspace({
|
|
64
|
+
fixFlag: true,
|
|
65
|
+
host: hostFactory.make(),
|
|
66
|
+
});
|
|
67
|
+
context = workspace.context; // minimizing delta
|
|
68
|
+
|
|
69
|
+
spy = jest.spyOn(workspace.context, "addError");
|
|
69
70
|
});
|
|
70
|
-
const spy = jest.spyOn(context, "addError");
|
|
71
71
|
|
|
72
72
|
afterEach(() => {
|
|
73
73
|
spy.mockClear();
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it("fixes missing entries", () => {
|
|
77
|
-
|
|
77
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
78
78
|
|
|
79
|
-
packageEntry
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
packageEntry({
|
|
80
|
+
options: {
|
|
81
|
+
entries: {
|
|
82
|
+
license: "UNLICENSED",
|
|
83
|
+
},
|
|
84
|
+
entriesExist: undefined,
|
|
82
85
|
},
|
|
83
|
-
});
|
|
86
|
+
}).check(context);
|
|
84
87
|
|
|
85
88
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
86
89
|
|
|
87
90
|
const failure: Failure = spy.mock.calls[0][0];
|
|
88
|
-
expect(failure
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
expect(failure).toMatchObject(
|
|
92
|
+
workspace.failureMatcher({
|
|
93
|
+
file: "package.json",
|
|
94
|
+
hasFixer: true,
|
|
95
|
+
message: createStandardizedEntryErrorMessage("license"),
|
|
96
|
+
})
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_LICENSE);
|
|
93
100
|
});
|
|
94
101
|
|
|
95
102
|
it("fixes missing nested entries", () => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
packageEntry
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
104
|
+
|
|
105
|
+
packageEntry({
|
|
106
|
+
options: {
|
|
107
|
+
entries: {
|
|
108
|
+
repository: {
|
|
109
|
+
type: "git",
|
|
110
|
+
url: "https://github.com:foo/foo",
|
|
111
|
+
},
|
|
103
112
|
},
|
|
113
|
+
entriesExist: undefined,
|
|
104
114
|
},
|
|
105
|
-
});
|
|
115
|
+
}).check(context);
|
|
106
116
|
|
|
107
117
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
108
118
|
|
|
109
119
|
const failure: Failure = spy.mock.calls[0][0];
|
|
110
|
-
expect(failure
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
expect(failure).toMatchObject(
|
|
121
|
+
workspace.failureMatcher({
|
|
122
|
+
file: "package.json",
|
|
123
|
+
hasFixer: true,
|
|
124
|
+
message: createStandardizedEntryErrorMessage("repository"),
|
|
125
|
+
})
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
115
129
|
});
|
|
116
130
|
|
|
117
131
|
it("doesn't error for nested entries that are defined", () => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
packageEntry
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
132
|
+
workspace.writeFile("package.json", PACKAGE_REPOSITORY);
|
|
133
|
+
|
|
134
|
+
packageEntry({
|
|
135
|
+
options: {
|
|
136
|
+
entries: {
|
|
137
|
+
repository: {
|
|
138
|
+
type: "git",
|
|
139
|
+
url: "https://github.com:foo/foo",
|
|
140
|
+
},
|
|
125
141
|
},
|
|
142
|
+
entriesExist: undefined,
|
|
126
143
|
},
|
|
127
|
-
});
|
|
144
|
+
}).check(context);
|
|
128
145
|
|
|
129
146
|
expect(spy).toHaveBeenCalledTimes(0);
|
|
130
|
-
expect(
|
|
147
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("errors for keys that are missing", () => {
|
|
151
|
+
workspace.writeFile("package.json", PACKAGE_REPOSITORY);
|
|
152
|
+
|
|
153
|
+
packageEntry({
|
|
154
|
+
options: {
|
|
155
|
+
entries: undefined,
|
|
156
|
+
entriesExist: ["bugs"],
|
|
157
|
+
},
|
|
158
|
+
}).check(context);
|
|
159
|
+
|
|
160
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
161
|
+
|
|
162
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
163
|
+
expect(failure).toMatchObject(
|
|
164
|
+
workspace.failureMatcher({
|
|
165
|
+
file: "package.json",
|
|
166
|
+
hasFixer: false,
|
|
167
|
+
message: createExpectedEntryErrorMessage("bugs"),
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it("handles both entries and entriesExist", () => {
|
|
174
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
175
|
+
|
|
176
|
+
packageEntry({
|
|
177
|
+
options: {
|
|
178
|
+
entries: {
|
|
179
|
+
repository: {
|
|
180
|
+
type: "git",
|
|
181
|
+
url: "https://github.com:foo/foo",
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
entriesExist: ["bugs"],
|
|
185
|
+
},
|
|
186
|
+
}).check(context);
|
|
187
|
+
|
|
188
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
189
|
+
|
|
190
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
191
|
+
expect(failure).toMatchObject(
|
|
192
|
+
workspace.failureMatcher({
|
|
193
|
+
file: "package.json",
|
|
194
|
+
hasFixer: true,
|
|
195
|
+
message: createStandardizedEntryErrorMessage("repository"),
|
|
196
|
+
})
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const failure2: Failure = spy.mock.calls[1][0];
|
|
200
|
+
expect(failure2).toMatchObject(
|
|
201
|
+
workspace.failureMatcher({
|
|
202
|
+
file: "package.json",
|
|
203
|
+
hasFixer: false,
|
|
204
|
+
message: createExpectedEntryErrorMessage("bugs"),
|
|
205
|
+
})
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
131
209
|
});
|
|
132
210
|
});
|
|
133
211
|
});
|
|
@@ -6,13 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
// tslint:disable:no-console
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import { Context, Failure, PackageContext } from "@monorepolint/core";
|
|
15
|
-
import { packageOrder } from "../packageOrder";
|
|
9
|
+
import { AddErrorSpy, createTestingWorkspace, HOST_FACTORIES, TestingWorkspace } from "./utils.js";
|
|
10
|
+
import { Context, Failure } from "@monorepolint/config";
|
|
11
|
+
import { packageOrder } from "../packageOrder.js";
|
|
12
|
+
import { describe, expect, it, beforeEach, jest } from "@jest/globals";
|
|
16
13
|
|
|
17
14
|
const PACKAGE_UNORDERED =
|
|
18
15
|
JSON.stringify(
|
|
@@ -85,85 +82,103 @@ const PACKAGE_ORDERED_UNKOWN_KEYS =
|
|
|
85
82
|
2
|
|
86
83
|
) + "\n";
|
|
87
84
|
|
|
88
|
-
describe("expectPackageOrder", () => {
|
|
89
|
-
afterEach(() => {
|
|
90
|
-
mockFiles.clear();
|
|
91
|
-
});
|
|
92
|
-
|
|
85
|
+
describe.each(HOST_FACTORIES)("expectPackageOrder ($name)", (hostFactory) => {
|
|
93
86
|
describe("fix: true", () => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
87
|
+
let workspace: TestingWorkspace;
|
|
88
|
+
let spy: AddErrorSpy;
|
|
89
|
+
let context: Context;
|
|
90
|
+
|
|
91
|
+
beforeEach(async () => {
|
|
92
|
+
workspace = await createTestingWorkspace({
|
|
93
|
+
fixFlag: true,
|
|
94
|
+
host: hostFactory.make(),
|
|
95
|
+
});
|
|
96
|
+
context = workspace.context; // minimizing delta
|
|
101
97
|
|
|
102
|
-
|
|
103
|
-
spy.mockClear();
|
|
98
|
+
spy = jest.spyOn(workspace.context, "addError");
|
|
104
99
|
});
|
|
105
100
|
|
|
106
101
|
it("fixes order for expected keys", () => {
|
|
107
|
-
|
|
102
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED);
|
|
108
103
|
|
|
109
|
-
packageOrder
|
|
110
|
-
|
|
111
|
-
|
|
104
|
+
packageOrder({
|
|
105
|
+
options: {
|
|
106
|
+
order: orderArray,
|
|
107
|
+
},
|
|
108
|
+
}).check(context);
|
|
112
109
|
|
|
113
110
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
114
111
|
|
|
115
112
|
const failure: Failure = spy.mock.calls[0][0];
|
|
116
|
-
expect(failure
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
expect(failure).toMatchObject(
|
|
114
|
+
workspace.failureMatcher({
|
|
115
|
+
file: "package.json",
|
|
116
|
+
hasFixer: true,
|
|
117
|
+
message: "Incorrect order of fields in package.json",
|
|
118
|
+
})
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED);
|
|
121
122
|
});
|
|
122
123
|
|
|
123
124
|
it("fixes order for unexpected keys", () => {
|
|
124
|
-
|
|
125
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
|
|
125
126
|
|
|
126
|
-
packageOrder
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
packageOrder({
|
|
128
|
+
options: {
|
|
129
|
+
order: orderArray,
|
|
130
|
+
},
|
|
131
|
+
}).check(context);
|
|
129
132
|
|
|
130
133
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
131
134
|
|
|
132
135
|
const failure: Failure = spy.mock.calls[0][0];
|
|
133
|
-
expect(failure
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
136
|
+
expect(failure).toMatchObject(
|
|
137
|
+
workspace.failureMatcher({
|
|
138
|
+
file: "package.json",
|
|
139
|
+
hasFixer: true,
|
|
140
|
+
message: "Incorrect order of fields in package.json",
|
|
141
|
+
})
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
138
145
|
});
|
|
139
146
|
|
|
140
147
|
it("fixes order using function", () => {
|
|
141
|
-
|
|
148
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED);
|
|
142
149
|
|
|
143
|
-
packageOrder
|
|
144
|
-
|
|
145
|
-
|
|
150
|
+
packageOrder({
|
|
151
|
+
options: {
|
|
152
|
+
order: orderFunction,
|
|
153
|
+
},
|
|
154
|
+
}).check(context);
|
|
146
155
|
|
|
147
156
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
148
157
|
|
|
149
158
|
const failure: Failure = spy.mock.calls[0][0];
|
|
150
|
-
expect(failure
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
159
|
+
expect(failure).toMatchObject(
|
|
160
|
+
workspace.failureMatcher({
|
|
161
|
+
file: "package.json",
|
|
162
|
+
hasFixer: true,
|
|
163
|
+
message: "Incorrect order of fields in package.json",
|
|
164
|
+
})
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_BY_LENGTH);
|
|
155
168
|
});
|
|
156
169
|
|
|
157
170
|
it("does nothing if already order", () => {
|
|
158
|
-
|
|
171
|
+
workspace.writeFile("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
159
172
|
|
|
160
|
-
packageOrder
|
|
161
|
-
|
|
162
|
-
|
|
173
|
+
packageOrder({
|
|
174
|
+
options: {
|
|
175
|
+
order: orderArray,
|
|
176
|
+
},
|
|
177
|
+
}).check(context);
|
|
163
178
|
|
|
164
179
|
expect(spy).not.toHaveBeenCalled();
|
|
165
180
|
|
|
166
|
-
expect(
|
|
181
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
167
182
|
});
|
|
168
183
|
});
|
|
169
184
|
});
|