@monorepolint/rules 0.6.0-alpha.4 → 0.6.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.turbo/turbo-clean.log +1 -1
  2. package/.turbo/turbo-compile-typescript.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/.turbo/turbo-test.log +443 -92
  5. package/.turbo/turbo-transpile-typescript.log +5 -5
  6. package/CHANGELOG.md +112 -0
  7. package/build/js/index.js +413 -368
  8. package/build/js/index.js.map +1 -1
  9. package/build/tsconfig.tsbuildinfo +1 -1
  10. package/build/types/REMOVE.d.ts +2 -0
  11. package/build/types/REMOVE.d.ts.map +1 -0
  12. package/build/types/__tests__/alphabeticalDependencies.spec.d.ts +8 -0
  13. package/build/types/__tests__/alphabeticalDependencies.spec.d.ts.map +1 -0
  14. package/build/types/__tests__/forceError.spec.d.ts +8 -0
  15. package/build/types/__tests__/forceError.spec.d.ts.map +1 -0
  16. package/build/types/__tests__/oncePerPackage.spec.d.ts +8 -0
  17. package/build/types/__tests__/oncePerPackage.spec.d.ts.map +1 -0
  18. package/build/types/__tests__/standardTsconfig.spec.d.ts +8 -0
  19. package/build/types/__tests__/standardTsconfig.spec.d.ts.map +1 -0
  20. package/build/types/bannedDependencies.d.ts +9 -33
  21. package/build/types/bannedDependencies.d.ts.map +1 -1
  22. package/build/types/consistentDependencies.d.ts +6 -6
  23. package/build/types/consistentDependencies.d.ts.map +1 -1
  24. package/build/types/consistentVersions.d.ts +6 -10
  25. package/build/types/consistentVersions.d.ts.map +1 -1
  26. package/build/types/fileContents.d.ts +3 -2
  27. package/build/types/fileContents.d.ts.map +1 -1
  28. package/build/types/index.d.ts +1 -0
  29. package/build/types/index.d.ts.map +1 -1
  30. package/build/types/mustSatisfyPeerDependencies.d.ts +12 -190
  31. package/build/types/mustSatisfyPeerDependencies.d.ts.map +1 -1
  32. package/build/types/nestedWorkspaces.d.ts +2 -2
  33. package/build/types/nestedWorkspaces.d.ts.map +1 -1
  34. package/build/types/oncePerPackage.d.ts +6 -6
  35. package/build/types/oncePerPackage.d.ts.map +1 -1
  36. package/build/types/packageEntry.d.ts +11 -33
  37. package/build/types/packageEntry.d.ts.map +1 -1
  38. package/build/types/packageOrder.d.ts +2 -1
  39. package/build/types/packageOrder.d.ts.map +1 -1
  40. package/build/types/packageScript.d.ts +13 -22
  41. package/build/types/packageScript.d.ts.map +1 -1
  42. package/build/types/requireDependency.d.ts +5 -20
  43. package/build/types/requireDependency.d.ts.map +1 -1
  44. package/build/types/standardTsconfig.d.ts +12 -19
  45. package/build/types/standardTsconfig.d.ts.map +1 -1
  46. package/build/types/util/zodSchemas.d.ts +14 -0
  47. package/build/types/util/zodSchemas.d.ts.map +1 -0
  48. package/coverage/block-navigation.js +1 -1
  49. package/coverage/clover.xml +1420 -1452
  50. package/coverage/coverage-final.json +21 -19
  51. package/coverage/index.html +27 -27
  52. package/coverage/sorter.js +21 -7
  53. package/coverage/src/REMOVE.ts.html +88 -0
  54. package/coverage/src/alphabeticalDependencies.ts.html +15 -15
  55. package/coverage/src/alphabeticalScripts.ts.html +5 -5
  56. package/coverage/src/bannedDependencies.ts.html +20 -53
  57. package/coverage/src/consistentDependencies.ts.html +20 -14
  58. package/coverage/src/consistentVersions.ts.html +330 -183
  59. package/coverage/src/fileContents.ts.html +223 -88
  60. package/coverage/src/forceError.ts.html +31 -31
  61. package/coverage/src/index.html +104 -89
  62. package/coverage/src/index.ts.html +11 -5
  63. package/coverage/src/mustSatisfyPeerDependencies.ts.html +15 -501
  64. package/coverage/src/nestedWorkspaces.ts.html +5 -5
  65. package/coverage/src/oncePerPackage.ts.html +31 -31
  66. package/coverage/src/packageEntry.ts.html +121 -91
  67. package/coverage/src/packageOrder.ts.html +44 -14
  68. package/coverage/src/packageScript.ts.html +235 -88
  69. package/coverage/src/requireDependency.ts.html +241 -82
  70. package/coverage/src/standardTsconfig.ts.html +212 -212
  71. package/coverage/src/util/checkAlpha.ts.html +40 -40
  72. package/coverage/src/util/createRuleFactory.ts.html +19 -19
  73. package/coverage/src/util/index.html +30 -15
  74. package/coverage/src/util/makeDirectory.ts.html +11 -11
  75. package/coverage/src/util/packageDependencyGraphService.ts.html +1 -1
  76. package/coverage/src/util/zodSchemas.ts.html +130 -0
  77. package/package.json +15 -15
  78. package/src/REMOVE.ts +1 -0
  79. package/src/__tests__/alphabeticalDependencies.spec.ts +102 -0
  80. package/src/__tests__/alphabeticalScripts.spec.ts +18 -0
  81. package/src/__tests__/bannedDependencies.spec.ts +49 -0
  82. package/src/__tests__/consistentDependencies.spec.ts +23 -0
  83. package/src/__tests__/consistentVersions.spec.ts +142 -0
  84. package/src/__tests__/fileContents.spec.ts +348 -0
  85. package/src/__tests__/forceError.spec.ts +70 -0
  86. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +44 -0
  87. package/src/__tests__/nestedWorkspaces.spec.ts +14 -0
  88. package/src/__tests__/oncePerPackage.spec.ts +75 -0
  89. package/src/__tests__/packageEntry.spec.ts +177 -0
  90. package/src/__tests__/packageOrder.spec.ts +22 -0
  91. package/src/__tests__/packageScript.spec.ts +549 -0
  92. package/src/__tests__/requireDependency.spec.ts +259 -2
  93. package/src/__tests__/standardTsconfig.spec.ts +91 -0
  94. package/src/bannedDependencies.ts +14 -25
  95. package/src/consistentDependencies.ts +10 -8
  96. package/src/consistentVersions.ts +132 -83
  97. package/src/fileContents.ts +80 -35
  98. package/src/index.ts +2 -0
  99. package/src/mustSatisfyPeerDependencies.ts +10 -172
  100. package/src/nestedWorkspaces.ts +4 -4
  101. package/src/oncePerPackage.ts +6 -6
  102. package/src/packageEntry.ts +60 -50
  103. package/src/packageOrder.ts +19 -9
  104. package/src/packageScript.ts +67 -18
  105. package/src/requireDependency.ts +84 -31
  106. package/src/standardTsconfig.ts +26 -26
  107. package/src/util/zodSchemas.ts +15 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">90.27% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>65/72</span>
28
+ <span class='fraction'>118/118</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>13/13</span>
35
+ <span class='fraction'>23/23</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">66.66% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>2/3</span>
42
+ <span class='fraction'>4/4</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.27% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>65/72</span>
49
+ <span class='fraction'>118/118</span>
50
50
  </div>
51
51
 
52
52
 
@@ -149,7 +149,60 @@
149
149
  <a name='L84'></a><a href='#L84'>84</a>
150
150
  <a name='L85'></a><a href='#L85'>85</a>
151
151
  <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
153
206
  <span class="cline-any cline-neutral">&nbsp;</span>
154
207
  <span class="cline-any cline-neutral">&nbsp;</span>
155
208
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -161,6 +214,8 @@
161
214
  <span class="cline-any cline-yes">1x</span>
162
215
  <span class="cline-any cline-yes">1x</span>
163
216
  <span class="cline-any cline-yes">1x</span>
217
+ <span class="cline-any cline-yes">1x</span>
218
+ <span class="cline-any cline-yes">1x</span>
164
219
  <span class="cline-any cline-neutral">&nbsp;</span>
165
220
  <span class="cline-any cline-yes">1x</span>
166
221
  <span class="cline-any cline-yes">1x</span>
@@ -168,71 +223,122 @@
168
223
  <span class="cline-any cline-yes">1x</span>
169
224
  <span class="cline-any cline-yes">1x</span>
170
225
  <span class="cline-any cline-yes">1x</span>
226
+ <span class="cline-any cline-yes">1x</span>
227
+ <span class="cline-any cline-yes">1x</span>
228
+ <span class="cline-any cline-yes">1x</span>
229
+ <span class="cline-any cline-yes">1x</span>
230
+ <span class="cline-any cline-yes">1x</span>
231
+ <span class="cline-any cline-yes">1x</span>
232
+ <span class="cline-any cline-yes">1x</span>
233
+ <span class="cline-any cline-yes">1x</span>
234
+ <span class="cline-any cline-yes">1x</span>
235
+ <span class="cline-any cline-yes">1x</span>
236
+ <span class="cline-any cline-yes">1x</span>
237
+ <span class="cline-any cline-yes">1x</span>
238
+ <span class="cline-any cline-yes">1x</span>
239
+ <span class="cline-any cline-yes">1x</span>
240
+ <span class="cline-any cline-yes">1x</span>
241
+ <span class="cline-any cline-yes">1x</span>
242
+ <span class="cline-any cline-yes">1x</span>
243
+ <span class="cline-any cline-yes">1x</span>
244
+ <span class="cline-any cline-yes">1x</span>
245
+ <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-yes">1x</span>
247
+ <span class="cline-any cline-yes">1x</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">1x</span>
171
250
  <span class="cline-any cline-neutral">&nbsp;</span>
172
251
  <span class="cline-any cline-neutral">&nbsp;</span>
173
252
  <span class="cline-any cline-neutral">&nbsp;</span>
174
253
  <span class="cline-any cline-yes">1x</span>
175
254
  <span class="cline-any cline-yes">1x</span>
176
255
  <span class="cline-any cline-yes">1x</span>
177
- <span class="cline-any cline-yes">7x</span>
178
- <span class="cline-any cline-yes">7x</span>
256
+ <span class="cline-any cline-yes">17x</span>
257
+ <span class="cline-any cline-yes">17x</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-yes">17x</span>
260
+ <span class="cline-any cline-yes">17x</span>
261
+ <span class="cline-any cline-yes">17x</span>
262
+ <span class="cline-any cline-yes">17x</span>
263
+ <span class="cline-any cline-yes">17x</span>
264
+ <span class="cline-any cline-yes">17x</span>
265
+ <span class="cline-any cline-yes">60x</span>
266
+ <span class="cline-any cline-yes">60x</span>
267
+ <span class="cline-any cline-yes">35x</span>
268
+ <span class="cline-any cline-yes">35x</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-yes">25x</span>
272
+ <span class="cline-any cline-yes">25x</span>
273
+ <span class="cline-any cline-yes">25x</span>
274
+ <span class="cline-any cline-yes">25x</span>
275
+ <span class="cline-any cline-yes">25x</span>
276
+ <span class="cline-any cline-yes">25x</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-yes">60x</span>
179
280
  <span class="cline-any cline-neutral">&nbsp;</span>
180
281
  <span class="cline-any cline-yes">7x</span>
282
+ <span class="cline-any cline-yes">6x</span>
283
+ <span class="cline-any cline-yes">6x</span>
284
+ <span class="cline-any cline-yes">6x</span>
285
+ <span class="cline-any cline-yes">6x</span>
286
+ <span class="cline-any cline-yes">1x</span>
287
+ <span class="cline-any cline-yes">1x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-yes">1x</span>
290
+ <span class="cline-any cline-yes">1x</span>
291
+ <span class="cline-any cline-yes">6x</span>
292
+ <span class="cline-any cline-yes">6x</span>
181
293
  <span class="cline-any cline-yes">7x</span>
182
294
  <span class="cline-any cline-yes">7x</span>
183
- <span class="cline-any cline-yes">7x</span>
184
- <span class="cline-any cline-yes">7x</span>
185
- <span class="cline-any cline-yes">7x</span>
186
- <span class="cline-any cline-yes">28x</span>
187
- <span class="cline-any cline-yes">28x</span>
188
- <span class="cline-any cline-yes">14x</span>
189
- <span class="cline-any cline-yes">14x</span>
190
295
  <span class="cline-any cline-neutral">&nbsp;</span>
191
- <span class="cline-any cline-yes">28x</span>
192
- <span class="cline-any cline-yes">3x</span>
193
- <span class="cline-any cline-yes">3x</span>
194
- <span class="cline-any cline-yes">3x</span>
195
- <span class="cline-any cline-yes">3x</span>
196
- <span class="cline-any cline-no">&nbsp;</span>
197
- <span class="cline-any cline-no">&nbsp;</span>
198
- <span class="cline-any cline-no">&nbsp;</span>
199
- <span class="cline-any cline-no">&nbsp;</span>
200
- <span class="cline-any cline-no">&nbsp;</span>
201
- <span class="cline-any cline-no">&nbsp;</span>
202
- <span class="cline-any cline-no">&nbsp;</span>
203
- <span class="cline-any cline-yes">3x</span>
204
- <span class="cline-any cline-yes">3x</span>
205
- <span class="cline-any cline-yes">3x</span>
206
296
  <span class="cline-any cline-neutral">&nbsp;</span>
207
- <span class="cline-any cline-yes">28x</span>
297
+ <span class="cline-any cline-yes">60x</span>
208
298
  <span class="cline-any cline-yes">16x</span>
209
- <span class="cline-any cline-yes">11x</span>
210
- <span class="cline-any cline-yes">11x</span>
211
- <span class="cline-any cline-yes">11x</span>
212
- <span class="cline-any cline-yes">11x</span>
213
- <span class="cline-any cline-yes">11x</span>
214
- <span class="cline-any cline-yes">11x</span>
215
- <span class="cline-any cline-yes">11x</span>
216
- <span class="cline-any cline-yes">11x</span>
217
- <span class="cline-any cline-yes">5x</span>
299
+ <span class="cline-any cline-yes">13x</span>
300
+ <span class="cline-any cline-yes">13x</span>
301
+ <span class="cline-any cline-yes">13x</span>
302
+ <span class="cline-any cline-yes">13x</span>
303
+ <span class="cline-any cline-yes">13x</span>
304
+ <span class="cline-any cline-yes">13x</span>
305
+ <span class="cline-any cline-yes">13x</span>
306
+ <span class="cline-any cline-yes">13x</span>
218
307
  <span class="cline-any cline-yes">5x</span>
219
308
  <span class="cline-any cline-yes">5x</span>
220
309
  <span class="cline-any cline-yes">5x</span>
221
310
  <span class="cline-any cline-yes">5x</span>
222
- <span class="cline-any cline-yes">1x</span>
223
- <span class="cline-any cline-yes">1x</span>
224
311
  <span class="cline-any cline-yes">5x</span>
225
- <span class="cline-any cline-yes">4x</span>
226
- <span class="cline-any cline-yes">4x</span>
227
312
  <span class="cline-any cline-yes">5x</span>
228
313
  <span class="cline-any cline-yes">5x</span>
229
314
  <span class="cline-any cline-yes">5x</span>
230
315
  <span class="cline-any cline-yes">5x</span>
231
- <span class="cline-any cline-yes">11x</span>
232
- <span class="cline-any cline-yes">11x</span>
316
+ <span class="cline-any cline-yes">13x</span>
317
+ <span class="cline-any cline-yes">13x</span>
233
318
  <span class="cline-any cline-yes">16x</span>
234
- <span class="cline-any cline-yes">7x</span>
235
- <span class="cline-any cline-yes">7x</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-yes">60x</span>
322
+ <span class="cline-any cline-yes">10x</span>
323
+ <span class="cline-any cline-yes">6x</span>
324
+ <span class="cline-any cline-yes">6x</span>
325
+ <span class="cline-any cline-yes">6x</span>
326
+ <span class="cline-any cline-yes">6x</span>
327
+ <span class="cline-any cline-yes">5x</span>
328
+ <span class="cline-any cline-yes">5x</span>
329
+ <span class="cline-any cline-yes">5x</span>
330
+ <span class="cline-any cline-yes">5x</span>
331
+ <span class="cline-any cline-yes">5x</span>
332
+ <span class="cline-any cline-yes">5x</span>
333
+ <span class="cline-any cline-yes">5x</span>
334
+ <span class="cline-any cline-yes">5x</span>
335
+ <span class="cline-any cline-yes">5x</span>
336
+ <span class="cline-any cline-yes">5x</span>
337
+ <span class="cline-any cline-yes">6x</span>
338
+ <span class="cline-any cline-yes">6x</span>
339
+ <span class="cline-any cline-yes">10x</span>
340
+ <span class="cline-any cline-yes">17x</span>
341
+ <span class="cline-any cline-yes">17x</span>
236
342
  <span class="cline-any cline-yes">1x</span>
237
343
  <span class="cline-any cline-yes">1x</span>
238
344
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*!
@@ -245,17 +351,43 @@
245
351
  import { Context } from "@monorepolint/config";
246
352
  import { mutateJson, PackageJson } from "@monorepolint/utils";
247
353
  import { diff } from "jest-diff";
248
- import * as r from "runtypes";
354
+ import { z } from "zod";
355
+ import { REMOVE } from "./REMOVE.js";
249
356
  import { createRuleFactory } from "./util/createRuleFactory.js";
357
+ import { ZodRemove } from "./util/zodSchemas.js";
250
358
  &nbsp;
251
- const Options = r.Partial({
252
- dependencies: r.Dictionary(r.String.optional()),
253
- devDependencies: r.Dictionary(r.String.optional()),
254
- peerDependencies: r.Dictionary(r.String.optional()),
255
- optionalDependencies: r.Dictionary(r.String.optional()),
256
- });
359
+ const Options = z.object({
360
+ dependencies: z.record(
361
+ z.string(),
362
+ z.union([
363
+ z.string(),
364
+ ZodRemove,
365
+ ]).optional(),
366
+ ).optional(),
367
+ devDependencies: z.record(
368
+ z.string(),
369
+ z.union([
370
+ z.string(),
371
+ ZodRemove,
372
+ ]).optional(),
373
+ ).optional(),
374
+ peerDependencies: z.record(
375
+ z.string(),
376
+ z.union([
377
+ z.string(),
378
+ ZodRemove,
379
+ ]).optional(),
380
+ ).optional(),
381
+ optionalDependencies: z.record(
382
+ z.string(),
383
+ z.union([
384
+ z.string(),
385
+ ZodRemove,
386
+ ]).optional(),
387
+ ).optional(),
388
+ }).partial();
257
389
  &nbsp;
258
- type Options = r.Static&lt;typeof Options&gt;;
390
+ type Options = z.infer&lt;typeof Options&gt;;
259
391
  &nbsp;
260
392
  export const requireDependency = createRuleFactory({
261
393
  name: "requireDependency",
@@ -274,29 +406,40 @@ export const requireDependency = createRuleFactory({
274
406
  return;
275
407
  }
276
408
  &nbsp;
409
+ // Separate additions from removals upfront
410
+ const dependenciesToAdd = Object.entries(expectedEntries).filter(
411
+ ([, version]) =&gt; version !== REMOVE &amp;&amp; version !== undefined,
412
+ );
413
+ const dependenciesToRemove = Object.entries(expectedEntries).filter(
414
+ ([, version]) =&gt; version === REMOVE,
415
+ );
416
+ &nbsp;
417
+ // Handle missing dependency block
277
418
  if (packageJson[type] === undefined) {
278
- context.addError({
279
- file: packageJsonPath,
280
- message: `No ${type} block, cannot add required ${type}.`,
281
- fixer: <span class="fstat-no" title="function not covered" >() =&gt; {</span>
282
- <span class="cstat-no" title="statement not covered" > mutateJson&lt;PackageJson&gt;(packageJsonPath, context.host, (input) =&gt; {</span>
283
- <span class="cstat-no" title="statement not covered" > input[type] = Object.fromEntries(</span>
284
- <span class="cstat-no" title="statement not covered" > Object.entries(expectedEntries).filter(([, v]) =&gt; v !== undefined),</span>
285
- <span class="cstat-no" title="statement not covered" > ) as Record&lt;string, string&gt;;</span>
286
- <span class="cstat-no" title="statement not covered" > return input;</span>
287
- <span class="cstat-no" title="statement not covered" > });</span>
288
- <span class="cstat-no" title="statement not covered" > },</span>
289
- });
290
- return;
419
+ // Only create block if there are dependencies to add (REMOVE entries shouldn't create blocks)
420
+ if (dependenciesToAdd.length &gt; 0) {
421
+ context.addError({
422
+ file: packageJsonPath,
423
+ message: `No ${type} block, cannot add required ${type}.`,
424
+ fixer: () =&gt; {
425
+ mutateJson&lt;PackageJson&gt;(packageJsonPath, context.host, (input) =&gt; {
426
+ input[type] = Object.fromEntries(dependenciesToAdd) as Record&lt;string, string&gt;;
427
+ return input;
428
+ });
429
+ },
430
+ });
431
+ }
432
+ return; // Can't remove from non-existent block
291
433
  }
292
434
  &nbsp;
293
- for (const [dep, version] of Object.entries(options[type]!)) {
435
+ // Process additions
436
+ for (const [dep, version] of dependenciesToAdd) {
294
437
  if (packageJson[type]?.[dep] !== version) {
295
438
  context.addError({
296
439
  file: packageJsonPath,
297
- message: `Expected dependency ${dep}@${version}`,
440
+ message: `Expected dependency ${dep}@${version as string}`,
298
441
  longMessage: diff(
299
- `${dep}@${version}\n`,
442
+ `${dep}@${version as string}\n`,
300
443
  `${dep}@${packageJson[type]![dep] || "missing"}\n`,
301
444
  )!,
302
445
  fixer: () =&gt; {
@@ -304,12 +447,28 @@ export const requireDependency = createRuleFactory({
304
447
  packageJsonPath,
305
448
  context.host,
306
449
  (input) =&gt; {
307
- if (version === undefined) {
308
- input[type] = { ...input[type] };
309
- delete input[type][dep];
310
- } else {
311
- input[type] = { ...input[type], [dep]: version };
312
- }
450
+ input[type] = { ...input[type], [dep]: version as string };
451
+ return input;
452
+ },
453
+ );
454
+ },
455
+ });
456
+ }
457
+ }
458
+ &nbsp;
459
+ // Process removals
460
+ for (const [dep] of dependenciesToRemove) {
461
+ if (packageJson[type]?.[dep] !== undefined) {
462
+ context.addError({
463
+ file: packageJsonPath,
464
+ message: `Dependency ${dep} should be removed`,
465
+ fixer: () =&gt; {
466
+ mutateJson&lt;PackageJson&gt;(
467
+ packageJsonPath,
468
+ context.host,
469
+ (input) =&gt; {
470
+ input[type] = { ...input[type] };
471
+ delete input[type][dep];
313
472
  return input;
314
473
  },
315
474
  );
@@ -319,7 +478,7 @@ export const requireDependency = createRuleFactory({
319
478
  }
320
479
  });
321
480
  },
322
- validateOptions: Options.check,
481
+ validateOptions: Options.parse,
323
482
  });
324
483
  &nbsp;</pre></td></tr></table></pre>
325
484
 
@@ -328,7 +487,7 @@ export const requireDependency = createRuleFactory({
328
487
  <div class='footer quiet pad2 space-top1 center small'>
329
488
  Code coverage generated by
330
489
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
331
- at 2025-01-31T21:00:08.068Z
490
+ at 2025-11-07T18:00:58.549Z
332
491
  </div>
333
492
  <script src="../prettify.js"></script>
334
493
  <script>