@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.
Files changed (155) hide show
  1. package/.turbo/turbo-clean.log +4 -0
  2. package/.turbo/turbo-compile-typescript.log +4 -0
  3. package/.turbo/turbo-lint.log +107 -0
  4. package/.turbo/turbo-test.log +631 -0
  5. package/.turbo/turbo-transpile-typescript.log +18 -0
  6. package/build/js/index.cjs +1491 -0
  7. package/build/js/index.cjs.map +1 -0
  8. package/build/js/index.js +1433 -0
  9. package/build/js/index.js.map +1 -0
  10. package/build/tsconfig.tsbuildinfo +1 -0
  11. package/{lib/__tests__/utils.d.ts → build/types/__tests__/alphabeticalScripts.spec.d.ts} +2 -2
  12. package/build/types/__tests__/alphabeticalScripts.spec.d.ts.map +1 -0
  13. package/build/types/__tests__/bannedDependencies.spec.d.ts +2 -0
  14. package/build/types/__tests__/bannedDependencies.spec.d.ts.map +1 -0
  15. package/{lib → build/types}/__tests__/consistentDependencies.spec.d.ts +0 -0
  16. package/build/types/__tests__/consistentDependencies.spec.d.ts.map +1 -0
  17. package/build/types/__tests__/consistentVersions.spec.d.ts +8 -0
  18. package/build/types/__tests__/consistentVersions.spec.d.ts.map +1 -0
  19. package/build/types/__tests__/fileContents.spec.d.ts +8 -0
  20. package/build/types/__tests__/fileContents.spec.d.ts.map +1 -0
  21. package/build/types/__tests__/mustSatisfyPeerDependencies.spec.d.ts +8 -0
  22. package/build/types/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +1 -0
  23. package/build/types/__tests__/nestedWorkspaces.spec.d.ts +2 -0
  24. package/build/types/__tests__/nestedWorkspaces.spec.d.ts.map +1 -0
  25. package/{lib → build/types}/__tests__/packageEntry.spec.d.ts +0 -0
  26. package/build/types/__tests__/packageEntry.spec.d.ts.map +1 -0
  27. package/{lib → build/types}/__tests__/packageOrder.spec.d.ts +0 -0
  28. package/build/types/__tests__/packageOrder.spec.d.ts.map +1 -0
  29. package/{lib → build/types}/__tests__/packageScript.spec.d.ts +0 -0
  30. package/build/types/__tests__/packageScript.spec.d.ts.map +1 -0
  31. package/build/types/__tests__/requireDependency.spec.d.ts +2 -0
  32. package/build/types/__tests__/requireDependency.spec.d.ts.map +1 -0
  33. package/build/types/__tests__/utils.d.ts +81 -0
  34. package/build/types/__tests__/utils.d.ts.map +1 -0
  35. package/build/types/alphabeticalDependencies.d.ts +23 -0
  36. package/build/types/alphabeticalDependencies.d.ts.map +1 -0
  37. package/build/types/alphabeticalScripts.d.ts +23 -0
  38. package/build/types/alphabeticalScripts.d.ts.map +1 -0
  39. package/build/types/bannedDependencies.d.ts +134 -0
  40. package/build/types/bannedDependencies.d.ts.map +1 -0
  41. package/build/types/consistentDependencies.d.ts +38 -0
  42. package/build/types/consistentDependencies.d.ts.map +1 -0
  43. package/build/types/consistentVersions.d.ts +47 -0
  44. package/build/types/consistentVersions.d.ts.map +1 -0
  45. package/build/types/fileContents.d.ts +111 -0
  46. package/build/types/fileContents.d.ts.map +1 -0
  47. package/build/types/index.d.ts +20 -0
  48. package/build/types/index.d.ts.map +1 -0
  49. package/build/types/mustSatisfyPeerDependencies.d.ts +721 -0
  50. package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -0
  51. package/build/types/nestedWorkspaces.d.ts +24 -0
  52. package/build/types/nestedWorkspaces.d.ts.map +1 -0
  53. package/build/types/packageEntry.d.ts +115 -0
  54. package/build/types/packageEntry.d.ts.map +1 -0
  55. package/build/types/packageOrder.d.ts +33 -0
  56. package/build/types/packageOrder.d.ts.map +1 -0
  57. package/build/types/packageScript.d.ts +89 -0
  58. package/build/types/packageScript.d.ts.map +1 -0
  59. package/build/types/requireDependency.d.ts +99 -0
  60. package/build/types/requireDependency.d.ts.map +1 -0
  61. package/build/types/standardTsconfig.d.ts +113 -0
  62. package/build/types/standardTsconfig.d.ts.map +1 -0
  63. package/build/types/util/checkAlpha.d.ts +10 -0
  64. package/build/types/util/checkAlpha.d.ts.map +1 -0
  65. package/build/types/util/createNewRuleConversion.d.ts +30 -0
  66. package/build/types/util/createNewRuleConversion.d.ts.map +1 -0
  67. package/build/types/util/makeDirectory.d.ts +8 -0
  68. package/build/types/util/makeDirectory.d.ts.map +1 -0
  69. package/build/types/util/packageDependencyGraphService.d.ts +37 -0
  70. package/build/types/util/packageDependencyGraphService.d.ts.map +1 -0
  71. package/{jest.config.js → jest.config.cjs} +0 -0
  72. package/package.json +39 -20
  73. package/src/__tests__/alphabeticalScripts.spec.ts +76 -0
  74. package/src/__tests__/bannedDependencies.spec.ts +191 -0
  75. package/src/__tests__/consistentDependencies.spec.ts +41 -27
  76. package/src/__tests__/consistentVersions.spec.ts +224 -0
  77. package/src/__tests__/fileContents.spec.ts +75 -0
  78. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1189 -0
  79. package/src/__tests__/nestedWorkspaces.spec.ts +153 -0
  80. package/src/__tests__/packageEntry.spec.ts +99 -31
  81. package/src/__tests__/packageOrder.spec.ts +48 -41
  82. package/src/__tests__/packageScript.spec.ts +66 -56
  83. package/src/__tests__/requireDependency.spec.ts +152 -0
  84. package/src/__tests__/utils.ts +115 -11
  85. package/src/alphabeticalDependencies.ts +6 -48
  86. package/src/alphabeticalScripts.ts +21 -0
  87. package/src/bannedDependencies.ts +135 -44
  88. package/src/consistentDependencies.ts +38 -14
  89. package/src/consistentVersions.ts +142 -0
  90. package/src/fileContents.ts +35 -30
  91. package/src/index.ts +13 -8
  92. package/src/mustSatisfyPeerDependencies.ts +748 -0
  93. package/src/nestedWorkspaces.ts +61 -0
  94. package/src/packageEntry.ts +72 -27
  95. package/src/packageOrder.ts +13 -9
  96. package/src/packageScript.ts +13 -15
  97. package/src/requireDependency.ts +71 -0
  98. package/src/standardTsconfig.ts +49 -24
  99. package/src/util/checkAlpha.ts +59 -0
  100. package/src/util/createNewRuleConversion.ts +38 -0
  101. package/src/util/makeDirectory.ts +24 -0
  102. package/src/util/packageDependencyGraphService.ts +114 -0
  103. package/tsconfig.json +10 -2
  104. package/lib/__tests__/consistentDependencies.spec.d.ts.map +0 -1
  105. package/lib/__tests__/consistentDependencies.spec.js +0 -108
  106. package/lib/__tests__/consistentDependencies.spec.js.map +0 -1
  107. package/lib/__tests__/packageEntry.spec.d.ts.map +0 -1
  108. package/lib/__tests__/packageEntry.spec.js +0 -99
  109. package/lib/__tests__/packageEntry.spec.js.map +0 -1
  110. package/lib/__tests__/packageOrder.spec.d.ts.map +0 -1
  111. package/lib/__tests__/packageOrder.spec.js +0 -115
  112. package/lib/__tests__/packageOrder.spec.js.map +0 -1
  113. package/lib/__tests__/packageScript.spec.d.ts.map +0 -1
  114. package/lib/__tests__/packageScript.spec.js +0 -172
  115. package/lib/__tests__/packageScript.spec.js.map +0 -1
  116. package/lib/__tests__/utils.d.ts.map +0 -1
  117. package/lib/__tests__/utils.js +0 -23
  118. package/lib/__tests__/utils.js.map +0 -1
  119. package/lib/alphabeticalDependencies.d.ts +0 -10
  120. package/lib/alphabeticalDependencies.d.ts.map +0 -1
  121. package/lib/alphabeticalDependencies.js +0 -56
  122. package/lib/alphabeticalDependencies.js.map +0 -1
  123. package/lib/bannedDependencies.d.ts +0 -15
  124. package/lib/bannedDependencies.d.ts.map +0 -1
  125. package/lib/bannedDependencies.js +0 -57
  126. package/lib/bannedDependencies.js.map +0 -1
  127. package/lib/consistentDependencies.d.ts +0 -10
  128. package/lib/consistentDependencies.d.ts.map +0 -1
  129. package/lib/consistentDependencies.js +0 -57
  130. package/lib/consistentDependencies.js.map +0 -1
  131. package/lib/fileContents.d.ts +0 -25
  132. package/lib/fileContents.d.ts.map +0 -1
  133. package/lib/fileContents.js +0 -77
  134. package/lib/fileContents.js.map +0 -1
  135. package/lib/index.d.ts +0 -15
  136. package/lib/index.d.ts.map +0 -1
  137. package/lib/index.js +0 -25
  138. package/lib/index.js.map +0 -1
  139. package/lib/packageEntry.d.ts +0 -16
  140. package/lib/packageEntry.d.ts.map +0 -1
  141. package/lib/packageEntry.js +0 -40
  142. package/lib/packageEntry.js.map +0 -1
  143. package/lib/packageOrder.d.ts +0 -12
  144. package/lib/packageOrder.d.ts.map +0 -1
  145. package/lib/packageOrder.js +0 -103
  146. package/lib/packageOrder.js.map +0 -1
  147. package/lib/packageScript.d.ts +0 -25
  148. package/lib/packageScript.d.ts.map +0 -1
  149. package/lib/packageScript.js +0 -89
  150. package/lib/packageScript.js.map +0 -1
  151. package/lib/standardTsconfig.d.ts +0 -33
  152. package/lib/standardTsconfig.d.ts.map +0 -1
  153. package/lib/standardTsconfig.js +0 -98
  154. package/lib/standardTsconfig.js.map +0 -1
  155. 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
- // done first since this also mocks 'fs'
12
- const mockFiles: Map<string, string> = createMockFiles();
13
-
14
- import { Failure, PackageContext } from "@monorepolint/core";
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
- const context = new PackageContext(".", {
65
- rules: [],
66
- fix: true,
67
- verbose: false,
68
- silent: 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");
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
- mockFiles.set("package.json", PACKAGE_MISSING_ENTRY);
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.file).toBe("package.json");
89
- expect(failure.fixer).not.toBeUndefined();
90
- expect(failure.message).toBe("Expected standardized entry for 'license'");
91
-
92
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_LICENSE);
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
- mockFiles.set("package.json", PACKAGE_MISSING_ENTRY);
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.file).toBe("package.json");
111
- expect(failure.fixer).not.toBeUndefined();
112
- expect(failure.message).toBe("Expected standardized entry for 'repository'");
113
-
114
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_REPOSITORY);
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
- mockFiles.set("package.json", PACKAGE_REPOSITORY);
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(mockFiles.get("package.json")).toEqual(PACKAGE_REPOSITORY);
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 { createMockFiles } from "./utils";
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";
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
- const context = new PackageContext(".", {
95
- rules: [],
96
- fix: true,
97
- verbose: false,
98
- silent: true,
99
- });
100
- const spy = jest.spyOn(context, "addError");
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
- afterEach(() => {
103
- spy.mockClear();
98
+ spy = jest.spyOn(workspace.context, "addError");
104
99
  });
105
100
 
106
101
  it("fixes order for expected keys", () => {
107
- mockFiles.set("package.json", PACKAGE_UNORDERED);
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.file).toBe("package.json");
117
- expect(failure.fixer).not.toBeUndefined();
118
- expect(failure.message).toBe("Incorrect order of fields in package.json");
119
-
120
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED);
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
- mockFiles.set("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
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.file).toBe("package.json");
134
- expect(failure.fixer).not.toBeUndefined();
135
- expect(failure.message).toBe("Incorrect order of fields in package.json");
136
-
137
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
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
- mockFiles.set("package.json", PACKAGE_UNORDERED);
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.file).toBe("package.json");
151
- expect(failure.fixer).not.toBeUndefined();
152
- expect(failure.message).toBe("Incorrect order of fields in package.json");
153
-
154
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_BY_LENGTH);
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
- mockFiles.set("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
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(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
173
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
167
174
  });
168
175
  });
169
176
  });