@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.
Files changed (149) 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/build/types/__tests__/consistentDependencies.spec.d.ts +2 -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 +8 -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 -18
  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 +142 -0
  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 +201 -0
  81. package/src/__tests__/packageOrder.spec.ts +48 -40
  82. package/src/__tests__/packageScript.spec.ts +149 -65
  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 -23
  95. package/src/packageOrder.ts +15 -10
  96. package/src/packageScript.ts +60 -13
  97. package/src/requireDependency.ts +71 -0
  98. package/src/standardTsconfig.ts +50 -21
  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__/packageOrder.spec.d.ts.map +0 -1
  105. package/lib/__tests__/packageOrder.spec.js +0 -114
  106. package/lib/__tests__/packageOrder.spec.js.map +0 -1
  107. package/lib/__tests__/packageScript.spec.d.ts.map +0 -1
  108. package/lib/__tests__/packageScript.spec.js +0 -108
  109. package/lib/__tests__/packageScript.spec.js.map +0 -1
  110. package/lib/__tests__/utils.d.ts.map +0 -1
  111. package/lib/__tests__/utils.js +0 -23
  112. package/lib/__tests__/utils.js.map +0 -1
  113. package/lib/alphabeticalDependencies.d.ts +0 -10
  114. package/lib/alphabeticalDependencies.d.ts.map +0 -1
  115. package/lib/alphabeticalDependencies.js +0 -56
  116. package/lib/alphabeticalDependencies.js.map +0 -1
  117. package/lib/bannedDependencies.d.ts +0 -15
  118. package/lib/bannedDependencies.d.ts.map +0 -1
  119. package/lib/bannedDependencies.js +0 -57
  120. package/lib/bannedDependencies.js.map +0 -1
  121. package/lib/consistentDependencies.d.ts +0 -10
  122. package/lib/consistentDependencies.d.ts.map +0 -1
  123. package/lib/consistentDependencies.js +0 -57
  124. package/lib/consistentDependencies.js.map +0 -1
  125. package/lib/fileContents.d.ts +0 -25
  126. package/lib/fileContents.d.ts.map +0 -1
  127. package/lib/fileContents.js +0 -77
  128. package/lib/fileContents.js.map +0 -1
  129. package/lib/index.d.ts +0 -15
  130. package/lib/index.d.ts.map +0 -1
  131. package/lib/index.js +0 -25
  132. package/lib/index.js.map +0 -1
  133. package/lib/packageEntry.d.ts +0 -16
  134. package/lib/packageEntry.d.ts.map +0 -1
  135. package/lib/packageEntry.js +0 -38
  136. package/lib/packageEntry.js.map +0 -1
  137. package/lib/packageOrder.d.ts +0 -12
  138. package/lib/packageOrder.d.ts.map +0 -1
  139. package/lib/packageOrder.js +0 -102
  140. package/lib/packageOrder.js.map +0 -1
  141. package/lib/packageScript.d.ts +0 -17
  142. package/lib/packageScript.d.ts.map +0 -1
  143. package/lib/packageScript.js +0 -51
  144. package/lib/packageScript.js.map +0 -1
  145. package/lib/standardTsconfig.d.ts +0 -29
  146. package/lib/standardTsconfig.d.ts.map +0 -1
  147. package/lib/standardTsconfig.js +0 -96
  148. package/lib/standardTsconfig.js.map +0 -1
  149. 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 { 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,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
- const context = new PackageContext(".", {
95
- rules: [],
96
- fix: true,
97
- verbose: false,
98
- });
99
- 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
100
97
 
101
- afterEach(() => {
102
- spy.mockClear();
98
+ spy = jest.spyOn(workspace.context, "addError");
103
99
  });
104
100
 
105
101
  it("fixes order for expected keys", () => {
106
- mockFiles.set("package.json", PACKAGE_UNORDERED);
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.file).toBe("package.json");
116
- expect(failure.fixer).not.toBeUndefined();
117
- expect(failure.message).toBe("Incorrect order of fields in package.json");
118
-
119
- 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);
120
120
  });
121
121
 
122
122
  it("fixes order for unexpected keys", () => {
123
- mockFiles.set("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
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.file).toBe("package.json");
133
- expect(failure.fixer).not.toBeUndefined();
134
- expect(failure.message).toBe("Incorrect order of fields in package.json");
135
-
136
- 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);
137
141
  });
138
142
 
139
143
  it("fixes order using function", () => {
140
- mockFiles.set("package.json", PACKAGE_UNORDERED);
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.file).toBe("package.json");
150
- expect(failure.fixer).not.toBeUndefined();
151
- expect(failure.message).toBe("Incorrect order of fields in package.json");
152
-
153
- 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);
154
162
  });
155
163
 
156
164
  it("does nothing if already order", () => {
157
- mockFiles.set("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
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(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
173
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
166
174
  });
167
175
  });
168
176
  });