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