@shivaedev/quality 0.22.0 → 0.24.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 +13 -0
- package/README.md +4 -0
- package/dist/baseline/compare.d.ts +2 -2
- package/dist/baseline/compare.d.ts.map +1 -1
- package/dist/baseline/compare.js +5 -3
- package/dist/baseline/compare.js.map +1 -1
- package/dist/baseline/format.d.ts +5 -5
- package/dist/baseline/format.d.ts.map +1 -1
- package/dist/baseline/format.js +23 -13
- package/dist/baseline/format.js.map +1 -1
- package/dist/baseline/legacy.d.ts +2 -2
- package/dist/baseline/legacy.d.ts.map +1 -1
- package/dist/baseline/legacy.js +4 -4
- package/dist/baseline/legacy.js.map +1 -1
- package/dist/baseline/rewrite.d.ts +1 -1
- package/dist/baseline/rewrite.d.ts.map +1 -1
- package/dist/baseline/rewrite.js +2 -2
- package/dist/baseline/rewrite.js.map +1 -1
- package/dist/baseline/update.d.ts +2 -2
- package/dist/baseline/update.d.ts.map +1 -1
- package/dist/baseline/update.js +24 -18
- package/dist/baseline/update.js.map +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +15 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/baseline.d.ts +1 -1
- package/dist/cli/baseline.d.ts.map +1 -1
- package/dist/cli/baseline.js +10 -6
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/fix.d.ts +2 -2
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +34 -40
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/lint.d.ts +1 -1
- package/dist/cli/lint.d.ts.map +1 -1
- package/dist/cli/lint.js +1 -1
- package/dist/cli/lint.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +1 -1
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/program.d.ts +9 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +44 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/run-main.d.ts +5 -2
- package/dist/cli/run-main.d.ts.map +1 -1
- package/dist/cli/run-main.js +16 -12
- package/dist/cli/run-main.js.map +1 -1
- package/dist/cli/shrink.d.ts +2 -2
- package/dist/cli/shrink.d.ts.map +1 -1
- package/dist/cli/shrink.js +9 -3
- package/dist/cli/shrink.js.map +1 -1
- package/dist/cli.js +2 -49
- package/dist/cli.js.map +1 -1
- package/dist/config/decode.d.ts +1 -1
- package/dist/config/decode.d.ts.map +1 -1
- package/dist/config/decode.js +13 -9
- package/dist/config/decode.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +26 -20
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +22 -2
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +18 -10
- package/dist/config/resolve.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/decoded.d.ts +2 -2
- package/dist/decoded.d.ts.map +1 -1
- package/dist/decoded.js +7 -5
- package/dist/decoded.js.map +1 -1
- package/dist/engine/baseline-file.d.ts +1 -1
- package/dist/engine/baseline-file.d.ts.map +1 -1
- package/dist/engine/baseline-file.js +4 -2
- package/dist/engine/baseline-file.js.map +1 -1
- package/dist/engine/evaluate.d.ts +2 -2
- package/dist/engine/evaluate.d.ts.map +1 -1
- package/dist/engine/evaluate.js +5 -3
- package/dist/engine/evaluate.js.map +1 -1
- package/dist/engine/run-rules.d.ts +1 -1
- package/dist/engine/run-rules.d.ts.map +1 -1
- package/dist/engine/run-rules.js +24 -14
- package/dist/engine/run-rules.js.map +1 -1
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +8 -4
- package/dist/engine/session.js.map +1 -1
- package/dist/engine/violation.d.ts +7 -7
- package/dist/engine/violation.d.ts.map +1 -1
- package/dist/engine/violation.js +22 -10
- package/dist/engine/violation.js.map +1 -1
- package/dist/exceptions/registry.d.ts +2 -2
- package/dist/exceptions/registry.d.ts.map +1 -1
- package/dist/exceptions/registry.js +10 -6
- package/dist/exceptions/registry.js.map +1 -1
- package/dist/git/base.d.ts +1 -2
- package/dist/git/base.d.ts.map +1 -1
- package/dist/git/base.js +22 -10
- package/dist/git/base.js.map +1 -1
- package/dist/git/command.d.ts +2 -2
- package/dist/git/command.d.ts.map +1 -1
- package/dist/git/command.js +13 -9
- package/dist/git/command.js.map +1 -1
- package/dist/git/history.d.ts +1 -1
- package/dist/git/history.d.ts.map +1 -1
- package/dist/git/history.js +5 -3
- package/dist/git/history.js.map +1 -1
- package/dist/inventory/collect.d.ts +1 -1
- package/dist/inventory/collect.d.ts.map +1 -1
- package/dist/inventory/collect.js +7 -5
- package/dist/inventory/collect.js.map +1 -1
- package/dist/inventory/filesystem.d.ts +1 -1
- package/dist/inventory/filesystem.d.ts.map +1 -1
- package/dist/inventory/filesystem.js +11 -7
- package/dist/inventory/filesystem.js.map +1 -1
- package/dist/inventory/ignore-scope.d.ts +4 -4
- package/dist/inventory/ignore-scope.d.ts.map +1 -1
- package/dist/inventory/ignore-scope.js +18 -9
- package/dist/inventory/ignore-scope.js.map +1 -1
- package/dist/manifests/sorted.d.ts +1 -1
- package/dist/manifests/sorted.d.ts.map +1 -1
- package/dist/manifests/sorted.js +14 -16
- package/dist/manifests/sorted.js.map +1 -1
- package/dist/report/plural.d.ts +1 -1
- package/dist/report/plural.d.ts.map +1 -1
- package/dist/report/plural.js +3 -1
- package/dist/report/plural.js.map +1 -1
- package/dist/report/render.d.ts +1 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +29 -21
- package/dist/report/render.js.map +1 -1
- package/dist/report/stale.d.ts +1 -1
- package/dist/report/stale.d.ts.map +1 -1
- package/dist/report/stale.js +18 -8
- package/dist/report/stale.js.map +1 -1
- package/dist/rule.d.ts +13 -13
- package/dist/rule.d.ts.map +1 -1
- package/dist/rule.js +10 -8
- package/dist/rule.js.map +1 -1
- package/dist/rules/built-in.d.ts +2 -2
- package/dist/rules/built-in.d.ts.map +1 -1
- package/dist/rules/built-in.js +6 -0
- package/dist/rules/built-in.js.map +1 -1
- package/dist/rules/comments/kinds.d.ts +4 -4
- package/dist/rules/comments/kinds.d.ts.map +1 -1
- package/dist/rules/comments/kinds.js +16 -8
- package/dist/rules/comments/kinds.js.map +1 -1
- package/dist/rules/comments/max-per-file.d.ts.map +1 -1
- package/dist/rules/comments/max-per-file.js +13 -9
- package/dist/rules/comments/max-per-file.js.map +1 -1
- package/dist/rules/comments/pattern-rule.d.ts +1 -1
- package/dist/rules/comments/pattern-rule.d.ts.map +1 -1
- package/dist/rules/comments/pattern-rule.js +12 -10
- package/dist/rules/comments/pattern-rule.js.map +1 -1
- package/dist/rules/comments/scan.d.ts +3 -3
- package/dist/rules/comments/scan.d.ts.map +1 -1
- package/dist/rules/comments/scan.js +23 -19
- package/dist/rules/comments/scan.js.map +1 -1
- package/dist/rules/max-lines.d.ts.map +1 -1
- package/dist/rules/max-lines.js +12 -10
- package/dist/rules/max-lines.js.map +1 -1
- package/dist/rules/maxDepth.d.ts +2 -0
- package/dist/rules/maxDepth.d.ts.map +1 -0
- package/dist/rules/maxDepth.js +20 -0
- package/dist/rules/maxDepth.js.map +1 -0
- package/dist/rules/noBarrel.d.ts +2 -0
- package/dist/rules/noBarrel.d.ts.map +1 -0
- package/dist/rules/noBarrel.js +14 -0
- package/dist/rules/noBarrel.js.map +1 -0
- package/dist/rules/stories/origins.d.ts +10 -0
- package/dist/rules/stories/origins.d.ts.map +1 -0
- package/dist/rules/stories/origins.js +129 -0
- package/dist/rules/stories/origins.js.map +1 -0
- package/dist/rules/stories/prerequisites.d.ts +4 -0
- package/dist/rules/stories/prerequisites.d.ts.map +1 -0
- package/dist/rules/stories/prerequisites.js +32 -0
- package/dist/rules/stories/prerequisites.js.map +1 -0
- package/dist/rules/stories/program.d.ts +5 -0
- package/dist/rules/stories/program.d.ts.map +1 -0
- package/dist/rules/stories/program.js +22 -0
- package/dist/rules/stories/program.js.map +1 -0
- package/dist/rules/stories/specs.d.ts +2 -0
- package/dist/rules/stories/specs.d.ts.map +1 -0
- package/dist/rules/stories/specs.js +80 -0
- package/dist/rules/stories/specs.js.map +1 -0
- package/dist/rules/suppressions/biome/configs.d.ts +1 -1
- package/dist/rules/suppressions/biome/configs.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/configs.js +23 -17
- package/dist/rules/suppressions/biome/configs.js.map +1 -1
- package/dist/rules/suppressions/biome/declarations.d.ts +4 -4
- package/dist/rules/suppressions/biome/declarations.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/declarations.js +15 -7
- package/dist/rules/suppressions/biome/declarations.js.map +1 -1
- package/dist/rules/suppressions/biome/json.d.ts +6 -6
- package/dist/rules/suppressions/biome/json.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/json.js +27 -13
- package/dist/rules/suppressions/biome/json.js.map +1 -1
- package/dist/rules/suppressions/biome/resolve.d.ts +1 -1
- package/dist/rules/suppressions/biome/resolve.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/resolve.js +23 -17
- package/dist/rules/suppressions/biome/resolve.js.map +1 -1
- package/dist/rules/suppressions/biome/weakenings.d.ts +1 -1
- package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/weakenings.js +78 -52
- package/dist/rules/suppressions/biome/weakenings.js.map +1 -1
- package/dist/rules/suppressions/biome-overrides.d.ts.map +1 -1
- package/dist/rules/suppressions/biome-overrides.js +45 -33
- package/dist/rules/suppressions/biome-overrides.js.map +1 -1
- package/dist/rules/suppressions/directives.d.ts +1 -1
- package/dist/rules/suppressions/directives.d.ts.map +1 -1
- package/dist/rules/suppressions/directives.js +5 -3
- package/dist/rules/suppressions/directives.js.map +1 -1
- package/dist/rules/suppressions/no-double-cast.d.ts.map +1 -1
- package/dist/rules/suppressions/no-double-cast.js +14 -10
- package/dist/rules/suppressions/no-double-cast.js.map +1 -1
- package/dist/rules/suppressions/no-inline.d.ts.map +1 -1
- package/dist/rules/suppressions/no-inline.js +8 -6
- package/dist/rules/suppressions/no-inline.js.map +1 -1
- package/dist/rules/suppressions/stylesheet-comments.d.ts +1 -1
- package/dist/rules/suppressions/stylesheet-comments.d.ts.map +1 -1
- package/dist/rules/suppressions/stylesheet-comments.js +11 -5
- package/dist/rules/suppressions/stylesheet-comments.js.map +1 -1
- package/dist/rules/syntax.d.ts +1 -1
- package/dist/rules/syntax.d.ts.map +1 -1
- package/dist/rules/syntax.js +2 -2
- package/dist/rules/syntax.js.map +1 -1
- package/dist/standard-schema.d.ts +6 -6
- package/dist/standard-schema.d.ts.map +1 -1
- package/docs/modules.md +19 -1
- package/docs/roadmap.md +1 -1
- package/docs/rules.md +9 -1
- package/package.json +2 -2
- package/src/baseline/compare.ts +5 -3
- package/src/baseline/format.ts +17 -10
- package/src/baseline/legacy.ts +4 -4
- package/src/baseline/rewrite.ts +2 -2
- package/src/baseline/update.ts +20 -16
- package/src/cli/args.ts +15 -10
- package/src/cli/baseline.ts +36 -35
- package/src/cli/fix.ts +39 -42
- package/src/cli/lint.ts +17 -19
- package/src/cli/migrate.ts +20 -21
- package/src/cli/program.ts +50 -0
- package/src/cli/run-main.ts +19 -13
- package/src/cli/shrink.ts +11 -8
- package/src/cli.ts +2 -51
- package/src/config/decode.ts +15 -10
- package/src/config/load.ts +44 -37
- package/src/config/resolve.ts +32 -27
- package/src/config.ts +3 -1
- package/src/decoded.ts +5 -4
- package/src/engine/baseline-file.ts +14 -12
- package/src/engine/evaluate.ts +6 -5
- package/src/engine/run-rules.ts +21 -13
- package/src/engine/session.ts +32 -25
- package/src/engine/violation.ts +22 -11
- package/src/exceptions/registry.ts +10 -8
- package/src/git/base.ts +45 -37
- package/src/git/command.ts +6 -4
- package/src/git/history.ts +5 -4
- package/src/inventory/collect.ts +39 -34
- package/src/inventory/filesystem.ts +38 -30
- package/src/inventory/ignore-scope.ts +20 -10
- package/src/manifests/sorted.ts +18 -18
- package/src/report/plural.ts +3 -1
- package/src/report/render.ts +23 -18
- package/src/report/stale.ts +33 -25
- package/src/rule.ts +25 -19
- package/src/rules/built-in.ts +6 -0
- package/src/rules/comments/kinds.ts +16 -9
- package/src/rules/comments/max-per-file.ts +15 -11
- package/src/rules/comments/pattern-rule.ts +5 -4
- package/src/rules/comments/scan.ts +18 -15
- package/src/rules/max-lines.ts +3 -2
- package/src/rules/maxDepth.ts +24 -0
- package/src/rules/noBarrel.ts +16 -0
- package/src/rules/stories/origins.ts +147 -0
- package/src/rules/stories/prerequisites.ts +37 -0
- package/src/rules/stories/program.ts +29 -0
- package/src/rules/stories/specs.ts +93 -0
- package/src/rules/suppressions/biome/configs.ts +23 -17
- package/src/rules/suppressions/biome/declarations.ts +15 -10
- package/src/rules/suppressions/biome/json.ts +25 -13
- package/src/rules/suppressions/biome/resolve.ts +23 -18
- package/src/rules/suppressions/biome/weakenings.ts +60 -41
- package/src/rules/suppressions/biome-overrides.ts +32 -22
- package/src/rules/suppressions/directives.ts +5 -4
- package/src/rules/suppressions/no-double-cast.ts +14 -10
- package/src/rules/suppressions/no-inline.ts +5 -4
- package/src/rules/suppressions/stylesheet-comments.ts +11 -6
- package/src/rules/syntax.ts +2 -2
- package/src/standard-schema.ts +4 -4
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
import { parse } from "#rules/syntax.ts";
|
|
3
3
|
const DECLARATION = /\.d\.[cm]?ts$/u;
|
|
4
|
-
|
|
4
|
+
function commentRanges(source) {
|
|
5
5
|
const ranges = new Map();
|
|
6
6
|
const jsxText = [];
|
|
7
|
-
|
|
7
|
+
function add(found) {
|
|
8
8
|
for (const range of found ?? []) {
|
|
9
9
|
ranges.set(range.pos, range);
|
|
10
10
|
}
|
|
11
|
-
}
|
|
12
|
-
|
|
11
|
+
}
|
|
12
|
+
function visit(node) {
|
|
13
13
|
if (node.kind === ts.SyntaxKind.JsxText) {
|
|
14
14
|
jsxText.push(node);
|
|
15
15
|
}
|
|
@@ -18,19 +18,21 @@ const commentRanges = (source) => {
|
|
|
18
18
|
for (const child of node.getChildren(source)) {
|
|
19
19
|
visit(child);
|
|
20
20
|
}
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
visit(source);
|
|
23
23
|
return [...ranges.values()]
|
|
24
24
|
.filter((range) => !jsxText.some((text) => range.pos >= text.pos && range.pos < text.end))
|
|
25
25
|
.sort((left, right) => left.pos - right.pos);
|
|
26
|
-
}
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
}
|
|
27
|
+
export function bodyOf(kind, text) {
|
|
28
|
+
return kind === "line"
|
|
29
|
+
? [text.slice(2).trim()]
|
|
30
|
+
: text
|
|
31
|
+
.slice(2, -2)
|
|
32
|
+
.split("\n")
|
|
33
|
+
.map((line) => line.trim().replace(/^\*(?=\s|$)\s*/u, ""));
|
|
34
|
+
}
|
|
35
|
+
function toComment(source, range) {
|
|
34
36
|
const kind = range.kind === ts.SyntaxKind.SingleLineCommentTrivia ? "line" : "block";
|
|
35
37
|
const text = source.text.slice(range.pos, range.end);
|
|
36
38
|
const start = source.getLineAndCharacterOfPosition(range.pos);
|
|
@@ -43,13 +45,13 @@ const toComment = (source, range) => {
|
|
|
43
45
|
ownLine: source.text.slice(lineStart, range.pos).trim() === "",
|
|
44
46
|
text,
|
|
45
47
|
};
|
|
46
|
-
}
|
|
48
|
+
}
|
|
47
49
|
const scanned = new WeakMap();
|
|
48
|
-
|
|
50
|
+
function scan(file) {
|
|
49
51
|
const source = parse(file);
|
|
50
52
|
return source === undefined ? [] : commentRanges(source).map((range) => toComment(source, range));
|
|
51
|
-
}
|
|
52
|
-
export
|
|
53
|
+
}
|
|
54
|
+
export function scanComments(file) {
|
|
53
55
|
const cached = scanned.get(file);
|
|
54
56
|
if (cached !== undefined) {
|
|
55
57
|
return cached;
|
|
@@ -57,6 +59,8 @@ export const scanComments = (file) => {
|
|
|
57
59
|
const comments = scan(file);
|
|
58
60
|
scanned.set(file, comments);
|
|
59
61
|
return comments;
|
|
60
|
-
}
|
|
61
|
-
export
|
|
62
|
+
}
|
|
63
|
+
export function commentsOf(file) {
|
|
64
|
+
return DECLARATION.test(file.path) ? [] : scanComments(file);
|
|
65
|
+
}
|
|
62
66
|
//# sourceMappingURL=scan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/rules/comments/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAWzC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,
|
|
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":"AA0BA,eAAO,MAAM,QAAQ;;;EAMnB,CAAC"}
|
package/dist/rules/max-lines.js
CHANGED
|
@@ -7,16 +7,18 @@ const MaxLinesOptions = Schema.Struct({
|
|
|
7
7
|
source: Limit.check(Schema.isLessThanOrEqualTo(150)).pipe(Schema.withDecodingDefaultKey(Effect.succeed(150))),
|
|
8
8
|
test: Limit.check(Schema.isLessThanOrEqualTo(300)).pipe(Schema.withDecodingDefaultKey(Effect.succeed(300))),
|
|
9
9
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
function oversized(file, limit) {
|
|
11
|
+
return file.lines.length <= limit
|
|
12
|
+
? []
|
|
13
|
+
: [
|
|
14
|
+
{
|
|
15
|
+
count: file.lines.length - limit,
|
|
16
|
+
file: file.path,
|
|
17
|
+
message: `${file.lines.length} lines exceeds the ${limit}-line limit.`,
|
|
18
|
+
threshold: limit,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
}
|
|
20
22
|
export const maxLines = defineRule({
|
|
21
23
|
check: ({ options, sources }) => sources.filter((file) => !DECLARATION.test(file.path)).flatMap((file) => oversized(file, isTestCode(file.path) ? options.test : options.source)),
|
|
22
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,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAiC,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,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,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7G,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3G,CAAC,CAAC;AAEH,
|
|
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,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAiC,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,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,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7G,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3G,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,IAAgB,EAAE,KAAa;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;QAChC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACA;gBACC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;gBAChC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,sBAAsB,KAAK,cAAc;gBACtE,SAAS,EAAE,KAAK;aAChB;SACD,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAC/B,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjJ,WAAW,EAAE,2GAA2G;IACxH,EAAE,EAAE,qBAAqB;IACzB,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;CACnH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxDepth.d.ts","sourceRoot":"","sources":["../../src/rules/maxDepth.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,QAAQ,yDAInB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { defineRule } from "#rule.ts";
|
|
2
|
+
const DECLARATION = /\.d\.[cm]?ts$/u;
|
|
3
|
+
const TOO_DEEP = /^\t{8,}/u;
|
|
4
|
+
function findingsOf(file) {
|
|
5
|
+
return file.lines.flatMap((text, index) => TOO_DEEP.test(text)
|
|
6
|
+
? [
|
|
7
|
+
{
|
|
8
|
+
file: file.path,
|
|
9
|
+
line: index + 1,
|
|
10
|
+
message: "Indentation is 8+ tabs deep. Extract a named function or component.",
|
|
11
|
+
},
|
|
12
|
+
]
|
|
13
|
+
: []);
|
|
14
|
+
}
|
|
15
|
+
export const maxDepth = defineRule({
|
|
16
|
+
check: ({ sources }) => sources.filter((file) => !DECLARATION.test(file.path)).flatMap(findingsOf),
|
|
17
|
+
description: "Extract a named function or component before indentation reaches eight tabs.",
|
|
18
|
+
id: "nesting/max-depth",
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=maxDepth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxDepth.js","sourceRoot":"","sources":["../../src/rules/maxDepth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiC,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B,SAAS,UAAU,CAAC,IAAgB;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACzC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC;YACA;gBACC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,KAAK,GAAG,CAAC;gBACf,OAAO,EAAE,qEAAqE;aAC9E;SACD;QACF,CAAC,CAAC,EAAE,CACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAClG,WAAW,EAAE,8EAA8E;IAC3F,EAAE,EAAE,mBAAmB;CACvB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noBarrel.d.ts","sourceRoot":"","sources":["../../src/rules/noBarrel.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,2DAUnB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
import { defineRule } from "#rule.ts";
|
|
3
|
+
const BARREL_FILE = /^index\.tsx?$/u;
|
|
4
|
+
export const noBarrel = defineRule({
|
|
5
|
+
check: ({ sources }) => sources
|
|
6
|
+
.filter((file) => BARREL_FILE.test(posix.basename(file.path)))
|
|
7
|
+
.map((file) => ({
|
|
8
|
+
file: file.path,
|
|
9
|
+
message: "index.ts and index.tsx modules are banned. Name the module after its purpose and import it directly.",
|
|
10
|
+
})),
|
|
11
|
+
description: "Name TypeScript modules after their purpose instead of index.ts or index.tsx.",
|
|
12
|
+
id: "structure/no-barrel",
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=noBarrel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noBarrel.js","sourceRoot":"","sources":["../../src/rules/noBarrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACtB,OAAO;SACL,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,sGAAsG;KAC/G,CAAC,CAAC;IACL,WAAW,EAAE,+EAA+E;IAC5F,EAAE,EAAE,qBAAqB;CACzB,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { ImportGraph } from "#imports/graph.ts";
|
|
3
|
+
import type { RuleInputs } from "#rule.ts";
|
|
4
|
+
type Origin = "factory" | "kit" | "story" | "plain" | "suite" | "vitest" | "stories" | "function" | undefined;
|
|
5
|
+
export declare function storyOrigins(inputs: RuleInputs, graph: ImportGraph): {
|
|
6
|
+
origin: (node: ts.Node) => Origin;
|
|
7
|
+
source: (path: string) => ts.SourceFile | undefined;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=origins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origins.d.ts","sourceRoot":"","sources":["../../../src/rules/stories/origins.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,KAAK,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AA6B9G,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW;IA8GzD,MAAM,SAXM,EAAE,CAAC,IAAI,KAAG,MAAM;IAWb,MAAM,SAAS,MAAM;EAC7C"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { storyProgram } from "./program.js";
|
|
4
|
+
function importFrom(node) {
|
|
5
|
+
for (let current = node; current !== undefined; current = current.parent) {
|
|
6
|
+
if (ts.isImportDeclaration(current) && ts.isStringLiteral(current.moduleSpecifier)) {
|
|
7
|
+
return current.moduleSpecifier.text;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
function moduleOrigin(from) {
|
|
13
|
+
if (from === "vitest" || from === "@effect/vitest") {
|
|
14
|
+
return "vitest";
|
|
15
|
+
}
|
|
16
|
+
return from === "@shivaedev/test-story" || from === "@shivaedev/test-story/storyKit.ts" ? "stories" : undefined;
|
|
17
|
+
}
|
|
18
|
+
function imported(name, from) {
|
|
19
|
+
const namespace = moduleOrigin(from);
|
|
20
|
+
if (name === "storyKit" && namespace === "stories") {
|
|
21
|
+
return "factory";
|
|
22
|
+
}
|
|
23
|
+
if ((name === "describe" || name === "suite") && namespace === "vitest") {
|
|
24
|
+
return "suite";
|
|
25
|
+
}
|
|
26
|
+
return (name === "it" || name === "test") && namespace === "vitest" ? "plain" : undefined;
|
|
27
|
+
}
|
|
28
|
+
export function storyOrigins(inputs, graph) {
|
|
29
|
+
const program = storyProgram(inputs, graph);
|
|
30
|
+
const checker = program.getTypeChecker();
|
|
31
|
+
const visiting = new Set();
|
|
32
|
+
const known = new Map();
|
|
33
|
+
function binding(node) {
|
|
34
|
+
if (!ts.isVariableDeclaration(node.parent.parent)) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const value = node.parent.parent.initializer;
|
|
38
|
+
const name = node.propertyName ?? node.name;
|
|
39
|
+
return value !== undefined && (ts.isIdentifier(name) || ts.isStringLiteral(name)) ? member(value, name.text) : undefined;
|
|
40
|
+
}
|
|
41
|
+
function declaration(node) {
|
|
42
|
+
if (ts.isImportSpecifier(node)) {
|
|
43
|
+
return imported((node.propertyName ?? node.name).text, importFrom(node));
|
|
44
|
+
}
|
|
45
|
+
if (ts.isNamespaceImport(node)) {
|
|
46
|
+
return moduleOrigin(importFrom(node));
|
|
47
|
+
}
|
|
48
|
+
if (ts.isVariableDeclaration(node) || ts.isPropertyAssignment(node)) {
|
|
49
|
+
return node.initializer === undefined ? undefined : origin(node.initializer);
|
|
50
|
+
}
|
|
51
|
+
return localBinding(node);
|
|
52
|
+
}
|
|
53
|
+
function localBinding(node) {
|
|
54
|
+
if (ts.isShorthandPropertyAssignment(node)) {
|
|
55
|
+
return symbol(checker.getShorthandAssignmentValueSymbol(node));
|
|
56
|
+
}
|
|
57
|
+
return ts.isBindingElement(node) ? binding(node) : undefined;
|
|
58
|
+
}
|
|
59
|
+
function symbol(value) {
|
|
60
|
+
if (value === undefined) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const direct = value.declarations?.map(visit).find((result) => result !== undefined);
|
|
64
|
+
return direct ?? (value.flags & ts.SymbolFlags.Alias ? symbol(checker.getAliasedSymbol(value)) : undefined);
|
|
65
|
+
}
|
|
66
|
+
function object(node) {
|
|
67
|
+
for (const property of [...node.properties].reverse()) {
|
|
68
|
+
if (property.name?.getText() === "it") {
|
|
69
|
+
return visit(property) === "story" ? "kit" : undefined;
|
|
70
|
+
}
|
|
71
|
+
if (ts.isSpreadAssignment(property) && visit(property.expression) === "kit") {
|
|
72
|
+
return "kit";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
function member(value, name) {
|
|
78
|
+
const receiver = visit(value);
|
|
79
|
+
if (receiver === "kit" && name === "it") {
|
|
80
|
+
return "story";
|
|
81
|
+
}
|
|
82
|
+
if (receiver === "story" || receiver === "plain" || receiver === "suite") {
|
|
83
|
+
return receiver;
|
|
84
|
+
}
|
|
85
|
+
const from = receiver === "vitest" ? "vitest" : undefined;
|
|
86
|
+
return imported(name, receiver === "stories" ? "@shivaedev/test-story/storyKit.ts" : from);
|
|
87
|
+
}
|
|
88
|
+
function identifier(node) {
|
|
89
|
+
if (node.text === "describe" || node.text === "suite") {
|
|
90
|
+
return symbol(checker.getSymbolAtLocation(node)) ?? "suite";
|
|
91
|
+
}
|
|
92
|
+
const value = checker.getSymbolAtLocation(node);
|
|
93
|
+
return symbol(value) ?? (value === undefined && (node.text === "it" || node.text === "test") ? "plain" : undefined);
|
|
94
|
+
}
|
|
95
|
+
function origin(node) {
|
|
96
|
+
if (ts.isFunctionLike(node)) {
|
|
97
|
+
return "function";
|
|
98
|
+
}
|
|
99
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
100
|
+
return object(node);
|
|
101
|
+
}
|
|
102
|
+
return expression(node);
|
|
103
|
+
}
|
|
104
|
+
function expression(node) {
|
|
105
|
+
if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node)) {
|
|
106
|
+
return visit(node.expression);
|
|
107
|
+
}
|
|
108
|
+
if (ts.isCallExpression(node)) {
|
|
109
|
+
const callee = visit(node.expression);
|
|
110
|
+
return callee === "factory" ? "kit" : callee;
|
|
111
|
+
}
|
|
112
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
113
|
+
return member(node.expression, node.name.text) ?? symbol(checker.getSymbolAtLocation(node.name));
|
|
114
|
+
}
|
|
115
|
+
return ts.isIdentifier(node) ? identifier(node) : declaration(node);
|
|
116
|
+
}
|
|
117
|
+
function visit(node) {
|
|
118
|
+
if (visiting.has(node) || known.has(node)) {
|
|
119
|
+
return known.get(node);
|
|
120
|
+
}
|
|
121
|
+
visiting.add(node);
|
|
122
|
+
const result = origin(node);
|
|
123
|
+
visiting.delete(node);
|
|
124
|
+
known.set(node, result);
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
return { origin: visit, source: (path) => program.getSourceFile(join(inputs.root, path)) };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=origins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origins.js","sourceRoot":"","sources":["../../../src/rules/stories/origins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkspacePackage } from "#imports/workspace.ts";
|
|
2
|
+
import type { RuleInputs } from "#rule.ts";
|
|
3
|
+
export declare function storyPrerequisites(inputs: RuleInputs, packages: readonly WorkspacePackage[]): Promise<ReadonlySet<string>>;
|
|
4
|
+
//# sourceMappingURL=prerequisites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../../src/rules/stories/prerequisites.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAa3C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAqBhI"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
const DEPENDENCIES = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
|
|
3
|
+
function object(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
function manifest(text) {
|
|
7
|
+
const value = JSON.parse(text ?? "{}");
|
|
8
|
+
return object(value) ? value : {};
|
|
9
|
+
}
|
|
10
|
+
export async function storyPrerequisites(inputs, packages) {
|
|
11
|
+
const root = manifest(await inputs.readText("package.json"));
|
|
12
|
+
const members = typeof root.name === "string" ? [...packages, { directory: "", name: root.name }] : packages;
|
|
13
|
+
const byName = new Map(members.map((member) => [member.name, member]));
|
|
14
|
+
const pending = ["@shivaedev/test-story"];
|
|
15
|
+
const directories = new Set();
|
|
16
|
+
while (pending.length > 0) {
|
|
17
|
+
const current = byName.get(pending.pop() ?? "");
|
|
18
|
+
if (current === undefined || directories.has(current.directory)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
directories.add(current.directory);
|
|
22
|
+
const value = manifest(await inputs.readText(posix.join(current.directory, "package.json")));
|
|
23
|
+
for (const key of DEPENDENCIES) {
|
|
24
|
+
const dependencies = value[key];
|
|
25
|
+
if (object(dependencies)) {
|
|
26
|
+
pending.push(...Object.keys(dependencies).filter((name) => byName.has(name)));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return directories;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../../src/rules/stories/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;AAErG,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAwB;IACzC,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB,EAAE,QAAqC;IACjG,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7G,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,SAAS;QACV,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QAC7F,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/E,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../../src/rules/stories/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,EAAE,CAAC,OAAO,CAuB/E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
export function storyProgram(inputs, graph) {
|
|
4
|
+
const sources = new Map(inputs.sources.map((file) => [join(inputs.root, file.path), file.text]));
|
|
5
|
+
const targets = new Map(graph.edges.flatMap((edge) => edge.to.kind === "file" ? [[`${join(inputs.root, edge.from)}:${edge.specifier}`, join(inputs.root, edge.to.path)]] : []));
|
|
6
|
+
const options = { allowJs: true, noLib: true, types: [] };
|
|
7
|
+
const host = {
|
|
8
|
+
...ts.createCompilerHost(options),
|
|
9
|
+
fileExists: (path) => sources.has(path),
|
|
10
|
+
getSourceFile: (path) => {
|
|
11
|
+
const text = sources.get(path);
|
|
12
|
+
return text === undefined ? undefined : ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true);
|
|
13
|
+
},
|
|
14
|
+
readFile: (path) => sources.get(path),
|
|
15
|
+
resolveModuleNames: (names, from) => names.map((name) => {
|
|
16
|
+
const path = targets.get(`${from}:${name}`);
|
|
17
|
+
return path === undefined ? undefined : { extension: ts.Extension.Ts, resolvedFileName: path };
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
return ts.createProgram([...sources.keys()], options, host);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/rules/stories/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,MAAM,UAAU,YAAY,CAAC,MAAkB,EAAE,KAAkB;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CACtB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAChI,CACD,CAAC;IACF,MAAM,OAAO,GAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9E,MAAM,IAAI,GAAoB;QAC7B,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;QACjC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACvC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvG,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACrC,kBAAkB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CACnC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAChG,CAAC,CAAC;KACH,CAAC;IACF,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../src/rules/stories/specs.ts"],"names":[],"mappings":"AAsDA,eAAO,MAAM,UAAU,yDAsCrB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { importGraph } from "#imports/graph.ts";
|
|
3
|
+
import { packageOf } from "#imports/workspace.ts";
|
|
4
|
+
import { testName } from "#naming/testName.ts";
|
|
5
|
+
import { defineRule } from "#rule.ts";
|
|
6
|
+
import { storyOrigins } from "./origins.js";
|
|
7
|
+
import { storyPrerequisites } from "./prerequisites.js";
|
|
8
|
+
function namesTest(node) {
|
|
9
|
+
if (ts.isIdentifier(node)) {
|
|
10
|
+
return node.text === "it" || node.text === "test";
|
|
11
|
+
}
|
|
12
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
13
|
+
return node.name.text === "it" || namesTest(node.expression);
|
|
14
|
+
}
|
|
15
|
+
return ts.isCallExpression(node) && namesTest(node.expression);
|
|
16
|
+
}
|
|
17
|
+
function callback(node, origin) {
|
|
18
|
+
return (ts.isArrowFunction(node)
|
|
19
|
+
|| ts.isFunctionExpression(node)
|
|
20
|
+
|| ((ts.isIdentifier(node) || ts.isPropertyAccessExpression(node)) && origin(node) === "function"));
|
|
21
|
+
}
|
|
22
|
+
function testShaped(call, origin) {
|
|
23
|
+
const title = call.arguments[0];
|
|
24
|
+
return (title !== undefined
|
|
25
|
+
&& (ts.isStringLiteralLike(title) || ts.isTemplateExpression(title))
|
|
26
|
+
&& call.arguments.slice(1).some((argument) => callback(argument, origin)));
|
|
27
|
+
}
|
|
28
|
+
function declarationScope(node, origin) {
|
|
29
|
+
for (let current = node.parent; current !== undefined; current = current.parent) {
|
|
30
|
+
if (ts.isFunctionLike(current) && (!ts.isCallExpression(current.parent) || origin(current.parent.expression) !== "suite")) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function uncoveredRegistration(call, originOf) {
|
|
37
|
+
const origin = originOf(call.expression);
|
|
38
|
+
if (origin === "story" || origin === "suite") {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return origin === "plain" || ((namesTest(call.expression) || testShaped(call, originOf)) && declarationScope(call, originOf));
|
|
42
|
+
}
|
|
43
|
+
export const storySpecs = defineRule({
|
|
44
|
+
check: async (inputs) => {
|
|
45
|
+
const graph = await importGraph(inputs);
|
|
46
|
+
const exempt = await storyPrerequisites(inputs, graph.packages);
|
|
47
|
+
const origins = storyOrigins(inputs, graph);
|
|
48
|
+
return inputs.sources.flatMap((file) => {
|
|
49
|
+
const name = testName(file.path);
|
|
50
|
+
const owner = packageOf(graph.packages, file.path);
|
|
51
|
+
if (name === undefined || name.modifiers.includes("typecheck") || exempt.has(owner?.directory ?? "")) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const source = origins.source(file.path);
|
|
55
|
+
let plain;
|
|
56
|
+
function visit(node) {
|
|
57
|
+
if (ts.isCallExpression(node) && uncoveredRegistration(node, origins.origin)) {
|
|
58
|
+
plain ??= node;
|
|
59
|
+
}
|
|
60
|
+
ts.forEachChild(node, visit);
|
|
61
|
+
}
|
|
62
|
+
if (source !== undefined) {
|
|
63
|
+
visit(source);
|
|
64
|
+
}
|
|
65
|
+
if (source === undefined || plain === undefined) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
return [
|
|
69
|
+
{
|
|
70
|
+
file: file.path,
|
|
71
|
+
line: source.getLineAndCharacterOfPosition(plain.getStart(source)).line + 1,
|
|
72
|
+
message: "Declares tests without a test-story story kit. Build the package's kit with storyKit from @shivaedev/test-story/storyKit.ts in src/test-support, and declare every test through the kit's it. See https://github.com/ShivaeDev/platform/tree/main/packages/quality#story-tests.",
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
description: "Every package tests its real engine through its own test-story kit. Typecheck tests and test-story's workspace prerequisites are exempt.",
|
|
78
|
+
id: "tests/story-specs",
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../src/rules/stories/specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,5 +21,5 @@ export interface BiomeConfigs {
|
|
|
21
21
|
readonly problems: readonly Finding[];
|
|
22
22
|
readonly root: string;
|
|
23
23
|
}
|
|
24
|
-
export declare
|
|
24
|
+
export declare function biomeConfigs({ files, readText }: RuleInputs): Promise<BiomeConfigs>;
|
|
25
25
|
//# sourceMappingURL=configs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,WAAW,EAAsC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAW,KAAK,IAAI,EAA2C,MAAM,WAAW,CAAC;AAGxF,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/configs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,WAAW,EAAsC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAW,KAAK,IAAI,EAA2C,MAAM,WAAW,CAAC;AAGxF,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;CAClC;AAoFD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAYzF"}
|