@monorepolint/rules 0.5.0-alpha.1 → 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/build/types/__tests__/consistentDependencies.spec.d.ts +2 -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 +8 -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 -18
- package/src/__tests__/alphabeticalScripts.spec.ts +76 -0
- package/src/__tests__/bannedDependencies.spec.ts +191 -0
- package/src/__tests__/consistentDependencies.spec.ts +142 -0
- 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 +201 -0
- package/src/__tests__/packageOrder.spec.ts +48 -40
- package/src/__tests__/packageScript.spec.ts +149 -65
- 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 -23
- package/src/packageOrder.ts +15 -10
- package/src/packageScript.ts +60 -13
- package/src/requireDependency.ts +71 -0
- package/src/standardTsconfig.ts +50 -21
- 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__/packageOrder.spec.d.ts.map +0 -1
- package/lib/__tests__/packageOrder.spec.js +0 -114
- 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 -108
- 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 -38
- 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 -102
- package/lib/packageOrder.js.map +0 -1
- package/lib/packageScript.d.ts +0 -17
- package/lib/packageScript.d.ts.map +0 -1
- package/lib/packageScript.js +0 -51
- package/lib/packageScript.js.map +0 -1
- package/lib/standardTsconfig.d.ts +0 -29
- package/lib/standardTsconfig.d.ts.map +0 -1
- package/lib/standardTsconfig.js +0 -96
- package/lib/standardTsconfig.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -2181
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,201 @@
|
|
|
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
|
+
|
|
8
|
+
// tslint:disable:no-console
|
|
9
|
+
|
|
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";
|
|
14
|
+
|
|
15
|
+
const PACKAGE_MISSING_ENTRY =
|
|
16
|
+
JSON.stringify(
|
|
17
|
+
{
|
|
18
|
+
name: "package",
|
|
19
|
+
version: {},
|
|
20
|
+
scripts: {},
|
|
21
|
+
dependencies: {},
|
|
22
|
+
},
|
|
23
|
+
undefined,
|
|
24
|
+
2
|
|
25
|
+
) + "\n";
|
|
26
|
+
|
|
27
|
+
const PACKAGE_LICENSE =
|
|
28
|
+
JSON.stringify(
|
|
29
|
+
{
|
|
30
|
+
name: "package",
|
|
31
|
+
version: {},
|
|
32
|
+
scripts: {},
|
|
33
|
+
dependencies: {},
|
|
34
|
+
license: "UNLICENSED",
|
|
35
|
+
},
|
|
36
|
+
undefined,
|
|
37
|
+
2
|
|
38
|
+
) + "\n";
|
|
39
|
+
|
|
40
|
+
const PACKAGE_REPOSITORY =
|
|
41
|
+
JSON.stringify(
|
|
42
|
+
{
|
|
43
|
+
name: "package",
|
|
44
|
+
version: {},
|
|
45
|
+
scripts: {},
|
|
46
|
+
dependencies: {},
|
|
47
|
+
repository: {
|
|
48
|
+
type: "git",
|
|
49
|
+
url: "https://github.com:foo/foo",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
undefined,
|
|
53
|
+
2
|
|
54
|
+
) + "\n";
|
|
55
|
+
|
|
56
|
+
describe.each(HOST_FACTORIES)("expectPackageEntries ($name)", (hostFactory) => {
|
|
57
|
+
describe("fix: true", () => {
|
|
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");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
afterEach(() => {
|
|
73
|
+
spy.mockClear();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("fixes missing entries", () => {
|
|
77
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
78
|
+
|
|
79
|
+
packageEntry.check(context, {
|
|
80
|
+
entries: {
|
|
81
|
+
license: "UNLICENSED",
|
|
82
|
+
},
|
|
83
|
+
entriesExist: undefined,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
87
|
+
|
|
88
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
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);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("fixes missing nested entries", () => {
|
|
101
|
+
workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
|
|
102
|
+
|
|
103
|
+
packageEntry.check(context, {
|
|
104
|
+
entries: {
|
|
105
|
+
repository: {
|
|
106
|
+
type: "git",
|
|
107
|
+
url: "https://github.com:foo/foo",
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
entriesExist: undefined,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
114
|
+
|
|
115
|
+
const failure: Failure = spy.mock.calls[0][0];
|
|
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);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("doesn't error for nested entries that are defined", () => {
|
|
128
|
+
workspace.writeFile("package.json", PACKAGE_REPOSITORY);
|
|
129
|
+
|
|
130
|
+
packageEntry.check(context, {
|
|
131
|
+
entries: {
|
|
132
|
+
repository: {
|
|
133
|
+
type: "git",
|
|
134
|
+
url: "https://github.com:foo/foo",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
entriesExist: undefined,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(spy).toHaveBeenCalledTimes(0);
|
|
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);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
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,25 +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
|
-
|
|
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
|
|
100
97
|
|
|
101
|
-
|
|
102
|
-
spy.mockClear();
|
|
98
|
+
spy = jest.spyOn(workspace.context, "addError");
|
|
103
99
|
});
|
|
104
100
|
|
|
105
101
|
it("fixes order for expected keys", () => {
|
|
106
|
-
|
|
102
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED);
|
|
107
103
|
|
|
108
104
|
packageOrder.check(context, {
|
|
109
105
|
order: orderArray,
|
|
@@ -112,15 +108,19 @@ describe("expectPackageOrder", () => {
|
|
|
112
108
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
113
109
|
|
|
114
110
|
const failure: Failure = spy.mock.calls[0][0];
|
|
115
|
-
expect(failure
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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);
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
it("fixes order for unexpected keys", () => {
|
|
123
|
-
|
|
123
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
|
|
124
124
|
|
|
125
125
|
packageOrder.check(context, {
|
|
126
126
|
order: orderArray,
|
|
@@ -129,15 +129,19 @@ describe("expectPackageOrder", () => {
|
|
|
129
129
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
130
130
|
|
|
131
131
|
const failure: Failure = spy.mock.calls[0][0];
|
|
132
|
-
expect(failure
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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);
|
|
137
141
|
});
|
|
138
142
|
|
|
139
143
|
it("fixes order using function", () => {
|
|
140
|
-
|
|
144
|
+
workspace.writeFile("package.json", PACKAGE_UNORDERED);
|
|
141
145
|
|
|
142
146
|
packageOrder.check(context, {
|
|
143
147
|
order: orderFunction,
|
|
@@ -146,15 +150,19 @@ describe("expectPackageOrder", () => {
|
|
|
146
150
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
147
151
|
|
|
148
152
|
const failure: Failure = spy.mock.calls[0][0];
|
|
149
|
-
expect(failure
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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);
|
|
154
162
|
});
|
|
155
163
|
|
|
156
164
|
it("does nothing if already order", () => {
|
|
157
|
-
|
|
165
|
+
workspace.writeFile("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
158
166
|
|
|
159
167
|
packageOrder.check(context, {
|
|
160
168
|
order: orderArray,
|
|
@@ -162,7 +170,7 @@ describe("expectPackageOrder", () => {
|
|
|
162
170
|
|
|
163
171
|
expect(spy).not.toHaveBeenCalled();
|
|
164
172
|
|
|
165
|
-
expect(
|
|
173
|
+
expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
|
|
166
174
|
});
|
|
167
175
|
});
|
|
168
176
|
});
|