@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
package/dist/report/stale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,KAA4B,EAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB,EAAE,KAA4B,EAAyB,EAAE,CACtH,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjJ,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC;AAErH,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CACvE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AAExG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAiB,EAAyB,EAAE,CAAC;IAC5F,GAAG,OAAO,CACT,OAAO,EACP,KAAK,CAAC,QAAQ,EACd,qGAAqG,EACrG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,MAAM,EACN,KAAK,CAAC,QAAQ,EACd,2HAA2H,EAC3H,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,OAAO,EACP,KAAK,CAAC,QAAQ,EACd,0FAA0F,EAC1F,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;CACD,CAAC"}
|
package/dist/rule.d.ts
CHANGED
|
@@ -3,10 +3,9 @@ export interface Finding {
|
|
|
3
3
|
readonly file: string;
|
|
4
4
|
readonly line?: number | undefined;
|
|
5
5
|
readonly message: string;
|
|
6
|
-
/** Tells apart exceptions of one rule in one file, such as which Biome rule an override turns off. */
|
|
7
6
|
readonly subject?: string | undefined;
|
|
8
|
-
|
|
9
|
-
readonly
|
|
7
|
+
readonly count?: number | undefined;
|
|
8
|
+
readonly threshold?: number | undefined;
|
|
10
9
|
}
|
|
11
10
|
export type Findings = ReadonlyArray<Finding>;
|
|
12
11
|
export interface SourceFile {
|
|
@@ -33,11 +32,13 @@ export type Configured = {
|
|
|
33
32
|
export interface Rule<Id extends string = string, Input = unknown> {
|
|
34
33
|
readonly id: Id;
|
|
35
34
|
readonly description: string;
|
|
35
|
+
readonly registrable?: boolean;
|
|
36
36
|
configure(options: Input | undefined): Promise<Configured>;
|
|
37
37
|
}
|
|
38
38
|
interface RuleDefinition<Id extends string, Options> {
|
|
39
39
|
readonly id: Id;
|
|
40
40
|
readonly description: string;
|
|
41
|
+
readonly registrable?: false;
|
|
41
42
|
readonly check: (context: RuleContext<Options>) => Findings | PromiseLike<Findings>;
|
|
42
43
|
}
|
|
43
44
|
interface RuleDefinitionWithOptions<Id extends string, Input, Options> extends RuleDefinition<Id, Options> {
|
|
@@ -46,10 +47,6 @@ interface RuleDefinitionWithOptions<Id extends string, Input, Options> extends R
|
|
|
46
47
|
interface RuleDefinitionWithoutOptions<Id extends string> extends RuleDefinition<Id, undefined> {
|
|
47
48
|
readonly options?: undefined;
|
|
48
49
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Defines a rule. Options are an object validated by a Standard Schema; a rule the config gives no options validates `{}`,
|
|
51
|
-
* so give each option a default or make it optional.
|
|
52
|
-
*/
|
|
53
50
|
export declare function defineRule<const Id extends string, Input, Options>(definition: RuleDefinitionWithOptions<Id, Input, Options>): Rule<Id, Input>;
|
|
54
51
|
export declare function defineRule<const Id extends string>(definition: RuleDefinitionWithoutOptions<Id>): Rule<Id, undefined>;
|
|
55
52
|
export {};
|
package/dist/rule.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
|
package/dist/rule.js
CHANGED
|
@@ -18,6 +18,6 @@ export function defineRule(definition) {
|
|
|
18
18
|
const configure = definition.options === undefined
|
|
19
19
|
? configureWith(noOptions, definition.check, undefined)
|
|
20
20
|
: configureWith(definition.options, definition.check, {});
|
|
21
|
-
return { configure, description: definition.description, id: definition.id };
|
|
21
|
+
return { configure, description: definition.description, id: definition.id, registrable: definition.registrable ?? true };
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=rule.js.map
|
package/dist/rule.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAyD5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;AAC3H,CAAC"}
|
package/dist/rules/built-in.d.ts
CHANGED
|
@@ -2,5 +2,22 @@ export declare const builtInRules: readonly [import("../rule.ts").Rule<"structur
|
|
|
2
2
|
readonly source?: number;
|
|
3
3
|
readonly test?: number;
|
|
4
4
|
readonly testFiles?: readonly string[];
|
|
5
|
+
}>, import("../rule.ts").Rule<"comments/no-jsdoc", {
|
|
6
|
+
readonly allow?: readonly string[];
|
|
7
|
+
}>, import("../rule.ts").Rule<"comments/no-line-reference", undefined>, import("../rule.ts").Rule<"comments/no-pr-reference", undefined>, import("../rule.ts").Rule<"comments/no-banner", undefined>, import("../rule.ts").Rule<"comments/no-todo", undefined>, import("../rule.ts").Rule<"comments/max-per-file", {
|
|
8
|
+
readonly max?: number;
|
|
9
|
+
readonly allow?: readonly string[];
|
|
10
|
+
}>, import("../rule.ts").Rule<"suppressions/no-inline", {
|
|
11
|
+
readonly declared?: readonly {
|
|
12
|
+
readonly directive: "@ts-expect-error";
|
|
13
|
+
readonly includes: readonly [string, ...string[]];
|
|
14
|
+
readonly reason: string;
|
|
15
|
+
}[];
|
|
16
|
+
}>, import("../rule.ts").Rule<"suppressions/no-double-cast", undefined>, import("../rule.ts").Rule<"suppressions/biome-overrides", {
|
|
17
|
+
readonly declared?: readonly {
|
|
18
|
+
readonly rule: string;
|
|
19
|
+
readonly includes: readonly [string, ...string[]];
|
|
20
|
+
readonly reason: string;
|
|
21
|
+
}[];
|
|
5
22
|
}>];
|
|
6
23
|
//# sourceMappingURL=built-in.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in.d.ts","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"built-in.d.ts","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;GAWf,CAAC"}
|
package/dist/rules/built-in.js
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
import { maxPerFile } from "./comments/max-per-file.js";
|
|
2
|
+
import { noBanner } from "./comments/no-banner.js";
|
|
3
|
+
import { noJsdoc } from "./comments/no-jsdoc.js";
|
|
4
|
+
import { noLineReference } from "./comments/no-line-reference.js";
|
|
5
|
+
import { noPrReference } from "./comments/no-pr-reference.js";
|
|
6
|
+
import { noTodo } from "./comments/no-todo.js";
|
|
1
7
|
import { maxLines } from "./max-lines.js";
|
|
2
|
-
|
|
8
|
+
import { biomeOverrides } from "./suppressions/biome-overrides.js";
|
|
9
|
+
import { noDoubleCast } from "./suppressions/no-double-cast.js";
|
|
10
|
+
import { noInline } from "./suppressions/no-inline.js";
|
|
11
|
+
export const builtInRules = [
|
|
12
|
+
maxLines,
|
|
13
|
+
noJsdoc,
|
|
14
|
+
noLineReference,
|
|
15
|
+
noPrReference,
|
|
16
|
+
noBanner,
|
|
17
|
+
noTodo,
|
|
18
|
+
maxPerFile,
|
|
19
|
+
noInline,
|
|
20
|
+
noDoubleCast,
|
|
21
|
+
biomeOverrides,
|
|
22
|
+
];
|
|
3
23
|
//# sourceMappingURL=built-in.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in.js","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"built-in.js","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,QAAQ;IACR,OAAO;IACP,eAAe;IACf,aAAa;IACb,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,cAAc;CACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import type { SourceComment } from "./scan.ts";
|
|
3
|
+
export declare const DEFAULT_PRAGMAS: ReadonlyArray<string>;
|
|
4
|
+
export declare const Pragmas: Schema.withDecodingDefaultKey<Schema.$Array<Schema.String>, never>;
|
|
5
|
+
export declare const textOf: (comment: SourceComment) => string;
|
|
6
|
+
export declare const isJsdoc: (comment: SourceComment) => boolean;
|
|
7
|
+
export declare const isPragma: (comment: SourceComment, pragmas: ReadonlyArray<string>) => boolean;
|
|
8
|
+
export declare const isDirective: (comment: SourceComment) => boolean;
|
|
9
|
+
//# sourceMappingURL=kinds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/kinds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAQjD,CAAC;AAEF,eAAO,MAAM,OAAO,oEAAmG,CAAC;AAkBxH,eAAO,MAAM,MAAM,GAAI,SAAS,aAAa,KAAG,MAAiC,CAAC;AAElF,eAAO,MAAM,OAAO,GAAI,SAAS,aAAa,KAAG,OAAgG,CAAC;AAElJ,eAAO,MAAM,QAAQ,GAAI,SAAS,aAAa,EAAE,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,OAGjF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,aAAa,KAAG,OAGpD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { SUPPRESSIONS } from "../suppressions/directives.js";
|
|
3
|
+
export const DEFAULT_PRAGMAS = [
|
|
4
|
+
"@vitest-environment",
|
|
5
|
+
"@vitest-environment-options",
|
|
6
|
+
"@jest-environment",
|
|
7
|
+
"@jsx",
|
|
8
|
+
"@jsxFrag",
|
|
9
|
+
"@jsxImportSource",
|
|
10
|
+
"@jsxRuntime",
|
|
11
|
+
];
|
|
12
|
+
export const Pragmas = Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed(DEFAULT_PRAGMAS)));
|
|
13
|
+
const DIRECTIVES = [
|
|
14
|
+
...SUPPRESSIONS,
|
|
15
|
+
/^@ts-/,
|
|
16
|
+
/^biome-ignore/,
|
|
17
|
+
/^(?:eslint|oxlint|stylelint)-(?:disable|enable)/,
|
|
18
|
+
/^[#@]__(?:PURE|NO_SIDE_EFFECTS)__/,
|
|
19
|
+
/^(?:c8|v8|istanbul) ignore/,
|
|
20
|
+
];
|
|
21
|
+
const TRIPLE_SLASH = /^\/\/\/\s*</;
|
|
22
|
+
const contentOf = (comment) => comment.body.filter((line) => line !== "");
|
|
23
|
+
const startsWithTag = (line, tags) => tags.some((tag) => line === tag || line.startsWith(`${tag} `) || line.startsWith(`${tag}\t`));
|
|
24
|
+
export const textOf = (comment) => comment.body.join("\n");
|
|
25
|
+
export const isJsdoc = (comment) => comment.kind === "block" && comment.text.startsWith("/**") && comment.text !== "/**/";
|
|
26
|
+
export const isPragma = (comment, pragmas) => {
|
|
27
|
+
const content = contentOf(comment);
|
|
28
|
+
return content.length > 0 && content.every((line) => startsWithTag(line, pragmas));
|
|
29
|
+
};
|
|
30
|
+
export const isDirective = (comment) => {
|
|
31
|
+
const first = contentOf(comment)[0] ?? "";
|
|
32
|
+
return TRIPLE_SLASH.test(comment.text) || DIRECTIVES.some((directive) => directive.test(first));
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../../src/rules/comments/kinds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,MAAM,CAAC,MAAM,eAAe,GAA0B;IACrD,qBAAqB;IACrB,6BAA6B;IAC7B,mBAAmB;IACnB,MAAM;IACN,UAAU;IACV,kBAAkB;IAClB,aAAa;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAExH,MAAM,UAAU,GAA0B;IACzC,GAAG,YAAY;IACf,OAAO;IACP,eAAe;IACf,iDAAiD;IACjD,mCAAmC;IACnC,4BAA4B;CAC5B,CAAC;AAEF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAyB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAEhH,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAA2B,EAAW,EAAE,CAC5E,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAElJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAE,OAA8B,EAAW,EAAE;IAC3F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAW,EAAE;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-per-file.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/max-per-file.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,UAAU;;;EAMrB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { plural } from "../../report/plural.js";
|
|
3
|
+
import { defineRule } from "../../rule.js";
|
|
4
|
+
import { isDirective, isPragma, Pragmas } from "./kinds.js";
|
|
5
|
+
import { commentsOf } from "./scan.js";
|
|
6
|
+
const MaxPerFileOptions = Schema.Struct({
|
|
7
|
+
max: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.withDecodingDefaultKey(Effect.succeed(2))),
|
|
8
|
+
allow: Pragmas,
|
|
9
|
+
});
|
|
10
|
+
const continues = (previous, comment) => previous !== undefined &&
|
|
11
|
+
previous.kind === "line" &&
|
|
12
|
+
comment.kind === "line" &&
|
|
13
|
+
previous.ownLine &&
|
|
14
|
+
comment.ownLine &&
|
|
15
|
+
comment.line === previous.endLine + 1;
|
|
16
|
+
const commentBlocks = (comments) => comments.filter((comment, index) => !continues(comments[index - 1], comment));
|
|
17
|
+
const overCap = (file, max, allow) => {
|
|
18
|
+
const counted = commentsOf(file).filter((comment) => !isDirective(comment) && !isPragma(comment, allow));
|
|
19
|
+
const blocks = commentBlocks(counted);
|
|
20
|
+
const first = blocks[max];
|
|
21
|
+
return first === undefined
|
|
22
|
+
? []
|
|
23
|
+
: [
|
|
24
|
+
{
|
|
25
|
+
file: file.path,
|
|
26
|
+
line: first.line,
|
|
27
|
+
count: blocks.length - max,
|
|
28
|
+
message: `${plural(blocks.length, "comment", "comments")} against a limit of ${max}.`,
|
|
29
|
+
threshold: max,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
};
|
|
33
|
+
export const maxPerFile = defineRule({
|
|
34
|
+
id: "comments/max-per-file",
|
|
35
|
+
description: "A file that needs more than a few comments does too much, or its comments narrate the code. Delete the comments that restate the code, then split the file.",
|
|
36
|
+
options: Schema.toStandardSchemaV1(MaxPerFileOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
|
|
37
|
+
check: ({ options, sources }) => sources.flatMap((file) => overCap(file, options.max, options.allow)),
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=max-per-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-per-file.js","sourceRoot":"","sources":["../../../src/rules/comments/max-per-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAiC,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAE3D,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9G,KAAK,EAAE,OAAO;CACd,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,QAAmC,EAAE,OAAsB,EAAW,EAAE,CAC1F,QAAQ,KAAK,SAAS;IACtB,QAAQ,CAAC,IAAI,KAAK,MAAM;IACxB,OAAO,CAAC,IAAI,KAAK,MAAM;IACvB,QAAQ,CAAC,OAAO;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;AAEvC,MAAM,aAAa,GAAG,CAAC,QAAsC,EAAgC,EAAE,CAC9F,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAE,GAAW,EAAE,KAA4B,EAA0B,EAAE;IACvG,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACA;gBACC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG;gBAC1B,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,uBAAuB,GAAG,GAAG;gBACrF,SAAS,EAAE,GAAG;aACd;SACD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACpC,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EACV,6JAA6J;IAC9J,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IACrH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;CACrG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-banner.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-banner.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,+DAKnB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { definePatternRule } from "./pattern-rule.js";
|
|
2
|
+
const DIVIDER = "[-=*#~_+/\\\\─━═┄┈]{3,}";
|
|
3
|
+
export const noBanner = definePatternRule({
|
|
4
|
+
id: "comments/no-banner",
|
|
5
|
+
description: "Banners, dividers and regions mark a file that does several jobs. Split the file along those sections instead.",
|
|
6
|
+
patterns: [new RegExp(`^${DIVIDER}|${DIVIDER}$`, "m"), /^#(?:end)?region\b/m],
|
|
7
|
+
message: (match) => `Banner or divider: "${match}".`,
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=no-banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-banner.js","sourceRoot":"","sources":["../../../src/rules/comments/no-banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;IACzC,EAAE,EAAE,oBAAoB;IACxB,WAAW,EAAE,gHAAgH;IAC7H,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,IAAI,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,KAAK,IAAI;CACpD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-jsdoc.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-jsdoc.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO;;EAUlB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { defineRule } from "../../rule.js";
|
|
3
|
+
import { isDirective, isJsdoc, isPragma, Pragmas } from "./kinds.js";
|
|
4
|
+
import { commentsOf } from "./scan.js";
|
|
5
|
+
const NoJsdocOptions = Schema.Struct({ allow: Pragmas });
|
|
6
|
+
export const noJsdoc = defineRule({
|
|
7
|
+
id: "comments/no-jsdoc",
|
|
8
|
+
description: "Names and types already say what a JSDoc block repeats. Delete it, and keep a reason the code cannot show as a short // comment.",
|
|
9
|
+
options: Schema.toStandardSchemaV1(NoJsdocOptions, { parseOptions: { errors: "all", onExcessProperty: "error" } }),
|
|
10
|
+
check: ({ options, sources }) => sources.flatMap((file) => commentsOf(file)
|
|
11
|
+
.filter((comment) => isJsdoc(comment) && !isPragma(comment, options.allow) && !isDirective(comment))
|
|
12
|
+
.map((comment) => ({ file: file.path, line: comment.line, message: "JSDoc block." }))),
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=no-jsdoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-jsdoc.js","sourceRoot":"","sources":["../../../src/rules/comments/no-jsdoc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;IACjC,EAAE,EAAE,mBAAmB;IACvB,WAAW,EAAE,kIAAkI;IAC/I,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IAClH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,UAAU,CAAC,IAAI,CAAC;SACd,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACnG,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CACtF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-line-reference.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-line-reference.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,uEAK1B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { definePatternRule } from "./pattern-rule.js";
|
|
2
|
+
const SOURCE_EXTENSION = "(?:[cm]?[jt]sx?|json5?|mdx?|css|scss|less|html?|vue|svelte|astro|ya?ml|toml|sql|prisma|graphql|gql|go|rs|py|rb|java|kt|swift|sh)";
|
|
3
|
+
export const noLineReference = definePatternRule({
|
|
4
|
+
id: "comments/no-line-reference",
|
|
5
|
+
description: "A line number goes stale with the next edit. Name the function, type, test or setting instead.",
|
|
6
|
+
patterns: [new RegExp(`[\\w./@-]*\\.${SOURCE_EXTENSION}(?::\\d+|#L\\d+)`, "i"), /(?<![\w-])lines?\s+\d+/i],
|
|
7
|
+
message: (match) => `Refers to a line: "${match}".`,
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=no-line-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-line-reference.js","sourceRoot":"","sources":["../../../src/rules/comments/no-line-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,gBAAgB,GACrB,kIAAkI,CAAC;AAEpI,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;IAChD,EAAE,EAAE,4BAA4B;IAChC,WAAW,EAAE,gGAAgG;IAC7G,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,gBAAgB,gBAAgB,kBAAkB,EAAE,GAAG,CAAC,EAAE,yBAAyB,CAAC;IAC1G,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,KAAK,IAAI;CACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-pr-reference.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-pr-reference.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,qEAUxB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { definePatternRule } from "./pattern-rule.js";
|
|
2
|
+
export const noPrReference = definePatternRule({
|
|
3
|
+
id: "comments/no-pr-reference",
|
|
4
|
+
description: "History belongs in version control, not in the code. State the reason itself, so the comment holds without the link.",
|
|
5
|
+
patterns: [
|
|
6
|
+
/\b(?:PR|MR|pull request|merge request|issue|ticket)s?\s*#?\d+\b/i,
|
|
7
|
+
/\/(?:pull|pulls|issues|merge_requests)\/\d+/,
|
|
8
|
+
/\bGH-\d+\b/,
|
|
9
|
+
/(?<![\w&/#-])#\d+\b/,
|
|
10
|
+
],
|
|
11
|
+
message: (match) => `Refers to a pull request or issue: "${match}".`,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=no-pr-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-pr-reference.js","sourceRoot":"","sources":["../../../src/rules/comments/no-pr-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;IAC9C,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EAAE,sHAAsH;IACnI,QAAQ,EAAE;QACT,kEAAkE;QAClE,6CAA6C;QAC7C,YAAY;QACZ,qBAAqB;KACrB;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uCAAuC,KAAK,IAAI;CACpE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-todo.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/no-todo.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,6DAKjB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { definePatternRule } from "./pattern-rule.js";
|
|
2
|
+
export const noTodo = definePatternRule({
|
|
3
|
+
id: "comments/no-todo",
|
|
4
|
+
description: "A TODO in the code is never done. Do the work now, or track it where the repository tracks work.",
|
|
5
|
+
patterns: [/\b(?:TODO|FIXME|XXX)\b/, /@todo\b/i],
|
|
6
|
+
message: (match) => `Marks unfinished work: "${match}".`,
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=no-todo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-todo.js","sourceRoot":"","sources":["../../../src/rules/comments/no-todo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC;IACvC,EAAE,EAAE,kBAAkB;IACtB,WAAW,EAAE,kGAAkG;IAC/G,QAAQ,EAAE,CAAC,wBAAwB,EAAE,UAAU,CAAC;IAChD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,KAAK,IAAI;CACxD,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Rule } from "../../rule.ts";
|
|
2
|
+
interface PatternRule<Id extends string> {
|
|
3
|
+
readonly id: Id;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
readonly patterns: ReadonlyArray<RegExp>;
|
|
6
|
+
readonly message: (match: string) => string;
|
|
7
|
+
}
|
|
8
|
+
export declare const definePatternRule: <const Id extends string>({ description, id, message, patterns }: PatternRule<Id>) => Rule<Id, undefined>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=pattern-rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-rule.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/pattern-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAIpE,UAAU,WAAW,CAAC,EAAE,SAAS,MAAM;IACtC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C;AAOD,eAAO,MAAM,iBAAiB,GAAI,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,wCAAwC,WAAW,CAAC,EAAE,CAAC,KAAG,IAAI,CAAC,EAAE,EAAE,SAAS,CAWpI,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineRule } from "../../rule.js";
|
|
2
|
+
import { isDirective, textOf } from "./kinds.js";
|
|
3
|
+
import { commentsOf } from "./scan.js";
|
|
4
|
+
const firstMatch = (comment, patterns) => {
|
|
5
|
+
const text = textOf(comment);
|
|
6
|
+
return patterns.map((pattern) => pattern.exec(text)?.[0]).find((match) => match !== undefined);
|
|
7
|
+
};
|
|
8
|
+
export const definePatternRule = ({ description, id, message, patterns }) => defineRule({
|
|
9
|
+
id,
|
|
10
|
+
description,
|
|
11
|
+
check: ({ sources }) => sources.flatMap((file) => commentsOf(file).flatMap((comment) => {
|
|
12
|
+
const match = isDirective(comment) ? undefined : firstMatch(comment, patterns);
|
|
13
|
+
return match === undefined ? [] : [{ file: file.path, line: comment.line, message: message(match) }];
|
|
14
|
+
})),
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=pattern-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-rule.js","sourceRoot":"","sources":["../../../src/rules/comments/pattern-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAS3D,MAAM,UAAU,GAAG,CAAC,OAAsB,EAAE,QAA+B,EAAsB,EAAE;IAClG,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA0B,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAmB,EAAuB,EAAE,CAC1I,UAAU,CAAC;IACV,EAAE;IACF,WAAW;IACX,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACtB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAA0B,EAAE;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/E,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,CACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SourceFile } from "../../rule.ts";
|
|
2
|
+
export interface SourceComment {
|
|
3
|
+
readonly kind: "block" | "line";
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly body: ReadonlyArray<string>;
|
|
6
|
+
readonly line: number;
|
|
7
|
+
readonly endLine: number;
|
|
8
|
+
readonly ownLine: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const bodyOf: (kind: SourceComment["kind"], text: string) => ReadonlyArray<string>;
|
|
11
|
+
export declare const scanComments: (file: SourceFile) => ReadonlyArray<SourceComment>;
|
|
12
|
+
export declare const commentsOf: (file: SourceFile) => ReadonlyArray<SourceComment>;
|
|
13
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/rules/comments/scan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AA4BD,eAAO,MAAM,MAAM,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,KAAG,aAAa,CAAC,MAAM,CAM1B,CAAC;AAwB9D,eAAO,MAAM,YAAY,GAAI,MAAM,UAAU,KAAG,aAAa,CAAC,aAAa,CAQ1E,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,aAAa,CAAC,aAAa,CAA4D,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { parse } from "../syntax.js";
|
|
3
|
+
const DECLARATION = /\.d\.[cm]?ts$/;
|
|
4
|
+
const commentRanges = (source) => {
|
|
5
|
+
const ranges = new Map();
|
|
6
|
+
const jsxText = [];
|
|
7
|
+
const add = (found) => {
|
|
8
|
+
for (const range of found ?? []) {
|
|
9
|
+
ranges.set(range.pos, range);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const visit = (node) => {
|
|
13
|
+
if (node.kind === ts.SyntaxKind.JsxText) {
|
|
14
|
+
jsxText.push(node);
|
|
15
|
+
}
|
|
16
|
+
add(ts.getLeadingCommentRanges(source.text, node.pos));
|
|
17
|
+
add(ts.getTrailingCommentRanges(source.text, node.end));
|
|
18
|
+
for (const child of node.getChildren(source)) {
|
|
19
|
+
visit(child);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
visit(source);
|
|
23
|
+
return [...ranges.values()]
|
|
24
|
+
.filter((range) => !jsxText.some((text) => range.pos >= text.pos && range.pos < text.end))
|
|
25
|
+
.sort((left, right) => left.pos - right.pos);
|
|
26
|
+
};
|
|
27
|
+
export const bodyOf = (kind, text) => kind === "line"
|
|
28
|
+
? [text.slice(2).trim()]
|
|
29
|
+
: text
|
|
30
|
+
.slice(2, -2)
|
|
31
|
+
.split("\n")
|
|
32
|
+
.map((line) => line.trim().replace(/^\*(?=\s|$)\s*/, ""));
|
|
33
|
+
const toComment = (source, range) => {
|
|
34
|
+
const kind = range.kind === ts.SyntaxKind.SingleLineCommentTrivia ? "line" : "block";
|
|
35
|
+
const text = source.text.slice(range.pos, range.end);
|
|
36
|
+
const start = source.getLineAndCharacterOfPosition(range.pos);
|
|
37
|
+
const lineStart = source.getPositionOfLineAndCharacter(start.line, 0);
|
|
38
|
+
return {
|
|
39
|
+
body: bodyOf(kind, text),
|
|
40
|
+
endLine: source.getLineAndCharacterOfPosition(range.end).line + 1,
|
|
41
|
+
kind,
|
|
42
|
+
line: start.line + 1,
|
|
43
|
+
ownLine: source.text.slice(lineStart, range.pos).trim() === "",
|
|
44
|
+
text,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const scanned = new WeakMap();
|
|
48
|
+
const scan = (file) => {
|
|
49
|
+
const source = parse(file);
|
|
50
|
+
return source === undefined ? [] : commentRanges(source).map((range) => toComment(source, range));
|
|
51
|
+
};
|
|
52
|
+
export const scanComments = (file) => {
|
|
53
|
+
const cached = scanned.get(file);
|
|
54
|
+
if (cached !== undefined) {
|
|
55
|
+
return cached;
|
|
56
|
+
}
|
|
57
|
+
const comments = scan(file);
|
|
58
|
+
scanned.set(file, comments);
|
|
59
|
+
return comments;
|
|
60
|
+
};
|
|
61
|
+
export const commentsOf = (file) => (DECLARATION.test(file.path) ? [] : scanComments(file));
|
|
62
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/rules/comments/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-lines.d.ts","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"max-lines.d.ts","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,QAAQ;;;;EAUnB,CAAC"}
|
package/dist/rules/max-lines.js
CHANGED
|
@@ -11,7 +11,14 @@ const MaxLinesOptions = Schema.Struct({
|
|
|
11
11
|
});
|
|
12
12
|
const oversized = (file, limit) => file.lines.length <= limit
|
|
13
13
|
? []
|
|
14
|
-
: [
|
|
14
|
+
: [
|
|
15
|
+
{
|
|
16
|
+
count: file.lines.length - limit,
|
|
17
|
+
file: file.path,
|
|
18
|
+
message: `${file.lines.length} lines exceeds the ${limit}-line limit.`,
|
|
19
|
+
threshold: limit,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
15
22
|
export const maxLines = defineRule({
|
|
16
23
|
id: "structure/max-lines",
|
|
17
24
|
description: "Keep each module to one job. Split a long file along its responsibilities; never golf it under the limit.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-lines.js","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC;AAEvE,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC5G,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC9G,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,KAAa,EAA0B,EAAE,CAC7E,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;IACzB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"max-lines.js","sourceRoot":"","sources":["../../src/rules/max-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAC;AAEvE,MAAM,kBAAkB,GAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC5G,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC9G,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,KAAa,EAA0B,EAAE,CAC7E,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;IACzB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC;QACA;YACC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,sBAAsB,KAAK,cAAc;YACtE,SAAS,EAAE,KAAK;SAChB;KACD,CAAC;AAEL,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,2GAA2G;IACxH,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;IACnH,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RuleInputs } from "../../../rule.ts";
|
|
2
|
+
import { type Json } from "./json.ts";
|
|
3
|
+
export type Config = {
|
|
4
|
+
readonly _tag: "Config";
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly base: string;
|
|
7
|
+
readonly json: Json;
|
|
8
|
+
} | {
|
|
9
|
+
readonly _tag: "Unreadable";
|
|
10
|
+
readonly path: string;
|
|
11
|
+
readonly reason: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const biomeConfigs: ({ files, readText }: RuleInputs) => Promise<ReadonlyArray<Config>>;
|
|
14
|
+
//# sourceMappingURL=configs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAW,KAAK,IAAI,EAA8B,MAAM,WAAW,CAAC;AAE3E,MAAM,MAAM,MAAM,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoCnF,eAAO,MAAM,YAAY,GAAU,qBAAqB,UAAU,KAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAOjG,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
import { itemsOf, member, parseJsonc, textOf } from "./json.js";
|
|
3
|
+
const ROOT_CONFIGS = ["biome.json", "biome.jsonc"];
|
|
4
|
+
const NESTED = /(?:^|\/)biome\.jsonc?$/;
|
|
5
|
+
const directoryOf = (path) => (posix.dirname(path) === "." ? "" : posix.dirname(path));
|
|
6
|
+
const localExtends = (path, json) => {
|
|
7
|
+
const node = member(json, "extends");
|
|
8
|
+
const entries = node?._tag === "Array" ? itemsOf(node).flatMap((item) => textOf(item) ?? []) : [textOf(node) ?? ""];
|
|
9
|
+
return entries.filter((entry) => entry.startsWith(".")).map((entry) => posix.join(posix.dirname(path), entry));
|
|
10
|
+
};
|
|
11
|
+
const load = async (readText, path, base, seen) => {
|
|
12
|
+
if (seen.has(path)) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
seen.add(path);
|
|
16
|
+
const text = await readText(path);
|
|
17
|
+
if (text === undefined) {
|
|
18
|
+
return [{ _tag: "Unreadable", path, reason: "the file does not exist" }];
|
|
19
|
+
}
|
|
20
|
+
const parsed = parseJsonc(path, text);
|
|
21
|
+
if (parsed._tag === "Unreadable") {
|
|
22
|
+
return [{ _tag: "Unreadable", path, reason: parsed.reason }];
|
|
23
|
+
}
|
|
24
|
+
const extended = await Promise.all(localExtends(path, parsed.json).map((target) => load(readText, target, base, seen)));
|
|
25
|
+
return [{ _tag: "Config", base, json: parsed.json, path }, ...extended.flat()];
|
|
26
|
+
};
|
|
27
|
+
const rootConfig = async (readText) => {
|
|
28
|
+
const present = await Promise.all(ROOT_CONFIGS.map(async (path) => ((await readText(path)) === undefined ? [] : [path])));
|
|
29
|
+
return present.flat()[0];
|
|
30
|
+
};
|
|
31
|
+
export const biomeConfigs = async ({ files, readText }) => {
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const root = await rootConfig(readText);
|
|
34
|
+
const nested = files.filter((path) => NESTED.test(path) && path !== root);
|
|
35
|
+
const roots = root === undefined ? [] : await load(readText, root, "", seen);
|
|
36
|
+
const below = await Promise.all(nested.map((path) => load(readText, path, directoryOf(path), seen)));
|
|
37
|
+
return [...roots, ...below.flat()];
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=configs.js.map
|