@monorepolint/rules 0.6.0-alpha.5 → 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 +446 -94
  5. package/.turbo/turbo-transpile-typescript.log +5 -5
  6. package/CHANGELOG.md +102 -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 +1454 -1442
  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 +34 -34
  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 +60 -60
  61. package/coverage/src/index.html +127 -112
  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 +59 -59
  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 +193 -193
  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 +14 -14
  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">0% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/24</span>
28
+ <span class='fraction'>24/24</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>4/4</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>1/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/24</span>
49
+ <span class='fraction'>24/24</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -95,70 +95,70 @@
95
95
  <a name='L30'></a><a href='#L30'>30</a>
96
96
  <a name='L31'></a><a href='#L31'>31</a>
97
97
  <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
99
- <span class="cline-any cline-no">&nbsp;</span>
98
+ <a name='L33'></a><a href='#L33'>33</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
99
+ <span class="cline-any cline-yes">1x</span>
100
100
  <span class="cline-any cline-neutral">&nbsp;</span>
101
- <span class="cline-any cline-no">&nbsp;</span>
102
- <span class="cline-any cline-no">&nbsp;</span>
103
- <span class="cline-any cline-no">&nbsp;</span>
104
- <span class="cline-any cline-no">&nbsp;</span>
101
+ <span class="cline-any cline-yes">1x</span>
102
+ <span class="cline-any cline-yes">1x</span>
103
+ <span class="cline-any cline-yes">1x</span>
104
+ <span class="cline-any cline-yes">1x</span>
105
105
  <span class="cline-any cline-neutral">&nbsp;</span>
106
106
  <span class="cline-any cline-neutral">&nbsp;</span>
107
107
  <span class="cline-any cline-neutral">&nbsp;</span>
108
- <span class="cline-any cline-no">&nbsp;</span>
108
+ <span class="cline-any cline-yes">1x</span>
109
109
  <span class="cline-any cline-neutral">&nbsp;</span>
110
- <span class="cline-any cline-no">&nbsp;</span>
111
- <span class="cline-any cline-no">&nbsp;</span>
110
+ <span class="cline-any cline-yes">1x</span>
111
+ <span class="cline-any cline-yes">1x</span>
112
112
  <span class="cline-any cline-neutral">&nbsp;</span>
113
- <span class="cline-any cline-no">&nbsp;</span>
114
- <span class="cline-any cline-no">&nbsp;</span>
115
- <span class="cline-any cline-no">&nbsp;</span>
113
+ <span class="cline-any cline-yes">1x</span>
114
+ <span class="cline-any cline-yes">6x</span>
115
+ <span class="cline-any cline-yes">6x</span>
116
116
  <span class="cline-any cline-neutral">&nbsp;</span>
117
- <span class="cline-any cline-no">&nbsp;</span>
118
- <span class="cline-any cline-no">&nbsp;</span>
119
- <span class="cline-any cline-no">&nbsp;</span>
120
- <span class="cline-any cline-no">&nbsp;</span>
121
- <span class="cline-any cline-no">&nbsp;</span>
122
- <span class="cline-any cline-no">&nbsp;</span>
123
- <span class="cline-any cline-no">&nbsp;</span>
124
- <span class="cline-any cline-no">&nbsp;</span>
125
- <span class="cline-any cline-no">&nbsp;</span>
126
- <span class="cline-any cline-no">&nbsp;</span>
117
+ <span class="cline-any cline-yes">6x</span>
118
+ <span class="cline-any cline-yes">2x</span>
119
+ <span class="cline-any cline-yes">2x</span>
120
+ <span class="cline-any cline-yes">2x</span>
121
+ <span class="cline-any cline-yes">2x</span>
122
+ <span class="cline-any cline-yes">2x</span>
123
+ <span class="cline-any cline-yes">6x</span>
124
+ <span class="cline-any cline-yes">4x</span>
125
+ <span class="cline-any cline-yes">4x</span>
126
+ <span class="cline-any cline-yes">6x</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
- <span class="cline-any cline-no">&nbsp;</span>
129
- <span class="cline-any cline-no">&nbsp;</span>
130
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import * as r from "runtypes";</span></span></span>
131
- <span class="cstat-no" title="statement not covered" >import { createRuleFactory } from "./util/createRuleFactory.js";</span>
128
+ <span class="cline-any cline-yes">1x</span>
129
+ <span class="cline-any cline-yes">1x</span>
130
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from "zod";
131
+ import { createRuleFactory } from "./util/createRuleFactory.js";
132
132
  &nbsp;
133
- <span class="cstat-no" title="statement not covered" >export const Options = r.Record({</span>
134
- <span class="cstat-no" title="statement not covered" > singletonKey: r.String.Or(r.Symbol),</span>
135
- <span class="cstat-no" title="statement not covered" > customMessage: r.String.optional(),</span>
136
- <span class="cstat-no" title="statement not covered" >});</span>
133
+ export const Options = z.object({
134
+ singletonKey: z.union([z.string(), z.symbol()]),
135
+ customMessage: z.string().optional(),
136
+ });
137
137
  &nbsp;
138
- export type Options = r.Static&lt;typeof Options&gt;;
138
+ export type Options = z.infer&lt;typeof Options&gt;;
139
139
  &nbsp;
140
- <span class="cstat-no" title="statement not covered" >const visitedMap = new Map&lt;string | symbol, Set&lt;string&gt;&gt;();</span>
140
+ const visitedMap = new Map&lt;string | symbol, Set&lt;string&gt;&gt;();
141
141
  &nbsp;
142
- <span class="cstat-no" title="statement not covered" >export const oncePerPackage = createRuleFactory&lt;Options&gt;({</span>
143
- <span class="cstat-no" title="statement not covered" > name: "oncePerPackage",</span>
142
+ export const oncePerPackage = createRuleFactory&lt;Options&gt;({
143
+ name: "oncePerPackage",
144
144
  &nbsp;
145
- <span class="cstat-no" title="statement not covered" > check: async (context, options) =&gt; {</span>
146
- <span class="cstat-no" title="statement not covered" > const visited = visitedMap.get(options.singletonKey) ?? new Set&lt;string&gt;();</span>
147
- <span class="cstat-no" title="statement not covered" > visitedMap.set(options.singletonKey, visited);</span>
145
+ check: async (context, options) =&gt; {
146
+ const visited = visitedMap.get(options.singletonKey) ?? new Set&lt;string&gt;();
147
+ visitedMap.set(options.singletonKey, visited);
148
148
  &nbsp;
149
- <span class="cstat-no" title="statement not covered" > if (visited.has(context.getName())) {</span>
150
- <span class="cstat-no" title="statement not covered" > context.addError({</span>
151
- <span class="cstat-no" title="statement not covered" > message: "This package has already been visited for this key: "</span>
152
- <span class="cstat-no" title="statement not covered" > + options.singletonKey.toString(),</span>
153
- <span class="cstat-no" title="statement not covered" > file: context.getPackageJsonPath(),</span>
154
- <span class="cstat-no" title="statement not covered" > });</span>
155
- <span class="cstat-no" title="statement not covered" > } else {</span>
156
- <span class="cstat-no" title="statement not covered" > visited.add(context.getName());</span>
157
- <span class="cstat-no" title="statement not covered" > }</span>
158
- <span class="cstat-no" title="statement not covered" > },</span>
149
+ if (visited.has(context.getName())) {
150
+ context.addError({
151
+ message: "This package has already been visited for this key: "
152
+ + options.singletonKey.toString(),
153
+ file: context.getPackageJsonPath(),
154
+ });
155
+ } else {
156
+ visited.add(context.getName());
157
+ }
158
+ },
159
159
  &nbsp;
160
- <span class="cstat-no" title="statement not covered" > validateOptions: Options.assert,</span>
161
- <span class="cstat-no" title="statement not covered" >});</span>
160
+ validateOptions: Options.parse,
161
+ });
162
162
  &nbsp;</pre></td></tr></table></pre>
163
163
 
164
164
  <div class='push'></div><!-- for sticky footer -->
@@ -166,7 +166,7 @@ export type Options = r.Static&lt;typeof Options&gt;;
166
166
  <div class='footer quiet pad2 space-top1 center small'>
167
167
  Code coverage generated by
168
168
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
169
- at 2025-04-02T20:08:01.942Z
169
+ at 2025-11-07T18:00:58.549Z
170
170
  </div>
171
171
  <script src="../prettify.js"></script>
172
172
  <script>
@@ -25,28 +25,28 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>82/82</span>
28
+ <span class='fraction'>89/89</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'>12/12</span>
35
+ <span class='fraction'>22/22</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/4</span>
42
+ <span class='fraction'>7/7</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>82/82</span>
49
+ <span class='fraction'>89/89</span>
50
50
  </div>
51
51
 
52
52
 
@@ -160,7 +160,17 @@
160
160
  <a name='L95'></a><a href='#L95'>95</a>
161
161
  <a name='L96'></a><a href='#L96'>96</a>
162
162
  <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
164
174
  <span class="cline-any cline-neutral">&nbsp;</span>
165
175
  <span class="cline-any cline-neutral">&nbsp;</span>
166
176
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -171,24 +181,9 @@
171
181
  <span class="cline-any cline-yes">1x</span>
172
182
  <span class="cline-any cline-yes">1x</span>
173
183
  <span class="cline-any cline-yes">1x</span>
174
- <span class="cline-any cline-neutral">&nbsp;</span>
175
- <span class="cline-any cline-yes">1x</span>
176
- <span class="cline-any cline-yes">1x</span>
177
- <span class="cline-any cline-yes">1x</span>
178
- <span class="cline-any cline-yes">1x</span>
179
- <span class="cline-any cline-yes">1x</span>
180
- <span class="cline-any cline-yes">1x</span>
181
- <span class="cline-any cline-yes">1x</span>
182
- <span class="cline-any cline-yes">1x</span>
183
- <span class="cline-any cline-yes">1x</span>
184
- <span class="cline-any cline-yes">1x</span>
185
- <span class="cline-any cline-yes">1x</span>
186
- <span class="cline-any cline-yes">1x</span>
187
- <span class="cline-any cline-yes">1x</span>
188
- <span class="cline-any cline-yes">1x</span>
189
- <span class="cline-any cline-yes">1x</span>
190
184
  <span class="cline-any cline-yes">1x</span>
191
185
  <span class="cline-any cline-yes">1x</span>
186
+ <span class="cline-any cline-neutral">&nbsp;</span>
192
187
  <span class="cline-any cline-yes">1x</span>
193
188
  <span class="cline-any cline-yes">1x</span>
194
189
  <span class="cline-any cline-yes">1x</span>
@@ -202,21 +197,16 @@
202
197
  <span class="cline-any cline-yes">1x</span>
203
198
  <span class="cline-any cline-yes">1x</span>
204
199
  <span class="cline-any cline-yes">1x</span>
205
- <span class="cline-any cline-yes">10x</span>
200
+ <span class="cline-any cline-yes">18x</span>
206
201
  <span class="cline-any cline-neutral">&nbsp;</span>
207
- <span class="cline-any cline-yes">10x</span>
208
- <span class="cline-any cline-yes">8x</span>
209
- <span class="cline-any cline-yes">8x</span>
202
+ <span class="cline-any cline-yes">18x</span>
203
+ <span class="cline-any cline-yes">16x</span>
204
+ <span class="cline-any cline-yes">18x</span>
205
+ <span class="cline-any cline-neutral">&nbsp;</span>
206
+ <span class="cline-any cline-yes">18x</span>
210
207
  <span class="cline-any cline-neutral">&nbsp;</span>
211
208
  <span class="cline-any cline-yes">8x</span>
212
- <span class="cline-any cline-yes">8x</span>
213
- <span class="cline-any cline-yes">8x</span>
214
- <span class="cline-any cline-yes">8x</span>
215
- <span class="cline-any cline-yes">8x</span>
216
- <span class="cline-any cline-yes">8x</span>
217
- <span class="cline-any cline-yes">6x</span>
218
209
  <span class="cline-any cline-yes">6x</span>
219
- <span class="cline-any cline-yes">8x</span>
220
210
  <span class="cline-any cline-yes">6x</span>
221
211
  <span class="cline-any cline-yes">6x</span>
222
212
  <span class="cline-any cline-yes">6x</span>
@@ -231,32 +221,62 @@
231
221
  <span class="cline-any cline-yes">6x</span>
232
222
  <span class="cline-any cline-yes">6x</span>
233
223
  <span class="cline-any cline-yes">6x</span>
224
+ <span class="cline-any cline-yes">18x</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-yes">10x</span>
227
+ <span class="cline-any cline-yes">10x</span>
228
+ <span class="cline-any cline-yes">10x</span>
229
+ <span class="cline-any cline-yes">10x</span>
230
+ <span class="cline-any cline-yes">10x</span>
231
+ <span class="cline-any cline-yes">10x</span>
234
232
  <span class="cline-any cline-yes">6x</span>
235
233
  <span class="cline-any cline-yes">6x</span>
234
+ <span class="cline-any cline-yes">10x</span>
235
+ <span class="cline-any cline-yes">8x</span>
236
+ <span class="cline-any cline-yes">8x</span>
237
+ <span class="cline-any cline-yes">8x</span>
238
+ <span class="cline-any cline-yes">8x</span>
239
+ <span class="cline-any cline-yes">8x</span>
240
+ <span class="cline-any cline-yes">8x</span>
241
+ <span class="cline-any cline-yes">8x</span>
242
+ <span class="cline-any cline-yes">8x</span>
243
+ <span class="cline-any cline-yes">8x</span>
244
+ <span class="cline-any cline-yes">8x</span>
245
+ <span class="cline-any cline-yes">8x</span>
246
+ <span class="cline-any cline-yes">8x</span>
247
+ <span class="cline-any cline-yes">8x</span>
248
+ <span class="cline-any cline-yes">8x</span>
236
249
  <span class="cline-any cline-yes">8x</span>
237
250
  <span class="cline-any cline-yes">8x</span>
238
- <span class="cline-any cline-neutral">&nbsp;</span>
239
251
  <span class="cline-any cline-yes">10x</span>
252
+ <span class="cline-any cline-yes">18x</span>
253
+ <span class="cline-any cline-yes">16x</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-yes">18x</span>
256
+ <span class="cline-any cline-yes">6x</span>
257
+ <span class="cline-any cline-yes">6x</span>
240
258
  <span class="cline-any cline-yes">4x</span>
241
259
  <span class="cline-any cline-yes">4x</span>
242
260
  <span class="cline-any cline-yes">4x</span>
243
261
  <span class="cline-any cline-yes">4x</span>
244
262
  <span class="cline-any cline-yes">4x</span>
245
- <span class="cline-any cline-yes">4x</span>
246
- <span class="cline-any cline-yes">4x</span>
247
- <span class="cline-any cline-yes">4x</span>
248
- <span class="cline-any cline-yes">4x</span>
249
- <span class="cline-any cline-yes">10x</span>
263
+ <span class="cline-any cline-yes">6x</span>
264
+ <span class="cline-any cline-yes">6x</span>
265
+ <span class="cline-any cline-yes">18x</span>
250
266
  <span class="cline-any cline-yes">1x</span>
251
267
  <span class="cline-any cline-yes">1x</span>
252
268
  <span class="cline-any cline-neutral">&nbsp;</span>
253
269
  <span class="cline-any cline-yes">1x</span>
254
- <span class="cline-any cline-yes">12x</span>
255
- <span class="cline-any cline-yes">12x</span>
270
+ <span class="cline-any cline-yes">16x</span>
271
+ <span class="cline-any cline-yes">16x</span>
256
272
  <span class="cline-any cline-neutral">&nbsp;</span>
257
273
  <span class="cline-any cline-yes">1x</span>
258
274
  <span class="cline-any cline-yes">8x</span>
259
275
  <span class="cline-any cline-yes">8x</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-yes">1x</span>
278
+ <span class="cline-any cline-yes">12x</span>
279
+ <span class="cline-any cline-yes">12x</span>
260
280
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*!
261
281
  * Copyright 2019 Palantir Technologies, Inc.
262
282
  *
@@ -266,35 +286,20 @@
266
286
  &nbsp;
267
287
  import { mutateJson, PackageJson } from "@monorepolint/utils";
268
288
  import { diff } from "jest-diff";
269
- import * as r from "runtypes";
289
+ import { z } from "zod";
290
+ import { REMOVE } from "./REMOVE.js";
270
291
  import { createRuleFactory } from "./util/createRuleFactory.js";
292
+ import { ZodRemove } from "./util/zodSchemas.js";
271
293
  &nbsp;
272
- export const Options = r.Union(
273
- r
274
- .Record({
275
- entries: r.Dictionary(r.Unknown), // string =&gt; unknown, enforces existence of keys and their values
276
- })
277
- .And(
278
- r.Partial({
279
- entriesExist: r.Undefined,
280
- }),
281
- ),
282
- r
283
- .Record({
284
- entriesExist: r.Array(r.String), // enforces existence of keys, but not values
285
- })
286
- .And(
287
- r.Partial({
288
- entries: r.Undefined,
289
- }),
290
- ),
291
- r.Record({
292
- entries: r.Dictionary(r.Unknown), // string =&gt; unknown, enforces existence of keys and their values
293
- entriesExist: r.Array(r.String),
294
- }),
294
+ export const Options = z.object({
295
+ entries: z.record(z.string(), z.union([z.unknown(), ZodRemove])).optional(), // string =&gt; unknown | REMOVE, enforces existence of keys and their values or removal
296
+ entriesExist: z.array(z.string()).optional(), // enforces existence of keys, but not values
297
+ }).refine(
298
+ (data) =&gt; data.entries !== undefined || data.entriesExist !== undefined,
299
+ { message: "At least one of 'entries' or 'entriesExist' must be provided" },
295
300
  );
296
301
  &nbsp;
297
- export type Options = r.Static&lt;typeof Options&gt;;
302
+ export type Options = z.infer&lt;typeof Options&gt;;
298
303
  &nbsp;
299
304
  export const packageEntry = createRuleFactory&lt;Options&gt;({
300
305
  name: "packageEntry",
@@ -305,30 +310,51 @@ export const packageEntry = createRuleFactory&lt;Options&gt;({
305
310
  for (const key of Object.keys(options.entries)) {
306
311
  const value = options.entries[key];
307
312
  &nbsp;
308
- const entryDiff = diff(
309
- JSON.stringify(value) + "\n",
310
- (JSON.stringify(packageJson[key]) || "") + "\n",
311
- );
312
- if (
313
- (typeof value !== "object" &amp;&amp; value !== packageJson[key])
314
- || entryDiff == null
315
- || !entryDiff.includes("Compared values have no visual difference")
316
- ) {
317
- context.addError({
318
- file: context.getPackageJsonPath(),
319
- message: createStandardizedEntryErrorMessage(key),
320
- longMessage: entryDiff,
321
- fixer: () =&gt; {
322
- mutateJson&lt;PackageJson&gt;(
323
- context.getPackageJsonPath(),
324
- context.host,
325
- (input) =&gt; {
326
- input[key] = value;
327
- return input;
328
- },
329
- );
330
- },
331
- });
313
+ if (value === REMOVE) {
314
+ // Handle removal: only add error if key exists
315
+ if (packageJson[key] !== undefined) {
316
+ context.addError({
317
+ file: context.getPackageJsonPath(),
318
+ message: createRemovalEntryErrorMessage(key),
319
+ fixer: () =&gt; {
320
+ mutateJson&lt;PackageJson&gt;(
321
+ context.getPackageJsonPath(),
322
+ context.host,
323
+ (input) =&gt; {
324
+ delete input[key];
325
+ return input;
326
+ },
327
+ );
328
+ },
329
+ });
330
+ }
331
+ } else {
332
+ // Handle regular value checking
333
+ const entryDiff = diff(
334
+ JSON.stringify(value) + "\n",
335
+ (JSON.stringify(packageJson[key]) || "") + "\n",
336
+ );
337
+ if (
338
+ (typeof value !== "object" &amp;&amp; value !== packageJson[key])
339
+ || entryDiff == null
340
+ || !entryDiff.includes("Compared values have no visual difference")
341
+ ) {
342
+ context.addError({
343
+ file: context.getPackageJsonPath(),
344
+ message: createStandardizedEntryErrorMessage(key),
345
+ longMessage: entryDiff,
346
+ fixer: () =&gt; {
347
+ mutateJson&lt;PackageJson&gt;(
348
+ context.getPackageJsonPath(),
349
+ context.host,
350
+ (input) =&gt; {
351
+ input[key] = value;
352
+ return input;
353
+ },
354
+ );
355
+ },
356
+ });
357
+ }
332
358
  }
333
359
  }
334
360
  }
@@ -344,7 +370,7 @@ export const packageEntry = createRuleFactory&lt;Options&gt;({
344
370
  }
345
371
  }
346
372
  },
347
- validateOptions: Options.check,
373
+ validateOptions: Options.parse,
348
374
  });
349
375
  &nbsp;
350
376
  export function createStandardizedEntryErrorMessage(key: string) {
@@ -354,6 +380,10 @@ export function createStandardizedEntryErrorMessage(key: string) {
354
380
  export function createExpectedEntryErrorMessage(key: string) {
355
381
  return `Expected entry for '${key}' to exist`;
356
382
  }
383
+ &nbsp;
384
+ export function createRemovalEntryErrorMessage(key: string) {
385
+ return `Entry '${key}' should be removed`;
386
+ }
357
387
  &nbsp;</pre></td></tr></table></pre>
358
388
 
359
389
  <div class='push'></div><!-- for sticky footer -->
@@ -361,7 +391,7 @@ export function createExpectedEntryErrorMessage(key: string) {
361
391
  <div class='footer quiet pad2 space-top1 center small'>
362
392
  Code coverage generated by
363
393
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
364
- at 2025-04-02T20:08:01.942Z
394
+ at 2025-11-07T18:00:58.549Z
365
395
  </div>
366
396
  <script src="../prettify.js"></script>
367
397
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">99% </span>
26
+ <span class="strong">99.09% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>99/100</span>
28
+ <span class='fraction'>109/110</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">99% </span>
47
+ <span class="strong">99.09% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>99/100</span>
49
+ <span class='fraction'>109/110</span>
50
50
  </div>
51
51
 
52
52
 
@@ -192,7 +192,17 @@
192
192
  <a name='L127'></a><a href='#L127'>127</a>
193
193
  <a name='L128'></a><a href='#L128'>128</a>
194
194
  <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
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>
196
206
  <span class="cline-any cline-neutral">&nbsp;</span>
197
207
  <span class="cline-any cline-neutral">&nbsp;</span>
198
208
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -210,6 +220,16 @@
210
220
  <span class="cline-any cline-yes">1x</span>
211
221
  <span class="cline-any cline-yes">1x</span>
212
222
  <span class="cline-any cline-yes">1x</span>
223
+ <span class="cline-any cline-yes">1x</span>
224
+ <span class="cline-any cline-yes">1x</span>
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>
213
233
  <span class="cline-any cline-neutral">&nbsp;</span>
214
234
  <span class="cline-any cline-neutral">&nbsp;</span>
215
235
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -330,17 +350,27 @@
330
350
  &nbsp;
331
351
  import { Context } from "@monorepolint/config";
332
352
  import { diff } from "jest-diff";
333
- import * as r from "runtypes";
353
+ import { z } from "zod";
334
354
  import { createRuleFactory } from "./util/createRuleFactory.js";
335
355
  type OrderFunction = (context: Context) =&gt; (a: string, b: string) =&gt; number;
336
356
  &nbsp;
337
- const Options = r
338
- .Record({
339
- order: r.Union(r.Array(r.String), r.Function),
340
- })
341
- .Or(r.Undefined);
357
+ const Options = z.union([
358
+ z.undefined(),
359
+ z.object({
360
+ order: z.union([
361
+ z.array(z.string()),
362
+ z.function({
363
+ input: [z.any()],
364
+ output: z.function({
365
+ input: [z.string(), z.string()],
366
+ output: z.number(),
367
+ }),
368
+ }),
369
+ ]),
370
+ }),
371
+ ]);
342
372
  &nbsp;
343
- type Options = r.Static&lt;typeof Options&gt;;
373
+ type Options = z.infer&lt;typeof Options&gt;;
344
374
  &nbsp;
345
375
  const defaultKeyOrder = [
346
376
  "name",
@@ -409,7 +439,7 @@ export const packageOrder = createRuleFactory&lt;Options&gt;({
409
439
  });
410
440
  }
411
441
  },
412
- validateOptions: Options.check,
442
+ validateOptions: Options.parse,
413
443
  });
414
444
  &nbsp;
415
445
  function arrayOrderCompare(a: ReadonlyArray&lt;string&gt;, b: ReadonlyArray&lt;string&gt;) {
@@ -457,7 +487,7 @@ function isOrderFunction(
457
487
  <div class='footer quiet pad2 space-top1 center small'>
458
488
  Code coverage generated by
459
489
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
460
- at 2025-04-02T20:08:01.942Z
490
+ at 2025-11-07T18:00:58.549Z
461
491
  </div>
462
492
  <script src="../prettify.js"></script>
463
493
  <script>