@monorepolint/rules 0.5.0-alpha.10 → 0.5.0-alpha.103
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 +107 -0
- package/.turbo/turbo-test.log +631 -0
- package/.turbo/turbo-transpile-typescript.log +18 -0
- package/build/js/index.cjs +1491 -0
- package/build/js/index.cjs.map +1 -0
- package/build/js/index.js +1433 -0
- package/build/js/index.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/{lib/__tests__/utils.d.ts → build/types/__tests__/alphabeticalScripts.spec.d.ts} +2 -2
- 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/{lib → build/types}/__tests__/consistentDependencies.spec.d.ts +0 -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/{lib → build/types}/__tests__/packageEntry.spec.d.ts +0 -0
- package/build/types/__tests__/packageEntry.spec.d.ts.map +1 -0
- package/{lib → build/types}/__tests__/packageOrder.spec.d.ts +0 -0
- package/build/types/__tests__/packageOrder.spec.d.ts.map +1 -0
- package/{lib → build/types}/__tests__/packageScript.spec.d.ts +0 -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 +23 -0
- package/build/types/alphabeticalDependencies.d.ts.map +1 -0
- package/build/types/alphabeticalScripts.d.ts +23 -0
- package/build/types/alphabeticalScripts.d.ts.map +1 -0
- package/build/types/bannedDependencies.d.ts +134 -0
- package/build/types/bannedDependencies.d.ts.map +1 -0
- package/build/types/consistentDependencies.d.ts +38 -0
- package/build/types/consistentDependencies.d.ts.map +1 -0
- package/build/types/consistentVersions.d.ts +47 -0
- package/build/types/consistentVersions.d.ts.map +1 -0
- package/build/types/fileContents.d.ts +111 -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 +721 -0
- package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -0
- package/build/types/nestedWorkspaces.d.ts +24 -0
- package/build/types/nestedWorkspaces.d.ts.map +1 -0
- package/build/types/packageEntry.d.ts +115 -0
- package/build/types/packageEntry.d.ts.map +1 -0
- package/build/types/packageOrder.d.ts +33 -0
- package/build/types/packageOrder.d.ts.map +1 -0
- package/build/types/packageScript.d.ts +89 -0
- package/build/types/packageScript.d.ts.map +1 -0
- package/build/types/requireDependency.d.ts +99 -0
- package/build/types/requireDependency.d.ts.map +1 -0
- package/build/types/standardTsconfig.d.ts +113 -0
- package/build/types/standardTsconfig.d.ts.map +1 -0
- package/build/types/util/checkAlpha.d.ts +10 -0
- package/build/types/util/checkAlpha.d.ts.map +1 -0
- package/build/types/util/createNewRuleConversion.d.ts +30 -0
- package/build/types/util/createNewRuleConversion.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/packageDependencyGraphService.d.ts +37 -0
- package/build/types/util/packageDependencyGraphService.d.ts.map +1 -0
- package/{jest.config.js → jest.config.cjs} +0 -0
- package/package.json +39 -20
- package/src/__tests__/alphabeticalScripts.spec.ts +76 -0
- package/src/__tests__/bannedDependencies.spec.ts +191 -0
- package/src/__tests__/consistentDependencies.spec.ts +41 -27
- package/src/__tests__/consistentVersions.spec.ts +224 -0
- package/src/__tests__/fileContents.spec.ts +75 -0
- package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1189 -0
- package/src/__tests__/nestedWorkspaces.spec.ts +153 -0
- package/src/__tests__/packageEntry.spec.ts +99 -31
- package/src/__tests__/packageOrder.spec.ts +48 -41
- package/src/__tests__/packageScript.spec.ts +66 -56
- package/src/__tests__/requireDependency.spec.ts +152 -0
- package/src/__tests__/utils.ts +115 -11
- package/src/alphabeticalDependencies.ts +6 -48
- package/src/alphabeticalScripts.ts +21 -0
- package/src/bannedDependencies.ts +135 -44
- package/src/consistentDependencies.ts +38 -14
- package/src/consistentVersions.ts +142 -0
- package/src/fileContents.ts +35 -30
- package/src/index.ts +13 -8
- package/src/mustSatisfyPeerDependencies.ts +748 -0
- package/src/nestedWorkspaces.ts +61 -0
- package/src/packageEntry.ts +72 -27
- package/src/packageOrder.ts +13 -9
- package/src/packageScript.ts +13 -15
- package/src/requireDependency.ts +71 -0
- package/src/standardTsconfig.ts +49 -24
- package/src/util/checkAlpha.ts +59 -0
- package/src/util/createNewRuleConversion.ts +38 -0
- package/src/util/makeDirectory.ts +24 -0
- package/src/util/packageDependencyGraphService.ts +114 -0
- package/tsconfig.json +10 -2
- package/lib/__tests__/consistentDependencies.spec.d.ts.map +0 -1
- package/lib/__tests__/consistentDependencies.spec.js +0 -108
- 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.map +0 -1
- package/lib/__tests__/utils.js +0 -23
- package/lib/__tests__/utils.js.map +0 -1
- package/lib/alphabeticalDependencies.d.ts +0 -10
- package/lib/alphabeticalDependencies.d.ts.map +0 -1
- package/lib/alphabeticalDependencies.js +0 -56
- package/lib/alphabeticalDependencies.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 -15
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -25
- 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/tsconfig.tsbuildinfo +0 -2439
|
@@ -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, undefined);
|
|
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,45 +53,52 @@ 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
79
|
packageEntry.check(context, {
|
|
80
80
|
entries: {
|
|
81
81
|
license: "UNLICENSED",
|
|
82
82
|
},
|
|
83
|
+
entriesExist: undefined,
|
|
83
84
|
});
|
|
84
85
|
|
|
85
86
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
86
87
|
|
|
87
88
|
const failure: Failure = spy.mock.calls[0][0];
|
|
88
|
-
expect(failure
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
expect(failure).toMatchObject(
|
|
90
|
+
workspace.failureMatcher({
|
|
91
|
+
file: "package.json",
|
|
92
|
+
hasFixer: true,
|
|
93
|
+
message: createStandardizedEntryErrorMessage("license"),
|
|
94
|
+
})
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_LICENSE);
|
|
93
98
|
});
|
|
94
99
|
|
|
95
100
|
it("fixes missing nested entries", () => {
|
|
96
|
-
|
|
101
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
97
102
|
|
|
98
103
|
packageEntry.check(context, {
|
|
99
104
|
entries: {
|
|
@@ -102,20 +107,25 @@ describe("expectPackageEntries", () => {
|
|
|
102
107
|
url: "https://github.com:foo/foo",
|
|
103
108
|
},
|
|
104
109
|
},
|
|
110
|
+
entriesExist: undefined,
|
|
105
111
|
});
|
|
106
112
|
|
|
107
113
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
108
114
|
|
|
109
115
|
const failure: Failure = spy.mock.calls[0][0];
|
|
110
|
-
expect(failure
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
116
|
+
expect(failure).toMatchObject(
|
|
117
|
+
workspace.failureMatcher({
|
|
118
|
+
file: "package.json",
|
|
119
|
+
hasFixer: true,
|
|
120
|
+
message: createStandardizedEntryErrorMessage("repository"),
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
115
125
|
});
|
|
116
126
|
|
|
117
127
|
it("doesn't error for nested entries that are defined", () => {
|
|
118
|
-
|
|
128
|
+
workspace.writeFile("package.json", PACKAGE_REPOSITORY);
|
|
119
129
|
|
|
120
130
|
packageEntry.check(context, {
|
|
121
131
|
entries: {
|
|
@@ -124,10 +134,68 @@ describe("expectPackageEntries", () => {
|
|
|
124
134
|
url: "https://github.com:foo/foo",
|
|
125
135
|
},
|
|
126
136
|
},
|
|
137
|
+
entriesExist: undefined,
|
|
127
138
|
});
|
|
128
139
|
|
|
129
140
|
expect(spy).toHaveBeenCalledTimes(0);
|
|
130
|
-
expect(
|
|
141
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("errors for keys that are missing", () => {
|
|
145
|
+
workspace.writeFile("package.json", PACKAGE_REPOSITORY);
|
|
146
|
+
|
|
147
|
+
packageEntry.check(context, {
|
|
148
|
+
entries: undefined,
|
|
149
|
+
entriesExist: ["bugs"],
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
153
|
+
|
|
154
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
155
|
+
expect(failure).toMatchObject(
|
|
156
|
+
workspace.failureMatcher({
|
|
157
|
+
file: "package.json",
|
|
158
|
+
hasFixer: false,
|
|
159
|
+
message: createExpectedEntryErrorMessage("bugs"),
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("handles both entries and entriesExist", () => {
|
|
166
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
167
|
+
|
|
168
|
+
packageEntry.check(context, {
|
|
169
|
+
entries: {
|
|
170
|
+
repository: {
|
|
171
|
+
type: "git",
|
|
172
|
+
url: "https://github.com:foo/foo",
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
entriesExist: ["bugs"],
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
179
|
+
|
|
180
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
181
|
+
expect(failure).toMatchObject(
|
|
182
|
+
workspace.failureMatcher({
|
|
183
|
+
file: "package.json",
|
|
184
|
+
hasFixer: true,
|
|
185
|
+
message: createStandardizedEntryErrorMessage("repository"),
|
|
186
|
+
})
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const failure2: Failure = spy.mock.calls[1][0];
|
|
190
|
+
expect(failure2).toMatchObject(
|
|
191
|
+
workspace.failureMatcher({
|
|
192
|
+
file: "package.json",
|
|
193
|
+
hasFixer: false,
|
|
194
|
+
message: createExpectedEntryErrorMessage("bugs"),
|
|
195
|
+
})
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
|
|
131
199
|
});
|
|
132
200
|
});
|
|
133
201
|
});
|
|
@@ -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,26 +82,24 @@ 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
104
|
packageOrder.check(context, {
|
|
110
105
|
order: orderArray,
|
|
@@ -113,15 +108,19 @@ describe("expectPackageOrder", () => {
|
|
|
113
108
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
114
109
|
|
|
115
110
|
const failure: Failure = spy.mock.calls[0][0];
|
|
116
|
-
expect(failure
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
111
|
+
expect(failure).toMatchObject(
|
|
112
|
+
workspace.failureMatcher({
|
|
113
|
+
file: "package.json",
|
|
114
|
+
hasFixer: true,
|
|
115
|
+
message: "Incorrect order of fields in package.json",
|
|
116
|
+
})
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED);
|
|
121
120
|
});
|
|
122
121
|
|
|
123
122
|
it("fixes order for unexpected keys", () => {
|
|
124
|
-
|
|
123
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
|
|
125
124
|
|
|
126
125
|
packageOrder.check(context, {
|
|
127
126
|
order: orderArray,
|
|
@@ -130,15 +129,19 @@ describe("expectPackageOrder", () => {
|
|
|
130
129
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
131
130
|
|
|
132
131
|
const failure: Failure = spy.mock.calls[0][0];
|
|
133
|
-
expect(failure
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
expect(failure).toMatchObject(
|
|
133
|
+
workspace.failureMatcher({
|
|
134
|
+
file: "package.json",
|
|
135
|
+
hasFixer: true,
|
|
136
|
+
message: "Incorrect order of fields in package.json",
|
|
137
|
+
})
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
138
141
|
});
|
|
139
142
|
|
|
140
143
|
it("fixes order using function", () => {
|
|
141
|
-
|
|
144
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED);
|
|
142
145
|
|
|
143
146
|
packageOrder.check(context, {
|
|
144
147
|
order: orderFunction,
|
|
@@ -147,15 +150,19 @@ describe("expectPackageOrder", () => {
|
|
|
147
150
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
148
151
|
|
|
149
152
|
const failure: Failure = spy.mock.calls[0][0];
|
|
150
|
-
expect(failure
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
expect(failure).toMatchObject(
|
|
154
|
+
workspace.failureMatcher({
|
|
155
|
+
file: "package.json",
|
|
156
|
+
hasFixer: true,
|
|
157
|
+
message: "Incorrect order of fields in package.json",
|
|
158
|
+
})
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_BY_LENGTH);
|
|
155
162
|
});
|
|
156
163
|
|
|
157
164
|
it("does nothing if already order", () => {
|
|
158
|
-
|
|
165
|
+
workspace.writeFile("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
159
166
|
|
|
160
167
|
packageOrder.check(context, {
|
|
161
168
|
order: orderArray,
|
|
@@ -163,7 +170,7 @@ describe("expectPackageOrder", () => {
|
|
|
163
170
|
|
|
164
171
|
expect(spy).not.toHaveBeenCalled();
|
|
165
172
|
|
|
166
|
-
expect(
|
|
173
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
167
174
|
});
|
|
168
175
|
});
|
|
169
176
|
});
|