@monorepolint/rules 0.5.0-alpha.12 → 0.5.0-alpha.125

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