@shivaedev/quality 0.2.0 → 0.3.0

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 (258) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +207 -35
  3. package/dist/baseline/compare.d.ts +3 -8
  4. package/dist/baseline/compare.d.ts.map +1 -1
  5. package/dist/baseline/compare.js +13 -23
  6. package/dist/baseline/compare.js.map +1 -1
  7. package/dist/baseline/format.d.ts +7 -5
  8. package/dist/baseline/format.d.ts.map +1 -1
  9. package/dist/baseline/format.js +31 -23
  10. package/dist/baseline/format.js.map +1 -1
  11. package/dist/baseline/guard.d.ts +23 -0
  12. package/dist/baseline/guard.d.ts.map +1 -0
  13. package/dist/baseline/guard.js +31 -0
  14. package/dist/baseline/guard.js.map +1 -0
  15. package/dist/baseline/legacy.d.ts +11 -0
  16. package/dist/baseline/legacy.d.ts.map +1 -0
  17. package/dist/baseline/legacy.js +33 -0
  18. package/dist/baseline/legacy.js.map +1 -0
  19. package/dist/baseline/rewrite.d.ts +3 -0
  20. package/dist/baseline/rewrite.d.ts.map +1 -0
  21. package/dist/baseline/rewrite.js +19 -0
  22. package/dist/baseline/rewrite.js.map +1 -0
  23. package/dist/baseline/update.d.ts +7 -6
  24. package/dist/baseline/update.d.ts.map +1 -1
  25. package/dist/baseline/update.js +28 -28
  26. package/dist/baseline/update.js.map +1 -1
  27. package/dist/cli/args.d.ts +14 -1
  28. package/dist/cli/args.d.ts.map +1 -1
  29. package/dist/cli/args.js +54 -29
  30. package/dist/cli/args.js.map +1 -1
  31. package/dist/cli/baseline.d.ts +3 -1
  32. package/dist/cli/baseline.d.ts.map +1 -1
  33. package/dist/cli/baseline.js +19 -10
  34. package/dist/cli/baseline.js.map +1 -1
  35. package/dist/cli/check.d.ts +5 -0
  36. package/dist/cli/check.d.ts.map +1 -0
  37. package/dist/cli/check.js +39 -0
  38. package/dist/cli/check.js.map +1 -0
  39. package/dist/cli/lint.js +1 -1
  40. package/dist/cli/lint.js.map +1 -1
  41. package/dist/cli/migrate.d.ts +4 -0
  42. package/dist/cli/migrate.d.ts.map +1 -0
  43. package/dist/cli/migrate.js +31 -0
  44. package/dist/cli/migrate.js.map +1 -0
  45. package/dist/cli/run-main.d.ts +2 -1
  46. package/dist/cli/run-main.d.ts.map +1 -1
  47. package/dist/cli/run-main.js +5 -2
  48. package/dist/cli/run-main.js.map +1 -1
  49. package/dist/cli/shrink.d.ts +6 -0
  50. package/dist/cli/shrink.d.ts.map +1 -0
  51. package/dist/cli/shrink.js +8 -0
  52. package/dist/cli/shrink.js.map +1 -0
  53. package/dist/cli.js +11 -2
  54. package/dist/cli.js.map +1 -1
  55. package/dist/config/decode.d.ts +1 -0
  56. package/dist/config/decode.d.ts.map +1 -1
  57. package/dist/config/decode.js +1 -0
  58. package/dist/config/decode.js.map +1 -1
  59. package/dist/config/file.d.ts +2 -0
  60. package/dist/config/file.d.ts.map +1 -0
  61. package/dist/config/file.js +2 -0
  62. package/dist/config/file.js.map +1 -0
  63. package/dist/config/load.d.ts +1 -1
  64. package/dist/config/load.d.ts.map +1 -1
  65. package/dist/config/load.js +3 -2
  66. package/dist/config/load.js.map +1 -1
  67. package/dist/config/resolve.d.ts +1 -0
  68. package/dist/config/resolve.d.ts.map +1 -1
  69. package/dist/config/resolve.js +6 -4
  70. package/dist/config/resolve.js.map +1 -1
  71. package/dist/config.d.ts +2 -7
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js.map +1 -1
  74. package/dist/engine/baseline-file.d.ts +11 -0
  75. package/dist/engine/baseline-file.d.ts.map +1 -0
  76. package/dist/engine/baseline-file.js +18 -0
  77. package/dist/engine/baseline-file.js.map +1 -0
  78. package/dist/engine/evaluate.d.ts +2 -2
  79. package/dist/engine/evaluate.d.ts.map +1 -1
  80. package/dist/engine/evaluate.js +3 -3
  81. package/dist/engine/evaluate.js.map +1 -1
  82. package/dist/engine/session.d.ts +3 -5
  83. package/dist/engine/session.d.ts.map +1 -1
  84. package/dist/engine/session.js +12 -10
  85. package/dist/engine/session.js.map +1 -1
  86. package/dist/exceptions/registry.d.ts +1 -1
  87. package/dist/exceptions/registry.d.ts.map +1 -1
  88. package/dist/exceptions/registry.js +8 -3
  89. package/dist/exceptions/registry.js.map +1 -1
  90. package/dist/failure.d.ts +0 -2
  91. package/dist/failure.d.ts.map +1 -1
  92. package/dist/failure.js +0 -2
  93. package/dist/failure.js.map +1 -1
  94. package/dist/git/base.d.ts +9 -0
  95. package/dist/git/base.d.ts.map +1 -0
  96. package/dist/git/base.js +34 -0
  97. package/dist/git/base.js.map +1 -0
  98. package/dist/git/command.d.ts +12 -0
  99. package/dist/git/command.d.ts.map +1 -0
  100. package/dist/git/command.js +13 -0
  101. package/dist/git/command.js.map +1 -0
  102. package/dist/git/history.d.ts +10 -0
  103. package/dist/git/history.d.ts.map +1 -0
  104. package/dist/git/history.js +28 -0
  105. package/dist/git/history.js.map +1 -0
  106. package/dist/inventory/ignore-scope.d.ts.map +1 -1
  107. package/dist/inventory/ignore-scope.js +0 -1
  108. package/dist/inventory/ignore-scope.js.map +1 -1
  109. package/dist/inventory/walk.d.ts +0 -1
  110. package/dist/inventory/walk.d.ts.map +1 -1
  111. package/dist/inventory/walk.js +1 -1
  112. package/dist/inventory/walk.js.map +1 -1
  113. package/dist/report/guard.d.ts +9 -0
  114. package/dist/report/guard.d.ts.map +1 -0
  115. package/dist/report/guard.js +34 -0
  116. package/dist/report/guard.js.map +1 -0
  117. package/dist/report/render.js +1 -2
  118. package/dist/report/render.js.map +1 -1
  119. package/dist/report/stale.d.ts.map +1 -1
  120. package/dist/report/stale.js +4 -3
  121. package/dist/report/stale.js.map +1 -1
  122. package/dist/rule.d.ts +4 -7
  123. package/dist/rule.d.ts.map +1 -1
  124. package/dist/rule.js +1 -1
  125. package/dist/rule.js.map +1 -1
  126. package/dist/rules/built-in.d.ts +17 -0
  127. package/dist/rules/built-in.d.ts.map +1 -1
  128. package/dist/rules/built-in.js +21 -1
  129. package/dist/rules/built-in.js.map +1 -1
  130. package/dist/rules/comments/kinds.d.ts +9 -0
  131. package/dist/rules/comments/kinds.d.ts.map +1 -0
  132. package/dist/rules/comments/kinds.js +34 -0
  133. package/dist/rules/comments/kinds.js.map +1 -0
  134. package/dist/rules/comments/max-per-file.d.ts +5 -0
  135. package/dist/rules/comments/max-per-file.d.ts.map +1 -0
  136. package/dist/rules/comments/max-per-file.js +39 -0
  137. package/dist/rules/comments/max-per-file.js.map +1 -0
  138. package/dist/rules/comments/no-banner.d.ts +2 -0
  139. package/dist/rules/comments/no-banner.d.ts.map +1 -0
  140. package/dist/rules/comments/no-banner.js +9 -0
  141. package/dist/rules/comments/no-banner.js.map +1 -0
  142. package/dist/rules/comments/no-jsdoc.d.ts +4 -0
  143. package/dist/rules/comments/no-jsdoc.d.ts.map +1 -0
  144. package/dist/rules/comments/no-jsdoc.js +14 -0
  145. package/dist/rules/comments/no-jsdoc.js.map +1 -0
  146. package/dist/rules/comments/no-line-reference.d.ts +2 -0
  147. package/dist/rules/comments/no-line-reference.d.ts.map +1 -0
  148. package/dist/rules/comments/no-line-reference.js +9 -0
  149. package/dist/rules/comments/no-line-reference.js.map +1 -0
  150. package/dist/rules/comments/no-pr-reference.d.ts +2 -0
  151. package/dist/rules/comments/no-pr-reference.d.ts.map +1 -0
  152. package/dist/rules/comments/no-pr-reference.js +13 -0
  153. package/dist/rules/comments/no-pr-reference.js.map +1 -0
  154. package/dist/rules/comments/no-todo.d.ts +2 -0
  155. package/dist/rules/comments/no-todo.d.ts.map +1 -0
  156. package/dist/rules/comments/no-todo.js +8 -0
  157. package/dist/rules/comments/no-todo.js.map +1 -0
  158. package/dist/rules/comments/pattern-rule.d.ts +10 -0
  159. package/dist/rules/comments/pattern-rule.d.ts.map +1 -0
  160. package/dist/rules/comments/pattern-rule.js +16 -0
  161. package/dist/rules/comments/pattern-rule.js.map +1 -0
  162. package/dist/rules/comments/scan.d.ts +13 -0
  163. package/dist/rules/comments/scan.d.ts.map +1 -0
  164. package/dist/rules/comments/scan.js +62 -0
  165. package/dist/rules/comments/scan.js.map +1 -0
  166. package/dist/rules/max-lines.d.ts.map +1 -1
  167. package/dist/rules/max-lines.js +8 -1
  168. package/dist/rules/max-lines.js.map +1 -1
  169. package/dist/rules/suppressions/biome/configs.d.ts +14 -0
  170. package/dist/rules/suppressions/biome/configs.d.ts.map +1 -0
  171. package/dist/rules/suppressions/biome/configs.js +39 -0
  172. package/dist/rules/suppressions/biome/configs.js.map +1 -0
  173. package/dist/rules/suppressions/biome/json.d.ts +27 -0
  174. package/dist/rules/suppressions/biome/json.d.ts.map +1 -0
  175. package/dist/rules/suppressions/biome/json.js +37 -0
  176. package/dist/rules/suppressions/biome/json.js.map +1 -0
  177. package/dist/rules/suppressions/biome/weakenings.d.ts +9 -0
  178. package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -0
  179. package/dist/rules/suppressions/biome/weakenings.js +68 -0
  180. package/dist/rules/suppressions/biome/weakenings.js.map +1 -0
  181. package/dist/rules/suppressions/biome-overrides.d.ts +8 -0
  182. package/dist/rules/suppressions/biome-overrides.d.ts.map +1 -0
  183. package/dist/rules/suppressions/biome-overrides.js +47 -0
  184. package/dist/rules/suppressions/biome-overrides.js.map +1 -0
  185. package/dist/rules/suppressions/directives.d.ts +4 -0
  186. package/dist/rules/suppressions/directives.d.ts.map +1 -0
  187. package/dist/rules/suppressions/directives.js +19 -0
  188. package/dist/rules/suppressions/directives.js.map +1 -0
  189. package/dist/rules/suppressions/no-double-cast.d.ts +2 -0
  190. package/dist/rules/suppressions/no-double-cast.d.ts.map +1 -0
  191. package/dist/rules/suppressions/no-double-cast.js +38 -0
  192. package/dist/rules/suppressions/no-double-cast.js.map +1 -0
  193. package/dist/rules/suppressions/no-inline.d.ts +8 -0
  194. package/dist/rules/suppressions/no-inline.d.ts.map +1 -0
  195. package/dist/rules/suppressions/no-inline.js +48 -0
  196. package/dist/rules/suppressions/no-inline.js.map +1 -0
  197. package/dist/rules/suppressions/stylesheet-comments.d.ts +4 -0
  198. package/dist/rules/suppressions/stylesheet-comments.d.ts.map +1 -0
  199. package/dist/rules/suppressions/stylesheet-comments.js +20 -0
  200. package/dist/rules/suppressions/stylesheet-comments.js.map +1 -0
  201. package/dist/rules/syntax.d.ts +4 -0
  202. package/dist/rules/syntax.d.ts.map +1 -0
  203. package/dist/rules/syntax.js +12 -0
  204. package/dist/rules/syntax.js.map +1 -0
  205. package/package.json +4 -5
  206. package/src/baseline/compare.ts +15 -39
  207. package/src/baseline/format.ts +35 -32
  208. package/src/baseline/guard.ts +47 -0
  209. package/src/baseline/legacy.ts +46 -0
  210. package/src/baseline/rewrite.ts +24 -0
  211. package/src/baseline/update.ts +47 -30
  212. package/src/cli/args.ts +64 -30
  213. package/src/cli/baseline.ts +27 -13
  214. package/src/cli/check.ts +51 -0
  215. package/src/cli/lint.ts +1 -1
  216. package/src/cli/migrate.ts +36 -0
  217. package/src/cli/run-main.ts +8 -3
  218. package/src/cli/shrink.ts +31 -0
  219. package/src/cli.ts +11 -2
  220. package/src/config/decode.ts +1 -0
  221. package/src/config/file.ts +1 -0
  222. package/src/config/load.ts +4 -3
  223. package/src/config/resolve.ts +7 -4
  224. package/src/config.ts +3 -7
  225. package/src/engine/baseline-file.ts +27 -0
  226. package/src/engine/evaluate.ts +4 -2
  227. package/src/engine/session.ts +14 -12
  228. package/src/exceptions/registry.ts +9 -2
  229. package/src/failure.ts +0 -2
  230. package/src/git/base.ts +54 -0
  231. package/src/git/command.ts +31 -0
  232. package/src/git/history.ts +41 -0
  233. package/src/inventory/ignore-scope.ts +0 -1
  234. package/src/inventory/walk.ts +1 -1
  235. package/src/report/guard.ts +46 -0
  236. package/src/report/render.ts +2 -2
  237. package/src/report/stale.ts +11 -3
  238. package/src/rule.ts +5 -8
  239. package/src/rules/built-in.ts +21 -1
  240. package/src/rules/comments/kinds.ts +45 -0
  241. package/src/rules/comments/max-per-file.ts +46 -0
  242. package/src/rules/comments/no-banner.ts +10 -0
  243. package/src/rules/comments/no-jsdoc.ts +18 -0
  244. package/src/rules/comments/no-line-reference.ts +11 -0
  245. package/src/rules/comments/no-pr-reference.ts +13 -0
  246. package/src/rules/comments/no-todo.ts +8 -0
  247. package/src/rules/comments/pattern-rule.ts +28 -0
  248. package/src/rules/comments/scan.ts +80 -0
  249. package/src/rules/max-lines.ts +8 -1
  250. package/src/rules/suppressions/biome/configs.ts +50 -0
  251. package/src/rules/suppressions/biome/json.ts +55 -0
  252. package/src/rules/suppressions/biome/weakenings.ts +102 -0
  253. package/src/rules/suppressions/biome-overrides.ts +61 -0
  254. package/src/rules/suppressions/directives.ts +25 -0
  255. package/src/rules/suppressions/no-double-cast.ts +47 -0
  256. package/src/rules/suppressions/no-inline.ts +63 -0
  257. package/src/rules/suppressions/stylesheet-comments.ts +27 -0
  258. package/src/rules/syntax.ts +14 -0
@@ -1 +1 @@
1
- {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,KAA4B,EAAyB,EAAE,CACvG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAE9I,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC;AAErH,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CACvE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AAExG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAiB,EAAyB,EAAE,CAAC;IAC5F,GAAG,OAAO,CACT,KAAK,CAAC,QAAQ,EACd,kHAAkH,EAClH,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,KAAK,CAAC,QAAQ,EACd,0FAA0F,EAC1F,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;CACD,CAAC"}
1
+ {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB,EAAE,KAA4B,EAAyB,EAAE,CACtH,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjJ,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC;AAErH,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CACvE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AAExG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAiB,EAAyB,EAAE,CAAC;IAC5F,GAAG,OAAO,CACT,OAAO,EACP,KAAK,CAAC,QAAQ,EACd,qGAAqG,EACrG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,MAAM,EACN,KAAK,CAAC,QAAQ,EACd,2HAA2H,EAC3H,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,OAAO,EACP,KAAK,CAAC,QAAQ,EACd,0FAA0F,EAC1F,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;CACD,CAAC"}
package/dist/rule.d.ts CHANGED
@@ -3,10 +3,9 @@ export interface Finding {
3
3
  readonly file: string;
4
4
  readonly line?: number | undefined;
5
5
  readonly message: string;
6
- /** Tells apart exceptions of one rule in one file, such as which Biome rule an override turns off. */
7
6
  readonly subject?: string | undefined;
8
- /** A size where larger is worse, such as a file's line count. A baselined file may not grow past it. */
9
- readonly measure?: number | undefined;
7
+ readonly count?: number | undefined;
8
+ readonly threshold?: number | undefined;
10
9
  }
11
10
  export type Findings = ReadonlyArray<Finding>;
12
11
  export interface SourceFile {
@@ -33,11 +32,13 @@ export type Configured = {
33
32
  export interface Rule<Id extends string = string, Input = unknown> {
34
33
  readonly id: Id;
35
34
  readonly description: string;
35
+ readonly registrable?: boolean;
36
36
  configure(options: Input | undefined): Promise<Configured>;
37
37
  }
38
38
  interface RuleDefinition<Id extends string, Options> {
39
39
  readonly id: Id;
40
40
  readonly description: string;
41
+ readonly registrable?: false;
41
42
  readonly check: (context: RuleContext<Options>) => Findings | PromiseLike<Findings>;
42
43
  }
43
44
  interface RuleDefinitionWithOptions<Id extends string, Input, Options> extends RuleDefinition<Id, Options> {
@@ -46,10 +47,6 @@ interface RuleDefinitionWithOptions<Id extends string, Input, Options> extends R
46
47
  interface RuleDefinitionWithoutOptions<Id extends string> extends RuleDefinition<Id, undefined> {
47
48
  readonly options?: undefined;
48
49
  }
49
- /**
50
- * Defines a rule. Options are an object validated by a Standard Schema; a rule the config gives no options validates `{}`,
51
- * so give each option a default or make it optional.
52
- */
53
50
  export declare function defineRule<const Id extends string, Input, Options>(definition: RuleDefinitionWithOptions<Id, Input, Options>): Rule<Id, Input>;
54
51
  export declare function defineRule<const Id extends string>(definition: RuleDefinitionWithoutOptions<Id>): Rule<Id, undefined>;
55
52
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
package/dist/rule.js CHANGED
@@ -18,6 +18,6 @@ export function defineRule(definition) {
18
18
  const configure = definition.options === undefined
19
19
  ? configureWith(noOptions, definition.check, undefined)
20
20
  : configureWith(definition.options, definition.check, {});
21
- return { configure, description: definition.description, id: definition.id };
21
+ return { configure, description: definition.description, id: definition.id, registrable: definition.registrable ?? true };
22
22
  }
23
23
  //# sourceMappingURL=rule.js.map
package/dist/rule.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAwD5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAQH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAyD5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;AAC3H,CAAC"}
@@ -2,5 +2,22 @@ export declare const builtInRules: readonly [import("../rule.ts").Rule<"structur
2
2
  readonly source?: number;
3
3
  readonly test?: number;
4
4
  readonly testFiles?: readonly string[];
5
+ }>, import("../rule.ts").Rule<"comments/no-jsdoc", {
6
+ readonly allow?: readonly string[];
7
+ }>, import("../rule.ts").Rule<"comments/no-line-reference", undefined>, import("../rule.ts").Rule<"comments/no-pr-reference", undefined>, import("../rule.ts").Rule<"comments/no-banner", undefined>, import("../rule.ts").Rule<"comments/no-todo", undefined>, import("../rule.ts").Rule<"comments/max-per-file", {
8
+ readonly max?: number;
9
+ readonly allow?: readonly string[];
10
+ }>, import("../rule.ts").Rule<"suppressions/no-inline", {
11
+ readonly declared?: readonly {
12
+ readonly directive: "@ts-expect-error";
13
+ readonly includes: readonly [string, ...string[]];
14
+ readonly reason: string;
15
+ }[];
16
+ }>, import("../rule.ts").Rule<"suppressions/no-double-cast", undefined>, import("../rule.ts").Rule<"suppressions/biome-overrides", {
17
+ readonly declared?: readonly {
18
+ readonly rule: string;
19
+ readonly includes: readonly [string, ...string[]];
20
+ readonly reason: string;
21
+ }[];
5
22
  }>];
6
23
  //# sourceMappingURL=built-in.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"built-in.d.ts","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;GAAsB,CAAC"}
1
+ {"version":3,"file":"built-in.d.ts","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;GAWf,CAAC"}
@@ -1,3 +1,23 @@
1
+ import { maxPerFile } from "./comments/max-per-file.js";
2
+ import { noBanner } from "./comments/no-banner.js";
3
+ import { noJsdoc } from "./comments/no-jsdoc.js";
4
+ import { noLineReference } from "./comments/no-line-reference.js";
5
+ import { noPrReference } from "./comments/no-pr-reference.js";
6
+ import { noTodo } from "./comments/no-todo.js";
1
7
  import { maxLines } from "./max-lines.js";
2
- export const builtInRules = [maxLines];
8
+ import { biomeOverrides } from "./suppressions/biome-overrides.js";
9
+ import { noDoubleCast } from "./suppressions/no-double-cast.js";
10
+ import { noInline } from "./suppressions/no-inline.js";
11
+ export const builtInRules = [
12
+ maxLines,
13
+ noJsdoc,
14
+ noLineReference,
15
+ noPrReference,
16
+ noBanner,
17
+ noTodo,
18
+ maxPerFile,
19
+ noInline,
20
+ noDoubleCast,
21
+ biomeOverrides,
22
+ ];
3
23
  //# sourceMappingURL=built-in.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"built-in.js","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAU,CAAC"}
1
+ {"version":3,"file":"built-in.js","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,QAAQ;IACR,OAAO;IACP,eAAe;IACf,aAAa;IACb,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,cAAc;CACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Schema } from "effect";
2
+ import type { SourceComment } from "./scan.ts";
3
+ export declare const DEFAULT_PRAGMAS: ReadonlyArray<string>;
4
+ export declare const Pragmas: Schema.withDecodingDefaultKey<Schema.$Array<Schema.String>, never>;
5
+ export declare const textOf: (comment: SourceComment) => string;
6
+ export declare const isJsdoc: (comment: SourceComment) => boolean;
7
+ export declare const isPragma: (comment: SourceComment, pragmas: ReadonlyArray<string>) => boolean;
8
+ export declare const isDirective: (comment: SourceComment) => boolean;
9
+ //# sourceMappingURL=kinds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/kinds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAQjD,CAAC;AAEF,eAAO,MAAM,OAAO,oEAAmG,CAAC;AAkBxH,eAAO,MAAM,MAAM,GAAI,SAAS,aAAa,KAAG,MAAiC,CAAC;AAElF,eAAO,MAAM,OAAO,GAAI,SAAS,aAAa,KAAG,OAAgG,CAAC;AAElJ,eAAO,MAAM,QAAQ,GAAI,SAAS,aAAa,EAAE,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,OAGjF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,aAAa,KAAG,OAGpD,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SUPPRESSIONS } from "../suppressions/directives.js";
3
+ export const DEFAULT_PRAGMAS = [
4
+ "@vitest-environment",
5
+ "@vitest-environment-options",
6
+ "@jest-environment",
7
+ "@jsx",
8
+ "@jsxFrag",
9
+ "@jsxImportSource",
10
+ "@jsxRuntime",
11
+ ];
12
+ export const Pragmas = Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed(DEFAULT_PRAGMAS)));
13
+ const DIRECTIVES = [
14
+ ...SUPPRESSIONS,
15
+ /^@ts-/,
16
+ /^biome-ignore/,
17
+ /^(?:eslint|oxlint|stylelint)-(?:disable|enable)/,
18
+ /^[#@]__(?:PURE|NO_SIDE_EFFECTS)__/,
19
+ /^(?:c8|v8|istanbul) ignore/,
20
+ ];
21
+ const TRIPLE_SLASH = /^\/\/\/\s*</;
22
+ const contentOf = (comment) => comment.body.filter((line) => line !== "");
23
+ const startsWithTag = (line, tags) => tags.some((tag) => line === tag || line.startsWith(`${tag} `) || line.startsWith(`${tag}\t`));
24
+ export const textOf = (comment) => comment.body.join("\n");
25
+ export const isJsdoc = (comment) => comment.kind === "block" && comment.text.startsWith("/**") && comment.text !== "/**/";
26
+ export const isPragma = (comment, pragmas) => {
27
+ const content = contentOf(comment);
28
+ return content.length > 0 && content.every((line) => startsWithTag(line, pragmas));
29
+ };
30
+ export const isDirective = (comment) => {
31
+ const first = contentOf(comment)[0] ?? "";
32
+ return TRIPLE_SLASH.test(comment.text) || DIRECTIVES.some((directive) => directive.test(first));
33
+ };
34
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../../src/rules/comments/kinds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,MAAM,CAAC,MAAM,eAAe,GAA0B;IACrD,qBAAqB;IACrB,6BAA6B;IAC7B,mBAAmB;IACnB,MAAM;IACN,UAAU;IACV,kBAAkB;IAClB,aAAa;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAExH,MAAM,UAAU,GAA0B;IACzC,GAAG,YAAY;IACf,OAAO;IACP,eAAe;IACf,iDAAiD;IACjD,mCAAmC;IACnC,4BAA4B;CAC5B,CAAC;AAEF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAyB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAEhH,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAA2B,EAAW,EAAE,CAC5E,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAElJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAE,OAA8B,EAAW,EAAE;IAC3F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAW,EAAE;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const maxPerFile: import("../../rule.ts").Rule<"comments/max-per-file", {
2
+ readonly max?: number;
3
+ readonly allow?: readonly string[];
4
+ }>;
5
+ //# sourceMappingURL=max-per-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-per-file.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/max-per-file.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,UAAU;;;EAMrB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { plural } from "../../report/plural.js";
3
+ import { defineRule } from "../../rule.js";
4
+ import { isDirective, isPragma, Pragmas } from "./kinds.js";
5
+ import { commentsOf } from "./scan.js";
6
+ const MaxPerFileOptions = Schema.Struct({
7
+ max: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.withDecodingDefaultKey(Effect.succeed(2))),
8
+ allow: Pragmas,
9
+ });
10
+ const continues = (previous, comment) => previous !== undefined &&
11
+ previous.kind === "line" &&
12
+ comment.kind === "line" &&
13
+ previous.ownLine &&
14
+ comment.ownLine &&
15
+ comment.line === previous.endLine + 1;
16
+ const commentBlocks = (comments) => comments.filter((comment, index) => !continues(comments[index - 1], comment));
17
+ const overCap = (file, max, allow) => {
18
+ const counted = commentsOf(file).filter((comment) => !isDirective(comment) && !isPragma(comment, allow));
19
+ const blocks = commentBlocks(counted);
20
+ const first = blocks[max];
21
+ return first === undefined
22
+ ? []
23
+ : [
24
+ {
25
+ file: file.path,
26
+ line: first.line,
27
+ count: blocks.length - max,
28
+ message: `${plural(blocks.length, "comment", "comments")} against a limit of ${max}.`,
29
+ threshold: max,
30
+ },
31
+ ];
32
+ };
33
+ export const maxPerFile = defineRule({
34
+ id: "comments/max-per-file",
35
+ description: "A file that needs more than a few comments does too much, or its comments narrate the code. Delete the comments that restate the code, then split the file.",
36
+ options: Schema.toStandardSchemaV1(MaxPerFileOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
37
+ check: ({ options, sources }) => sources.flatMap((file) => overCap(file, options.max, options.allow)),
38
+ });
39
+ //# sourceMappingURL=max-per-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-per-file.js","sourceRoot":"","sources":["../../../src/rules/comments/max-per-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAiC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAE3D,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9G,KAAK,EAAE,OAAO;CACd,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,QAAmC,EAAE,OAAsB,EAAW,EAAE,CAC1F,QAAQ,KAAK,SAAS;IACtB,QAAQ,CAAC,IAAI,KAAK,MAAM;IACxB,OAAO,CAAC,IAAI,KAAK,MAAM;IACvB,QAAQ,CAAC,OAAO;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;AAEvC,MAAM,aAAa,GAAG,CAAC,QAAsC,EAAgC,EAAE,CAC9F,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAE,GAAW,EAAE,KAA4B,EAA0B,EAAE;IACvG,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACA;gBACC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG;gBAC1B,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,uBAAuB,GAAG,GAAG;gBACrF,SAAS,EAAE,GAAG;aACd;SACD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACpC,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EACV,6JAA6J;IAC9J,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IACrH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;CACrG,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noBanner: import("../../rule.ts").Rule<"comments/no-banner", undefined>;
2
+ //# sourceMappingURL=no-banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-banner.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-banner.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,+DAKnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { definePatternRule } from "./pattern-rule.js";
2
+ const DIVIDER = "[-=*#~_+/\\\\─━═┄┈]{3,}";
3
+ export const noBanner = definePatternRule({
4
+ id: "comments/no-banner",
5
+ description: "Banners, dividers and regions mark a file that does several jobs. Split the file along those sections instead.",
6
+ patterns: [new RegExp(`^${DIVIDER}|${DIVIDER}$`, "m"), /^#(?:end)?region\b/m],
7
+ message: (match) => `Banner or divider: "${match}".`,
8
+ });
9
+ //# sourceMappingURL=no-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-banner.js","sourceRoot":"","sources":["../../../src/rules/comments/no-banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;IACzC,EAAE,EAAE,oBAAoB;IACxB,WAAW,EAAE,gHAAgH;IAC7H,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,IAAI,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,KAAK,IAAI;CACpD,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const noJsdoc: import("../../rule.ts").Rule<"comments/no-jsdoc", {
2
+ readonly allow?: readonly string[];
3
+ }>;
4
+ //# sourceMappingURL=no-jsdoc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-jsdoc.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-jsdoc.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO;;EAUlB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Schema } from "effect";
2
+ import { defineRule } from "../../rule.js";
3
+ import { isDirective, isJsdoc, isPragma, Pragmas } from "./kinds.js";
4
+ import { commentsOf } from "./scan.js";
5
+ const NoJsdocOptions = Schema.Struct({ allow: Pragmas });
6
+ export const noJsdoc = defineRule({
7
+ id: "comments/no-jsdoc",
8
+ description: "Names and types already say what a JSDoc block repeats. Delete it, and keep a reason the code cannot show as a short // comment.",
9
+ options: Schema.toStandardSchemaV1(NoJsdocOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
10
+ check: ({ options, sources }) => sources.flatMap((file) => commentsOf(file)
11
+ .filter((comment) => isJsdoc(comment) && !isPragma(comment, options.allow) && !isDirective(comment))
12
+ .map((comment) => ({ file: file.path, line: comment.line, message: "JSDoc block." }))),
13
+ });
14
+ //# sourceMappingURL=no-jsdoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-jsdoc.js","sourceRoot":"","sources":["../../../src/rules/comments/no-jsdoc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;IACjC,EAAE,EAAE,mBAAmB;IACvB,WAAW,EAAE,kIAAkI;IAC/I,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IAClH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,UAAU,CAAC,IAAI,CAAC;SACd,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACnG,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CACtF;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noLineReference: import("../../rule.ts").Rule<"comments/no-line-reference", undefined>;
2
+ //# sourceMappingURL=no-line-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-line-reference.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-line-reference.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,uEAK1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { definePatternRule } from "./pattern-rule.js";
2
+ const SOURCE_EXTENSION = "(?:[cm]?[jt]sx?|json5?|mdx?|css|scss|less|html?|vue|svelte|astro|ya?ml|toml|sql|prisma|graphql|gql|go|rs|py|rb|java|kt|swift|sh)";
3
+ export const noLineReference = definePatternRule({
4
+ id: "comments/no-line-reference",
5
+ description: "A line number goes stale with the next edit. Name the function, type, test or setting instead.",
6
+ patterns: [new RegExp(`[\\w./@-]*\\.${SOURCE_EXTENSION}(?::\\d+|#L\\d+)`, "i"), /(?<![\w-])lines?\s+\d+/i],
7
+ message: (match) => `Refers to a line: "${match}".`,
8
+ });
9
+ //# sourceMappingURL=no-line-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-line-reference.js","sourceRoot":"","sources":["../../../src/rules/comments/no-line-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,gBAAgB,GACrB,kIAAkI,CAAC;AAEpI,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;IAChD,EAAE,EAAE,4BAA4B;IAChC,WAAW,EAAE,gGAAgG;IAC7G,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,gBAAgB,gBAAgB,kBAAkB,EAAE,GAAG,CAAC,EAAE,yBAAyB,CAAC;IAC1G,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,KAAK,IAAI;CACnD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noPrReference: import("../../rule.ts").Rule<"comments/no-pr-reference", undefined>;
2
+ //# sourceMappingURL=no-pr-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-pr-reference.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-pr-reference.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,qEAUxB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { definePatternRule } from "./pattern-rule.js";
2
+ export const noPrReference = definePatternRule({
3
+ id: "comments/no-pr-reference",
4
+ description: "History belongs in version control, not in the code. State the reason itself, so the comment holds without the link.",
5
+ patterns: [
6
+ /\b(?:PR|MR|pull request|merge request|issue|ticket)s?\s*#?\d+\b/i,
7
+ /\/(?:pull|pulls|issues|merge_requests)\/\d+/,
8
+ /\bGH-\d+\b/,
9
+ /(?<![\w&/#-])#\d+\b/,
10
+ ],
11
+ message: (match) => `Refers to a pull request or issue: "${match}".`,
12
+ });
13
+ //# sourceMappingURL=no-pr-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-pr-reference.js","sourceRoot":"","sources":["../../../src/rules/comments/no-pr-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;IAC9C,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EAAE,sHAAsH;IACnI,QAAQ,EAAE;QACT,kEAAkE;QAClE,6CAA6C;QAC7C,YAAY;QACZ,qBAAqB;KACrB;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uCAAuC,KAAK,IAAI;CACpE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noTodo: import("../../rule.ts").Rule<"comments/no-todo", undefined>;
2
+ //# sourceMappingURL=no-todo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-todo.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-todo.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,6DAKjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { definePatternRule } from "./pattern-rule.js";
2
+ export const noTodo = definePatternRule({
3
+ id: "comments/no-todo",
4
+ description: "A TODO in the code is never done. Do the work now, or track it where the repository tracks work.",
5
+ patterns: [/\b(?:TODO|FIXME|XXX)\b/, /@todo\b/i],
6
+ message: (match) => `Marks unfinished work: "${match}".`,
7
+ });
8
+ //# sourceMappingURL=no-todo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-todo.js","sourceRoot":"","sources":["../../../src/rules/comments/no-todo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC;IACvC,EAAE,EAAE,kBAAkB;IACtB,WAAW,EAAE,kGAAkG;IAC/G,QAAQ,EAAE,CAAC,wBAAwB,EAAE,UAAU,CAAC;IAChD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,KAAK,IAAI;CACxD,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Rule } from "../../rule.ts";
2
+ interface PatternRule<Id extends string> {
3
+ readonly id: Id;
4
+ readonly description: string;
5
+ readonly patterns: ReadonlyArray<RegExp>;
6
+ readonly message: (match: string) => string;
7
+ }
8
+ export declare const definePatternRule: <const Id extends string>({ description, id, message, patterns }: PatternRule<Id>) => Rule<Id, undefined>;
9
+ export {};
10
+ //# sourceMappingURL=pattern-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-rule.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/pattern-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAIpE,UAAU,WAAW,CAAC,EAAE,SAAS,MAAM;IACtC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C;AAOD,eAAO,MAAM,iBAAiB,GAAI,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,wCAAwC,WAAW,CAAC,EAAE,CAAC,KAAG,IAAI,CAAC,EAAE,EAAE,SAAS,CAWpI,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { defineRule } from "../../rule.js";
2
+ import { isDirective, textOf } from "./kinds.js";
3
+ import { commentsOf } from "./scan.js";
4
+ const firstMatch = (comment, patterns) => {
5
+ const text = textOf(comment);
6
+ return patterns.map((pattern) => pattern.exec(text)?.[0]).find((match) => match !== undefined);
7
+ };
8
+ export const definePatternRule = ({ description, id, message, patterns }) => defineRule({
9
+ id,
10
+ description,
11
+ check: ({ sources }) => sources.flatMap((file) => commentsOf(file).flatMap((comment) => {
12
+ const match = isDirective(comment) ? undefined : firstMatch(comment, patterns);
13
+ return match === undefined ? [] : [{ file: file.path, line: comment.line, message: message(match) }];
14
+ })),
15
+ });
16
+ //# sourceMappingURL=pattern-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-rule.js","sourceRoot":"","sources":["../../../src/rules/comments/pattern-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAS3D,MAAM,UAAU,GAAG,CAAC,OAAsB,EAAE,QAA+B,EAAsB,EAAE;IAClG,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA0B,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAmB,EAAuB,EAAE,CAC1I,UAAU,CAAC;IACV,EAAE;IACF,WAAW;IACX,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACtB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAA0B,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/E,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,CACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SourceFile } from "../../rule.ts";
2
+ export interface SourceComment {
3
+ readonly kind: "block" | "line";
4
+ readonly text: string;
5
+ readonly body: ReadonlyArray<string>;
6
+ readonly line: number;
7
+ readonly endLine: number;
8
+ readonly ownLine: boolean;
9
+ }
10
+ export declare const bodyOf: (kind: SourceComment["kind"], text: string) => ReadonlyArray<string>;
11
+ export declare const scanComments: (file: SourceFile) => ReadonlyArray<SourceComment>;
12
+ export declare const commentsOf: (file: SourceFile) => ReadonlyArray<SourceComment>;
13
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/scan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AA4BD,eAAO,MAAM,MAAM,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,KAAG,aAAa,CAAC,MAAM,CAM1B,CAAC;AAwB9D,eAAO,MAAM,YAAY,GAAI,MAAM,UAAU,KAAG,aAAa,CAAC,aAAa,CAQ1E,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,aAAa,CAAC,aAAa,CAA4D,CAAC"}
@@ -0,0 +1,62 @@
1
+ import ts from "typescript";
2
+ import { parse } from "../syntax.js";
3
+ const DECLARATION = /\.d\.[cm]?ts$/;
4
+ const commentRanges = (source) => {
5
+ const ranges = new Map();
6
+ const jsxText = [];
7
+ const add = (found) => {
8
+ for (const range of found ?? []) {
9
+ ranges.set(range.pos, range);
10
+ }
11
+ };
12
+ const visit = (node) => {
13
+ if (node.kind === ts.SyntaxKind.JsxText) {
14
+ jsxText.push(node);
15
+ }
16
+ add(ts.getLeadingCommentRanges(source.text, node.pos));
17
+ add(ts.getTrailingCommentRanges(source.text, node.end));
18
+ for (const child of node.getChildren(source)) {
19
+ visit(child);
20
+ }
21
+ };
22
+ visit(source);
23
+ return [...ranges.values()]
24
+ .filter((range) => !jsxText.some((text) => range.pos >= text.pos && range.pos < text.end))
25
+ .sort((left, right) => left.pos - right.pos);
26
+ };
27
+ export const bodyOf = (kind, text) => kind === "line"
28
+ ? [text.slice(2).trim()]
29
+ : text
30
+ .slice(2, -2)
31
+ .split("\n")
32
+ .map((line) => line.trim().replace(/^\*(?=\s|$)\s*/, ""));
33
+ const toComment = (source, range) => {
34
+ const kind = range.kind === ts.SyntaxKind.SingleLineCommentTrivia ? "line" : "block";
35
+ const text = source.text.slice(range.pos, range.end);
36
+ const start = source.getLineAndCharacterOfPosition(range.pos);
37
+ const lineStart = source.getPositionOfLineAndCharacter(start.line, 0);
38
+ return {
39
+ body: bodyOf(kind, text),
40
+ endLine: source.getLineAndCharacterOfPosition(range.end).line + 1,
41
+ kind,
42
+ line: start.line + 1,
43
+ ownLine: source.text.slice(lineStart, range.pos).trim() === "",
44
+ text,
45
+ };
46
+ };
47
+ const scanned = new WeakMap();
48
+ const scan = (file) => {
49
+ const source = parse(file);
50
+ return source === undefined ? [] : commentRanges(source).map((range) => toComment(source, range));
51
+ };
52
+ export const scanComments = (file) => {
53
+ const cached = scanned.get(file);
54
+ if (cached !== undefined) {
55
+ return cached;
56
+ }
57
+ const comments = scan(file);
58
+ scanned.set(file, comments);
59
+ return comments;
60
+ };
61
+ export const commentsOf = (file) => (DECLARATION.test(file.path) ? [] : scanComments(file));
62
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/rules/comments/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAWrC,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,aAAa,GAAG,CAAC,MAAqB,EAAkC,EAAE;IAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,KAAiD,EAAE,EAAE;QACjE,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,EAAE;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,CAAC,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACF,CAAC,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACzF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAA2B,EAAE,IAAY,EAAyB,EAAE,CAC1F,IAAI,KAAK,MAAM;IACd,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,IAAI;SACH,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;AAE9D,MAAM,SAAS,GAAG,CAAC,MAAqB,EAAE,KAAsB,EAAiB,EAAE;IAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACrF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QACjE,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAC9D,IAAI;KACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAA4C,CAAC;AAExE,MAAM,IAAI,GAAG,CAAC,IAAgB,EAAgC,EAAE;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAgC,EAAE;IAC9E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAgB,EAAgC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"max-lines.d.ts","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,QAAQ;;;;EAUnB,CAAC"}
1
+ {"version":3,"file":"max-lines.d.ts","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,QAAQ;;;;EAUnB,CAAC"}
@@ -11,7 +11,14 @@ const MaxLinesOptions = Schema.Struct({
11
11
  });
12
12
  const oversized = (file, limit) => file.lines.length <= limit
13
13
  ? []
14
- : [{ file: file.path, measure: file.lines.length, message: `${file.lines.length} lines exceeds the ${limit}-line limit.` }];
14
+ : [
15
+ {
16
+ count: file.lines.length - limit,
17
+ file: file.path,
18
+ message: `${file.lines.length} lines exceeds the ${limit}-line limit.`,
19
+ threshold: limit,
20
+ },
21
+ ];
15
22
  export const maxLines = defineRule({
16
23
  id: "structure/max-lines",
17
24
  description: "Keep each module to one job. Split a long file along its responsibilities; never golf it under the limit.",
@@ -1 +1 @@
1
- {"version":3,"file":"max-lines.js","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC;AAEvE,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC5G,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC9G,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,KAAa,EAA0B,EAAE,CAC7E,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;IACzB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,sBAAsB,KAAK,cAAc,EAAE,CAAC,CAAC;AAE9H,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,2GAA2G;IACxH,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IACnH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC;CACD,CAAC,CAAC"}
1
+ {"version":3,"file":"max-lines.js","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC;AAEvE,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC5G,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC9G,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,KAAa,EAA0B,EAAE,CAC7E,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;IACzB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC;QACA;YACC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,sBAAsB,KAAK,cAAc;YACtE,SAAS,EAAE,KAAK;SAChB;KACD,CAAC;AAEL,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,2GAA2G;IACxH,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IACnH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC;CACD,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RuleInputs } from "../../../rule.ts";
2
+ import { type Json } from "./json.ts";
3
+ export type Config = {
4
+ readonly _tag: "Config";
5
+ readonly path: string;
6
+ readonly base: string;
7
+ readonly json: Json;
8
+ } | {
9
+ readonly _tag: "Unreadable";
10
+ readonly path: string;
11
+ readonly reason: string;
12
+ };
13
+ export declare const biomeConfigs: ({ files, readText }: RuleInputs) => Promise<ReadonlyArray<Config>>;
14
+ //# sourceMappingURL=configs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAW,KAAK,IAAI,EAA8B,MAAM,WAAW,CAAC;AAE3E,MAAM,MAAM,MAAM,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoCnF,eAAO,MAAM,YAAY,GAAU,qBAAqB,UAAU,KAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAOjG,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { posix } from "node:path";
2
+ import { itemsOf, member, parseJsonc, textOf } from "./json.js";
3
+ const ROOT_CONFIGS = ["biome.json", "biome.jsonc"];
4
+ const NESTED = /(?:^|\/)biome\.jsonc?$/;
5
+ const directoryOf = (path) => (posix.dirname(path) === "." ? "" : posix.dirname(path));
6
+ const localExtends = (path, json) => {
7
+ const node = member(json, "extends");
8
+ const entries = node?._tag === "Array" ? itemsOf(node).flatMap((item) => textOf(item) ?? []) : [textOf(node) ?? ""];
9
+ return entries.filter((entry) => entry.startsWith(".")).map((entry) => posix.join(posix.dirname(path), entry));
10
+ };
11
+ const load = async (readText, path, base, seen) => {
12
+ if (seen.has(path)) {
13
+ return [];
14
+ }
15
+ seen.add(path);
16
+ const text = await readText(path);
17
+ if (text === undefined) {
18
+ return [{ _tag: "Unreadable", path, reason: "the file does not exist" }];
19
+ }
20
+ const parsed = parseJsonc(path, text);
21
+ if (parsed._tag === "Unreadable") {
22
+ return [{ _tag: "Unreadable", path, reason: parsed.reason }];
23
+ }
24
+ const extended = await Promise.all(localExtends(path, parsed.json).map((target) => load(readText, target, base, seen)));
25
+ return [{ _tag: "Config", base, json: parsed.json, path }, ...extended.flat()];
26
+ };
27
+ const rootConfig = async (readText) => {
28
+ const present = await Promise.all(ROOT_CONFIGS.map(async (path) => ((await readText(path)) === undefined ? [] : [path])));
29
+ return present.flat()[0];
30
+ };
31
+ export const biomeConfigs = async ({ files, readText }) => {
32
+ const seen = new Set();
33
+ const root = await rootConfig(readText);
34
+ const nested = files.filter((path) => NESTED.test(path) && path !== root);
35
+ const roots = root === undefined ? [] : await load(readText, root, "", seen);
36
+ const below = await Promise.all(nested.map((path) => load(readText, path, directoryOf(path), seen)));
37
+ return [...roots, ...below.flat()];
38
+ };
39
+ //# sourceMappingURL=configs.js.map