@shivaedev/quality 0.2.0 → 0.3.1

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 +114 -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 +59 -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 +89 -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
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type Json = {
2
+ readonly _tag: "Object";
3
+ readonly line: number;
4
+ readonly entries: ReadonlyMap<string, Json>;
5
+ } | {
6
+ readonly _tag: "Array";
7
+ readonly line: number;
8
+ readonly items: ReadonlyArray<Json>;
9
+ } | {
10
+ readonly _tag: "Value";
11
+ readonly line: number;
12
+ readonly value: string | boolean | undefined;
13
+ };
14
+ export type Parsed = {
15
+ readonly _tag: "Parsed";
16
+ readonly json: Json;
17
+ } | {
18
+ readonly _tag: "Unreadable";
19
+ readonly reason: string;
20
+ };
21
+ export declare const parseJsonc: (path: string, text: string) => Parsed;
22
+ export declare const member: (node: Json | undefined, key: string) => Json | undefined;
23
+ export declare const entriesOf: (node: Json | undefined) => ReadonlyArray<readonly [string, Json]>;
24
+ export declare const itemsOf: (node: Json | undefined) => ReadonlyArray<Json>;
25
+ export declare const textOf: (node: Json | undefined) => string | undefined;
26
+ export declare const isFalse: (node: Json | undefined) => boolean;
27
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/json.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,IAAI,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;CAAE,GAC/F;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAyBjI,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,MAWvD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,GAAG,SAAS,EAAE,KAAK,MAAM,KAAG,IAAI,GAAG,SAA0E,CAAC;AAE/I,eAAO,MAAM,SAAS,GAAI,MAAM,IAAI,GAAG,SAAS,KAAG,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAuD,CAAC;AAEhJ,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,SAAS,KAAG,aAAa,CAAC,IAAI,CAA+C,CAAC;AAEnH,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,SACyB,CAAC;AAEnF,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,SAAS,KAAG,OAAyD,CAAC"}
@@ -0,0 +1,37 @@
1
+ import ts from "typescript";
2
+ const LITERALS = new Map([
3
+ [ts.SyntaxKind.TrueKeyword, true],
4
+ [ts.SyntaxKind.FalseKeyword, false],
5
+ ]);
6
+ const scalarOf = (node) => (ts.isStringLiteral(node) ? node.text : LITERALS.get(node.kind));
7
+ const entryOf = (source, property) => ts.isPropertyAssignment(property) && (ts.isStringLiteral(property.name) || ts.isIdentifier(property.name))
8
+ ? [[property.name.text, toJson(source, property.initializer)]]
9
+ : [];
10
+ const toJson = (source, node) => {
11
+ const line = source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
12
+ if (ts.isObjectLiteralExpression(node)) {
13
+ return { _tag: "Object", entries: new Map(node.properties.flatMap((property) => entryOf(source, property))), line };
14
+ }
15
+ if (ts.isArrayLiteralExpression(node)) {
16
+ return { _tag: "Array", items: node.elements.map((element) => toJson(source, element)), line };
17
+ }
18
+ return { _tag: "Value", line, value: scalarOf(node) };
19
+ };
20
+ export const parseJsonc = (path, text) => {
21
+ const error = ts.parseConfigFileTextToJson(path, text).error;
22
+ const source = ts.parseJsonText(path, text);
23
+ const root = source.statements[0]?.expression;
24
+ if (error !== undefined || root === undefined) {
25
+ return {
26
+ _tag: "Unreadable",
27
+ reason: error === undefined ? "it is empty" : ts.flattenDiagnosticMessageText(error.messageText, " ").replace(/\.$/, ""),
28
+ };
29
+ }
30
+ return { _tag: "Parsed", json: toJson(source, root) };
31
+ };
32
+ export const member = (node, key) => (node?._tag === "Object" ? node.entries.get(key) : undefined);
33
+ export const entriesOf = (node) => (node?._tag === "Object" ? [...node.entries] : []);
34
+ export const itemsOf = (node) => (node?._tag === "Array" ? node.items : []);
35
+ export const textOf = (node) => node?._tag === "Value" && typeof node.value === "string" ? node.value : undefined;
36
+ export const isFalse = (node) => node?._tag === "Value" && node.value === false;
37
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Json } from "./json.ts";
2
+ export interface Weakening {
3
+ readonly rule: string;
4
+ readonly includes: ReadonlyArray<string>;
5
+ readonly file: string;
6
+ readonly line: number;
7
+ }
8
+ export declare const weakeningsOf: (config: Json, file: string, base: string) => ReadonlyArray<Weakening>;
9
+ //# sourceMappingURL=weakenings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakenings.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/weakenings.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,IAAI,EAAkB,MAAM,WAAW,CAAC;AAEnF,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAwFD,eAAO,MAAM,YAAY,GAAI,QAAQ,IAAI,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,aAAa,CAAC,SAAS,CAM9F,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { entriesOf, isFalse, itemsOf, member, textOf } from "./json.js";
2
+ const LINT_WEAK = new Set(["off", "warn", "info"]);
3
+ const ASSIST_WEAK = new Set(["off"]);
4
+ const PRESETS = new Set(["recommended", "preset"]);
5
+ const levelOf = (node) => textOf(node) ?? textOf(member(node, "level"));
6
+ const at = (rule, node) => (node === undefined ? [] : [{ line: node.line, rule }]);
7
+ const disabled = (rule, section) => isFalse(member(section, "enabled")) ? at(rule, member(section, "enabled")) : [];
8
+ const withoutDefaults = (rule, set) => [
9
+ ...(isFalse(member(set, "recommended")) ? at(rule, member(set, "recommended")) : []),
10
+ ...(textOf(member(set, "preset")) === "none" ? at(rule, member(set, "preset")) : []),
11
+ ];
12
+ const groupSettings = (prefix, weak, groups) => entriesOf(groups)
13
+ .filter(([group]) => !PRESETS.has(group))
14
+ .flatMap(([group, rules]) => [
15
+ ...(weak.has(textOf(rules) ?? "") ? at(`${prefix}/${group}`, rules) : []),
16
+ ...withoutDefaults(`${prefix}/${group}`, rules),
17
+ ...entriesOf(rules)
18
+ .filter(([rule, setting]) => !PRESETS.has(rule) && weak.has(levelOf(setting) ?? ""))
19
+ .flatMap(([rule, setting]) => at(`${prefix}/${group}/${rule}`, setting)),
20
+ ]);
21
+ const linter = (section) => [
22
+ ...disabled("lint", section),
23
+ ...withoutDefaults("lint/recommended", member(section, "rules")),
24
+ ...groupSettings("lint", LINT_WEAK, member(section, "rules")),
25
+ ...entriesOf(member(section, "domains"))
26
+ .filter(([, value]) => textOf(value) === "none")
27
+ .flatMap(([domain, value]) => at(`lint/domains/${domain}`, value)),
28
+ ];
29
+ const assist = (section) => [
30
+ ...disabled("assist", section),
31
+ ...withoutDefaults("assist/recommended", member(section, "actions")),
32
+ ...groupSettings("assist", ASSIST_WEAK, member(section, "actions")),
33
+ ];
34
+ const LANGUAGES = ["javascript", "json", "css", "graphql", "grit", "html"];
35
+ const TOOLS = [
36
+ ["linter", "lint"],
37
+ ["assist", "assist"],
38
+ ["formatter", "format"],
39
+ ];
40
+ const SCOPED_SECTIONS = [["files", "files"], ...TOOLS];
41
+ const scopeSettings = (scope) => [
42
+ ...linter(member(scope, "linter")),
43
+ ...assist(member(scope, "assist")),
44
+ ...disabled("format", member(scope, "formatter")),
45
+ ...LANGUAGES.flatMap((language) => TOOLS.flatMap(([key, name]) => disabled(`${language}/${name}`, member(member(scope, language), key)))),
46
+ ];
47
+ const scoped = (base, glob) => {
48
+ const [, negation = "", path = glob] = /^(!*)(.*)$/.exec(glob) ?? [];
49
+ return base === "" ? glob : `${negation}${base}/${path}`;
50
+ };
51
+ const includesOf = (override) => {
52
+ const includes = itemsOf(member(override, "includes")).flatMap((item) => textOf(item) ?? []);
53
+ return includes.length === 0 ? ["**"] : includes;
54
+ };
55
+ const narrowsScope = (globs) => globs.length > 0 && (globs.some((glob) => glob.startsWith("!")) || !globs.includes("**"));
56
+ const narrowings = (config, file, base) => SCOPED_SECTIONS.flatMap(([key, name]) => {
57
+ const list = member(member(config, key), "includes");
58
+ const globs = itemsOf(list).flatMap((item) => textOf(item) ?? []);
59
+ return list === undefined || !narrowsScope(globs)
60
+ ? []
61
+ : [{ file, includes: globs.map((glob) => scoped(base, glob)), line: list.line, rule: `${name}/includes` }];
62
+ });
63
+ export const weakeningsOf = (config, file, base) => [
64
+ ...narrowings(config, file, base),
65
+ ...scopeSettings(config).map((setting) => ({ ...setting, file, includes: [scoped(base, "**")] })),
66
+ ...itemsOf(member(config, "overrides")).flatMap((override) => scopeSettings(override).map((setting) => ({ ...setting, file, includes: includesOf(override).map((glob) => scoped(base, glob)) }))),
67
+ ];
68
+ //# sourceMappingURL=weakenings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakenings.js","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/weakenings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const biomeOverrides: import("../../rule.ts").Rule<"suppressions/biome-overrides", {
2
+ readonly declared?: readonly {
3
+ readonly rule: string;
4
+ readonly includes: readonly [string, ...string[]];
5
+ readonly reason: string;
6
+ }[];
7
+ }>;
8
+ //# sourceMappingURL=biome-overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome-overrides.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"AAyCA,eAAO,MAAM,cAAc;;;;;;EAmBzB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { defineRule } from "../../rule.js";
3
+ import { biomeConfigs } from "./biome/configs.js";
4
+ import { weakeningsOf } from "./biome/weakenings.js";
5
+ const Declaration = Schema.Struct({
6
+ rule: Schema.NonEmptyString,
7
+ includes: Schema.NonEmptyArray(Schema.NonEmptyString),
8
+ reason: Schema.String.check(Schema.isPattern(/\S/, { expected: "a reason that says why the scope needs the rule weakened" })),
9
+ });
10
+ const BiomeOverridesOptions = Schema.Struct({
11
+ declared: Schema.Array(Declaration).pipe(Schema.withDecodingDefaultKey(Effect.succeed([]))),
12
+ });
13
+ const sameScope = (left, right) => new Set(left).size === new Set(right).size && left.every((glob) => right.includes(glob));
14
+ const matches = (declaration, weakening) => declaration.rule === weakening.rule && sameScope(declaration.includes, weakening.includes);
15
+ const scopeText = (includes) => includes.map((glob) => `"${glob}"`).join(", ");
16
+ const undeclared = (weakening) => ({
17
+ file: weakening.file,
18
+ line: weakening.line,
19
+ message: `Weakens "${weakening.rule}" for ${scopeText(weakening.includes)} without a declaration.`,
20
+ subject: weakening.rule,
21
+ });
22
+ const unused = (file, declaration) => ({
23
+ file,
24
+ message: `Declares "${declaration.rule}" for ${scopeText(declaration.includes)}, which no Biome config weakens. Remove the declaration.`,
25
+ subject: declaration.rule,
26
+ });
27
+ const unreadable = (config) => config._tag === "Unreadable" ? [{ file: config.path, message: `Cannot read this Biome config: ${config.reason}.` }] : [];
28
+ export const biomeOverrides = defineRule({
29
+ id: "suppressions/biome-overrides",
30
+ description: "A Biome setting that turns a check off or down, or keeps files out of it, is an exception for every file it covers. Fix the code and remove the setting, or declare its rule, includes and reason under this rule's declared option.",
31
+ options: Schema.toStandardSchemaV1(BiomeOverridesOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
32
+ registrable: false,
33
+ check: async (inputs) => {
34
+ const configs = await biomeConfigs(inputs);
35
+ const { declared } = inputs.options;
36
+ const weakenings = configs.flatMap((config) => (config._tag === "Config" ? weakeningsOf(config.json, config.path, config.base) : []));
37
+ const root = configs.find((config) => !config.path.includes("/"))?.path ?? "biome.json";
38
+ return [
39
+ ...configs.flatMap(unreadable),
40
+ ...weakenings.filter((weakening) => !declared.some((declaration) => matches(declaration, weakening))).map(undeclared),
41
+ ...declared
42
+ .filter((declaration) => !weakenings.some((weakening) => matches(declaration, weakening)))
43
+ .map((declaration) => unused(root, declaration)),
44
+ ];
45
+ },
46
+ });
47
+ //# sourceMappingURL=biome-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome-overrides.js","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SourceComment } from "../comments/scan.ts";
2
+ export declare const SUPPRESSIONS: ReadonlyArray<RegExp>;
3
+ export declare const suppressionIn: (comment: SourceComment) => string | undefined;
4
+ //# sourceMappingURL=directives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/directives.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,CAS9C,CAAC;AAYF,eAAO,MAAM,aAAa,GAAI,SAAS,aAAa,KAAG,MAAM,GAAG,SACoC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export const SUPPRESSIONS = [
2
+ /^biome-ignore(?:-all|-start)?(?![\w-])/,
3
+ /^@ts-(?:ignore|expect-error|nocheck)(?![\w-])/,
4
+ /^(?:eslint|oxlint|stylelint)-disable(?:-next-line|-line)?(?![\w-])/,
5
+ /^deno-lint-ignore(?:-file)?(?![\w-])/,
6
+ /^tslint:disable/,
7
+ /^prettier-ignore(?![\w-])/,
8
+ /^\$Flow(?:FixMe|Ignore|ExpectedError|Issue)(?!\w)/,
9
+ /^@noflow(?!\w)/,
10
+ ];
11
+ const INLINE_ESLINT_CONFIG = /^eslint\s+["']?[\w@/-]+["']?\s*:/;
12
+ const LEADER = /^[\s/*]+/;
13
+ const directiveOn = (comment, line) => {
14
+ const content = line.replace(LEADER, "");
15
+ const patterns = comment.kind === "block" ? [...SUPPRESSIONS, INLINE_ESLINT_CONFIG] : SUPPRESSIONS;
16
+ return patterns.map((pattern) => pattern.exec(content)?.[0].replace(/\s*:$/, "")).find((match) => match !== undefined);
17
+ };
18
+ export const suppressionIn = (comment) => comment.body.map((line) => directiveOn(comment, line)).find((directive) => directive !== undefined);
19
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../../src/rules/suppressions/directives.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAA0B;IAClD,wCAAwC;IACxC,+CAA+C;IAC/C,oEAAoE;IACpE,sCAAsC;IACtC,iBAAiB;IACjB,2BAA2B;IAC3B,mDAAmD;IACnD,gBAAgB;CAChB,CAAC;AAEF,MAAM,oBAAoB,GAAG,kCAAkC,CAAC;AAEhE,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAE,IAAY,EAAsB,EAAE;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACnG,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AACxH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAsB,EAAsB,EAAE,CAC3E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noDoubleCast: import("../../rule.ts").Rule<"suppressions/no-double-cast", undefined>;
2
+ //# sourceMappingURL=no-double-cast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-double-cast.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/no-double-cast.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,YAAY,wEAMvB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import ts from "typescript";
2
+ import { defineRule } from "../../rule.js";
3
+ import { parse } from "../syntax.js";
4
+ const BRIDGES = new Map([
5
+ [ts.SyntaxKind.UnknownKeyword, "unknown"],
6
+ [ts.SyntaxKind.AnyKeyword, "any"],
7
+ [ts.SyntaxKind.NeverKeyword, "never"],
8
+ ]);
9
+ const isAssertion = (node) => ts.isAsExpression(node) || ts.isTypeAssertionExpression(node);
10
+ const unwrapped = (node) => (ts.isParenthesizedExpression(node) ? unwrapped(node.expression) : node);
11
+ const bridgeOf = (node) => {
12
+ const inner = unwrapped(node.expression);
13
+ return isAssertion(inner) ? BRIDGES.get(inner.type.kind) : undefined;
14
+ };
15
+ const castsIn = (path, source) => {
16
+ const findings = [];
17
+ const visit = (node) => {
18
+ const bridge = isAssertion(node) ? bridgeOf(node) : undefined;
19
+ if (bridge !== undefined) {
20
+ const line = source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
21
+ findings.push({ file: path, line, message: `Casts through "${bridge}" to reach a type the value does not have.` });
22
+ }
23
+ ts.forEachChild(node, visit);
24
+ };
25
+ visit(source);
26
+ return findings;
27
+ };
28
+ const doubleCasts = (file) => {
29
+ const source = parse(file);
30
+ return source === undefined ? [] : castsIn(file.path, source);
31
+ };
32
+ export const noDoubleCast = defineRule({
33
+ id: "suppressions/no-double-cast",
34
+ description: "A cast through unknown, any or never silences the compiler the way a suppression does. Decode the value at its boundary, narrow it, or fix the type that disagrees.",
35
+ registrable: false,
36
+ check: ({ sources }) => sources.flatMap(doubleCasts),
37
+ });
38
+ //# sourceMappingURL=no-double-cast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-double-cast.js","sourceRoot":"","sources":["../../../src/rules/suppressions/no-double-cast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,MAAM,OAAO,GAAuC,IAAI,GAAG,CAAC;IAC3D,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC;IACzC,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC;IACjC,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC;CACrC,CAAC,CAAC;AAIH,MAAM,WAAW,GAAG,CAAC,IAAa,EAAqB,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAExH,MAAM,SAAS,GAAG,CAAC,IAAmB,EAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEnI,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAsB,EAAE;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAqB,EAA0B,EAAE;IAC/E,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,MAAM,4CAA4C,EAAE,CAAC,CAAC;QACpH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAgB,EAA0B,EAAE;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACtC,EAAE,EAAE,6BAA6B;IACjC,WAAW,EACV,qKAAqK;IACtK,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;CACpD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const noInline: import("../../rule.ts").Rule<"suppressions/no-inline", {
2
+ readonly declared?: readonly {
3
+ readonly directive: "@ts-expect-error";
4
+ readonly includes: readonly [string, ...string[]];
5
+ readonly reason: string;
6
+ }[];
7
+ }>;
8
+ //# sourceMappingURL=no-inline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-inline.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/no-inline.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,QAAQ;;;;;;EAcnB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { Effect, Schema } from "effect";
2
+ import ignore from "ignore";
3
+ import { CONFIG_FILE } from "../../config/file.js";
4
+ import { defineRule } from "../../rule.js";
5
+ import { scanComments } from "../comments/scan.js";
6
+ import { suppressionIn } from "./directives.js";
7
+ import { STYLESHEET, stylesheetComments } from "./stylesheet-comments.js";
8
+ const Declaration = Schema.Struct({
9
+ directive: Schema.Literal("@ts-expect-error"),
10
+ includes: Schema.NonEmptyArray(Schema.NonEmptyString),
11
+ reason: Schema.String.check(Schema.isPattern(/\S/, { expected: "a reason that says why these files assert type errors" })),
12
+ });
13
+ const NoInlineOptions = Schema.Struct({
14
+ declared: Schema.Array(Declaration).pipe(Schema.withDecodingDefaultKey(Effect.succeed([]))),
15
+ });
16
+ const sitesIn = (file, comments) => comments.flatMap((comment) => {
17
+ const directive = suppressionIn(comment);
18
+ return directive === undefined ? [] : [{ file, line: comment.line, message: `Suppresses a check: "${directive}".`, subject: directive }];
19
+ });
20
+ const stylesheetSites = async ({ files, readText, sources }) => {
21
+ const read = files.filter((path) => STYLESHEET.test(path));
22
+ const texts = await Promise.all(read.map(async (path) => sources.find((source) => source.path === path)?.text ?? (await readText(path))));
23
+ return read.flatMap((path, index) => sitesIn(path, stylesheetComments(path, texts[index] ?? "")));
24
+ };
25
+ const allows = (declaration, site) => declaration.directive === site.subject &&
26
+ ignore()
27
+ .add([...declaration.includes])
28
+ .ignores(site.file);
29
+ const unused = (declaration) => ({
30
+ file: CONFIG_FILE,
31
+ message: `Declares "${declaration.directive}" for ${declaration.includes.map((glob) => `"${glob}"`).join(", ")}, which matches no directive. Remove the declaration.`,
32
+ subject: declaration.directive,
33
+ });
34
+ export const noInline = defineRule({
35
+ id: "suppressions/no-inline",
36
+ description: "A suppression silences a check at one site instead of fixing the cause. Fix the code; where a lint rule truly cannot apply, turn it off for that scope in the Biome config and declare it under suppressions/biome-overrides.",
37
+ options: Schema.toStandardSchemaV1(NoInlineOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
38
+ registrable: false,
39
+ check: async (inputs) => {
40
+ const { declared } = inputs.options;
41
+ const sites = [...inputs.sources.flatMap((file) => sitesIn(file.path, scanComments(file))), ...(await stylesheetSites(inputs))];
42
+ return [
43
+ ...sites.filter((site) => !declared.some((declaration) => allows(declaration, site))),
44
+ ...declared.filter((declaration) => !sites.some((site) => allows(declaration, site))).map(unused),
45
+ ];
46
+ },
47
+ });
48
+ //# sourceMappingURL=no-inline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-inline.js","sourceRoot":"","sources":["../../../src/rules/suppressions/no-inline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type SourceComment } from "../comments/scan.ts";
2
+ export declare const STYLESHEET: RegExp;
3
+ export declare const stylesheetComments: (path: string, text: string) => ReadonlyArray<SourceComment>;
4
+ //# sourceMappingURL=stylesheet-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheet-comments.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/stylesheet-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjE,eAAO,MAAM,UAAU,QAAyB,CAAC;AAuBjD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,aAAa,CAAC,aAAa,CACuC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { bodyOf } from "../comments/scan.js";
2
+ export const STYLESHEET = /\.(?:css|scss|less)$/;
3
+ const LINE_COMMENTS = /\.(?:scss|less)$/;
4
+ const TOKENS = String.raw `"(?:[^"\\\n]|\\.)*"?|'(?:[^'\\\n]|\\.)*'?|url\([^)]*\)?|\/\*[\s\S]*?(?:\*\/|$)`;
5
+ const tokensOf = (path) => new RegExp(LINE_COMMENTS.test(path) ? `${TOKENS}|\\/\\/[^\\n]*` : TOKENS, "gi");
6
+ const lineOf = (text, offset) => text.slice(0, offset).split("\n").length;
7
+ const toComment = (text, token, offset) => {
8
+ const kind = token.startsWith("//") ? "line" : "block";
9
+ const lineStart = text.lastIndexOf("\n", offset - 1) + 1;
10
+ return {
11
+ body: bodyOf(kind, kind === "block" && !token.endsWith("*/") ? `${token}*/` : token),
12
+ endLine: lineOf(text, offset + token.length),
13
+ kind,
14
+ line: lineOf(text, offset),
15
+ ownLine: text.slice(lineStart, offset).trim() === "",
16
+ text: token,
17
+ };
18
+ };
19
+ export const stylesheetComments = (path, text) => [...text.matchAll(tokensOf(path))].flatMap((match) => (match[0].startsWith("/") ? [toComment(text, match[0], match.index)] : []));
20
+ //# sourceMappingURL=stylesheet-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheet-comments.js","sourceRoot":"","sources":["../../../src/rules/suppressions/stylesheet-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,qBAAqB,CAAC;AAEjE,MAAM,CAAC,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAEjD,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,gFAAgF,CAAC;AAE1G,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE3H,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAElG,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,MAAc,EAAiB,EAAE;IAChF,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACpF,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5C,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QACpD,IAAI,EAAE,KAAK;KACX,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,IAAY,EAAgC,EAAE,CAC9F,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import ts from "typescript";
2
+ import type { SourceFile } from "../rule.ts";
3
+ export declare const parse: (file: SourceFile) => ts.SourceFile | undefined;
4
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/rules/syntax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C,eAAO,MAAM,KAAK,GAAI,MAAM,UAAU,KAAG,EAAE,CAAC,UAAU,GAAG,SAGxD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import ts from "typescript";
2
+ const SCRIPT_KINDS = [
3
+ [/\.[cm]?ts$/, ts.ScriptKind.TS],
4
+ [/\.tsx$/, ts.ScriptKind.TSX],
5
+ [/\.[cm]?js$/, ts.ScriptKind.JS],
6
+ [/\.jsx$/, ts.ScriptKind.JSX],
7
+ ];
8
+ export const parse = (file) => {
9
+ const kind = SCRIPT_KINDS.find(([pattern]) => pattern.test(file.path))?.[1];
10
+ return kind === undefined ? undefined : ts.createSourceFile(file.path, file.text, ts.ScriptTarget.Latest, true, kind);
11
+ };
12
+ //# sourceMappingURL=syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/rules/syntax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,MAAM,YAAY,GAAoD;IACrE,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IAC7B,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAgB,EAA6B,EAAE;IACpE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvH,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/quality",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Repository quality gate with typed rules, a shrink-only baseline and a registry of reasoned exceptions",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -40,7 +40,8 @@
40
40
  "provenance": true
41
41
  },
42
42
  "dependencies": {
43
- "ignore": "7.0.6"
43
+ "ignore": "7.0.6",
44
+ "typescript": "npm:@typescript/typescript6@6.0.2"
44
45
  },
45
46
  "peerDependencies": {
46
47
  "@effect/platform-node": "4.0.0-rc.112",
@@ -54,16 +55,14 @@
54
55
  "@types/node": "24.10.1",
55
56
  "@typescript/native": "npm:typescript@7.0.2",
56
57
  "effect": "4.0.0-rc.112",
57
- "typescript": "npm:@typescript/typescript6@6.0.2",
58
58
  "vitest": "4.1.9"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc6 --project tsconfig.build.json",
62
62
  "check": "biome check .",
63
63
  "test": "vitest run",
64
- "test:package": "node scripts/test-package.mjs",
65
64
  "typecheck": "tsc --noEmit",
66
65
  "typecheck:compat": "tsc6 --noEmit",
67
- "ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build && pnpm test:package"
66
+ "ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build"
68
67
  }
69
68
  }