@monorepolint/rules 0.5.0-alpha.7 → 0.5.0-alpha.70

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 (131) hide show
  1. package/lib/__tests__/alphabeticalScripts.spec.d.ts +8 -0
  2. package/lib/__tests__/alphabeticalScripts.spec.d.ts.map +1 -0
  3. package/lib/__tests__/alphabeticalScripts.spec.js +63 -0
  4. package/lib/__tests__/alphabeticalScripts.spec.js.map +1 -0
  5. package/lib/__tests__/bannedDependencies.spec.d.ts +2 -0
  6. package/lib/__tests__/bannedDependencies.spec.d.ts.map +1 -0
  7. package/lib/__tests__/bannedDependencies.spec.js +103 -0
  8. package/lib/__tests__/bannedDependencies.spec.js.map +1 -0
  9. package/lib/__tests__/consistentDependencies.spec.js +26 -11
  10. package/lib/__tests__/consistentDependencies.spec.js.map +1 -1
  11. package/lib/__tests__/consistentVersions.spec.d.ts +8 -0
  12. package/lib/__tests__/consistentVersions.spec.d.ts.map +1 -0
  13. package/lib/__tests__/consistentVersions.spec.js +182 -0
  14. package/lib/__tests__/consistentVersions.spec.js.map +1 -0
  15. package/lib/__tests__/fileContents.spec.d.ts +8 -0
  16. package/lib/__tests__/fileContents.spec.d.ts.map +1 -0
  17. package/lib/__tests__/fileContents.spec.js +66 -0
  18. package/lib/__tests__/fileContents.spec.js.map +1 -0
  19. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts +8 -0
  20. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +1 -0
  21. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js +1062 -0
  22. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js.map +1 -0
  23. package/lib/__tests__/nestedWorkspaces.spec.d.ts +2 -0
  24. package/lib/__tests__/nestedWorkspaces.spec.d.ts.map +1 -0
  25. package/lib/__tests__/nestedWorkspaces.spec.js +122 -0
  26. package/lib/__tests__/nestedWorkspaces.spec.js.map +1 -0
  27. package/lib/__tests__/packageEntry.spec.d.ts +8 -0
  28. package/lib/__tests__/packageEntry.spec.d.ts.map +1 -0
  29. package/lib/__tests__/packageEntry.spec.js +137 -0
  30. package/lib/__tests__/packageEntry.spec.js.map +1 -0
  31. package/lib/__tests__/requireDependency.spec.d.ts +2 -0
  32. package/lib/__tests__/requireDependency.spec.d.ts.map +1 -0
  33. package/lib/__tests__/requireDependency.spec.js +122 -0
  34. package/lib/__tests__/requireDependency.spec.js.map +1 -0
  35. package/lib/__tests__/utils.d.ts +1 -0
  36. package/lib/__tests__/utils.d.ts.map +1 -1
  37. package/lib/__tests__/utils.js +11 -0
  38. package/lib/__tests__/utils.js.map +1 -1
  39. package/lib/alphabeticalDependencies.d.ts +3 -1
  40. package/lib/alphabeticalDependencies.d.ts.map +1 -1
  41. package/lib/alphabeticalDependencies.js +5 -39
  42. package/lib/alphabeticalDependencies.js.map +1 -1
  43. package/lib/alphabeticalScripts.d.ts +12 -0
  44. package/lib/alphabeticalScripts.d.ts.map +1 -0
  45. package/lib/alphabeticalScripts.js +20 -0
  46. package/lib/alphabeticalScripts.js.map +1 -0
  47. package/lib/bannedDependencies.d.ts +12 -3
  48. package/lib/bannedDependencies.d.ts.map +1 -1
  49. package/lib/bannedDependencies.js +59 -14
  50. package/lib/bannedDependencies.js.map +1 -1
  51. package/lib/consistentDependencies.d.ts +8 -1
  52. package/lib/consistentDependencies.d.ts.map +1 -1
  53. package/lib/consistentDependencies.js +28 -9
  54. package/lib/consistentDependencies.js.map +1 -1
  55. package/lib/consistentVersions.d.ts +14 -0
  56. package/lib/consistentVersions.d.ts.map +1 -0
  57. package/lib/consistentVersions.js +94 -0
  58. package/lib/consistentVersions.js.map +1 -0
  59. package/lib/fileContents.d.ts.map +1 -1
  60. package/lib/fileContents.js +6 -2
  61. package/lib/fileContents.js.map +1 -1
  62. package/lib/index.d.ts +5 -0
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +18 -8
  65. package/lib/index.js.map +1 -1
  66. package/lib/mustSatisfyPeerDependencies.d.ts +240 -0
  67. package/lib/mustSatisfyPeerDependencies.d.ts.map +1 -0
  68. package/lib/mustSatisfyPeerDependencies.js +634 -0
  69. package/lib/mustSatisfyPeerDependencies.js.map +1 -0
  70. package/lib/nestedWorkspaces.d.ts +13 -0
  71. package/lib/nestedWorkspaces.d.ts.map +1 -0
  72. package/lib/nestedWorkspaces.js +50 -0
  73. package/lib/nestedWorkspaces.js.map +1 -0
  74. package/lib/packageEntry.d.ts +22 -4
  75. package/lib/packageEntry.d.ts.map +1 -1
  76. package/lib/packageEntry.js +45 -16
  77. package/lib/packageEntry.js.map +1 -1
  78. package/lib/packageOrder.d.ts.map +1 -1
  79. package/lib/packageOrder.js +6 -4
  80. package/lib/packageOrder.js.map +1 -1
  81. package/lib/packageScript.js +4 -3
  82. package/lib/packageScript.js.map +1 -1
  83. package/lib/requireDependency.d.ts +15 -0
  84. package/lib/requireDependency.d.ts.map +1 -0
  85. package/lib/requireDependency.js +65 -0
  86. package/lib/requireDependency.js.map +1 -0
  87. package/lib/standardTsconfig.d.ts +12 -0
  88. package/lib/standardTsconfig.d.ts.map +1 -1
  89. package/lib/standardTsconfig.js +17 -7
  90. package/lib/standardTsconfig.js.map +1 -1
  91. package/lib/util/checkAlpha.d.ts +9 -0
  92. package/lib/util/checkAlpha.d.ts.map +1 -0
  93. package/lib/util/checkAlpha.js +48 -0
  94. package/lib/util/checkAlpha.js.map +1 -0
  95. package/lib/util/makeDirectory.d.ts +8 -0
  96. package/lib/util/makeDirectory.d.ts.map +1 -0
  97. package/lib/util/makeDirectory.js +28 -0
  98. package/lib/util/makeDirectory.js.map +1 -0
  99. package/lib/util/packageDependencyGraphService.d.ts +37 -0
  100. package/lib/util/packageDependencyGraphService.d.ts.map +1 -0
  101. package/lib/util/packageDependencyGraphService.js +70 -0
  102. package/lib/util/packageDependencyGraphService.js.map +1 -0
  103. package/package.json +17 -13
  104. package/src/__tests__/alphabeticalScripts.spec.ts +76 -0
  105. package/src/__tests__/bannedDependencies.spec.ts +117 -0
  106. package/src/__tests__/consistentDependencies.spec.ts +29 -10
  107. package/src/__tests__/consistentVersions.spec.ts +218 -0
  108. package/src/__tests__/fileContents.spec.ts +82 -0
  109. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1183 -0
  110. package/src/__tests__/nestedWorkspaces.spec.ts +146 -0
  111. package/src/__tests__/packageEntry.spec.ts +181 -0
  112. package/src/__tests__/requireDependency.spec.ts +146 -0
  113. package/src/__tests__/utils.ts +12 -0
  114. package/src/alphabeticalDependencies.ts +3 -47
  115. package/src/alphabeticalScripts.ts +19 -0
  116. package/src/bannedDependencies.ts +74 -16
  117. package/src/consistentDependencies.ts +33 -10
  118. package/src/consistentVersions.ts +140 -0
  119. package/src/fileContents.ts +5 -3
  120. package/src/index.ts +5 -0
  121. package/src/mustSatisfyPeerDependencies.ts +735 -0
  122. package/src/nestedWorkspaces.ts +59 -0
  123. package/src/packageEntry.ts +56 -17
  124. package/src/packageOrder.ts +5 -4
  125. package/src/packageScript.ts +3 -3
  126. package/src/requireDependency.ts +69 -0
  127. package/src/standardTsconfig.ts +19 -7
  128. package/src/util/checkAlpha.ts +56 -0
  129. package/src/util/makeDirectory.ts +24 -0
  130. package/src/util/packageDependencyGraphService.ts +111 -0
  131. package/tsconfig.tsbuildinfo +5399 -1591
@@ -0,0 +1,218 @@
1
+ /*!
2
+ * Copyright 2020 Palantir Technologies, Inc.
3
+ *
4
+ * Licensed under the MIT license. See LICENSE file in the project root for details.
5
+ *
6
+ */
7
+
8
+ import { WorkspaceContext } from "@monorepolint/core";
9
+ import { PackageJson, readJson, writeJson } from "@monorepolint/utils";
10
+ import * as path from "path";
11
+ import * as tmp from "tmp";
12
+ import { consistentVersions, Options } from "../consistentVersions";
13
+ import { makeDirectoryRecursively } from "../util/makeDirectory";
14
+
15
+ describe("consistentVersions", () => {
16
+ tmp.setGracefulCleanup();
17
+
18
+ let cleanupJobs: Array<() => void> = [];
19
+ let cwd: string | undefined;
20
+
21
+ beforeEach(() => {
22
+ const dir = tmp.dirSync({ unsafeCleanup: true });
23
+ cleanupJobs.push(() => dir.removeCallback());
24
+ cwd = dir.name;
25
+
26
+ const spy = jest.spyOn(process, "cwd");
27
+ spy.mockReturnValue(cwd);
28
+ });
29
+
30
+ afterEach(() => {
31
+ for (const cleanupJob of cleanupJobs) {
32
+ cleanupJob();
33
+ }
34
+ cleanupJobs = [];
35
+ });
36
+
37
+ function makeWorkspace(fix = false) {
38
+ const workspaceContext = new WorkspaceContext(cwd!, {
39
+ rules: [],
40
+ fix,
41
+ verbose: false,
42
+ silent: true,
43
+ });
44
+ const addErrorSpy = jest.spyOn(workspaceContext, "addError");
45
+
46
+ function check(options: Options = { matchDependencyVersions: {} }) {
47
+ consistentVersions.check(workspaceContext, options);
48
+ }
49
+
50
+ return { addErrorSpy, check };
51
+ }
52
+
53
+ function addPackageJson(filePath: string, packageJson: PackageJson) {
54
+ const dirPath = path.resolve(cwd!, path.dirname(filePath));
55
+ const resolvedFilePath = path.resolve(cwd!, filePath);
56
+
57
+ makeDirectoryRecursively(dirPath);
58
+ writeJson(resolvedFilePath, packageJson);
59
+ return (): PackageJson => {
60
+ return readJson(resolvedFilePath);
61
+ };
62
+ }
63
+
64
+ describe("standard tests", () => {
65
+ let testPackageJson: PackageJson;
66
+
67
+ beforeEach(() => {
68
+ testPackageJson = {
69
+ name: "test",
70
+ dependencies: {
71
+ greatLib: "^15",
72
+ both: "1",
73
+ },
74
+ peerDependencies: {
75
+ whatever: "15",
76
+ },
77
+ devDependencies: {
78
+ else: "27.2.1",
79
+ both: "1",
80
+ },
81
+ };
82
+ });
83
+
84
+ it("Does nothing when arguments are empty", async () => {
85
+ const { addErrorSpy, check } = makeWorkspace();
86
+ addPackageJson("./package.json", testPackageJson);
87
+
88
+ check();
89
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
90
+ check({ matchDependencyVersions: {} });
91
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
92
+ });
93
+
94
+ it("Fixes packages that have an incorrect dependency version", async () => {
95
+ const { addErrorSpy, check } = makeWorkspace(true);
96
+ const readTestPackageJson = addPackageJson("./package.json", testPackageJson);
97
+
98
+ const requiredGreatLibVersion = "1.2.3";
99
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
100
+ check({
101
+ matchDependencyVersions: { both: testPackageJson.dependencies!.both, greatLib: requiredGreatLibVersion },
102
+ });
103
+ expect(addErrorSpy).toHaveBeenCalledTimes(1);
104
+ expect(readTestPackageJson().dependencies!.greatLib).toEqual(requiredGreatLibVersion);
105
+ });
106
+
107
+ it("Ignores packages that have a correct dependency version", async () => {
108
+ const { addErrorSpy, check } = makeWorkspace();
109
+ addPackageJson("./package.json", testPackageJson);
110
+
111
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
112
+ check({
113
+ matchDependencyVersions: {
114
+ both: testPackageJson.dependencies!.both,
115
+ greatLib: testPackageJson.dependencies!.greatLib,
116
+ },
117
+ });
118
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
119
+ });
120
+
121
+ it("Fixes packages that have an incorrect devDependency version", async () => {
122
+ const { addErrorSpy, check } = makeWorkspace(true);
123
+ const readTestPackageJson = addPackageJson("./package.json", testPackageJson);
124
+
125
+ const requiredElseLibVersion = "1.2.3";
126
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
127
+ check({ matchDependencyVersions: { both: testPackageJson.dependencies!.both, else: requiredElseLibVersion } });
128
+ expect(addErrorSpy).toHaveBeenCalledTimes(1);
129
+ expect(readTestPackageJson().devDependencies!.else).toEqual(requiredElseLibVersion);
130
+ });
131
+
132
+ it("Ignores packages that have a correct devDependency version", async () => {
133
+ const { addErrorSpy, check } = makeWorkspace();
134
+ addPackageJson("./package.json", testPackageJson);
135
+
136
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
137
+ check({
138
+ matchDependencyVersions: {
139
+ both: testPackageJson.dependencies!.both,
140
+ greatLib: testPackageJson.dependencies!.greatLib,
141
+ },
142
+ });
143
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
144
+ });
145
+
146
+ it("Fixes packages that have an incorrect dependency and devDependency versions", async () => {
147
+ const { addErrorSpy, check } = makeWorkspace(true);
148
+ const readTestPackageJson = addPackageJson("./package.json", testPackageJson);
149
+
150
+ const requiredBothVersion = "1.2.3";
151
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
152
+ check({ matchDependencyVersions: { both: requiredBothVersion } });
153
+ expect(addErrorSpy).toHaveBeenCalledTimes(2);
154
+ expect(readTestPackageJson().dependencies!.both).toEqual(requiredBothVersion);
155
+ expect(readTestPackageJson().devDependencies!.both).toEqual(requiredBothVersion);
156
+ });
157
+ });
158
+
159
+ describe("Multiple accepted versions tests", () => {
160
+ let testPackageJson: PackageJson;
161
+
162
+ beforeEach(() => {
163
+ testPackageJson = {
164
+ name: "test",
165
+ dependencies: {
166
+ greatLib: "^15",
167
+ both: "1",
168
+ },
169
+ peerDependencies: {
170
+ whatever: "15",
171
+ },
172
+ devDependencies: {
173
+ else: "27.2.1",
174
+ both: "1",
175
+ },
176
+ };
177
+ });
178
+
179
+ it("Accepts a match when multiple versions are configured", async () => {
180
+ const { addErrorSpy, check } = makeWorkspace();
181
+ addPackageJson("./package.json", testPackageJson);
182
+
183
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
184
+ check({ matchDependencyVersions: { greatLib: [testPackageJson.dependencies!.greatLib] } });
185
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
186
+ check({ matchDependencyVersions: { greatLib: ["1", "2", testPackageJson.dependencies!.greatLib] } });
187
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
188
+ check({ matchDependencyVersions: { greatLib: ["1", "2", testPackageJson.dependencies!.greatLib, "99", "100"] } });
189
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
190
+ check({ matchDependencyVersions: { greatLib: [testPackageJson.dependencies!.greatLib, "99", "100"] } });
191
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
192
+ });
193
+
194
+ it("Errors when version does not match", async () => {
195
+ const { addErrorSpy, check } = makeWorkspace();
196
+ addPackageJson("./package.json", testPackageJson);
197
+
198
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
199
+ check({ matchDependencyVersions: { greatLib: ["1", "2"] } });
200
+ expect(addErrorSpy).toHaveBeenCalledTimes(1);
201
+ addErrorSpy.mockReset();
202
+
203
+ expect(addErrorSpy).toHaveBeenCalledTimes(0);
204
+ check({ matchDependencyVersions: { both: ["99", "100"] } });
205
+ expect(addErrorSpy).toHaveBeenCalledTimes(2);
206
+ expect(addErrorSpy.mock.calls[0][0].message).toEqual(
207
+ `Expected dependency on both to match one of '["99","100"]', got '${
208
+ testPackageJson.dependencies!.both
209
+ }' instead.`
210
+ );
211
+ expect(addErrorSpy.mock.calls[1][0].message).toEqual(
212
+ `Expected devDependency on both to match one of '["99","100"]', got '${
213
+ testPackageJson.devDependencies!.both
214
+ }' instead.`
215
+ );
216
+ });
217
+ });
218
+ });
@@ -0,0 +1,82 @@
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
+ import { createMockFiles } from "./utils";
10
+
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 * as path from "path";
16
+ import { fileContents } from "../fileContents";
17
+
18
+ const EXPECTED_FOO_FILE = "hello world";
19
+
20
+ describe("fileContents", () => {
21
+ afterEach(() => {
22
+ mockFiles.clear();
23
+ });
24
+
25
+ describe("fix: true", () => {
26
+ const context = new PackageContext(".", {
27
+ rules: [],
28
+ fix: true,
29
+ verbose: false,
30
+ silent: true,
31
+ });
32
+ const spy = jest.spyOn(context, "addError");
33
+
34
+ afterEach(() => {
35
+ spy.mockClear();
36
+ });
37
+
38
+ it("fixes missing file", () => {
39
+ mockFiles.set(path.resolve(context.getWorkspaceContext().packageDir, "foo-template.txt"), EXPECTED_FOO_FILE);
40
+
41
+ fileContents.check(context, {
42
+ file: "foo.txt",
43
+ templateFile: "foo-template.txt",
44
+ generator: undefined,
45
+ template: undefined,
46
+ });
47
+
48
+ expect(spy).toHaveBeenCalledTimes(1);
49
+
50
+ const failure: Failure = spy.mock.calls[0][0];
51
+ expect(failure.file).toBe("foo.txt");
52
+ expect(failure.fixer).not.toBeUndefined();
53
+ expect(failure.message).toBe("Expect file contents to match");
54
+
55
+ expect(mockFiles.get("foo.txt")).toEqual(EXPECTED_FOO_FILE);
56
+ });
57
+
58
+ it("fixes missing nested file", () => {
59
+ mockFiles.set(
60
+ path.resolve(context.getWorkspaceContext().packageDir, "shared/foo-template.txt"),
61
+ EXPECTED_FOO_FILE
62
+ );
63
+
64
+ fileContents.check(context, {
65
+ file: "nested/foo.txt",
66
+ templateFile: "shared/foo-template.txt",
67
+ generator: undefined,
68
+ template: undefined,
69
+ });
70
+
71
+ expect(spy).toHaveBeenCalledTimes(1);
72
+
73
+ const failure: Failure = spy.mock.calls[0][0];
74
+ expect(failure.file).toBe("nested/foo.txt");
75
+ expect(failure.fixer).not.toBeUndefined();
76
+ expect(failure.message).toBe("Expect file contents to match");
77
+
78
+ expect(mockFiles.get("nested")).not.toBeUndefined();
79
+ expect(mockFiles.get("nested/foo.txt")).toEqual(EXPECTED_FOO_FILE);
80
+ });
81
+ });
82
+ });