@monorepolint/rules 0.5.0-alpha.106 → 0.5.0-alpha.107

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.
@@ -4,79 +4,79 @@
4
4
 
5
5
  ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/monorepolint/packages/core/build/js/index.js', falling back to original file content. You can also configure Jest config option `transformIgnorePatterns` to ignore /home/runner/work/monorepolint/monorepolint/packages/core/build/js/index.js from transformation or make sure that `outDir` in your tsconfig is neither `''` or `'.'`
6
6
  ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/monorepolint/packages/utils/build/js/index.js', falling back to original file content. You can also configure Jest config option `transformIgnorePatterns` to ignore /home/runner/work/monorepolint/monorepolint/packages/utils/build/js/index.js from transformation or make sure that `outDir` in your tsconfig is neither `''` or `'.'`
7
- (node:2968) ExperimentalWarning: VM Modules is an experimental feature and might change at any time
7
+ (node:2976) ExperimentalWarning: VM Modules is an experimental feature and might change at any time
8
8
  (Use `node --trace-warnings ...` to show where the warning was created)
9
-  PASS  src/__tests__/mustSatisfyPeerDependencies.spec.ts (8.486 s)
9
+  PASS  src/__tests__/mustSatisfyPeerDependencies.spec.ts (5.645 s)
10
10
  mustSatisfyPeerDependencies
11
- ✓ Flags overloaded dependency (entry in regular dependencies and peer dependencies) (6 ms)
12
- ✓ Flags conflicting peer dependencies (7 ms)
13
- ✓ Flags unsatisfied peer dependencies (test package has regular dep) (7 ms)
14
- ✓ Flags missing peer dependencies (NO regular dependency present) (6 ms)
15
- ✓ Flags unsatisfied peer dependencies (test package has peer dep) (6 ms)
16
- ✓ Honors dependencyWhitelist (7 ms)
17
- ✓ Honors dependencyBlacklist (6 ms)
11
+ ✓ Flags overloaded dependency (entry in regular dependencies and peer dependencies) (4 ms)
12
+ ✓ Flags conflicting peer dependencies (3 ms)
13
+ ✓ Flags unsatisfied peer dependencies (test package has regular dep) (3 ms)
14
+ ✓ Flags missing peer dependencies (NO regular dependency present) (4 ms)
15
+ ✓ Flags unsatisfied peer dependencies (test package has peer dep) (3 ms)
16
+ ✓ Honors dependencyWhitelist (3 ms)
17
+ ✓ Honors dependencyBlacklist (2 ms)
18
18
  regex tests
19
- ✓ Properly matches any version range regex (23 ms)
20
- ✓ Properly matches greator or equal version range regex (23 ms)
21
- ✓ Properly matches major version range regex (12 ms)
22
- ✓ Properly matches allowed range regex (24 ms)
19
+ ✓ Properly matches any version range regex (16 ms)
20
+ ✓ Properly matches greator or equal version range regex (11 ms)
21
+ ✓ Properly matches major version range regex (6 ms)
22
+ ✓ Properly matches allowed range regex (11 ms)
23
23
  Determines dependencies satisfaction correctly
24
24
  ✓ version is version (1 ms)
25
- ✓ version satisfies a range (5 ms)
26
- ✓ higher version satisfies a range (3 ms)
27
- ✓ version satisfies a greator or equal version range (2 ms)
28
- ✓ higher version satisfies a greator or equal version range (2 ms)
29
- ✓ version satisfies 'any' range (2 ms)
30
- ✓ greator or equal version range satisfies 'any' range (1 ms)
31
- ✓ range satisfies 'any' range (3 ms)
25
+ ✓ version satisfies a range (3 ms)
26
+ ✓ higher version satisfies a range (2 ms)
27
+ ✓ version satisfies a greator or equal version range (1 ms)
28
+ ✓ higher version satisfies a greator or equal version range (1 ms)
29
+ ✓ version satisfies 'any' range (1 ms)
30
+ ✓ greator or equal version range satisfies 'any' range (2 ms)
31
+ ✓ range satisfies 'any' range (1 ms)
32
32
  ✓ union range satisfies 'any' range (1 ms)
33
- ✓ version found in union start (2 ms)
34
- ✓ version found in union end (2 ms)
35
- ✓ version satisfies a range in union start (2 ms)
36
- ✓ version satisfies a range in union end (1 ms)
37
- ✓ higher version satisfies a range in union start (1 ms)
38
- ✓ higher version satisfies a range in union end (1 ms)
33
+ ✓ version found in union start (1 ms)
34
+ ✓ version found in union end (1 ms)
35
+ ✓ version satisfies a range in union start (1 ms)
36
+ ✓ version satisfies a range in union end
37
+ ✓ higher version satisfies a range in union start
38
+ ✓ higher version satisfies a range in union end
39
39
  ✓ range found in union start (1 ms)
40
- ✓ range found in union end (2 ms)
40
+ ✓ range found in union end (1 ms)
41
41
  ✓ union satisfies greator or equal version range (1 ms)
42
42
  ✓ greator or equal version range satisfies greator or equal version range (1 ms)
43
- ✓ equivalent greator or equal version ranges satisfy each other (2 ms)
44
- ✓ higher range satisfies a range in union start (2 ms)
43
+ ✓ equivalent greator or equal version ranges satisfy each other
44
+ ✓ higher range satisfies a range in union start
45
45
  ✓ higher range satisfies a range in union end (1 ms)
46
46
  ✓ equivalent 'any' ranges satisfy each other (1 ms)
47
- ✓ equivalent major ranges satisfy each other (6 ms)
48
- ✓ version missing in union (2 ms)
49
- ✓ range missing in union (1 ms)
47
+ ✓ equivalent major ranges satisfy each other (3 ms)
48
+ ✓ version missing in union
49
+ ✓ range missing in union
50
50
  Determines dependencies intersections correctly
51
- ✓ equivalence (2 ms)
51
+ ✓ equivalence (1 ms)
52
52
  ✓ exact vs any (1 ms)
53
- ✓ major vs any (2 ms)
53
+ ✓ major vs any
54
54
  ✓ greater or equal vs any (1 ms)
55
55
  ✓ any vs any (1 ms)
56
- ✓ exact vs greater or equal (2 ms)
57
- ✓ major vs greater or equal (2 ms)
56
+ ✓ exact vs greater or equal (1 ms)
57
+ ✓ major vs greater or equal (1 ms)
58
58
  ✓ greater or equal vs greater or equal (1 ms)
59
- ✓ exact vs major (2 ms)
60
- ✓ major vs major (2 ms)
59
+ ✓ exact vs major (1 ms)
60
+ ✓ major vs major (1 ms)
61
61
  ✓ exact vs union (2 ms)
62
- ✓ major vs union (4 ms)
63
- ✓ union vs union (3 ms)
62
+ ✓ major vs union (2 ms)
63
+ ✓ union vs union (2 ms)
64
64
 
65
65
   PASS  src/__tests__/consistentVersions.spec.ts
66
66
  consistentVersions
67
67
  standard tests
68
- ✓ Does nothing when arguments are empty (9 ms)
69
- ✓ Fixes packages that have an incorrect dependency version (5 ms)
70
- ✓ Ignores packages that have a correct dependency version (2 ms)
71
- ✓ Fixes packages that have an incorrect devDependency version (3 ms)
72
- ✓ Ignores packages that have a correct devDependency version (3 ms)
73
- ✓ Fixes packages that have an incorrect dependency and devDependency versions (3 ms)
68
+ ✓ Does nothing when arguments are empty (5 ms)
69
+ ✓ Fixes packages that have an incorrect dependency version (3 ms)
70
+ ✓ Ignores packages that have a correct dependency version (1 ms)
71
+ ✓ Fixes packages that have an incorrect devDependency version (2 ms)
72
+ ✓ Ignores packages that have a correct devDependency version (2 ms)
73
+ ✓ Fixes packages that have an incorrect dependency and devDependency versions (2 ms)
74
74
  Multiple accepted versions tests
75
- ✓ Accepts a match when multiple versions are configured (3 ms)
76
- ✓ Errors when version does not match (3 ms)
75
+ ✓ Accepts a match when multiple versions are configured (2 ms)
76
+ ✓ Errors when version does not match (2 ms)
77
77
 
78
78
  console.log
79
- package-without-scripts (/tmp/tmp-2968-GN9PB7krExNV)
79
+ package-without-scripts (/tmp/tmp-2976-E1qad23BQFON)
80
80
  
81
81
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
82
82
 
@@ -99,7 +99,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
99
99
   at Object.<anonymous> (src/__tests__/packageScript.spec.ts:56:10)
100
100
 
101
101
  console.log
102
- package-without-scripts (/tmp/tmp-2968-urJO0npD28Js)
102
+ package-without-scripts (/tmp/tmp-2976-ELCGccxnoI5w)
103
103
  
104
104
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
105
105
 
@@ -109,7 +109,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
109
109
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
110
110
 
111
111
  console.log
112
- package-with-scripts (/tmp/tmp-2968-Njjky19hzvQW)
112
+ package-with-scripts (/tmp/tmp-2976-vN4K5IRz1vdi)
113
113
  
114
114
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
115
115
 
@@ -119,7 +119,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
119
119
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
120
120
 
121
121
  console.log
122
- package-with-scripts (/tmp/tmp-2968-EWn7B4R54jer)
122
+ package-with-scripts (/tmp/tmp-2976-PjZ8KfG9idqN)
123
123
  
124
124
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
125
125
 
@@ -142,7 +142,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
142
142
   at Object.<anonymous> (src/__tests__/packageScript.spec.ts:169:10)
143
143
 
144
144
  console.log
145
- package-with-scripts (/tmp/tmp-2968-qwnxHnOy8zRq)
145
+ package-with-scripts (/tmp/tmp-2976-MqW8uIRDRecH)
146
146
  
147
147
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
148
148
 
@@ -152,7 +152,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
152
152
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
153
153
 
154
154
  console.log
155
- package-with-scripts (/tmp/tmp-2968-4utwffbRO1nG)
155
+ package-with-scripts (/tmp/tmp-2976-ZVhzJb73eDQL)
156
156
  
157
157
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
158
158
 
@@ -162,7 +162,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
162
162
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
163
163
 
164
164
  console.log
165
- package-with-scripts (/tmp/tmp-2968-49epZdljd6Gy)
165
+ package-with-scripts (/tmp/tmp-2976-eAVYqRuYU4Fz)
166
166
  
167
167
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
168
168
 
@@ -172,7 +172,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
172
172
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
173
173
 
174
174
  console.log
175
- package-without-scripts (/tmp/tmp-2968-ZshG5srPrd74)
175
+ package-without-scripts (/tmp/tmp-2976-7xHDaNLggISE)
176
176
  
177
177
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
178
178
 
@@ -195,7 +195,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
195
195
   at Object.<anonymous> (src/__tests__/packageScript.spec.ts:56:10)
196
196
 
197
197
  console.log
198
- package-without-scripts (/tmp/tmp-2968-4P1X5IHh6Jx2)
198
+ package-without-scripts (/tmp/tmp-2976-l2CKsPpAfF17)
199
199
  
200
200
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
201
201
 
@@ -205,7 +205,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
205
205
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
206
206
 
207
207
  console.log
208
- package-with-scripts (/tmp/tmp-2968-MHBAL9THpUhl)
208
+ package-with-scripts (/tmp/tmp-2976-7Z4Lr7bgPO1h)
209
209
  
210
210
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
211
211
 
@@ -215,7 +215,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
215
215
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
216
216
 
217
217
  console.log
218
- package-with-scripts (/tmp/tmp-2968-h2yVbmxh3m8R)
218
+ package-with-scripts (/tmp/tmp-2976-ecnxQaSyNyaE)
219
219
  
220
220
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
221
221
 
@@ -238,7 +238,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
238
238
   at Object.<anonymous> (src/__tests__/packageScript.spec.ts:169:10)
239
239
 
240
240
  console.log
241
- package-with-scripts (/tmp/tmp-2968-D3LlZy3l4L1o)
241
+ package-with-scripts (/tmp/tmp-2976-1vOhkcWoU1AI)
242
242
  
243
243
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
244
244
 
@@ -248,7 +248,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
248
248
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
249
249
 
250
250
  console.log
251
- package-with-scripts (/tmp/tmp-2968-qu8juF53yzSt)
251
+ package-with-scripts (/tmp/tmp-2976-X08T9AKnKShP)
252
252
  
253
253
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
254
254
 
@@ -258,49 +258,49 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
258
258
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
259
259
 
260
260
  console.log
261
- package-with-scripts (/tmp/tmp-2968-V8w5t1QEQvuz)
261
+ package-with-scripts (/tmp/tmp-2976-LXndMHhoem6M)
262
262
  
263
263
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
264
264
 
265
-  PASS  src/__tests__/packageScript.spec.ts
266
- expectPackageScript (SimpleHost)
267
- fix: false
268
265
  console.log
269
266
  Fixed! package.json: Expected standardized script entry for 'exists'. Valid options: (empty)
270
267
  
271
268
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
272
269
 
273
- ✓ handles an empty script section (71 ms)
270
+  PASS  src/__tests__/packageScript.spec.ts
271
+ expectPackageScript (SimpleHost)
272
+ fix: false
273
+ ✓ handles an empty script section (45 ms)
274
274
  fix: true
275
- ✓ fixes an empty script section (7 ms)
276
- ✓ adds a script (9 ms)
277
- ✓ does nothing if the value exists (2 ms)
278
- ✓ errors if long form is used and no value matches and there is no fixValue (12 ms)
279
- ✓ uses the fixValue for fixing if provided (6 ms)
280
- ✓ can fix to empty (7 ms)
281
- ✓ can allow only empty (6 ms)
275
+ ✓ fixes an empty script section (6 ms)
276
+ ✓ adds a script (5 ms)
277
+ ✓ does nothing if the value exists (1 ms)
278
+ ✓ errors if long form is used and no value matches and there is no fixValue (13 ms)
279
+ ✓ uses the fixValue for fixing if provided (4 ms)
280
+ ✓ can fix to empty (3 ms)
281
+ ✓ can allow only empty (4 ms)
282
282
  expectPackageScript (CachingHost)
283
283
  fix: false
284
- ✓ handles an empty script section (16 ms)
284
+ ✓ handles an empty script section (8 ms)
285
285
  fix: true
286
- ✓ fixes an empty script section (7 ms)
287
- ✓ adds a script (13 ms)
288
- ✓ does nothing if the value exists (2 ms)
289
- ✓ errors if long form is used and no value matches and there is no fixValue (9 ms)
290
- ✓ uses the fixValue for fixing if provided (6 ms)
291
- ✓ can fix to empty (5 ms)
292
- ✓ can allow only empty (6 ms)
286
+ ✓ fixes an empty script section (3 ms)
287
+ ✓ adds a script (5 ms)
288
+ ✓ does nothing if the value exists (1 ms)
289
+ ✓ errors if long form is used and no value matches and there is no fixValue (12 ms)
290
+ ✓ uses the fixValue for fixing if provided (3 ms)
291
+ ✓ can fix to empty (3 ms)
292
+ ✓ can allow only empty (4 ms)
293
293
 
294
294
   PASS  src/__tests__/bannedDependencies.spec.ts
295
295
  bannedDependencies
296
- ✓ Flags banned dependencies correctly (12 ms)
297
- ✓ Flags banned dependencies correctly w legacy globs (3 ms)
298
- ✓ Flags banned dependencies correctly w new globs (3 ms)
299
- ✓ Flags banned dependencies correctly w exact (3 ms)
300
- ✓ Flags banned transitives correctly (9 ms)
296
+ ✓ Flags banned dependencies correctly (8 ms)
297
+ ✓ Flags banned dependencies correctly w legacy globs (2 ms)
298
+ ✓ Flags banned dependencies correctly w new globs (1 ms)
299
+ ✓ Flags banned dependencies correctly w exact (2 ms)
300
+ ✓ Flags banned transitives correctly (5 ms)
301
301
 
302
302
  console.log
303
- package (/tmp/tmp-2968-PmHVn28QX5Es)
303
+ package (/tmp/tmp-2976-VBDsBVDd1wgj)
304
304
  
305
305
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
306
306
 
@@ -310,7 +310,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
310
310
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
311
311
 
312
312
  console.log
313
- package (/tmp/tmp-2968-GsQxGo6M79Tr)
313
+ package (/tmp/tmp-2976-FIXVSHjUPdu7)
314
314
  
315
315
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
316
316
 
@@ -320,7 +320,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
320
320
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
321
321
 
322
322
  console.log
323
- package (/tmp/tmp-2968-nsnPv5yedvwJ)
323
+ package (/tmp/tmp-2976-FWQEA1WMqPX6)
324
324
  
325
325
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
326
326
 
@@ -343,7 +343,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
343
343
   at Object.<anonymous> (src/__tests__/packageEntry.spec.ts:158:10)
344
344
 
345
345
  console.log
346
- package (/tmp/tmp-2968-00Sp7dT40dOz)
346
+ package (/tmp/tmp-2976-HAs0QuiAt06a)
347
347
  
348
348
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
349
349
 
@@ -371,7 +371,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
371
371
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
372
372
 
373
373
  console.log
374
- package (/tmp/tmp-2968-L7T5ramymVpy)
374
+ package (/tmp/tmp-2976-PZbaXFePn2jb)
375
375
  
376
376
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
377
377
 
@@ -381,7 +381,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
381
381
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
382
382
 
383
383
  console.log
384
- package (/tmp/tmp-2968-6KPtwCPP3442)
384
+ package (/tmp/tmp-2976-unDiPztSkoPY)
385
385
  
386
386
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
387
387
 
@@ -391,7 +391,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
391
391
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
392
392
 
393
393
  console.log
394
- package (/tmp/tmp-2968-ssg6vRLUJx5J)
394
+ package (/tmp/tmp-2976-J4N6gMy4pTZQ)
395
395
  
396
396
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
397
397
 
@@ -414,7 +414,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
414
414
   at Object.<anonymous> (src/__tests__/packageEntry.spec.ts:158:10)
415
415
 
416
416
  console.log
417
- package (/tmp/tmp-2968-fGa16fcC184r)
417
+ package (/tmp/tmp-2976-sqmDSh7l6wuB)
418
418
  
419
419
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
420
420
 
@@ -444,35 +444,35 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
444
444
   PASS  src/__tests__/packageEntry.spec.ts
445
445
  expectPackageEntries (SimpleHost)
446
446
  fix: true
447
- ✓ fixes missing entries (15 ms)
448
- ✓ fixes missing nested entries (5 ms)
447
+ ✓ fixes missing entries (11 ms)
448
+ ✓ fixes missing nested entries (4 ms)
449
449
  ✓ doesn't error for nested entries that are defined (1 ms)
450
- ✓ errors for keys that are missing (9 ms)
451
- ✓ handles both entries and entriesExist (12 ms)
450
+ ✓ errors for keys that are missing (7 ms)
451
+ ✓ handles both entries and entriesExist (18 ms)
452
452
  expectPackageEntries (CachingHost)
453
453
  fix: true
454
- ✓ fixes missing entries (19 ms)
455
- ✓ fixes missing nested entries (6 ms)
456
- ✓ doesn't error for nested entries that are defined (2 ms)
457
- ✓ errors for keys that are missing (10 ms)
458
- ✓ handles both entries and entriesExist (14 ms)
454
+ ✓ fixes missing entries (6 ms)
455
+ ✓ fixes missing nested entries (3 ms)
456
+ ✓ doesn't error for nested entries that are defined (1 ms)
457
+ ✓ errors for keys that are missing (7 ms)
458
+ ✓ handles both entries and entriesExist (13 ms)
459
459
 
460
460
   PASS  src/__tests__/nestedWorkspaces.spec.ts
461
461
  nestedWorkspaces
462
- ✓ checks correctly when no packages (19 ms)
463
- ✓ checks correctly when one level packages (7 ms)
464
- ✓ checks fail when one level packages with no workspaces field (6 ms)
465
- ✓ checks correctly when two level packages with two level workspaces field (9 ms)
466
- ✓ checks fail when two level packages with one level workspaces field (6 ms)
467
- ✓ checks correctly when three level packages with three level workspaces field (8 ms)
462
+ ✓ checks correctly when no packages (11 ms)
463
+ ✓ checks correctly when one level packages (5 ms)
464
+ ✓ checks fail when one level packages with no workspaces field (4 ms)
465
+ ✓ checks correctly when two level packages with two level workspaces field (5 ms)
466
+ ✓ checks fail when two level packages with one level workspaces field (4 ms)
467
+ ✓ checks correctly when three level packages with three level workspaces field (4 ms)
468
468
 
469
469
   PASS  src/__tests__/requireDependency.spec.ts
470
470
  requireDependency
471
- ✓ checks correctly (14 ms)
472
- ✓ fixes correctly (7 ms)
471
+ ✓ checks correctly (10 ms)
472
+ ✓ fixes correctly (13 ms)
473
473
 
474
474
  console.log
475
- package (/tmp/tmp-2968-OKGOMQnGbl1f)
475
+ package (/tmp/tmp-2976-MvagtEG5A8Mu)
476
476
  
477
477
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
478
478
 
@@ -482,7 +482,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
482
482
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
483
483
 
484
484
  console.log
485
- package-unknown-keys (/tmp/tmp-2968-3grak8327kgz)
485
+ package-unknown-keys (/tmp/tmp-2976-Vge61QNK7r8o)
486
486
  
487
487
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
488
488
 
@@ -492,7 +492,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
492
492
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
493
493
 
494
494
  console.log
495
- package (/tmp/tmp-2968-mZM14wcKUkpC)
495
+ package (/tmp/tmp-2976-XrBjA5HEJUPD)
496
496
  
497
497
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
498
498
 
@@ -502,7 +502,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
502
502
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
503
503
 
504
504
  console.log
505
- package (/tmp/tmp-2968-cNPnjAuLmVJq)
505
+ package (/tmp/tmp-2976-q2usCSUDsuTp)
506
506
  
507
507
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
508
508
 
@@ -512,7 +512,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
512
512
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
513
513
 
514
514
  console.log
515
- package-unknown-keys (/tmp/tmp-2968-bmxOKnIJY5hq)
515
+ package-unknown-keys (/tmp/tmp-2976-T5m7ZleRtZkD)
516
516
  
517
517
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
518
518
 
@@ -522,7 +522,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
522
522
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
523
523
 
524
524
  console.log
525
- package (/tmp/tmp-2968-2UsWt4HhYzKI)
525
+ package (/tmp/tmp-2976-gNn1Gl4feJ5k)
526
526
  
527
527
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
528
528
 
@@ -534,25 +534,25 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
534
534
   PASS  src/__tests__/packageOrder.spec.ts
535
535
  expectPackageOrder (SimpleHost)
536
536
  fix: true
537
- ✓ fixes order for expected keys (16 ms)
538
- ✓ fixes order for unexpected keys (16 ms)
539
- ✓ fixes order using function (5 ms)
540
- ✓ does nothing if already order (2 ms)
537
+ ✓ fixes order for expected keys (12 ms)
538
+ ✓ fixes order for unexpected keys (12 ms)
539
+ ✓ fixes order using function (4 ms)
540
+ ✓ does nothing if already order (1 ms)
541
541
  expectPackageOrder (CachingHost)
542
542
  fix: true
543
- ✓ fixes order for expected keys (7 ms)
544
- ✓ fixes order for unexpected keys (5 ms)
545
- ✓ fixes order using function (5 ms)
546
- ✓ does nothing if already order (15 ms)
543
+ ✓ fixes order for expected keys (5 ms)
544
+ ✓ fixes order for unexpected keys (4 ms)
545
+ ✓ fixes order using function (11 ms)
546
+ ✓ does nothing if already order (2 ms)
547
547
 
548
548
   PASS  src/__tests__/consistentDependencies.spec.ts
549
549
  consistentDependencies
550
- ✓ checks correctly (15 ms)
551
- ✓ fixes correctly (4 ms)
552
- ✓ ignores ignored dependencies (3 ms)
550
+ ✓ checks correctly (11 ms)
551
+ ✓ fixes correctly (3 ms)
552
+ ✓ ignores ignored dependencies (2 ms)
553
553
 
554
554
  console.log
555
- rootProject (/tmp/tmp-2968-2QGY1ihVTbVr)
555
+ rootProject (/tmp/tmp-2976-I61ERqqaEShk)
556
556
  
557
557
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
558
558
 
@@ -562,7 +562,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
562
562
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
563
563
 
564
564
  console.log
565
- rootProject (/tmp/tmp-2968-fDMykhxV9fI0)
565
+ rootProject (/tmp/tmp-2976-55snlAN5is4i)
566
566
  
567
567
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
568
568
 
@@ -572,7 +572,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
572
572
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
573
573
 
574
574
  console.log
575
- rootProject (/tmp/tmp-2968-0IWhJ6IRO6s4)
575
+ rootProject (/tmp/tmp-2976-sNH5g94pvfKL)
576
576
  
577
577
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
578
578
 
@@ -582,7 +582,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
582
582
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
583
583
 
584
584
  console.log
585
- rootProject (/tmp/tmp-2968-HPll6mckd9eI)
585
+ rootProject (/tmp/tmp-2976-zKOZu5O4UNGB)
586
586
  
587
587
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
588
588
 
@@ -594,15 +594,15 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
594
594
   PASS  src/__tests__/fileContents.spec.ts
595
595
  fileContents (SimpleHost)
596
596
  fix: true
597
- ✓ fixes missing file (15 ms)
598
- ✓ fixes missing nested file (6 ms)
597
+ ✓ fixes missing file (9 ms)
598
+ ✓ fixes missing nested file (3 ms)
599
599
  fileContents (CachingHost)
600
600
  fix: true
601
- ✓ fixes missing file (7 ms)
602
- ✓ fixes missing nested file (5 ms)
601
+ ✓ fixes missing file (5 ms)
602
+ ✓ fixes missing nested file (3 ms)
603
603
 
604
604
  console.log
605
- foo-lib (/tmp/tmp-2968-ROzMtIEkqBXw)
605
+ foo-lib (/tmp/tmp-2976-dw7A1A2SqE1Z)
606
606
  
607
607
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
608
608
 
@@ -612,7 +612,7 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
612
612
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
613
613
 
614
614
  console.log
615
- foo-lib (/tmp/tmp-2968-xODlsejYuOtf)
615
+ foo-lib (/tmp/tmp-2976-DNuNV98nJFPF)
616
616
  
617
617
   at WorkspaceContextImpl.print (../core/src/PackageContext.ts:133:13)
618
618
 
@@ -624,15 +624,15 @@ ts-jest[ts-compiler] (WARN) Unable to process '/home/runner/work/monorepolint/mo
624
624
   PASS  src/__tests__/alphabeticalScripts.spec.ts
625
625
  alphabeticalScripts (SimpleHost)
626
626
  fix: true
627
- ✓ fixes unsorted scripts (19 ms)
628
- ✓ does nothing if already sorted (2 ms)
627
+ ✓ fixes unsorted scripts (12 ms)
628
+ ✓ does nothing if already sorted (1 ms)
629
629
  alphabeticalScripts (CachingHost)
630
630
  fix: true
631
- ✓ fixes unsorted scripts (8 ms)
632
- ✓ does nothing if already sorted (2 ms)
631
+ ✓ fixes unsorted scripts (5 ms)
632
+ ✓ does nothing if already sorted (7 ms)
633
633
 
634
634
  Test Suites: 11 passed, 11 total
635
635
  Tests: 116 passed, 116 total
636
636
  Snapshots: 0 total
637
- Time: 17.711 s
637
+ Time: 11.597 s
638
638
  Ran all test suites.
@@ -2,13 +2,17 @@
2
2
  > @monorepolint/rules@0.4.0 transpile-typescript /home/runner/work/monorepolint/monorepolint/packages/rules
3
3
  > tsup --config ../../tsup.config.cjs
4
4
 
5
- CLI Building entry: src/index.ts
5
+ CLI Building entry: src/index.ts, src/public/util.ts
6
6
  CLI Using tsconfig: tsconfig.json
7
7
  CLI tsup v6.5.0
8
8
  CLI Using tsup config: /home/runner/work/monorepolint/monorepolint/tsup.config.cjs
9
9
  CLI Target: node16
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM build/js/index.js 50.14 KB
13
- ESM build/js/index.js.map 100.26 KB
14
- ESM ⚡️ Build success in 80ms
12
+ ESM build/js/index.js 49.84 KB
13
+ ESM build/js/chunk-GMT7IGKM.js 429.00 B
14
+ ESM build/js/public/util.js 106.00 B
15
+ ESM build/js/index.js.map 99.17 KB
16
+ ESM build/js/chunk-GMT7IGKM.js.map 1.16 KB
17
+ ESM build/js/public/util.js.map 71.00 B
18
+ ESM ⚡️ Build success in 47ms
@@ -0,0 +1,25 @@
1
+ // src/util/makeRule.ts
2
+ var globalId = 0;
3
+ function makeRule({
4
+ name,
5
+ check,
6
+ optionsRuntype,
7
+ printStats
8
+ }) {
9
+ return function(ruleEntry) {
10
+ const id = `${name} :: ${globalId++}`;
11
+ return {
12
+ id,
13
+ check: (context) => check(context, ruleEntry.options, { id }),
14
+ name,
15
+ optionsRuntype,
16
+ ruleEntry,
17
+ printStats
18
+ };
19
+ };
20
+ }
21
+
22
+ export {
23
+ makeRule
24
+ };
25
+ //# sourceMappingURL=chunk-GMT7IGKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/makeRule.ts"],"sourcesContent":["import { Context, RuleEntry, RuleModule } from \"@monorepolint/config\";\nimport * as r from \"runtypes\";\n\nlet globalId = 0;\nexport function makeRule<T extends r.Runtype<unknown>>({\n name,\n check,\n optionsRuntype,\n printStats,\n}: {\n name: string;\n check: (context: Context, options: r.Static<T>, extra: { id: string }) => Promise<unknown> | unknown;\n optionsRuntype: T;\n printStats?: () => void;\n}): RuleFunction<T> {\n return function (ruleEntry) {\n const id = `${name} :: ${globalId++}`;\n return {\n id,\n check: (context) => check(context, ruleEntry.options, { id }),\n name,\n optionsRuntype,\n ruleEntry,\n printStats,\n };\n };\n}\n\ntype RuleFunction<T extends r.Runtype<any>> = (ruleEntry: RuleEntry<r.Static<T>>) => RuleModule<T>;\n"],"mappings":";AAGA,IAAI,WAAW;AACR,SAAS,SAAuC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKoB;AAClB,SAAO,SAAU,WAAW;AAC1B,UAAM,KAAK,GAAG,WAAW;AACzB,WAAO;AAAA,MACL;AAAA,MACA,OAAO,CAAC,YAAY,MAAM,SAAS,UAAU,SAAS,EAAE,GAAG,CAAC;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/build/js/index.js CHANGED
@@ -1,3 +1,7 @@
1
+ import {
2
+ makeRule
3
+ } from "./chunk-GMT7IGKM.js";
4
+
1
5
  // src/alphabeticalDependencies.ts
2
6
  import * as r from "runtypes";
3
7
 
@@ -41,27 +45,6 @@ function createIncorrectOrderErrorMessage(block, packageName) {
41
45
  return `Incorrect order of ${block} in ${packageName}'s package.json`;
42
46
  }
43
47
 
44
- // src/util/makeRule.ts
45
- var globalId = 0;
46
- function makeRule({
47
- name,
48
- check,
49
- optionsRuntype,
50
- printStats
51
- }) {
52
- return function(ruleEntry) {
53
- const id = `${name} :: ${globalId++}`;
54
- return {
55
- id,
56
- check: (context) => check(context, ruleEntry.options, { id }),
57
- name,
58
- optionsRuntype,
59
- ruleEntry,
60
- printStats
61
- };
62
- };
63
- }
64
-
65
48
  // src/alphabeticalDependencies.ts
66
49
  var Options = r.Undefined;
67
50
  var alphabeticalDependencies = makeRule({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/alphabeticalDependencies.ts","../../src/util/checkAlpha.ts","../../src/util/makeRule.ts","../../src/alphabeticalScripts.ts","../../src/bannedDependencies.ts","../../src/util/packageDependencyGraphService.ts","../../src/consistentDependencies.ts","../../src/consistentVersions.ts","../../src/fileContents.ts","../../src/mustSatisfyPeerDependencies.ts","../../src/packageOrder.ts","../../src/packageEntry.ts","../../src/packageScript.ts","../../src/standardTsconfig.ts","../../src/nestedWorkspaces.ts","../../src/requireDependency.ts"],"sourcesContent":["/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as r from \"runtypes\";\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Undefined;\n\nexport const alphabeticalDependencies = makeRule({\n name: \"alphabeticalDependencies\",\n check: (context) => {\n checkAlpha(context, \"dependencies\");\n checkAlpha(context, \"devDependencies\");\n checkAlpha(context, \"peerDependencies\");\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\n\nexport function checkAlpha(\n context: Context,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"scripts\"\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const blockToSort = packageJson[block];\n\n if (blockToSort === undefined) {\n return;\n }\n\n const actualOrder = Object.keys(blockToSort);\n const expectedOrder = actualOrder.slice().sort(); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: createIncorrectOrderErrorMessage(block, packageJson.name!),\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedDependencies: Record<string, string> = {};\n\n expectedOrder.forEach((dep) => {\n expectedDependencies[dep] = blockToSort[dep];\n });\n\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createIncorrectOrderErrorMessage(block: string, packageName: string) {\n return `Incorrect order of ${block} in ${packageName}'s package.json`;\n}\n","import { Context, RuleEntry, RuleModule } from \"@monorepolint/config\";\nimport * as r from \"runtypes\";\n\nlet globalId = 0;\nexport function makeRule<T extends r.Runtype<unknown>>({\n name,\n check,\n optionsRuntype,\n printStats,\n}: {\n name: string;\n check: (context: Context, options: r.Static<T>, extra: { id: string }) => Promise<unknown> | unknown;\n optionsRuntype: T;\n printStats?: () => void;\n}): RuleFunction<T> {\n return function (ruleEntry) {\n const id = `${name} :: ${globalId++}`;\n return {\n id,\n check: (context) => check(context, ruleEntry.options, { id }),\n name,\n optionsRuntype,\n ruleEntry,\n printStats,\n };\n };\n}\n\ntype RuleFunction<T extends r.Runtype<any>> = (ruleEntry: RuleEntry<r.Static<T>>) => RuleModule<T>;\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as r from \"runtypes\";\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Undefined;\n\nexport const alphabeticalScripts = makeRule({\n name: \"alphabeticalScripts\",\n check: (context) => {\n checkAlpha(context, \"scripts\");\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { AggregateTiming } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nimport { IPackageDependencyGraphNode, PackageDependencyGraphService } from \"./util/packageDependencyGraphService.js\";\n// FIXME: This rule is messed. bannedTransitiveDependencies doesnt glob\n\nconst bannedDepGlobsField = r.Union(\n r.Array(r.String),\n r.Record({\n glob: r.Array(r.String).optional(),\n exact: r.Array(r.String).optional(),\n })\n);\n\nconst Options = r.Union(\n r.Record({\n bannedDependencies: bannedDepGlobsField,\n bannedTransitiveDependencies: r.Undefined.optional(),\n }),\n\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String),\n }),\n\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String).optional(),\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\n/**\n * We use this locally to avoid making a billion sets. Because check is called once per package\n * (with the exact same config object reference) we can save quite a bit of time by reusing this cache.\n */\nconst setCache = new Map<ReadonlyArray<string>, Set<string>>();\n\nconst aggregateTiming = new AggregateTiming(\":bannedDependencies stats\");\n\nexport const bannedDependencies = makeRule({\n name: \"bannedDependencies\",\n check: (context, opts, extra) => {\n aggregateTiming.start(extra?.id ?? \"unknown id\");\n\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const curDeps = packageJson.dependencies && Object.keys(packageJson.dependencies);\n const curDevDeps = packageJson.devDependencies && Object.keys(packageJson.devDependencies);\n const curPeerDeps = packageJson.peerDependencies && Object.keys(packageJson.peerDependencies);\n\n const { bannedDependencies: banned, bannedTransitiveDependencies: transitives } = opts;\n\n const globs = banned && (Array.isArray(banned) ? banned : banned.glob);\n const exacts = banned && (Array.isArray(banned) ? undefined : banned.exact);\n\n const violations = new Set<string>();\n\n if (globs) {\n if (curDeps) populateProblemsGlobs(globs, curDeps, violations);\n if (curDevDeps) populateProblemsGlobs(globs, curDevDeps, violations);\n if (curPeerDeps) populateProblemsGlobs(globs, curPeerDeps, violations);\n }\n\n if (exacts) {\n let set = setCache.get(exacts);\n if (set === undefined) {\n set = new Set(exacts);\n setCache.set(exacts, set);\n }\n if (curDeps) populateProblemsExact(set, curDeps, violations);\n if (curDevDeps) populateProblemsExact(set, curDevDeps, violations);\n if (curPeerDeps) populateProblemsExact(set, curPeerDeps, violations);\n }\n\n if (violations.size > 0) {\n context.addError({\n file: packagePath,\n message:\n `Found ${violations.size} banned dependencies of package.json:\\n\\t` +\n Array.from(violations)\n .map((v) => `'${v}'`)\n .join(\", \"),\n });\n }\n\n if (transitives) {\n let set = setCache.get(transitives);\n if (set === undefined) {\n set = new Set(transitives);\n setCache.set(transitives, set);\n }\n checkTransitives(context, set);\n }\n\n aggregateTiming.stop();\n },\n optionsRuntype: Options,\n printStats: () => {\n aggregateTiming.printResults();\n },\n});\n\nfunction populateProblemsExact(banned: Set<string>, dependencies: ReadonlyArray<string>, violations: Set<string>) {\n for (const dependency of dependencies) {\n if (banned.has(dependency)) {\n violations.add(dependency);\n }\n }\n}\n\nfunction populateProblemsGlobs(\n bannedDependencyGlobs: ReadonlyArray<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>\n) {\n for (const dependency of dependencies) {\n if (matchesAnyGlob(dependency, bannedDependencyGlobs)) {\n violations.add(dependency);\n }\n }\n}\n\n// This function is slow. God help you if you use this on a big repo\nfunction checkTransitives(context: Context, banned: Set<string>) {\n const graphService = new PackageDependencyGraphService();\n const root = graphService.buildDependencyGraph(path.resolve(context.getPackageJsonPath()), context.host);\n for (const { dependencies, importPath } of graphService.traverse(root)) {\n for (const [dependency] of dependencies) {\n if (banned.has(dependency)) {\n // Remove the starting package since it's obvious in CLI output.\n const [, ...importPathWithoutRoot] = importPath;\n const pathing = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(\" -> \");\n\n context.addError({\n file: root.paths.packageJsonPath,\n message: `Banned transitive dependencies in repo: ${pathing}`,\n });\n }\n }\n }\n}\n\nfunction nameOrPackageJsonPath(node: IPackageDependencyGraphNode): string {\n return node.packageJson.name ?? node.paths.packageJsonPath;\n}\n","/**\n * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.\n */\n\nimport { Host, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\n\n/** Interface for a node in a package dependency graph. */\nexport interface IPackageDependencyGraphNode {\n packageJson: PackageJson;\n dependencies: Map<string, IPackageDependencyGraphNode>;\n paths: {\n packageJsonPath: string;\n rootDirectory: string;\n };\n}\n\n/** Service abstraction for constructing and traversing package dependency graphs. */\nexport interface IPackageDependencyGraphService {\n /** Construct a graph of package dependencies. */\n buildDependencyGraph(packageJsonPath: string, host: Host, maxDepth?: number): IPackageDependencyGraphNode;\n\n /** Traverse a package dependency graph. */\n traverse(\n root: IPackageDependencyGraphNode,\n opts?: {\n /** Traverse each unique path to a given package (potentially slow). */\n traverseAllPaths?: boolean;\n }\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }>;\n}\n\n/** Default implementation of the package dependency graph service. */\nexport class PackageDependencyGraphService implements IPackageDependencyGraphService {\n /** Construct a graph of package dependencies and return the root node. */\n public buildDependencyGraph(\n startPackageJsonPath: string,\n host: Host,\n maxDepth?: number\n ): IPackageDependencyGraphNode {\n const nodes = new Map<string, IPackageDependencyGraphNode>();\n const visit = (packageJsonPath: string, currentDepth: number): IPackageDependencyGraphNode => {\n if (nodes.has(packageJsonPath)) {\n return nodes.get(packageJsonPath)!;\n }\n\n const packageJson: PackageJson = host.readJson(packageJsonPath);\n const node: IPackageDependencyGraphNode = {\n packageJson,\n dependencies: new Map<string, IPackageDependencyGraphNode>(),\n paths: {\n packageJsonPath,\n rootDirectory: path.dirname(packageJsonPath),\n },\n };\n\n // It's important that we register the node before visiting its dependencies to avoid cycles\n nodes.set(packageJsonPath, node);\n\n const nextDepth = currentDepth + 1;\n if (maxDepth == null || nextDepth <= maxDepth) {\n const dependencies = packageJson.dependencies != null ? Object.keys(packageJson.dependencies) : [];\n for (const dependency of dependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(dependency, node.paths.rootDirectory);\n if (dependencyPackageJsonPath == null) {\n throw new Error(`Could not resolve ${dependency} from ${node.paths.rootDirectory}`);\n }\n\n node.dependencies.set(dependency, visit(dependencyPackageJsonPath, nextDepth));\n }\n }\n\n return node;\n };\n\n return visit(startPackageJsonPath, 0);\n }\n\n /** Traverse a package dependency graph with an iterator. */\n public *traverse(\n root: IPackageDependencyGraphNode,\n opts = { traverseAllPaths: false }\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }> {\n const visited = new Set<IPackageDependencyGraphNode>();\n\n function* visit(\n node: IPackageDependencyGraphNode,\n importPath: IPackageDependencyGraphNode[] = []\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }> {\n // Don't visit a package more than once unless explicitly asked to traverse all paths\n if (!opts.traverseAllPaths && visited.has(node)) {\n return;\n }\n\n // Break cycles when traversing all paths\n if (importPath.indexOf(node) !== -1) {\n return;\n }\n\n // Visit the node\n visited.add(node);\n importPath = [...importPath, node];\n yield { ...node, importPath };\n\n // Recursively visit the node's dependencies\n for (const dependency of node.dependencies.values()) {\n yield* visit(dependency, importPath);\n }\n }\n\n yield* visit(root);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r\n .Record({\n ignoredDependencies: r.Array(r.String).Or(r.Undefined),\n })\n .Or(r.Undefined);\nexport type Options = r.Static<typeof Options>;\n\nconst skippedVersions = [\"*\", \"latest\"];\n\nexport const consistentDependencies = makeRule({\n name: \"consistentDependencies\",\n check: (context, args) => {\n checkDeps(context, args, \"dependencies\");\n checkDeps(context, args, \"devDependencies\");\n // we don't check peer deps since they can be more lenient\n },\n optionsRuntype: Options,\n});\n\nfunction checkDeps(context: Context, args: Options, block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\") {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n const dependencies = packageJson[block];\n\n const workspacePackageJson = context.getWorkspaceContext().getPackageJson();\n const workspaceDependencies = workspacePackageJson[block];\n\n const ignoredDeps = args?.ignoredDependencies ?? [];\n const depsToCheck =\n workspaceDependencies == null || ignoredDeps.length === 0\n ? workspaceDependencies\n : omit(workspaceDependencies, ignoredDeps);\n\n if (dependencies === undefined || depsToCheck === undefined) {\n return;\n }\n\n const expectedDependencies = {\n ...dependencies,\n ...filterKeys(depsToCheck, dependencies),\n };\n\n if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {\n context.addError({\n file: packagePath,\n message: `Inconsistent ${block} with root in package.json`,\n longMessage: diff(expectedDependencies, dependencies, { expand: true }),\n fixer: () => {\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction filterKeys(ob: Record<string, string>, filterOb: Record<string, string>) {\n const newOb: Record<string, any> = {};\n\n for (const key of Object.keys(filterOb)) {\n if (ob[key] !== undefined && skippedVersions.indexOf(filterOb[key]) === -1) {\n newOb[key] = ob[key];\n }\n }\n\n return newOb;\n}\n\nfunction omit<T>(obj: Record<string, T>, keysToOmit: readonly string[]): Record<string, T> {\n const newObj: Record<string, T> = {};\n\n const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));\n for (const [key, value] of filtered) {\n newObj[key] = value;\n }\n\n return newObj;\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as r from \"runtypes\";\nimport { coerce, SemVer } from \"semver\";\nimport { makeRule } from \"./util/makeRule.js\";\nexport const Options = r.Record({\n matchDependencyVersions: r.Dictionary(r.Union(r.String, r.Array(r.String))),\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const consistentVersions = makeRule({\n name: \"consistentVersions\",\n check: checkConsistentVersions,\n optionsRuntype: Options,\n});\n\nfunction checkConsistentVersions(context: Context, options: Options) {\n for (const [dependencyPackageName, expectedPackageDependencyValue] of Object.entries(\n options.matchDependencyVersions\n )) {\n if (Array.isArray(expectedPackageDependencyValue)) {\n ensurePackageMatchesSomeVersion(context, dependencyPackageName, expectedPackageDependencyValue);\n } else {\n ensurePackageIsCorrectVersion(context, dependencyPackageName, expectedPackageDependencyValue);\n }\n }\n}\n\nconst ensurePackageIsCorrectVersion = (\n context: Context,\n dependencyPackageName: string,\n expectedPackageDependencyValue: string\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const expectedPackageDependencyVersion = coerce(expectedPackageDependencyValue);\n if (expectedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`\n );\n }\n\n const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null &&\n actualPackageDependencyVersion.raw !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.dependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n\n const actualPackageDevDependencyValue =\n packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(actualPackageDevDependencyValue);\n if (\n actualPackageDevDependencyVersion != null &&\n actualPackageDevDependencyVersion.raw !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.devDependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n};\n\nconst ensurePackageMatchesSomeVersion = (\n context: Context,\n dependencyPackageName: string,\n acceptedPackageDependencyValues: string[]\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const acceptedPackageDependencyVersions: SemVer[] = acceptedPackageDependencyValues.map(\n (acceptedPackageDependencyValue) => {\n const acceptedPackageDependencyVersion = coerce(acceptedPackageDependencyValue);\n if (acceptedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`\n );\n }\n return acceptedPackageDependencyVersion;\n }\n );\n\n const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null &&\n acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) => actualPackageDependencyVersion.raw !== acceptedPackageDependencyVersion.raw\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match one of '${JSON.stringify(\n acceptedPackageDependencyValues\n )}', got '${actualPackageDependencyValue}' instead.`,\n });\n }\n\n const actualPackageDevDependencyValue =\n packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(actualPackageDevDependencyValue);\n if (\n actualPackageDevDependencyVersion != null &&\n acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) =>\n actualPackageDevDependencyVersion.raw !== acceptedPackageDependencyVersion.raw\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match one of '${JSON.stringify(\n acceptedPackageDependencyValues\n )}', got '${actualPackageDevDependencyValue}' instead.`,\n });\n }\n};\n","/*!\n * Copyright 2023 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Union(\n r.Record({\n file: r.String,\n generator: r.Function,\n template: r.Undefined.optional(),\n templateFile: r.Undefined.optional(),\n }),\n\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.String,\n templateFile: r.Undefined.optional(),\n }),\n\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.Undefined.optional(),\n templateFile: r.String,\n })\n);\n\ntype Options = r.Static<typeof Options>;\n\nexport const fileContents = makeRule({\n name: \"fileContents\",\n check: (context, opts) => {\n const fullPath = path.join(context.packageDir, opts.file);\n const expectedContent = getExpectedContents(context, opts);\n\n const pathExists = context.host.exists(fullPath);\n const actualContent = pathExists ? context.host.readFile(fullPath, { encoding: \"utf-8\" }) : undefined;\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n if (expectedContent === undefined) {\n if (pathExists) context.host.deleteFile(fullPath);\n } else {\n context.host.mkdir(path.dirname(fullPath), { recursive: true });\n context.host.writeFile(fullPath, expectedContent, { encoding: \"utf-8\" });\n }\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nconst optionsCache = new Map<Options, ((context: Context) => string | undefined) | string | undefined>();\n\nfunction getExpectedContents(context: Context, opts: Options) {\n // we need to use has because undefined is a valid value in the cache\n if (optionsCache.has(opts)) {\n const cachedEntry = optionsCache.get(opts);\n if (cachedEntry && typeof cachedEntry === \"function\") {\n return cachedEntry(context);\n }\n return cachedEntry;\n }\n\n if (opts.generator) {\n optionsCache.set(opts, opts.generator);\n return opts.generator(context) as string | undefined; // we have no guarentee its the right kind of function\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = context.host.readFile(fullPath, { encoding: \"utf-8\" });\n\n optionsCache.set(opts, template);\n return template;\n } else {\n optionsCache.set(opts, opts.template);\n return opts.template;\n }\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { Host, mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { coerce } from \"semver\";\nimport resolvePackagePath from \"resolve-package-path\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst Options = r.Union(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n })\n ),\n r.Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const mustSatisfyPeerDependencies = makeRule({\n name: \"mustSatisfyPeerDependencies\",\n check: checkSatisfyPeerDependencies,\n optionsRuntype: Options,\n});\n\n/**\n * separating on `|`, this regex allows any of the following formats:\n * - `*`\n * - `x`\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_ANY_VERSION_RANGE = /^(\\*|x)$/;\n\n/**\n * This regex allows any of the following formats:\n * - `>=15`\n * - `>=15.2`\n * - `>=15.2.1`\n * - `>=15.2.1-rc.0`\n * - `>=15.2.1+sha`\n * - `>=15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =\n /^>= ?\\d+(?:\\.\\d+|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$/;\n\n/**\n * This regex allows any of the following formats:\n * - `15`\n * - `^15`\n * - `15.x`\n * - `^15.x`\n * - `15.x.x`\n * - `^15.x.x`\n * - `^15.2`\n * - `^15.2.x`\n * - `^15.2.1`\n * - `^15.2.1-rc.0`\n * - `^15.2.1+sha`\n * - `^15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_MAJOR_VERSION_RANGE =\n /^(?:\\^?\\d+|\\^?\\d+\\.x|\\^?\\d+\\.x\\.x|\\^\\d+\\.\\d+|\\^\\d+\\.\\d+\\.x|\\^\\d+\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)$/;\n\n/**\n * Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),\n * though it will accept isolated `>=` ranges (e.g. `>=2.5.1`, but not `^1 || >=2.5.1`)\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n *\n * TODO: accept minor pins `~4.2.1`\n */\nexport const RANGE_REGEX =\n /^(\\*|x|>= ?\\d+(?:\\.\\d+|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?|\\^?\\d+(\\.x|\\.x\\.x|\\.\\d+|\\.\\d+\\.x|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?( \\|\\| \\^?\\d+(\\.x|\\.x\\.x|\\.\\d+|\\.\\d+\\.x|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?)*)$/;\n\ninterface IPeerDependencyRequirement {\n fromPackageName: string;\n range: ValidRange;\n}\n\ninterface IResolvedPeerDependencyRequirement {\n fromPeerDependencyRequirements: IPeerDependencyRequirement[];\n range: ValidRange;\n}\n\nfunction checkSatisfyPeerDependencies(context: Context, opts: Options) {\n const { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;\n const packageJsonPath = path.resolve(context.getPackageJsonPath());\n const packageJson: PackageJson = context.host.readJson(packageJsonPath);\n const packageDependencies = packageJson.dependencies || {};\n const packageDevDependencies = packageJson.devDependencies || {};\n const packagePeerDependencies = packageJson.peerDependencies || {};\n const packageName = packageJson.name || packageJsonPath;\n\n // check that no peer dependencies are also declared as regular dependencies\n for (const [peerDependencyName, peerDependencyRange] of Object.entries(packagePeerDependencies)) {\n if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {\n continue;\n }\n\n const dependencyRange = packageDependencies[peerDependencyName];\n if (dependencyRange != null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[0] Package ${packageName} has overloaded ${peerDependencyName} dependencies.\\n\\t` +\n `Peer dependency '${peerDependencyRange}' and regular dependency '${dependencyRange}'.`,\n });\n }\n }\n\n // map of all inherited peer dependency requirements\n const allRequiredPeerDependencies: { [peerDependencyName: string]: IPeerDependencyRequirement[] } = {};\n\n // for each of this package's dependencies, add the dependency's peer requirements into `allRequiredPeerDependencies`\n const allDependencies = enforceForDevDependencies\n ? [...Object.keys(packageDependencies), ...Object.keys(packageDevDependencies)]\n : Object.keys(packageDependencies);\n for (const dependency of allDependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(dependency, path.dirname(packageJsonPath));\n if (dependencyPackageJsonPath == null) {\n throw new Error(`Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`);\n }\n const dependencyPackageJson: PackageJson = context.host.readJson(dependencyPackageJsonPath);\n const requiredPeerDependencies = dependencyPackageJson.peerDependencies;\n if (requiredPeerDependencies == null) {\n continue;\n }\n for (const [peerDependencyName, range] of Object.entries(requiredPeerDependencies)) {\n if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {\n continue;\n }\n\n if (!isValidRange(range)) {\n const message = `Unable to parse ${dependencyPackageJson.name}'s ${peerDependencyName} peer dependency range '${range}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: dependencyPackageJsonPath, message });\n continue;\n }\n throw new Error(message);\n }\n if (allRequiredPeerDependencies[peerDependencyName] == null) {\n allRequiredPeerDependencies[peerDependencyName] = [];\n }\n allRequiredPeerDependencies[peerDependencyName].push({ fromPackageName: dependencyPackageJson.name!, range });\n }\n }\n\n for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(allRequiredPeerDependencies)) {\n // for each inherited peer dependency, determine the strictest range\n let mostStrictPeerRequirement: IResolvedPeerDependencyRequirement = {\n fromPeerDependencyRequirements: [peerDependencyRequirements[0]],\n range: peerDependencyRequirements[0].range,\n };\n for (const peerRequirement of peerDependencyRequirements) {\n if (doesASatisfyB(mostStrictPeerRequirement.range, peerRequirement.range)) {\n continue;\n } else if (doesASatisfyB(peerRequirement.range, mostStrictPeerRequirement.range)) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [peerRequirement],\n range: peerRequirement.range,\n };\n } else {\n const maybeIntersection = findIntersection(peerRequirement.range, mostStrictPeerRequirement.range);\n if (maybeIntersection !== undefined) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [\n ...mostStrictPeerRequirement.fromPeerDependencyRequirements,\n peerRequirement,\n ],\n range: maybeIntersection,\n };\n } else {\n context.addError({\n file: packageJsonPath,\n message:\n `[1] Package ${packageName} has conflicting inherited ${peerDependencyName} peer dependencies.\\n\\t` +\n `Dependency ${peerRequirement.fromPackageName} requires '${peerRequirement.range}' but\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n }\n\n // if this package has a dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n const packageDependencyRange = packageDependencies[peerDependencyName];\n if (packageDependencyRange != null) {\n if (!isValidRange(packageDependencyRange)) {\n const message = `Unable to parse ${packageName}'s ${peerDependencyName} dependency range '${packageDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (!doesASatisfyB(packageDependencyRange, mostStrictPeerRequirement.range)) {\n context.addError({\n file: packageJsonPath,\n message:\n `[2] Package ${packageName} dependency on ${peerDependencyName} '${packageDependencyRange}' does not satisfy inherited peer dependencies.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n\n // for every inherited peer dependency, this package must declare a dependency or peer dependency\n // equal to or stricter than `mostStrictPeerRequirement`\n const packagePeerDependencyRange = packagePeerDependencies[peerDependencyName];\n if (packageDependencyRange == null && packagePeerDependencyRange == null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[3] Package ${packageName} is missing required ${peerDependencyName} dependency.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n\n // if this package has a peer dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n if (packagePeerDependencyRange != null) {\n if (!isValidRange(packagePeerDependencyRange)) {\n const message = `Unable to parse ${packageName}'s ${peerDependencyName} peer dependency range '${packagePeerDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (!doesASatisfyB(packagePeerDependencyRange, mostStrictPeerRequirement.range)) {\n context.addError({\n file: packageJsonPath,\n message:\n `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n }\n }\n}\n\nfunction shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName,\n}: {\n dependencyBlacklist?: string[];\n dependencyWhitelist?: string[];\n packageName: string;\n}) {\n // blacklist should take precedance\n if (\n (dependencyBlacklist != null && dependencyBlacklist.includes(packageName)) ||\n (dependencyWhitelist != null && !dependencyWhitelist.includes(packageName))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getMostStrictStatement(mostStrictPeerRequirement: IResolvedPeerDependencyRequirement) {\n if (mostStrictPeerRequirement.fromPeerDependencyRequirements.length === 1) {\n const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0].fromPackageName;\n return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;\n } else {\n const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName)\n .join(\", \");\n const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`)\n .join(\", \");\n return (\n `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, ` +\n `resolving to '${mostStrictPeerRequirement.range}'.`\n );\n }\n}\n\n/**\n * Given two version ranges, find the maximum intersecting range\n * of `a` and `b`. `findIntersection(a,b)` should return the same\n * result as `findIntersection(b,a)`.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * EXAMPLES:\n * findIntersection(\"15.1.0\", \"*\") => \"15.1.0\"\n * findIntersection(\"^15\", \"*\") => \"^15\"\n * findIntersection(\">=15\", \"*\") => \">=15\"\n * findIntersection(\"*\", \"*\") => \"*\"\n * findIntersection(\"15.1.0\", \">=1\") => \"15.1.0\"\n * findIntersection(\"^15\", \">=1\") => \"^15\"\n * findIntersection(\">=15\", \">=1\") => \">=15\"\n * findIntersection(\"15.1.0\", \"^15\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15\") => \"^15.2\"\n * findIntersection(\"14\", \"^15\") => undefined\n * findIntersection(\"15.1.0\", \"^15 || ^16\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15 || ^16\") => \"^15.2\"\n * findIntersection(\"14\", \"^15 || ^16\") => undefined\n * findIntersection(\"^15.2 || ^16\", \"^15 || ^16.4\") => \"^15.2 || ^16.4\"\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns the maximum intersecting `ValidRange`, or `undefined` if there is no intersection\n */\nexport function findIntersection(a: ValidRange, b: ValidRange): ValidRange | undefined {\n if (doesASatisfyB(a, b)) {\n return a;\n } else if (doesASatisfyB(b, a)) {\n return b;\n }\n\n // It's safe to assume that `isAnyVersionRange(a)` and `isAnyVersionRange(b)` are false,\n // since a `MATCH_ANY_VERSION_RANGE` would have been satisfied by anything.\n if (isAnyVersionRange(a) || isAnyVersionRange(b)) {\n throw new Error();\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n // If the ranges were equal, they'd both satisfy each other.\n // Otherwise, the higher range should have satisfied the lower range.\n throw new Error();\n }\n\n if (aIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n // keep every version where `bSemVer` is >= `aSemVer`\n // where bVersion has an operator, we need to adjust the version to take into\n // account aVersion, e.g. if a is >=15.2.3 and b is ^15, then the intersection is actually ^15.2.3\n const compatibleBVersions = bVersions\n .map((bVersion) => {\n const bSemVer = coerce(bVersion)!;\n if (bVersion.startsWith(\"^\") && bSemVer.major >= aSemVer.major) {\n return `^${bSemVer.compare(aSemVer) >= 0 ? bSemVer.raw : aSemVer.raw}`;\n }\n return bSemVer.compare(aSemVer) !== -1 ? bVersion : undefined;\n })\n .filter((bVersion): bVersion is string => bVersion != null);\n if (compatibleBVersions.length === 0) {\n return undefined;\n }\n return compatibleBVersions.join(\" || \") as ValidRange;\n }\n if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n // keep every version where `aSemVer` is >= `bSemVer`\n // where aVersion has an operator, we need to adjust the version to take into\n // account bVersion, e.g. if b is >=15.2.3 and a is ^15, then the intersection is actually ^15.2.3\n const compatibleAVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n if (aVersion.startsWith(\"^\") && aSemVer.major >= bSemVer.major) {\n return `^${aSemVer.compare(bSemVer) >= 0 ? aSemVer.raw : bSemVer.raw}`;\n }\n return aSemVer.compare(bSemVer) !== -1 ? aVersion : undefined;\n })\n .filter((aVersion): aVersion is string => aVersion != null);\n if (compatibleAVersions.length === 0) {\n return undefined;\n }\n return compatibleAVersions.join(\" || \") as ValidRange;\n }\n\n const compatibleVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // there is no intersecting `b` major version for this `a` major version\n return undefined;\n }\n if (doesASatisfyB(aVersion as ValidRange, majorMatchingBVersion as ValidRange)) {\n return aVersion;\n } else if (doesASatisfyB(majorMatchingBVersion as ValidRange, aVersion as ValidRange)) {\n return majorMatchingBVersion;\n } else {\n return undefined;\n }\n })\n .filter((aVersion) => aVersion !== undefined);\n if (compatibleVersions.length === 0) {\n return undefined;\n }\n return compatibleVersions.join(\" || \") as ValidRange;\n}\n\n/**\n * Given two version ranges, determine whether `a` satisfies `b`.\n * `a` satisfies `b` iff `a` is a \"more strict than or equal to\" subset of `b`.\n * For example, both `^15` and `^15.2.0` satisfy `^15`, but `^15 || ^16` does not.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * To determine that `a` is \"more strict than or equal to\" `b`, we first\n * split the set of all versions or ranges that are potentially unioned in `a` and `b`.\n * For example, if `a` is `15.0.5`, we produce the set `[ \"15.0.5\" ]`,\n * and if `b` is `^15 || ^16`, we produce the set `[ \"^15\", \"^16\" ]`.\n * `a` is \"more strict than or equal to\" `b` iff each entry in `a`'s set\n * satisfies (equal to or greater than) some entry in `b`.\n *\n * The following version ranges satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.5 || ^16.0.0`\n * - `^15.0.5 || ^16.x.x`\n * - `15.0.5 || 16.0.0`\n * - `^15.0.999 || ^16.0.0`\n * - `^15.0.5 || ^16.0.999`\n * - `^15.0.999`\n * - `^16.0.0`\n * - `16.0.0`\n * The following version ranges do not satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.0 || ^16.0.0`\n * - `^15.0.5 || ^17.0.0`\n * - `^14.0.0 || ^15.0.5 || ^16.0.0`\n * - `^17.0.0`\n * - `17.0.0`\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns `true` if `a` is more strict than or equal to `b`, `false` otherwise\n */\nexport function doesASatisfyB(a: ValidRange, b: ValidRange): boolean {\n if (a === b) {\n return true;\n }\n\n const aIsAnyVersionRange = isAnyVersionRange(a);\n const bIsAnyVersionRange = isAnyVersionRange(b);\n if (bIsAnyVersionRange) {\n return true;\n } else if (aIsAnyVersionRange) {\n // `bIsAnyVersionRange` is `false`\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n const bSemVer = coerce(b)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n } else if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n });\n } else if (aIsGreaterOrEqualVersionRange) {\n // `bIsGreaterOrEqualVersionRange` is `false` (and `bIsAnyVersionRange` is `false`)\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // `a` permits a major version that is not permitted by `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersionIsRange = isMajorVersionRange(aVersion);\n const majorMatchingBSemVer = coerce(majorMatchingBVersion)!;\n const majorMatchingBVersionIsRange = isMajorVersionRange(majorMatchingBVersion);\n\n if (majorMatchingBVersionIsRange) {\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `majorMatchingBSemVer`\n // this is true whether or not `aVersionIsRange`\n return aSemVer.compare(majorMatchingBSemVer) !== -1;\n } else {\n // `majorMatchingBVersionIsRange` is `false`\n if (aVersionIsRange) {\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n // e.g if `b` is `15.5.5`, this is true whether `a` is `^15.0.0`, `^15.5.5`, or `^15.9.9`\n return false;\n } else {\n // `aVersionIsRange` is `false`\n // `a` satisfies `b` if and only if `aSemVer` is equal to `majorMatchingBSemVer`\n return aSemVer.compare(majorMatchingBSemVer) === 0;\n }\n }\n });\n}\n\n/**\n * Returns true if the version evaluates to 'any', e.g. * or x\n */\nfunction isAnyVersionRange(version: string): boolean {\n return MATCH_ANY_VERSION_RANGE.test(version);\n}\n\n/**\n * Retruns true if the version begins with '>='\n */\nfunction isGreaterOrEqualVersionRange(version: string): boolean {\n return MATCH_GREATER_OR_EQUAL_VERSION_RANGE.test(version);\n}\n\nfunction isMajorVersionRange(version: string): boolean {\n return MATCH_MAJOR_VERSION_RANGE.test(version);\n}\n\nexport type ValidRange = string & { _type: \"valid range\" };\nexport function isValidRange(version: string): version is ValidRange {\n return RANGE_REGEX.test(version);\n}\n\ntype IDependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nfunction getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType,\n dependencyName,\n version,\n host,\n}: {\n packageJsonPath: string;\n dependencyType: IDependencyType;\n dependencyName: string;\n version: string;\n host: Host;\n}) {\n return () => {\n mutateJson<PackageJson>(packageJsonPath, host, (packageJson) => {\n if (packageJson[dependencyType] == null) {\n packageJson[dependencyType] = {};\n }\n packageJson[dependencyType]![dependencyName] = version;\n return packageJson;\n });\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\ntype OrderFunction = (context: Context) => (a: string, b: string) => number;\n\nconst Options = r\n .Record({\n order: r.Union(r.Array(r.String), r.Function),\n })\n .Or(r.Undefined);\n\ntype Options = r.Static<typeof Options>;\n\nconst defaultKeyOrder = [\n \"name\",\n \"version\",\n \"description\",\n \"author\",\n \"contributors\",\n \"url\",\n \"license\",\n \"type\",\n \"exports\",\n \"private\",\n \"engines\",\n \"bin\",\n \"types\",\n \"main\",\n \"module\",\n \"typings\",\n \"style\",\n \"sideEffects\",\n \"workspaces\",\n \"husky\",\n \"lint-staged\",\n \"files\",\n \"scripts\",\n \"resolutions\",\n \"dependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"publishConfig\",\n];\n\nexport const packageOrder = makeRule({\n name: \"packageOrder\",\n check: (context, opts) => {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const order: string[] | OrderFunction = opts === undefined ? defaultKeyOrder : opts.order;\n\n const comparator = isOrderFunction(order) ? order(context) : createComparator(order);\n\n const actualOrder = Object.keys(packageJson);\n const expectedOrder = actualOrder.slice().sort(comparator); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: \"Incorrect order of fields in package.json\",\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedPackageJson: Record<string, any> = {};\n\n expectedOrder.forEach((key) => {\n expectedPackageJson[key] = packageJson[key];\n });\n\n context.host.writeJson(packagePath, expectedPackageJson);\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction createComparator(order: ReadonlyArray<string>) {\n return (a: string, b: string) => {\n const aIndex = order.indexOf(a);\n const bIndex = order.indexOf(b);\n\n // if one of the two is missing from the order array, push it further down\n if (aIndex >= 0 && bIndex < 0) {\n return -1;\n } else if (aIndex < 0 && bIndex >= 0) {\n return 1;\n }\n\n // otherwise compare the indexes and use alphabetical as a tie breaker\n const compared = aIndex - bIndex;\n\n if (compared !== 0) {\n return compared;\n } else {\n return a.localeCompare(b);\n }\n };\n}\n\nfunction isOrderFunction(order: ReadonlyArray<string> | OrderFunction): order is OrderFunction {\n return !Array.isArray(order);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Union(\n r\n .Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n })\n .And(\n r.Partial({\n entriesExist: r.Undefined,\n })\n ),\n r\n .Record({\n entriesExist: r.Array(r.String), // enforces existence of keys, but not values\n })\n .And(\n r.Partial({\n entries: r.Undefined,\n })\n ),\n r.Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n entriesExist: r.Array(r.String),\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const packageEntry = makeRule({\n name: \"packageEntry\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n\n if (options.entries) {\n for (const key of Object.keys(options.entries)) {\n const value = options.entries[key];\n\n const entryDiff = diff(JSON.stringify(value) + \"\\n\", (JSON.stringify(packageJson[key]) || \"\") + \"\\n\");\n if (\n (typeof value !== \"object\" && value !== packageJson[key]) ||\n entryDiff == null ||\n !entryDiff.includes(\"Compared values have no visual difference\")\n ) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createStandardizedEntryErrorMessage(key),\n longMessage: entryDiff,\n fixer: () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n input[key] = value;\n return input;\n });\n },\n });\n }\n }\n }\n\n if (options.entriesExist) {\n for (const key of options.entriesExist) {\n if (packageJson[key] === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createExpectedEntryErrorMessage(key),\n });\n }\n }\n }\n },\n optionsRuntype: Options,\n});\n\nexport function createStandardizedEntryErrorMessage(key: string) {\n return `Expected standardized entry for '${key}'`;\n}\n\nexport function createExpectedEntryErrorMessage(key: string) {\n return `Expected entry for '${key}' to exist`;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Record({\n scripts: r.Dictionary(\n r.Union(\n r.String,\n r.Record({\n options: r.Array(r.String.Or(r.Undefined)),\n fixValue: r.Union(r.String, r.Undefined, r.Literal(false)).optional(),\n })\n )\n ), // string => string\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const MSG_NO_SCRIPTS_BLOCK = \"No scripts block in package.json\";\n\nexport const packageScript = makeRule({\n name: \"packageScript\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n if (packageJson.scripts === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: MSG_NO_SCRIPTS_BLOCK,\n fixer: () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n input.scripts = {};\n return input;\n });\n },\n });\n return;\n }\n for (const [name, value] of Object.entries(options.scripts)) {\n const allowedValues = new Set<string | undefined>();\n let fixValue: string | undefined | false;\n let allowEmpty = false;\n let fixToEmpty = false;\n\n if (typeof value === \"string\") {\n allowedValues.add(value);\n fixValue = value;\n } else {\n for (const q of value.options) {\n if (q === undefined) {\n allowEmpty = true;\n }\n allowedValues.add(q);\n }\n fixToEmpty = Object.prototype.hasOwnProperty.call(value, \"fixValue\") && value.fixValue === undefined;\n fixValue = value.fixValue;\n }\n\n const actualValue = packageJson.scripts[name];\n\n if (!allowedValues.has(actualValue) && !(allowEmpty === true && actualValue === undefined)) {\n let fixer;\n\n if (fixValue !== false && (fixValue !== undefined || fixToEmpty === true)) {\n const q = fixValue;\n fixer = () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n if (fixToEmpty && q === undefined) {\n delete input.scripts![name];\n } else {\n input.scripts![name] = q!;\n }\n return input;\n });\n };\n }\n\n const validOptionsString = Array.from(allowedValues.values())\n .map((a) => (a === undefined ? \"(empty)\" : `'${a}'`))\n .join(\", \");\n\n context.addError({\n file: context.getPackageJsonPath(),\n message: `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,\n longMessage: diff(validOptionsString + \"\\n\", (packageJson.scripts[name] || \"\") + \"\\n\"),\n fixer,\n });\n }\n }\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst DEFAULT_TSCONFIG_FILENAME = \"tsconfig.json\";\n\nconst Options = r\n .Partial({\n file: r.String,\n generator: r.Function,\n tsconfigReferenceFile: r.String,\n template: r.Record({}).Or(r.String),\n templateFile: r.String,\n excludedReferences: r.Array(r.String).Or(r.Undefined),\n additionalReferences: r.Array(r.String).Or(r.Undefined),\n })\n .withConstraint(({ generator, template, templateFile }) => {\n let count = 0;\n if (generator) {\n count++;\n }\n if (template) {\n count++;\n }\n if (templateFile) {\n count++;\n }\n\n return count === 1 || \"Expect one of { generator, template, templateFile }\";\n });\n\nexport interface Options extends r.Static<typeof Options> {}\n\nexport const standardTsconfig = makeRule({\n name: \"standardTsconfig\",\n check: async (context, opts) => {\n const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;\n const fullPath = path.resolve(context.packageDir, tsconfigFileName);\n const generator = getGenerator(context, opts);\n const expectedContent = await generator(context);\n\n const actualContent = context.host.exists(fullPath)\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : undefined;\n\n if (expectedContent === undefined) {\n context.addWarning({\n file: fullPath,\n message: \"Excluding from expect-standard-tsconfig\",\n });\n return;\n }\n\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nfunction getGenerator(context: Context, opts: Options) {\n if (opts.generator) {\n return opts.generator;\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = JSON.parse(context.host.readFile(fullPath, { encoding: \"utf-8\" }));\n\n return makeGenerator(template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);\n } else if (opts.template) {\n return makeGenerator(opts.template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);\n } else {\n throw new Error(\"Unable to make generator\");\n }\n}\n\nfunction makeGenerator(\n template: any,\n excludedReferences: ReadonlyArray<string> | undefined,\n additionalReferences: ReadonlyArray<string> | undefined,\n tsconfigReferenceFile?: string\n) {\n return async function generator(context: Context) {\n template = {\n ...template,\n references: [],\n }; // make a copy and ensure we have a references array\n\n const nameToDirectory = await context.getWorkspaceContext().getPackageNameToDir();\n\n const packageJson = context.getPackageJson();\n const deps = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];\n for (const dep of deps) {\n const packageDir = nameToDirectory.get(dep);\n if (packageDir !== undefined && (excludedReferences === undefined || !matchesAnyGlob(dep, excludedReferences))) {\n const absoluteReferencePath =\n tsconfigReferenceFile !== undefined ? path.join(packageDir, tsconfigReferenceFile) : packageDir;\n template.references.push({\n path: path.relative(context.packageDir, absoluteReferencePath),\n });\n }\n }\n\n if (additionalReferences) {\n for (const additionalReference of additionalReferences) {\n template.references.push({\n path: additionalReference,\n });\n }\n }\n\n return JSON.stringify(template, undefined, 2) + \"\\n\";\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as globby from \"globby\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Undefined;\n\ntype Options = r.Static<typeof Options>;\n\n// Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)\nexport const nestedWorkspaces = makeRule({\n name: \"nestedWorkspaces\",\n check: (context) => {\n const rootPackageJson = context.getWorkspaceContext().getPackageJson();\n\n // Expand a set of globs covering all package.json files in the entire repo (except the root)\n const packageJsonPaths = globby.globbySync([\"*/**/package.json\", \"!**/node_modules/**\"]);\n\n const workspaces = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : rootPackageJson.workspaces !== undefined\n ? rootPackageJson.workspaces.packages\n : undefined;\n\n if (workspaces === undefined && packageJsonPaths.length > 0) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: 'The \"workspace\" field is missing, even though there are workspaces in the repository.',\n });\n return;\n }\n\n // Build a set of globs for each package.json that exists in packages specified by a workspace.\n const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);\n\n // Expand the globs to get an array of all package.json files that are in packages specified by a workspace.\n const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, \"!**/node_modules/**\"]);\n\n // Ensure there are no package.jsons which are not included in the globbed workspaces set\n const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));\n\n if (difference.length !== 0) {\n const differencesList = difference.map((packageJsonPath) => path.dirname(packageJsonPath)).join(\", \");\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n `The \"workspace\" field is missing one or more values: ${differencesList}. ` +\n 'You may be able to use a glob to avoid listing each workspace individually, e.g. \"packages/nested-workspace/*\".',\n });\n }\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst Options = r.Partial({\n dependencies: r.Dictionary(r.String),\n devDependencies: r.Dictionary(r.String),\n peerDependencies: r.Dictionary(r.String),\n optionalDependencies: r.Dictionary(r.String),\n});\n\ntype Options = r.Static<typeof Options>;\n\nexport const requireDependency = makeRule({\n name: \"requireDependency\",\n check: function expectPackageEntry(context: Context, options: Options) {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n [\n \"dependencies\" as const,\n \"devDependencies\" as const,\n \"peerDependencies\" as const,\n \"optionalDependencies\" as const,\n ].forEach((type) => {\n if (!options[type]) {\n return;\n }\n\n if (packageJson[type] === undefined) {\n context.addError({\n file: packageJsonPath,\n message: `No ${type} block, cannot add required ${type}.`,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = options[type];\n return input;\n });\n },\n });\n return;\n }\n\n for (const [dep, version] of Object.entries(options[type]!)) {\n if (packageJson[type][dep] !== version) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency ${dep}@${version}`,\n longMessage: diff(`${dep}@${version}\\n`, `${dep}@${packageJson[type][dep] || \"missing\"}\\n`)!,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = { ...input[type], [dep]: version };\n return input;\n });\n },\n });\n }\n }\n });\n },\n optionsRuntype: Options,\n});\n"],"mappings":"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","names":["r","Options","path","r","Options","diff","r","Options","diff","r","Options","diff","path","r","Options","diff","mutateJson","path","r","coerce","resolvePackagePath","Options","resolvePackagePath","coerce","mutateJson","diff","r","Options","arrayOrderCompare","diff","mutateJson","diff","r","Options","diff","mutateJson","mutateJson","diff","r","Options","mutateJson","diff","matchesAnyGlob","diff","path","r","Options","diff","matchesAnyGlob","path","r","Options","mutateJson","diff","r","Options","mutateJson","diff"]}
1
+ {"version":3,"sources":["../../src/alphabeticalDependencies.ts","../../src/util/checkAlpha.ts","../../src/alphabeticalScripts.ts","../../src/bannedDependencies.ts","../../src/util/packageDependencyGraphService.ts","../../src/consistentDependencies.ts","../../src/consistentVersions.ts","../../src/fileContents.ts","../../src/mustSatisfyPeerDependencies.ts","../../src/packageOrder.ts","../../src/packageEntry.ts","../../src/packageScript.ts","../../src/standardTsconfig.ts","../../src/nestedWorkspaces.ts","../../src/requireDependency.ts"],"sourcesContent":["/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as r from \"runtypes\";\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Undefined;\n\nexport const alphabeticalDependencies = makeRule({\n name: \"alphabeticalDependencies\",\n check: (context) => {\n checkAlpha(context, \"dependencies\");\n checkAlpha(context, \"devDependencies\");\n checkAlpha(context, \"peerDependencies\");\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\n\nexport function checkAlpha(\n context: Context,\n block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"scripts\"\n) {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const blockToSort = packageJson[block];\n\n if (blockToSort === undefined) {\n return;\n }\n\n const actualOrder = Object.keys(blockToSort);\n const expectedOrder = actualOrder.slice().sort(); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: createIncorrectOrderErrorMessage(block, packageJson.name!),\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedDependencies: Record<string, string> = {};\n\n expectedOrder.forEach((dep) => {\n expectedDependencies[dep] = blockToSort[dep];\n });\n\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createIncorrectOrderErrorMessage(block: string, packageName: string) {\n return `Incorrect order of ${block} in ${packageName}'s package.json`;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as r from \"runtypes\";\nimport { checkAlpha } from \"./util/checkAlpha.js\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Undefined;\n\nexport const alphabeticalScripts = makeRule({\n name: \"alphabeticalScripts\",\n check: (context) => {\n checkAlpha(context, \"scripts\");\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { AggregateTiming } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nimport { IPackageDependencyGraphNode, PackageDependencyGraphService } from \"./util/packageDependencyGraphService.js\";\n// FIXME: This rule is messed. bannedTransitiveDependencies doesnt glob\n\nconst bannedDepGlobsField = r.Union(\n r.Array(r.String),\n r.Record({\n glob: r.Array(r.String).optional(),\n exact: r.Array(r.String).optional(),\n })\n);\n\nconst Options = r.Union(\n r.Record({\n bannedDependencies: bannedDepGlobsField,\n bannedTransitiveDependencies: r.Undefined.optional(),\n }),\n\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String),\n }),\n\n r.Record({\n bannedDependencies: bannedDepGlobsField.optional(),\n bannedTransitiveDependencies: r.Array(r.String).optional(),\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\n/**\n * We use this locally to avoid making a billion sets. Because check is called once per package\n * (with the exact same config object reference) we can save quite a bit of time by reusing this cache.\n */\nconst setCache = new Map<ReadonlyArray<string>, Set<string>>();\n\nconst aggregateTiming = new AggregateTiming(\":bannedDependencies stats\");\n\nexport const bannedDependencies = makeRule({\n name: \"bannedDependencies\",\n check: (context, opts, extra) => {\n aggregateTiming.start(extra?.id ?? \"unknown id\");\n\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const curDeps = packageJson.dependencies && Object.keys(packageJson.dependencies);\n const curDevDeps = packageJson.devDependencies && Object.keys(packageJson.devDependencies);\n const curPeerDeps = packageJson.peerDependencies && Object.keys(packageJson.peerDependencies);\n\n const { bannedDependencies: banned, bannedTransitiveDependencies: transitives } = opts;\n\n const globs = banned && (Array.isArray(banned) ? banned : banned.glob);\n const exacts = banned && (Array.isArray(banned) ? undefined : banned.exact);\n\n const violations = new Set<string>();\n\n if (globs) {\n if (curDeps) populateProblemsGlobs(globs, curDeps, violations);\n if (curDevDeps) populateProblemsGlobs(globs, curDevDeps, violations);\n if (curPeerDeps) populateProblemsGlobs(globs, curPeerDeps, violations);\n }\n\n if (exacts) {\n let set = setCache.get(exacts);\n if (set === undefined) {\n set = new Set(exacts);\n setCache.set(exacts, set);\n }\n if (curDeps) populateProblemsExact(set, curDeps, violations);\n if (curDevDeps) populateProblemsExact(set, curDevDeps, violations);\n if (curPeerDeps) populateProblemsExact(set, curPeerDeps, violations);\n }\n\n if (violations.size > 0) {\n context.addError({\n file: packagePath,\n message:\n `Found ${violations.size} banned dependencies of package.json:\\n\\t` +\n Array.from(violations)\n .map((v) => `'${v}'`)\n .join(\", \"),\n });\n }\n\n if (transitives) {\n let set = setCache.get(transitives);\n if (set === undefined) {\n set = new Set(transitives);\n setCache.set(transitives, set);\n }\n checkTransitives(context, set);\n }\n\n aggregateTiming.stop();\n },\n optionsRuntype: Options,\n printStats: () => {\n aggregateTiming.printResults();\n },\n});\n\nfunction populateProblemsExact(banned: Set<string>, dependencies: ReadonlyArray<string>, violations: Set<string>) {\n for (const dependency of dependencies) {\n if (banned.has(dependency)) {\n violations.add(dependency);\n }\n }\n}\n\nfunction populateProblemsGlobs(\n bannedDependencyGlobs: ReadonlyArray<string>,\n dependencies: ReadonlyArray<string>,\n violations: Set<string>\n) {\n for (const dependency of dependencies) {\n if (matchesAnyGlob(dependency, bannedDependencyGlobs)) {\n violations.add(dependency);\n }\n }\n}\n\n// This function is slow. God help you if you use this on a big repo\nfunction checkTransitives(context: Context, banned: Set<string>) {\n const graphService = new PackageDependencyGraphService();\n const root = graphService.buildDependencyGraph(path.resolve(context.getPackageJsonPath()), context.host);\n for (const { dependencies, importPath } of graphService.traverse(root)) {\n for (const [dependency] of dependencies) {\n if (banned.has(dependency)) {\n // Remove the starting package since it's obvious in CLI output.\n const [, ...importPathWithoutRoot] = importPath;\n const pathing = [...importPathWithoutRoot.map(nameOrPackageJsonPath), dependency].join(\" -> \");\n\n context.addError({\n file: root.paths.packageJsonPath,\n message: `Banned transitive dependencies in repo: ${pathing}`,\n });\n }\n }\n }\n}\n\nfunction nameOrPackageJsonPath(node: IPackageDependencyGraphNode): string {\n return node.packageJson.name ?? node.paths.packageJsonPath;\n}\n","/**\n * @license Copyright 2019 Palantir Technologies, Inc. All rights reserved.\n */\n\nimport { Host, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport resolvePackagePath from \"resolve-package-path\";\n\n/** Interface for a node in a package dependency graph. */\nexport interface IPackageDependencyGraphNode {\n packageJson: PackageJson;\n dependencies: Map<string, IPackageDependencyGraphNode>;\n paths: {\n packageJsonPath: string;\n rootDirectory: string;\n };\n}\n\n/** Service abstraction for constructing and traversing package dependency graphs. */\nexport interface IPackageDependencyGraphService {\n /** Construct a graph of package dependencies. */\n buildDependencyGraph(packageJsonPath: string, host: Host, maxDepth?: number): IPackageDependencyGraphNode;\n\n /** Traverse a package dependency graph. */\n traverse(\n root: IPackageDependencyGraphNode,\n opts?: {\n /** Traverse each unique path to a given package (potentially slow). */\n traverseAllPaths?: boolean;\n }\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }>;\n}\n\n/** Default implementation of the package dependency graph service. */\nexport class PackageDependencyGraphService implements IPackageDependencyGraphService {\n /** Construct a graph of package dependencies and return the root node. */\n public buildDependencyGraph(\n startPackageJsonPath: string,\n host: Host,\n maxDepth?: number\n ): IPackageDependencyGraphNode {\n const nodes = new Map<string, IPackageDependencyGraphNode>();\n const visit = (packageJsonPath: string, currentDepth: number): IPackageDependencyGraphNode => {\n if (nodes.has(packageJsonPath)) {\n return nodes.get(packageJsonPath)!;\n }\n\n const packageJson: PackageJson = host.readJson(packageJsonPath);\n const node: IPackageDependencyGraphNode = {\n packageJson,\n dependencies: new Map<string, IPackageDependencyGraphNode>(),\n paths: {\n packageJsonPath,\n rootDirectory: path.dirname(packageJsonPath),\n },\n };\n\n // It's important that we register the node before visiting its dependencies to avoid cycles\n nodes.set(packageJsonPath, node);\n\n const nextDepth = currentDepth + 1;\n if (maxDepth == null || nextDepth <= maxDepth) {\n const dependencies = packageJson.dependencies != null ? Object.keys(packageJson.dependencies) : [];\n for (const dependency of dependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(dependency, node.paths.rootDirectory);\n if (dependencyPackageJsonPath == null) {\n throw new Error(`Could not resolve ${dependency} from ${node.paths.rootDirectory}`);\n }\n\n node.dependencies.set(dependency, visit(dependencyPackageJsonPath, nextDepth));\n }\n }\n\n return node;\n };\n\n return visit(startPackageJsonPath, 0);\n }\n\n /** Traverse a package dependency graph with an iterator. */\n public *traverse(\n root: IPackageDependencyGraphNode,\n opts = { traverseAllPaths: false }\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }> {\n const visited = new Set<IPackageDependencyGraphNode>();\n\n function* visit(\n node: IPackageDependencyGraphNode,\n importPath: IPackageDependencyGraphNode[] = []\n ): IterableIterator<IPackageDependencyGraphNode & { importPath: IPackageDependencyGraphNode[] }> {\n // Don't visit a package more than once unless explicitly asked to traverse all paths\n if (!opts.traverseAllPaths && visited.has(node)) {\n return;\n }\n\n // Break cycles when traversing all paths\n if (importPath.indexOf(node) !== -1) {\n return;\n }\n\n // Visit the node\n visited.add(node);\n importPath = [...importPath, node];\n yield { ...node, importPath };\n\n // Recursively visit the node's dependencies\n for (const dependency of node.dependencies.values()) {\n yield* visit(dependency, importPath);\n }\n }\n\n yield* visit(root);\n }\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r\n .Record({\n ignoredDependencies: r.Array(r.String).Or(r.Undefined),\n })\n .Or(r.Undefined);\nexport type Options = r.Static<typeof Options>;\n\nconst skippedVersions = [\"*\", \"latest\"];\n\nexport const consistentDependencies = makeRule({\n name: \"consistentDependencies\",\n check: (context, args) => {\n checkDeps(context, args, \"dependencies\");\n checkDeps(context, args, \"devDependencies\");\n // we don't check peer deps since they can be more lenient\n },\n optionsRuntype: Options,\n});\n\nfunction checkDeps(context: Context, args: Options, block: \"dependencies\" | \"devDependencies\" | \"peerDependencies\") {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n const dependencies = packageJson[block];\n\n const workspacePackageJson = context.getWorkspaceContext().getPackageJson();\n const workspaceDependencies = workspacePackageJson[block];\n\n const ignoredDeps = args?.ignoredDependencies ?? [];\n const depsToCheck =\n workspaceDependencies == null || ignoredDeps.length === 0\n ? workspaceDependencies\n : omit(workspaceDependencies, ignoredDeps);\n\n if (dependencies === undefined || depsToCheck === undefined) {\n return;\n }\n\n const expectedDependencies = {\n ...dependencies,\n ...filterKeys(depsToCheck, dependencies),\n };\n\n if (JSON.stringify(dependencies) !== JSON.stringify(expectedDependencies)) {\n context.addError({\n file: packagePath,\n message: `Inconsistent ${block} with root in package.json`,\n longMessage: diff(expectedDependencies, dependencies, { expand: true }),\n fixer: () => {\n const newPackageJson = { ...packageJson };\n newPackageJson[block] = expectedDependencies;\n context.host.writeJson(packagePath, newPackageJson);\n },\n });\n }\n}\n\nfunction filterKeys(ob: Record<string, string>, filterOb: Record<string, string>) {\n const newOb: Record<string, any> = {};\n\n for (const key of Object.keys(filterOb)) {\n if (ob[key] !== undefined && skippedVersions.indexOf(filterOb[key]) === -1) {\n newOb[key] = ob[key];\n }\n }\n\n return newOb;\n}\n\nfunction omit<T>(obj: Record<string, T>, keysToOmit: readonly string[]): Record<string, T> {\n const newObj: Record<string, T> = {};\n\n const filtered = Object.entries(obj).filter(([key]) => !keysToOmit.includes(key));\n for (const [key, value] of filtered) {\n newObj[key] = value;\n }\n\n return newObj;\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as r from \"runtypes\";\nimport { coerce, SemVer } from \"semver\";\nimport { makeRule } from \"./util/makeRule.js\";\nexport const Options = r.Record({\n matchDependencyVersions: r.Dictionary(r.Union(r.String, r.Array(r.String))),\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const consistentVersions = makeRule({\n name: \"consistentVersions\",\n check: checkConsistentVersions,\n optionsRuntype: Options,\n});\n\nfunction checkConsistentVersions(context: Context, options: Options) {\n for (const [dependencyPackageName, expectedPackageDependencyValue] of Object.entries(\n options.matchDependencyVersions\n )) {\n if (Array.isArray(expectedPackageDependencyValue)) {\n ensurePackageMatchesSomeVersion(context, dependencyPackageName, expectedPackageDependencyValue);\n } else {\n ensurePackageIsCorrectVersion(context, dependencyPackageName, expectedPackageDependencyValue);\n }\n }\n}\n\nconst ensurePackageIsCorrectVersion = (\n context: Context,\n dependencyPackageName: string,\n expectedPackageDependencyValue: string\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const expectedPackageDependencyVersion = coerce(expectedPackageDependencyValue);\n if (expectedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed expected package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${expectedPackageDependencyValue}'`\n );\n }\n\n const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null &&\n actualPackageDependencyVersion.raw !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDependencyValue}' instead.`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.dependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n\n const actualPackageDevDependencyValue =\n packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(actualPackageDevDependencyValue);\n if (\n actualPackageDevDependencyVersion != null &&\n actualPackageDevDependencyVersion.raw !== expectedPackageDependencyVersion.raw\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match version defined in monorepolint configuration '${expectedPackageDependencyValue}', got '${actualPackageDevDependencyValue}' instead`,\n fixer: () =>\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input.devDependencies![dependencyPackageName] = expectedPackageDependencyValue;\n return input;\n }),\n });\n }\n};\n\nconst ensurePackageMatchesSomeVersion = (\n context: Context,\n dependencyPackageName: string,\n acceptedPackageDependencyValues: string[]\n) => {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n const acceptedPackageDependencyVersions: SemVer[] = acceptedPackageDependencyValues.map(\n (acceptedPackageDependencyValue) => {\n const acceptedPackageDependencyVersion = coerce(acceptedPackageDependencyValue);\n if (acceptedPackageDependencyVersion == null) {\n throw new Error(\n `Malformed accepted package dependency version defined in monorepolint configuration: ${dependencyPackageName} @ '${acceptedPackageDependencyValue}'`\n );\n }\n return acceptedPackageDependencyVersion;\n }\n );\n\n const actualPackageDependencyValue = packageJson.dependencies && packageJson.dependencies[dependencyPackageName];\n const actualPackageDependencyVersion = coerce(actualPackageDependencyValue);\n if (\n actualPackageDependencyVersion != null &&\n acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) => actualPackageDependencyVersion.raw !== acceptedPackageDependencyVersion.raw\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency on ${dependencyPackageName} to match one of '${JSON.stringify(\n acceptedPackageDependencyValues\n )}', got '${actualPackageDependencyValue}' instead.`,\n });\n }\n\n const actualPackageDevDependencyValue =\n packageJson.devDependencies && packageJson.devDependencies[dependencyPackageName];\n const actualPackageDevDependencyVersion = coerce(actualPackageDevDependencyValue);\n if (\n actualPackageDevDependencyVersion != null &&\n acceptedPackageDependencyVersions.every(\n (acceptedPackageDependencyVersion) =>\n actualPackageDevDependencyVersion.raw !== acceptedPackageDependencyVersion.raw\n )\n ) {\n context.addError({\n file: packageJsonPath,\n message: `Expected devDependency on ${dependencyPackageName} to match one of '${JSON.stringify(\n acceptedPackageDependencyValues\n )}', got '${actualPackageDevDependencyValue}' instead.`,\n });\n }\n};\n","/*!\n * Copyright 2023 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\nconst Options = r.Union(\n r.Record({\n file: r.String,\n generator: r.Function,\n template: r.Undefined.optional(),\n templateFile: r.Undefined.optional(),\n }),\n\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.String,\n templateFile: r.Undefined.optional(),\n }),\n\n r.Record({\n file: r.String,\n generator: r.Undefined.optional(),\n template: r.Undefined.optional(),\n templateFile: r.String,\n })\n);\n\ntype Options = r.Static<typeof Options>;\n\nexport const fileContents = makeRule({\n name: \"fileContents\",\n check: (context, opts) => {\n const fullPath = path.join(context.packageDir, opts.file);\n const expectedContent = getExpectedContents(context, opts);\n\n const pathExists = context.host.exists(fullPath);\n const actualContent = pathExists ? context.host.readFile(fullPath, { encoding: \"utf-8\" }) : undefined;\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n if (expectedContent === undefined) {\n if (pathExists) context.host.deleteFile(fullPath);\n } else {\n context.host.mkdir(path.dirname(fullPath), { recursive: true });\n context.host.writeFile(fullPath, expectedContent, { encoding: \"utf-8\" });\n }\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nconst optionsCache = new Map<Options, ((context: Context) => string | undefined) | string | undefined>();\n\nfunction getExpectedContents(context: Context, opts: Options) {\n // we need to use has because undefined is a valid value in the cache\n if (optionsCache.has(opts)) {\n const cachedEntry = optionsCache.get(opts);\n if (cachedEntry && typeof cachedEntry === \"function\") {\n return cachedEntry(context);\n }\n return cachedEntry;\n }\n\n if (opts.generator) {\n optionsCache.set(opts, opts.generator);\n return opts.generator(context) as string | undefined; // we have no guarentee its the right kind of function\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = context.host.readFile(fullPath, { encoding: \"utf-8\" });\n\n optionsCache.set(opts, template);\n return template;\n } else {\n optionsCache.set(opts, opts.template);\n return opts.template;\n }\n}\n","/*!\n * Copyright 2020 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { Host, mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { coerce } from \"semver\";\nimport resolvePackagePath from \"resolve-package-path\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst Options = r.Union(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n }),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n dependencyWhitelist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n })\n .And(\n r.Partial({\n enforceForDevDependencies: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyBlacklist: r.Undefined,\n })\n ),\n r\n .Record({\n skipUnparseableRanges: r.Boolean,\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n dependencyWhitelist: r.Undefined,\n })\n ),\n r\n .Record({\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n .And(\n r.Partial({\n skipUnparseableRanges: r.Undefined,\n })\n ),\n r.Record({\n skipUnparseableRanges: r.Boolean,\n dependencyWhitelist: r.Array(r.String),\n dependencyBlacklist: r.Array(r.String),\n enforceForDevDependencies: r.Boolean,\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const mustSatisfyPeerDependencies = makeRule({\n name: \"mustSatisfyPeerDependencies\",\n check: checkSatisfyPeerDependencies,\n optionsRuntype: Options,\n});\n\n/**\n * separating on `|`, this regex allows any of the following formats:\n * - `*`\n * - `x`\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_ANY_VERSION_RANGE = /^(\\*|x)$/;\n\n/**\n * This regex allows any of the following formats:\n * - `>=15`\n * - `>=15.2`\n * - `>=15.2.1`\n * - `>=15.2.1-rc.0`\n * - `>=15.2.1+sha`\n * - `>=15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_GREATER_OR_EQUAL_VERSION_RANGE =\n /^>= ?\\d+(?:\\.\\d+|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$/;\n\n/**\n * This regex allows any of the following formats:\n * - `15`\n * - `^15`\n * - `15.x`\n * - `^15.x`\n * - `15.x.x`\n * - `^15.x.x`\n * - `^15.2`\n * - `^15.2.x`\n * - `^15.2.1`\n * - `^15.2.1-rc.0`\n * - `^15.2.1+sha`\n * - `^15.2.1-rc.0+sha`\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n */\nexport const MATCH_MAJOR_VERSION_RANGE =\n /^(?:\\^?\\d+|\\^?\\d+\\.x|\\^?\\d+\\.x\\.x|\\^\\d+\\.\\d+|\\^\\d+\\.\\d+\\.x|\\^\\d+\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)$/;\n\n/**\n * Does not currently accept `<`, `<=`, `>`, `=` or `-` for ranges (e.g. `> 2.5.1 < 3` or `1.0.0 - 1.2.0`),\n * though it will accept isolated `>=` ranges (e.g. `>=2.5.1`, but not `^1 || >=2.5.1`)\n *\n * See https://semver.org/#spec-item-9 for details about semver formatting, and\n * https://regex101.com/r/vkijKf/1/ for a sample Regex.\n *\n * Note that the semver spec does _not_ specify npm range syntax. (`^`, `||`, `~`, `>`, etc.)\n *\n * More info: https://docs.npmjs.com/about-semantic-versioning\n *\n * TODO: accept minor pins `~4.2.1`\n */\nexport const RANGE_REGEX =\n /^(\\*|x|>= ?\\d+(?:\\.\\d+|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?|\\^?\\d+(\\.x|\\.x\\.x|\\.\\d+|\\.\\d+\\.x|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?( \\|\\| \\^?\\d+(\\.x|\\.x\\.x|\\.\\d+|\\.\\d+\\.x|\\.\\d+\\.\\d+(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?)*)$/;\n\ninterface IPeerDependencyRequirement {\n fromPackageName: string;\n range: ValidRange;\n}\n\ninterface IResolvedPeerDependencyRequirement {\n fromPeerDependencyRequirements: IPeerDependencyRequirement[];\n range: ValidRange;\n}\n\nfunction checkSatisfyPeerDependencies(context: Context, opts: Options) {\n const { dependencyBlacklist, dependencyWhitelist, enforceForDevDependencies, skipUnparseableRanges } = opts;\n const packageJsonPath = path.resolve(context.getPackageJsonPath());\n const packageJson: PackageJson = context.host.readJson(packageJsonPath);\n const packageDependencies = packageJson.dependencies || {};\n const packageDevDependencies = packageJson.devDependencies || {};\n const packagePeerDependencies = packageJson.peerDependencies || {};\n const packageName = packageJson.name || packageJsonPath;\n\n // check that no peer dependencies are also declared as regular dependencies\n for (const [peerDependencyName, peerDependencyRange] of Object.entries(packagePeerDependencies)) {\n if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {\n continue;\n }\n\n const dependencyRange = packageDependencies[peerDependencyName];\n if (dependencyRange != null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[0] Package ${packageName} has overloaded ${peerDependencyName} dependencies.\\n\\t` +\n `Peer dependency '${peerDependencyRange}' and regular dependency '${dependencyRange}'.`,\n });\n }\n }\n\n // map of all inherited peer dependency requirements\n const allRequiredPeerDependencies: { [peerDependencyName: string]: IPeerDependencyRequirement[] } = {};\n\n // for each of this package's dependencies, add the dependency's peer requirements into `allRequiredPeerDependencies`\n const allDependencies = enforceForDevDependencies\n ? [...Object.keys(packageDependencies), ...Object.keys(packageDevDependencies)]\n : Object.keys(packageDependencies);\n for (const dependency of allDependencies) {\n const dependencyPackageJsonPath = resolvePackagePath(dependency, path.dirname(packageJsonPath));\n if (dependencyPackageJsonPath == null) {\n throw new Error(`Could not resolve ${dependency} from ${path.dirname(packageJsonPath)}`);\n }\n const dependencyPackageJson: PackageJson = context.host.readJson(dependencyPackageJsonPath);\n const requiredPeerDependencies = dependencyPackageJson.peerDependencies;\n if (requiredPeerDependencies == null) {\n continue;\n }\n for (const [peerDependencyName, range] of Object.entries(requiredPeerDependencies)) {\n if (shouldSkipPackage({ dependencyBlacklist, dependencyWhitelist, packageName: peerDependencyName })) {\n continue;\n }\n\n if (!isValidRange(range)) {\n const message = `Unable to parse ${dependencyPackageJson.name}'s ${peerDependencyName} peer dependency range '${range}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: dependencyPackageJsonPath, message });\n continue;\n }\n throw new Error(message);\n }\n if (allRequiredPeerDependencies[peerDependencyName] == null) {\n allRequiredPeerDependencies[peerDependencyName] = [];\n }\n allRequiredPeerDependencies[peerDependencyName].push({ fromPackageName: dependencyPackageJson.name!, range });\n }\n }\n\n for (const [peerDependencyName, peerDependencyRequirements] of Object.entries(allRequiredPeerDependencies)) {\n // for each inherited peer dependency, determine the strictest range\n let mostStrictPeerRequirement: IResolvedPeerDependencyRequirement = {\n fromPeerDependencyRequirements: [peerDependencyRequirements[0]],\n range: peerDependencyRequirements[0].range,\n };\n for (const peerRequirement of peerDependencyRequirements) {\n if (doesASatisfyB(mostStrictPeerRequirement.range, peerRequirement.range)) {\n continue;\n } else if (doesASatisfyB(peerRequirement.range, mostStrictPeerRequirement.range)) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [peerRequirement],\n range: peerRequirement.range,\n };\n } else {\n const maybeIntersection = findIntersection(peerRequirement.range, mostStrictPeerRequirement.range);\n if (maybeIntersection !== undefined) {\n mostStrictPeerRequirement = {\n fromPeerDependencyRequirements: [\n ...mostStrictPeerRequirement.fromPeerDependencyRequirements,\n peerRequirement,\n ],\n range: maybeIntersection,\n };\n } else {\n context.addError({\n file: packageJsonPath,\n message:\n `[1] Package ${packageName} has conflicting inherited ${peerDependencyName} peer dependencies.\\n\\t` +\n `Dependency ${peerRequirement.fromPackageName} requires '${peerRequirement.range}' but\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n }\n\n // if this package has a dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n const packageDependencyRange = packageDependencies[peerDependencyName];\n if (packageDependencyRange != null) {\n if (!isValidRange(packageDependencyRange)) {\n const message = `Unable to parse ${packageName}'s ${peerDependencyName} dependency range '${packageDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (!doesASatisfyB(packageDependencyRange, mostStrictPeerRequirement.range)) {\n context.addError({\n file: packageJsonPath,\n message:\n `[2] Package ${packageName} dependency on ${peerDependencyName} '${packageDependencyRange}' does not satisfy inherited peer dependencies.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n });\n }\n }\n\n // for every inherited peer dependency, this package must declare a dependency or peer dependency\n // equal to or stricter than `mostStrictPeerRequirement`\n const packagePeerDependencyRange = packagePeerDependencies[peerDependencyName];\n if (packageDependencyRange == null && packagePeerDependencyRange == null) {\n context.addError({\n file: packageJsonPath,\n message:\n `[3] Package ${packageName} is missing required ${peerDependencyName} dependency.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n\n // if this package has a peer dependency on an inherited peer dependency,\n // the range must be equal to or stricter than `mostStrictPeerRequirement`\n if (packagePeerDependencyRange != null) {\n if (!isValidRange(packagePeerDependencyRange)) {\n const message = `Unable to parse ${packageName}'s ${peerDependencyName} peer dependency range '${packagePeerDependencyRange}'.`;\n if (skipUnparseableRanges) {\n context.addWarning({ file: packageJsonPath, message });\n } else {\n throw new Error(message);\n }\n } else if (!doesASatisfyB(packagePeerDependencyRange, mostStrictPeerRequirement.range)) {\n context.addError({\n file: packageJsonPath,\n message:\n `[4] Package ${packageName} peer dependency on ${peerDependencyName} '${packagePeerDependencyRange}' is not strict enough.\\n\\t` +\n getMostStrictStatement(mostStrictPeerRequirement),\n fixer: getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType: \"peerDependencies\",\n dependencyName: peerDependencyName,\n version: mostStrictPeerRequirement.range,\n host: context.host,\n }),\n });\n }\n }\n }\n}\n\nfunction shouldSkipPackage({\n dependencyBlacklist,\n dependencyWhitelist,\n packageName,\n}: {\n dependencyBlacklist?: string[];\n dependencyWhitelist?: string[];\n packageName: string;\n}) {\n // blacklist should take precedance\n if (\n (dependencyBlacklist != null && dependencyBlacklist.includes(packageName)) ||\n (dependencyWhitelist != null && !dependencyWhitelist.includes(packageName))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getMostStrictStatement(mostStrictPeerRequirement: IResolvedPeerDependencyRequirement) {\n if (mostStrictPeerRequirement.fromPeerDependencyRequirements.length === 1) {\n const dependencyName = mostStrictPeerRequirement.fromPeerDependencyRequirements[0].fromPackageName;\n return `Dependency ${dependencyName} requires '${mostStrictPeerRequirement.range}'.`;\n } else {\n const dependencyNames = mostStrictPeerRequirement.fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => peerDependencyRequirement.fromPackageName)\n .join(\", \");\n const dependencyRequirements = mostStrictPeerRequirement.fromPeerDependencyRequirements\n .map((peerDependencyRequirement) => `'${peerDependencyRequirement.range}'`)\n .join(\", \");\n return (\n `Dependencies [${dependencyNames}] require [${dependencyRequirements}] respectively, ` +\n `resolving to '${mostStrictPeerRequirement.range}'.`\n );\n }\n}\n\n/**\n * Given two version ranges, find the maximum intersecting range\n * of `a` and `b`. `findIntersection(a,b)` should return the same\n * result as `findIntersection(b,a)`.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * EXAMPLES:\n * findIntersection(\"15.1.0\", \"*\") => \"15.1.0\"\n * findIntersection(\"^15\", \"*\") => \"^15\"\n * findIntersection(\">=15\", \"*\") => \">=15\"\n * findIntersection(\"*\", \"*\") => \"*\"\n * findIntersection(\"15.1.0\", \">=1\") => \"15.1.0\"\n * findIntersection(\"^15\", \">=1\") => \"^15\"\n * findIntersection(\">=15\", \">=1\") => \">=15\"\n * findIntersection(\"15.1.0\", \"^15\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15\") => \"^15.2\"\n * findIntersection(\"14\", \"^15\") => undefined\n * findIntersection(\"15.1.0\", \"^15 || ^16\") => \"15.1.0\"\n * findIntersection(\"^15.2\", \"^15 || ^16\") => \"^15.2\"\n * findIntersection(\"14\", \"^15 || ^16\") => undefined\n * findIntersection(\"^15.2 || ^16\", \"^15 || ^16.4\") => \"^15.2 || ^16.4\"\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns the maximum intersecting `ValidRange`, or `undefined` if there is no intersection\n */\nexport function findIntersection(a: ValidRange, b: ValidRange): ValidRange | undefined {\n if (doesASatisfyB(a, b)) {\n return a;\n } else if (doesASatisfyB(b, a)) {\n return b;\n }\n\n // It's safe to assume that `isAnyVersionRange(a)` and `isAnyVersionRange(b)` are false,\n // since a `MATCH_ANY_VERSION_RANGE` would have been satisfied by anything.\n if (isAnyVersionRange(a) || isAnyVersionRange(b)) {\n throw new Error();\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n // If the ranges were equal, they'd both satisfy each other.\n // Otherwise, the higher range should have satisfied the lower range.\n throw new Error();\n }\n\n if (aIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n // keep every version where `bSemVer` is >= `aSemVer`\n // where bVersion has an operator, we need to adjust the version to take into\n // account aVersion, e.g. if a is >=15.2.3 and b is ^15, then the intersection is actually ^15.2.3\n const compatibleBVersions = bVersions\n .map((bVersion) => {\n const bSemVer = coerce(bVersion)!;\n if (bVersion.startsWith(\"^\") && bSemVer.major >= aSemVer.major) {\n return `^${bSemVer.compare(aSemVer) >= 0 ? bSemVer.raw : aSemVer.raw}`;\n }\n return bSemVer.compare(aSemVer) !== -1 ? bVersion : undefined;\n })\n .filter((bVersion): bVersion is string => bVersion != null);\n if (compatibleBVersions.length === 0) {\n return undefined;\n }\n return compatibleBVersions.join(\" || \") as ValidRange;\n }\n if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n // keep every version where `aSemVer` is >= `bSemVer`\n // where aVersion has an operator, we need to adjust the version to take into\n // account bVersion, e.g. if b is >=15.2.3 and a is ^15, then the intersection is actually ^15.2.3\n const compatibleAVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n if (aVersion.startsWith(\"^\") && aSemVer.major >= bSemVer.major) {\n return `^${aSemVer.compare(bSemVer) >= 0 ? aSemVer.raw : bSemVer.raw}`;\n }\n return aSemVer.compare(bSemVer) !== -1 ? aVersion : undefined;\n })\n .filter((aVersion): aVersion is string => aVersion != null);\n if (compatibleAVersions.length === 0) {\n return undefined;\n }\n return compatibleAVersions.join(\" || \") as ValidRange;\n }\n\n const compatibleVersions = aVersions\n .map((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // there is no intersecting `b` major version for this `a` major version\n return undefined;\n }\n if (doesASatisfyB(aVersion as ValidRange, majorMatchingBVersion as ValidRange)) {\n return aVersion;\n } else if (doesASatisfyB(majorMatchingBVersion as ValidRange, aVersion as ValidRange)) {\n return majorMatchingBVersion;\n } else {\n return undefined;\n }\n })\n .filter((aVersion) => aVersion !== undefined);\n if (compatibleVersions.length === 0) {\n return undefined;\n }\n return compatibleVersions.join(\" || \") as ValidRange;\n}\n\n/**\n * Given two version ranges, determine whether `a` satisfies `b`.\n * `a` satisfies `b` iff `a` is a \"more strict than or equal to\" subset of `b`.\n * For example, both `^15` and `^15.2.0` satisfy `^15`, but `^15 || ^16` does not.\n *\n * NOTE: This code assumes that input version ranges match `RANGE_REGEX`.\n * Additionally, major version ranges must not be repeated in union ranges.\n * e.g. `^15.0.5 || ^16.0.0` is permitted, but `15.0.5 || 15.0.999` is not.\n *\n * To determine that `a` is \"more strict than or equal to\" `b`, we first\n * split the set of all versions or ranges that are potentially unioned in `a` and `b`.\n * For example, if `a` is `15.0.5`, we produce the set `[ \"15.0.5\" ]`,\n * and if `b` is `^15 || ^16`, we produce the set `[ \"^15\", \"^16\" ]`.\n * `a` is \"more strict than or equal to\" `b` iff each entry in `a`'s set\n * satisfies (equal to or greater than) some entry in `b`.\n *\n * The following version ranges satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.5 || ^16.0.0`\n * - `^15.0.5 || ^16.x.x`\n * - `15.0.5 || 16.0.0`\n * - `^15.0.999 || ^16.0.0`\n * - `^15.0.5 || ^16.0.999`\n * - `^15.0.999`\n * - `^16.0.0`\n * - `16.0.0`\n * The following version ranges do not satisfy `^15.0.5 || ^16.0.0`:\n * - `^15.0.0 || ^16.0.0`\n * - `^15.0.5 || ^17.0.0`\n * - `^14.0.0 || ^15.0.5 || ^16.0.0`\n * - `^17.0.0`\n * - `17.0.0`\n *\n * @param a version range that matches `RANGE_REGEX`\n * @param b version range that matches `RANGE_REGEX`\n * @returns `true` if `a` is more strict than or equal to `b`, `false` otherwise\n */\nexport function doesASatisfyB(a: ValidRange, b: ValidRange): boolean {\n if (a === b) {\n return true;\n }\n\n const aIsAnyVersionRange = isAnyVersionRange(a);\n const bIsAnyVersionRange = isAnyVersionRange(b);\n if (bIsAnyVersionRange) {\n return true;\n } else if (aIsAnyVersionRange) {\n // `bIsAnyVersionRange` is `false`\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersions = a.includes(\"||\") ? a.split(\"||\").map((s) => s.trim()) : [a];\n const bVersions = b.includes(\"||\") ? b.split(\"||\").map((s) => s.trim()) : [b];\n\n const aIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(a);\n const bIsGreaterOrEqualVersionRange = isGreaterOrEqualVersionRange(b);\n if (aIsGreaterOrEqualVersionRange && bIsGreaterOrEqualVersionRange) {\n const aSemVer = coerce(a)!;\n const bSemVer = coerce(b)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n } else if (bIsGreaterOrEqualVersionRange) {\n const bSemVer = coerce(b)!;\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `bSemVer`\n return aSemVer.compare(bSemVer) !== -1;\n });\n } else if (aIsGreaterOrEqualVersionRange) {\n // `bIsGreaterOrEqualVersionRange` is `false` (and `bIsAnyVersionRange` is `false`)\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n return aVersions.every((aVersion) => {\n const aSemVer = coerce(aVersion)!;\n const majorMatchingBVersion = bVersions.find((m) => coerce(m)!.major === aSemVer.major);\n if (majorMatchingBVersion === undefined) {\n // `a` permits a major version that is not permitted by `b`, therefore `a` is \"less strict\"\n return false;\n }\n\n const aVersionIsRange = isMajorVersionRange(aVersion);\n const majorMatchingBSemVer = coerce(majorMatchingBVersion)!;\n const majorMatchingBVersionIsRange = isMajorVersionRange(majorMatchingBVersion);\n\n if (majorMatchingBVersionIsRange) {\n // `a` satisfies `b` so long as `aSemVer` is greater than or equal to `majorMatchingBSemVer`\n // this is true whether or not `aVersionIsRange`\n return aSemVer.compare(majorMatchingBSemVer) !== -1;\n } else {\n // `majorMatchingBVersionIsRange` is `false`\n if (aVersionIsRange) {\n // `a` permits more values than `b`, therefore `a` is \"less strict\"\n // e.g if `b` is `15.5.5`, this is true whether `a` is `^15.0.0`, `^15.5.5`, or `^15.9.9`\n return false;\n } else {\n // `aVersionIsRange` is `false`\n // `a` satisfies `b` if and only if `aSemVer` is equal to `majorMatchingBSemVer`\n return aSemVer.compare(majorMatchingBSemVer) === 0;\n }\n }\n });\n}\n\n/**\n * Returns true if the version evaluates to 'any', e.g. * or x\n */\nfunction isAnyVersionRange(version: string): boolean {\n return MATCH_ANY_VERSION_RANGE.test(version);\n}\n\n/**\n * Retruns true if the version begins with '>='\n */\nfunction isGreaterOrEqualVersionRange(version: string): boolean {\n return MATCH_GREATER_OR_EQUAL_VERSION_RANGE.test(version);\n}\n\nfunction isMajorVersionRange(version: string): boolean {\n return MATCH_MAJOR_VERSION_RANGE.test(version);\n}\n\nexport type ValidRange = string & { _type: \"valid range\" };\nexport function isValidRange(version: string): version is ValidRange {\n return RANGE_REGEX.test(version);\n}\n\ntype IDependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\";\n\nfunction getAddDependencyTypeFixer({\n packageJsonPath,\n dependencyType,\n dependencyName,\n version,\n host,\n}: {\n packageJsonPath: string;\n dependencyType: IDependencyType;\n dependencyName: string;\n version: string;\n host: Host;\n}) {\n return () => {\n mutateJson<PackageJson>(packageJsonPath, host, (packageJson) => {\n if (packageJson[dependencyType] == null) {\n packageJson[dependencyType] = {};\n }\n packageJson[dependencyType]![dependencyName] = version;\n return packageJson;\n });\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\ntype OrderFunction = (context: Context) => (a: string, b: string) => number;\n\nconst Options = r\n .Record({\n order: r.Union(r.Array(r.String), r.Function),\n })\n .Or(r.Undefined);\n\ntype Options = r.Static<typeof Options>;\n\nconst defaultKeyOrder = [\n \"name\",\n \"version\",\n \"description\",\n \"author\",\n \"contributors\",\n \"url\",\n \"license\",\n \"type\",\n \"exports\",\n \"private\",\n \"engines\",\n \"bin\",\n \"types\",\n \"main\",\n \"module\",\n \"typings\",\n \"style\",\n \"sideEffects\",\n \"workspaces\",\n \"husky\",\n \"lint-staged\",\n \"files\",\n \"scripts\",\n \"resolutions\",\n \"dependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"publishConfig\",\n];\n\nexport const packageOrder = makeRule({\n name: \"packageOrder\",\n check: (context, opts) => {\n const packageJson = context.getPackageJson();\n const packagePath = context.getPackageJsonPath();\n\n const order: string[] | OrderFunction = opts === undefined ? defaultKeyOrder : opts.order;\n\n const comparator = isOrderFunction(order) ? order(context) : createComparator(order);\n\n const actualOrder = Object.keys(packageJson);\n const expectedOrder = actualOrder.slice().sort(comparator); // sort mutates, so we need to copy the previous result\n\n if (!arrayOrderCompare(actualOrder, expectedOrder)) {\n context.addError({\n file: packagePath,\n message: \"Incorrect order of fields in package.json\",\n longMessage: diff(expectedOrder, actualOrder, { expand: true }),\n fixer: () => {\n const expectedPackageJson: Record<string, any> = {};\n\n expectedOrder.forEach((key) => {\n expectedPackageJson[key] = packageJson[key];\n });\n\n context.host.writeJson(packagePath, expectedPackageJson);\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nfunction arrayOrderCompare(a: ReadonlyArray<string>, b: ReadonlyArray<string>) {\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction createComparator(order: ReadonlyArray<string>) {\n return (a: string, b: string) => {\n const aIndex = order.indexOf(a);\n const bIndex = order.indexOf(b);\n\n // if one of the two is missing from the order array, push it further down\n if (aIndex >= 0 && bIndex < 0) {\n return -1;\n } else if (aIndex < 0 && bIndex >= 0) {\n return 1;\n }\n\n // otherwise compare the indexes and use alphabetical as a tie breaker\n const compared = aIndex - bIndex;\n\n if (compared !== 0) {\n return compared;\n } else {\n return a.localeCompare(b);\n }\n };\n}\n\nfunction isOrderFunction(order: ReadonlyArray<string> | OrderFunction): order is OrderFunction {\n return !Array.isArray(order);\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Union(\n r\n .Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n })\n .And(\n r.Partial({\n entriesExist: r.Undefined,\n })\n ),\n r\n .Record({\n entriesExist: r.Array(r.String), // enforces existence of keys, but not values\n })\n .And(\n r.Partial({\n entries: r.Undefined,\n })\n ),\n r.Record({\n entries: r.Dictionary(r.Unknown), // string => unknown, enforces existence of keys and their values\n entriesExist: r.Array(r.String),\n })\n);\n\nexport type Options = r.Static<typeof Options>;\n\nexport const packageEntry = makeRule({\n name: \"packageEntry\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n\n if (options.entries) {\n for (const key of Object.keys(options.entries)) {\n const value = options.entries[key];\n\n const entryDiff = diff(JSON.stringify(value) + \"\\n\", (JSON.stringify(packageJson[key]) || \"\") + \"\\n\");\n if (\n (typeof value !== \"object\" && value !== packageJson[key]) ||\n entryDiff == null ||\n !entryDiff.includes(\"Compared values have no visual difference\")\n ) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createStandardizedEntryErrorMessage(key),\n longMessage: entryDiff,\n fixer: () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n input[key] = value;\n return input;\n });\n },\n });\n }\n }\n }\n\n if (options.entriesExist) {\n for (const key of options.entriesExist) {\n if (packageJson[key] === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: createExpectedEntryErrorMessage(key),\n });\n }\n }\n }\n },\n optionsRuntype: Options,\n});\n\nexport function createStandardizedEntryErrorMessage(key: string) {\n return `Expected standardized entry for '${key}'`;\n}\n\nexport function createExpectedEntryErrorMessage(key: string) {\n return `Expected entry for '${key}' to exist`;\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Record({\n scripts: r.Dictionary(\n r.Union(\n r.String,\n r.Record({\n options: r.Array(r.String.Or(r.Undefined)),\n fixValue: r.Union(r.String, r.Undefined, r.Literal(false)).optional(),\n })\n )\n ), // string => string\n});\n\nexport type Options = r.Static<typeof Options>;\n\nexport const MSG_NO_SCRIPTS_BLOCK = \"No scripts block in package.json\";\n\nexport const packageScript = makeRule({\n name: \"packageScript\",\n check: (context, options) => {\n const packageJson = context.getPackageJson();\n if (packageJson.scripts === undefined) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: MSG_NO_SCRIPTS_BLOCK,\n fixer: () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n input.scripts = {};\n return input;\n });\n },\n });\n return;\n }\n for (const [name, value] of Object.entries(options.scripts)) {\n const allowedValues = new Set<string | undefined>();\n let fixValue: string | undefined | false;\n let allowEmpty = false;\n let fixToEmpty = false;\n\n if (typeof value === \"string\") {\n allowedValues.add(value);\n fixValue = value;\n } else {\n for (const q of value.options) {\n if (q === undefined) {\n allowEmpty = true;\n }\n allowedValues.add(q);\n }\n fixToEmpty = Object.prototype.hasOwnProperty.call(value, \"fixValue\") && value.fixValue === undefined;\n fixValue = value.fixValue;\n }\n\n const actualValue = packageJson.scripts[name];\n\n if (!allowedValues.has(actualValue) && !(allowEmpty === true && actualValue === undefined)) {\n let fixer;\n\n if (fixValue !== false && (fixValue !== undefined || fixToEmpty === true)) {\n const q = fixValue;\n fixer = () => {\n mutateJson<PackageJson>(context.getPackageJsonPath(), context.host, (input) => {\n if (fixToEmpty && q === undefined) {\n delete input.scripts![name];\n } else {\n input.scripts![name] = q!;\n }\n return input;\n });\n };\n }\n\n const validOptionsString = Array.from(allowedValues.values())\n .map((a) => (a === undefined ? \"(empty)\" : `'${a}'`))\n .join(\", \");\n\n context.addError({\n file: context.getPackageJsonPath(),\n message: `Expected standardized script entry for '${name}'. Valid options: ${validOptionsString}`,\n longMessage: diff(validOptionsString + \"\\n\", (packageJson.scripts[name] || \"\") + \"\\n\"),\n fixer,\n });\n }\n }\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { matchesAnyGlob } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as path from \"path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst DEFAULT_TSCONFIG_FILENAME = \"tsconfig.json\";\n\nconst Options = r\n .Partial({\n file: r.String,\n generator: r.Function,\n tsconfigReferenceFile: r.String,\n template: r.Record({}).Or(r.String),\n templateFile: r.String,\n excludedReferences: r.Array(r.String).Or(r.Undefined),\n additionalReferences: r.Array(r.String).Or(r.Undefined),\n })\n .withConstraint(({ generator, template, templateFile }) => {\n let count = 0;\n if (generator) {\n count++;\n }\n if (template) {\n count++;\n }\n if (templateFile) {\n count++;\n }\n\n return count === 1 || \"Expect one of { generator, template, templateFile }\";\n });\n\nexport interface Options extends r.Static<typeof Options> {}\n\nexport const standardTsconfig = makeRule({\n name: \"standardTsconfig\",\n check: async (context, opts) => {\n const tsconfigFileName = opts.file ?? DEFAULT_TSCONFIG_FILENAME;\n const fullPath = path.resolve(context.packageDir, tsconfigFileName);\n const generator = getGenerator(context, opts);\n const expectedContent = await generator(context);\n\n const actualContent = context.host.exists(fullPath)\n ? context.host.readFile(fullPath, { encoding: \"utf-8\" })\n : undefined;\n\n if (expectedContent === undefined) {\n context.addWarning({\n file: fullPath,\n message: \"Excluding from expect-standard-tsconfig\",\n });\n return;\n }\n\n if (actualContent !== expectedContent) {\n context.addError({\n file: fullPath,\n message: \"Expect file contents to match\",\n longMessage: diff(expectedContent, actualContent, { expand: true }),\n fixer: () => {\n context.host.writeFile(fullPath, expectedContent, {\n encoding: \"utf-8\",\n });\n },\n });\n }\n },\n optionsRuntype: Options,\n});\n\nfunction getGenerator(context: Context, opts: Options) {\n if (opts.generator) {\n return opts.generator;\n } else if (opts.templateFile) {\n const { packageDir: workspacePackageDir } = context.getWorkspaceContext();\n const fullPath = path.resolve(workspacePackageDir, opts.templateFile);\n const template = JSON.parse(context.host.readFile(fullPath, { encoding: \"utf-8\" }));\n\n return makeGenerator(template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);\n } else if (opts.template) {\n return makeGenerator(opts.template, opts.excludedReferences, opts.additionalReferences, opts.tsconfigReferenceFile);\n } else {\n throw new Error(\"Unable to make generator\");\n }\n}\n\nfunction makeGenerator(\n template: any,\n excludedReferences: ReadonlyArray<string> | undefined,\n additionalReferences: ReadonlyArray<string> | undefined,\n tsconfigReferenceFile?: string\n) {\n return async function generator(context: Context) {\n template = {\n ...template,\n references: [],\n }; // make a copy and ensure we have a references array\n\n const nameToDirectory = await context.getWorkspaceContext().getPackageNameToDir();\n\n const packageJson = context.getPackageJson();\n const deps = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {})];\n for (const dep of deps) {\n const packageDir = nameToDirectory.get(dep);\n if (packageDir !== undefined && (excludedReferences === undefined || !matchesAnyGlob(dep, excludedReferences))) {\n const absoluteReferencePath =\n tsconfigReferenceFile !== undefined ? path.join(packageDir, tsconfigReferenceFile) : packageDir;\n template.references.push({\n path: path.relative(context.packageDir, absoluteReferencePath),\n });\n }\n }\n\n if (additionalReferences) {\n for (const additionalReference of additionalReferences) {\n template.references.push({\n path: additionalReference,\n });\n }\n }\n\n return JSON.stringify(template, undefined, 2) + \"\\n\";\n };\n}\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport * as globby from \"globby\";\nimport * as path from \"node:path\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nexport const Options = r.Undefined;\n\ntype Options = r.Static<typeof Options>;\n\n// Enforce that the root package.json contains all of the workspaces in the repo (including nested packages)\nexport const nestedWorkspaces = makeRule({\n name: \"nestedWorkspaces\",\n check: (context) => {\n const rootPackageJson = context.getWorkspaceContext().getPackageJson();\n\n // Expand a set of globs covering all package.json files in the entire repo (except the root)\n const packageJsonPaths = globby.globbySync([\"*/**/package.json\", \"!**/node_modules/**\"]);\n\n const workspaces = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : rootPackageJson.workspaces !== undefined\n ? rootPackageJson.workspaces.packages\n : undefined;\n\n if (workspaces === undefined && packageJsonPaths.length > 0) {\n context.addError({\n file: context.getPackageJsonPath(),\n message: 'The \"workspace\" field is missing, even though there are workspaces in the repository.',\n });\n return;\n }\n\n // Build a set of globs for each package.json that exists in packages specified by a workspace.\n const workspacePackageJsons = (workspaces || []).map((item) => `${item}/package.json`);\n\n // Expand the globs to get an array of all package.json files that are in packages specified by a workspace.\n const expandedWorkspacesGlobs = globby.globbySync([...workspacePackageJsons, \"!**/node_modules/**\"]);\n\n // Ensure there are no package.jsons which are not included in the globbed workspaces set\n const difference = packageJsonPaths.filter((packageJsonPath) => !expandedWorkspacesGlobs.includes(packageJsonPath));\n\n if (difference.length !== 0) {\n const differencesList = difference.map((packageJsonPath) => path.dirname(packageJsonPath)).join(\", \");\n context.addError({\n file: context.getPackageJsonPath(),\n message:\n `The \"workspace\" field is missing one or more values: ${differencesList}. ` +\n 'You may be able to use a glob to avoid listing each workspace individually, e.g. \"packages/nested-workspace/*\".',\n });\n }\n },\n optionsRuntype: Options,\n});\n","/*!\n * Copyright 2019 Palantir Technologies, Inc.\n *\n * Licensed under the MIT license. See LICENSE file in the project root for details.\n *\n */\n\nimport { Context } from \"@monorepolint/config\";\nimport { mutateJson, PackageJson } from \"@monorepolint/utils\";\nimport { diff } from \"jest-diff\";\nimport * as r from \"runtypes\";\nimport { makeRule } from \"./util/makeRule.js\";\n\nconst Options = r.Partial({\n dependencies: r.Dictionary(r.String),\n devDependencies: r.Dictionary(r.String),\n peerDependencies: r.Dictionary(r.String),\n optionalDependencies: r.Dictionary(r.String),\n});\n\ntype Options = r.Static<typeof Options>;\n\nexport const requireDependency = makeRule({\n name: \"requireDependency\",\n check: function expectPackageEntry(context: Context, options: Options) {\n const packageJson = context.getPackageJson();\n const packageJsonPath = context.getPackageJsonPath();\n\n [\n \"dependencies\" as const,\n \"devDependencies\" as const,\n \"peerDependencies\" as const,\n \"optionalDependencies\" as const,\n ].forEach((type) => {\n if (!options[type]) {\n return;\n }\n\n if (packageJson[type] === undefined) {\n context.addError({\n file: packageJsonPath,\n message: `No ${type} block, cannot add required ${type}.`,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = options[type];\n return input;\n });\n },\n });\n return;\n }\n\n for (const [dep, version] of Object.entries(options[type]!)) {\n if (packageJson[type][dep] !== version) {\n context.addError({\n file: packageJsonPath,\n message: `Expected dependency ${dep}@${version}`,\n longMessage: diff(`${dep}@${version}\\n`, `${dep}@${packageJson[type][dep] || \"missing\"}\\n`)!,\n fixer: () => {\n mutateJson<PackageJson>(packageJsonPath, context.host, (input) => {\n input[type] = { ...input[type], [dep]: version };\n return input;\n });\n },\n });\n }\n }\n });\n },\n optionsRuntype: Options,\n});\n"],"mappings":"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","names":["r","Options","path","r","Options","diff","r","Options","diff","r","Options","diff","path","r","Options","diff","mutateJson","path","r","coerce","resolvePackagePath","Options","resolvePackagePath","coerce","mutateJson","diff","r","Options","arrayOrderCompare","diff","mutateJson","diff","r","Options","diff","mutateJson","mutateJson","diff","r","Options","mutateJson","diff","matchesAnyGlob","diff","path","r","Options","diff","matchesAnyGlob","path","r","Options","mutateJson","diff","r","Options","mutateJson","diff"]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ makeRule
3
+ } from "../chunk-GMT7IGKM.js";
4
+ export {
5
+ makeRule
6
+ };
7
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monorepolint/rules",
3
- "version": "0.5.0-alpha.106+c717193",
3
+ "version": "0.5.0-alpha.107+27faf77",
4
4
  "author": "Eric L Anderson (https://github.com/ericanderson)",
5
5
  "contributors": [
6
6
  "Mac Lockard (https://github.com/maclockard)"
@@ -30,9 +30,9 @@
30
30
  "transpile-typescript": "tsup --config ../../tsup.config.cjs"
31
31
  },
32
32
  "dependencies": {
33
- "@monorepolint/config": "^0.5.0-alpha.106+c717193",
34
- "@monorepolint/core": "^0.5.0-alpha.106+c717193",
35
- "@monorepolint/utils": "^0.5.0-alpha.106+c717193",
33
+ "@monorepolint/config": "^0.5.0-alpha.107+27faf77",
34
+ "@monorepolint/core": "^0.5.0-alpha.107+27faf77",
35
+ "@monorepolint/utils": "^0.5.0-alpha.107+27faf77",
36
36
  "globby": "^13.1.2",
37
37
  "jest-diff": "^29.3.1",
38
38
  "resolve-package-path": "^4.0.3",
@@ -59,5 +59,5 @@
59
59
  "publishConfig": {
60
60
  "access": "public"
61
61
  },
62
- "gitHead": "c71719369db87ef0173ef8bd2293ce20cf8f9722"
62
+ "gitHead": "27faf7744e0ea03e0609e09747c2c314b56f6e88"
63
63
  }