@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.
- package/CHANGELOG.md +105 -0
- package/README.md +207 -35
- package/dist/baseline/compare.d.ts +3 -8
- package/dist/baseline/compare.d.ts.map +1 -1
- package/dist/baseline/compare.js +13 -23
- package/dist/baseline/compare.js.map +1 -1
- package/dist/baseline/format.d.ts +7 -5
- package/dist/baseline/format.d.ts.map +1 -1
- package/dist/baseline/format.js +31 -23
- package/dist/baseline/format.js.map +1 -1
- package/dist/baseline/guard.d.ts +23 -0
- package/dist/baseline/guard.d.ts.map +1 -0
- package/dist/baseline/guard.js +31 -0
- package/dist/baseline/guard.js.map +1 -0
- package/dist/baseline/legacy.d.ts +11 -0
- package/dist/baseline/legacy.d.ts.map +1 -0
- package/dist/baseline/legacy.js +33 -0
- package/dist/baseline/legacy.js.map +1 -0
- package/dist/baseline/rewrite.d.ts +3 -0
- package/dist/baseline/rewrite.d.ts.map +1 -0
- package/dist/baseline/rewrite.js +19 -0
- package/dist/baseline/rewrite.js.map +1 -0
- package/dist/baseline/update.d.ts +7 -6
- package/dist/baseline/update.d.ts.map +1 -1
- package/dist/baseline/update.js +28 -28
- package/dist/baseline/update.js.map +1 -1
- package/dist/cli/args.d.ts +14 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +54 -29
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/baseline.d.ts +3 -1
- package/dist/cli/baseline.d.ts.map +1 -1
- package/dist/cli/baseline.js +19 -10
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/check.d.ts +5 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +39 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/lint.js +1 -1
- package/dist/cli/lint.js.map +1 -1
- package/dist/cli/migrate.d.ts +4 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +31 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/run-main.d.ts +2 -1
- package/dist/cli/run-main.d.ts.map +1 -1
- package/dist/cli/run-main.js +5 -2
- package/dist/cli/run-main.js.map +1 -1
- package/dist/cli/shrink.d.ts +6 -0
- package/dist/cli/shrink.d.ts.map +1 -0
- package/dist/cli/shrink.js +8 -0
- package/dist/cli/shrink.js.map +1 -0
- package/dist/cli.js +11 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/decode.d.ts +1 -0
- package/dist/config/decode.d.ts.map +1 -1
- package/dist/config/decode.js +1 -0
- package/dist/config/decode.js.map +1 -1
- package/dist/config/file.d.ts +2 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +2 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -2
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +1 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +6 -4
- package/dist/config/resolve.js.map +1 -1
- package/dist/config.d.ts +2 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/engine/baseline-file.d.ts +11 -0
- package/dist/engine/baseline-file.d.ts.map +1 -0
- package/dist/engine/baseline-file.js +18 -0
- package/dist/engine/baseline-file.js.map +1 -0
- package/dist/engine/evaluate.d.ts +2 -2
- package/dist/engine/evaluate.d.ts.map +1 -1
- package/dist/engine/evaluate.js +3 -3
- package/dist/engine/evaluate.js.map +1 -1
- package/dist/engine/session.d.ts +3 -5
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +12 -10
- package/dist/engine/session.js.map +1 -1
- package/dist/exceptions/registry.d.ts +1 -1
- package/dist/exceptions/registry.d.ts.map +1 -1
- package/dist/exceptions/registry.js +8 -3
- package/dist/exceptions/registry.js.map +1 -1
- package/dist/failure.d.ts +0 -2
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +0 -2
- package/dist/failure.js.map +1 -1
- package/dist/git/base.d.ts +9 -0
- package/dist/git/base.d.ts.map +1 -0
- package/dist/git/base.js +34 -0
- package/dist/git/base.js.map +1 -0
- package/dist/git/command.d.ts +12 -0
- package/dist/git/command.d.ts.map +1 -0
- package/dist/git/command.js +13 -0
- package/dist/git/command.js.map +1 -0
- package/dist/git/history.d.ts +10 -0
- package/dist/git/history.d.ts.map +1 -0
- package/dist/git/history.js +28 -0
- package/dist/git/history.js.map +1 -0
- package/dist/inventory/ignore-scope.d.ts.map +1 -1
- package/dist/inventory/ignore-scope.js +0 -1
- package/dist/inventory/ignore-scope.js.map +1 -1
- package/dist/inventory/walk.d.ts +0 -1
- package/dist/inventory/walk.d.ts.map +1 -1
- package/dist/inventory/walk.js +1 -1
- package/dist/inventory/walk.js.map +1 -1
- package/dist/report/guard.d.ts +9 -0
- package/dist/report/guard.d.ts.map +1 -0
- package/dist/report/guard.js +34 -0
- package/dist/report/guard.js.map +1 -0
- package/dist/report/render.js +1 -2
- package/dist/report/render.js.map +1 -1
- package/dist/report/stale.d.ts.map +1 -1
- package/dist/report/stale.js +4 -3
- package/dist/report/stale.js.map +1 -1
- package/dist/rule.d.ts +4 -7
- package/dist/rule.d.ts.map +1 -1
- package/dist/rule.js +1 -1
- package/dist/rule.js.map +1 -1
- package/dist/rules/built-in.d.ts +17 -0
- package/dist/rules/built-in.d.ts.map +1 -1
- package/dist/rules/built-in.js +21 -1
- package/dist/rules/built-in.js.map +1 -1
- package/dist/rules/comments/kinds.d.ts +9 -0
- package/dist/rules/comments/kinds.d.ts.map +1 -0
- package/dist/rules/comments/kinds.js +34 -0
- package/dist/rules/comments/kinds.js.map +1 -0
- package/dist/rules/comments/max-per-file.d.ts +5 -0
- package/dist/rules/comments/max-per-file.d.ts.map +1 -0
- package/dist/rules/comments/max-per-file.js +39 -0
- package/dist/rules/comments/max-per-file.js.map +1 -0
- package/dist/rules/comments/no-banner.d.ts +2 -0
- package/dist/rules/comments/no-banner.d.ts.map +1 -0
- package/dist/rules/comments/no-banner.js +9 -0
- package/dist/rules/comments/no-banner.js.map +1 -0
- package/dist/rules/comments/no-jsdoc.d.ts +4 -0
- package/dist/rules/comments/no-jsdoc.d.ts.map +1 -0
- package/dist/rules/comments/no-jsdoc.js +14 -0
- package/dist/rules/comments/no-jsdoc.js.map +1 -0
- package/dist/rules/comments/no-line-reference.d.ts +2 -0
- package/dist/rules/comments/no-line-reference.d.ts.map +1 -0
- package/dist/rules/comments/no-line-reference.js +9 -0
- package/dist/rules/comments/no-line-reference.js.map +1 -0
- package/dist/rules/comments/no-pr-reference.d.ts +2 -0
- package/dist/rules/comments/no-pr-reference.d.ts.map +1 -0
- package/dist/rules/comments/no-pr-reference.js +13 -0
- package/dist/rules/comments/no-pr-reference.js.map +1 -0
- package/dist/rules/comments/no-todo.d.ts +2 -0
- package/dist/rules/comments/no-todo.d.ts.map +1 -0
- package/dist/rules/comments/no-todo.js +8 -0
- package/dist/rules/comments/no-todo.js.map +1 -0
- package/dist/rules/comments/pattern-rule.d.ts +10 -0
- package/dist/rules/comments/pattern-rule.d.ts.map +1 -0
- package/dist/rules/comments/pattern-rule.js +16 -0
- package/dist/rules/comments/pattern-rule.js.map +1 -0
- package/dist/rules/comments/scan.d.ts +13 -0
- package/dist/rules/comments/scan.d.ts.map +1 -0
- package/dist/rules/comments/scan.js +62 -0
- package/dist/rules/comments/scan.js.map +1 -0
- package/dist/rules/max-lines.d.ts.map +1 -1
- package/dist/rules/max-lines.js +8 -1
- package/dist/rules/max-lines.js.map +1 -1
- package/dist/rules/suppressions/biome/configs.d.ts +14 -0
- package/dist/rules/suppressions/biome/configs.d.ts.map +1 -0
- package/dist/rules/suppressions/biome/configs.js +39 -0
- package/dist/rules/suppressions/biome/configs.js.map +1 -0
- package/dist/rules/suppressions/biome/json.d.ts +27 -0
- package/dist/rules/suppressions/biome/json.d.ts.map +1 -0
- package/dist/rules/suppressions/biome/json.js +37 -0
- package/dist/rules/suppressions/biome/json.js.map +1 -0
- package/dist/rules/suppressions/biome/weakenings.d.ts +9 -0
- package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -0
- package/dist/rules/suppressions/biome/weakenings.js +68 -0
- package/dist/rules/suppressions/biome/weakenings.js.map +1 -0
- package/dist/rules/suppressions/biome-overrides.d.ts +8 -0
- package/dist/rules/suppressions/biome-overrides.d.ts.map +1 -0
- package/dist/rules/suppressions/biome-overrides.js +47 -0
- package/dist/rules/suppressions/biome-overrides.js.map +1 -0
- package/dist/rules/suppressions/directives.d.ts +4 -0
- package/dist/rules/suppressions/directives.d.ts.map +1 -0
- package/dist/rules/suppressions/directives.js +19 -0
- package/dist/rules/suppressions/directives.js.map +1 -0
- package/dist/rules/suppressions/no-double-cast.d.ts +2 -0
- package/dist/rules/suppressions/no-double-cast.d.ts.map +1 -0
- package/dist/rules/suppressions/no-double-cast.js +38 -0
- package/dist/rules/suppressions/no-double-cast.js.map +1 -0
- package/dist/rules/suppressions/no-inline.d.ts +8 -0
- package/dist/rules/suppressions/no-inline.d.ts.map +1 -0
- package/dist/rules/suppressions/no-inline.js +48 -0
- package/dist/rules/suppressions/no-inline.js.map +1 -0
- package/dist/rules/suppressions/stylesheet-comments.d.ts +4 -0
- package/dist/rules/suppressions/stylesheet-comments.d.ts.map +1 -0
- package/dist/rules/suppressions/stylesheet-comments.js +20 -0
- package/dist/rules/suppressions/stylesheet-comments.js.map +1 -0
- package/dist/rules/syntax.d.ts +4 -0
- package/dist/rules/syntax.d.ts.map +1 -0
- package/dist/rules/syntax.js +12 -0
- package/dist/rules/syntax.js.map +1 -0
- package/package.json +4 -5
- package/src/baseline/compare.ts +15 -39
- package/src/baseline/format.ts +35 -32
- package/src/baseline/guard.ts +47 -0
- package/src/baseline/legacy.ts +46 -0
- package/src/baseline/rewrite.ts +24 -0
- package/src/baseline/update.ts +47 -30
- package/src/cli/args.ts +64 -30
- package/src/cli/baseline.ts +27 -13
- package/src/cli/check.ts +51 -0
- package/src/cli/lint.ts +1 -1
- package/src/cli/migrate.ts +36 -0
- package/src/cli/run-main.ts +8 -3
- package/src/cli/shrink.ts +31 -0
- package/src/cli.ts +11 -2
- package/src/config/decode.ts +1 -0
- package/src/config/file.ts +1 -0
- package/src/config/load.ts +4 -3
- package/src/config/resolve.ts +7 -4
- package/src/config.ts +3 -7
- package/src/engine/baseline-file.ts +27 -0
- package/src/engine/evaluate.ts +4 -2
- package/src/engine/session.ts +14 -12
- package/src/exceptions/registry.ts +9 -2
- package/src/failure.ts +0 -2
- package/src/git/base.ts +54 -0
- package/src/git/command.ts +31 -0
- package/src/git/history.ts +41 -0
- package/src/inventory/ignore-scope.ts +0 -1
- package/src/inventory/walk.ts +1 -1
- package/src/report/guard.ts +46 -0
- package/src/report/render.ts +2 -2
- package/src/report/stale.ts +11 -3
- package/src/rule.ts +5 -8
- package/src/rules/built-in.ts +21 -1
- package/src/rules/comments/kinds.ts +45 -0
- package/src/rules/comments/max-per-file.ts +46 -0
- package/src/rules/comments/no-banner.ts +10 -0
- package/src/rules/comments/no-jsdoc.ts +18 -0
- package/src/rules/comments/no-line-reference.ts +11 -0
- package/src/rules/comments/no-pr-reference.ts +13 -0
- package/src/rules/comments/no-todo.ts +8 -0
- package/src/rules/comments/pattern-rule.ts +28 -0
- package/src/rules/comments/scan.ts +80 -0
- package/src/rules/max-lines.ts +8 -1
- package/src/rules/suppressions/biome/configs.ts +50 -0
- package/src/rules/suppressions/biome/json.ts +55 -0
- package/src/rules/suppressions/biome/weakenings.ts +102 -0
- package/src/rules/suppressions/biome-overrides.ts +61 -0
- package/src/rules/suppressions/directives.ts +25 -0
- package/src/rules/suppressions/no-double-cast.ts +47 -0
- package/src/rules/suppressions/no-inline.ts +63 -0
- package/src/rules/suppressions/stylesheet-comments.ts +27 -0
- package/src/rules/syntax.ts +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,OAAO,EAAa,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAM3E,MAAM,YAAY,GAA0B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAE1E,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvG,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,IAAU,EAAyB,EAAE;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,EAAE,QAAgC,EAAE,IAAY,EAAE,IAAY,EAAE,IAAiB,EAAkC,EAAE;IACtI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxH,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,QAAgC,EAA+B,EAAE;IAC1F,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAc,EAAkC,EAAE;IACrG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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.
|
|
3
|
+
"version": "0.3.0",
|
|
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
|
|
66
|
+
"ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build"
|
|
68
67
|
}
|
|
69
68
|
}
|
package/src/baseline/compare.ts
CHANGED
|
@@ -2,14 +2,9 @@ import type { Level } from "../config.ts";
|
|
|
2
2
|
import { groupBy, keyOf, unusedEntryProblem, type Violation } from "../engine/violation.ts";
|
|
3
3
|
import type { BaselineEntry } from "./format.ts";
|
|
4
4
|
|
|
5
|
-
export interface Tally {
|
|
6
|
-
readonly count: number;
|
|
7
|
-
readonly measure: number | undefined;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
5
|
export interface Regression {
|
|
11
6
|
readonly entry: BaselineEntry;
|
|
12
|
-
readonly
|
|
7
|
+
readonly count: number;
|
|
13
8
|
}
|
|
14
9
|
|
|
15
10
|
export interface StaleBaselineEntry {
|
|
@@ -21,34 +16,11 @@ export interface BaselineCheck {
|
|
|
21
16
|
readonly kept: ReadonlyArray<Violation>;
|
|
22
17
|
readonly regressions: ReadonlyArray<Regression>;
|
|
23
18
|
readonly stale: ReadonlyArray<StaleBaselineEntry>;
|
|
19
|
+
readonly loose: ReadonlyArray<StaleBaselineEntry>;
|
|
24
20
|
readonly baselined: number;
|
|
25
21
|
}
|
|
26
22
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const measures = (violations: ReadonlyArray<Violation>): ReadonlyArray<number> =>
|
|
30
|
-
violations.flatMap((violation) => (violation.measure === undefined ? [] : [violation.measure]));
|
|
31
|
-
|
|
32
|
-
export const tallyOf = (violations: ReadonlyArray<Violation>): Tally => {
|
|
33
|
-
const found = measures(violations);
|
|
34
|
-
return { count: violations.length, measure: found.length === 0 ? undefined : Math.max(...found) };
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const measureTrend = (entry: BaselineEntry, tally: Tally): number =>
|
|
38
|
-
entry.measure === undefined || tally.measure === undefined ? 0 : Math.sign(tally.measure - entry.measure);
|
|
39
|
-
|
|
40
|
-
const verdictOf = (entry: BaselineEntry, tally: Tally): Verdict => {
|
|
41
|
-
const trend = measureTrend(entry, tally);
|
|
42
|
-
if (tally.count > entry.count || trend > 0) {
|
|
43
|
-
return { _tag: "Regressed" };
|
|
44
|
-
}
|
|
45
|
-
return { _tag: "Covered", loose: tally.count < entry.count || trend < 0 };
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export const describeTally = (tally: Tally): string =>
|
|
49
|
-
`${tally.count} violation${tally.count === 1 ? "" : "s"}${tally.measure === undefined ? "" : ` measuring ${tally.measure}`}`;
|
|
50
|
-
|
|
51
|
-
export const describeEntry = (entry: BaselineEntry): string => describeTally({ count: entry.count, measure: entry.measure });
|
|
23
|
+
export const countOf = (violations: ReadonlyArray<Violation>): number => violations.reduce((total, violation) => total + (violation.count ?? 1), 0);
|
|
52
24
|
|
|
53
25
|
export const applyBaseline = (
|
|
54
26
|
violations: ReadonlyArray<Violation>,
|
|
@@ -59,23 +31,27 @@ export const applyBaseline = (
|
|
|
59
31
|
const covered = new Set<string>();
|
|
60
32
|
const regressions: Regression[] = [];
|
|
61
33
|
const stale: StaleBaselineEntry[] = [];
|
|
34
|
+
const loose: StaleBaselineEntry[] = [];
|
|
62
35
|
for (const entry of entries) {
|
|
63
36
|
const group = groups.get(keyOf(entry.rule, entry.file)) ?? [];
|
|
64
37
|
if (group.length === 0) {
|
|
65
|
-
|
|
38
|
+
const level = levels.get(entry.rule);
|
|
39
|
+
(level === undefined || level === "off" ? stale : loose).push({
|
|
40
|
+
entry,
|
|
41
|
+
problem: unusedEntryProblem(levels, entry.rule, "has no violations left"),
|
|
42
|
+
});
|
|
66
43
|
continue;
|
|
67
44
|
}
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
regressions.push({ entry, tally });
|
|
45
|
+
const count = countOf(group);
|
|
46
|
+
if (count > entry.count) {
|
|
47
|
+
regressions.push({ count, entry });
|
|
72
48
|
continue;
|
|
73
49
|
}
|
|
74
50
|
covered.add(keyOf(entry.rule, entry.file));
|
|
75
|
-
if (
|
|
76
|
-
|
|
51
|
+
if (count < entry.count) {
|
|
52
|
+
loose.push({ entry, problem: `allows more than is left: ${count} against ${entry.count} baselined` });
|
|
77
53
|
}
|
|
78
54
|
}
|
|
79
55
|
const kept = violations.filter((violation) => !covered.has(keyOf(violation.rule, violation.file)));
|
|
80
|
-
return { baselined: violations.length - kept.length, kept, regressions, stale };
|
|
56
|
+
return { baselined: violations.length - kept.length, kept, loose, regressions, stale };
|
|
81
57
|
};
|