Skip to content

Commit 11e6e00

Browse files
committed
test: add tests
1 parent 48f7e5e commit 11e6e00

13 files changed

+301
-6
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script lang="ts">
2+
type Info = { foo: number };
3+
let x: Info | null = { foo: 42 };
4+
const get = () => "hello";
5+
6+
x = null;
7+
const y = $derived(x);
8+
const z = $derived(fn(y.foo));
9+
const foo = $derived(get);
10+
11+
function fn(a: number): number {
12+
return a;
13+
}
14+
</script>
15+
16+
<input title={z} bind:value={x}>
17+
{foo()}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[
2+
{
3+
"ruleId": "@typescript-eslint/no-unsafe-argument",
4+
"code": "y.foo",
5+
"line": 8,
6+
"column": 27,
7+
"message": "Unsafe argument of type `any` assigned to a parameter of type `number`."
8+
}
9+
]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint eslint-comments/require-description: 0, @typescript-eslint/explicit-module-boundary-types: 0 */
2+
import type { Linter } from "eslint";
3+
import { generateParserOptions } from "../../../src/parser/test-utils";
4+
import { rules } from "@typescript-eslint/eslint-plugin";
5+
export function setupLinter(linter: Linter) {
6+
linter.defineRule(
7+
"@typescript-eslint/no-unsafe-argument",
8+
rules["no-unsafe-argument"] as never,
9+
);
10+
linter.defineRule(
11+
"@typescript-eslint/no-unsafe-assignment",
12+
rules["no-unsafe-assignment"] as never,
13+
);
14+
linter.defineRule(
15+
"@typescript-eslint/no-unsafe-call",
16+
rules["no-unsafe-call"] as never,
17+
);
18+
linter.defineRule(
19+
"@typescript-eslint/no-unsafe-member-access",
20+
rules["no-unsafe-member-access"] as never,
21+
);
22+
linter.defineRule(
23+
"@typescript-eslint/no-unsafe-return",
24+
rules["no-unsafe-return"] as never,
25+
);
26+
}
27+
28+
export function getConfig() {
29+
return {
30+
parser: "svelte-eslint-parser",
31+
parserOptions: {
32+
...generateParserOptions(),
33+
svelteFeatures: { runes: true },
34+
},
35+
rules: {
36+
"@typescript-eslint/no-unsafe-argument": "error",
37+
"@typescript-eslint/no-unsafe-assignment": "error",
38+
"@typescript-eslint/no-unsafe-call": "error",
39+
"@typescript-eslint/no-unsafe-member-access": "error",
40+
"@typescript-eslint/no-unsafe-return": "error",
41+
},
42+
env: {
43+
browser: true,
44+
es2021: true,
45+
},
46+
};
47+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
type Info = { foo: number };
2+
let x: Info | null = { foo: 42 };
3+
const get = () => "hello";
4+
5+
x = null;
6+
const y = $derived(x);
7+
const z = $derived(fn(y.foo));
8+
const foo = $derived(get);
9+
10+
function fn(a: number): number {
11+
return a;
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[
2+
{
3+
"ruleId": "@typescript-eslint/no-unsafe-argument",
4+
"code": "y.foo",
5+
"line": 7,
6+
"column": 23,
7+
"message": "Unsafe argument of type `any` assigned to a parameter of type `number`."
8+
}
9+
]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint eslint-comments/require-description: 0, @typescript-eslint/explicit-module-boundary-types: 0 */
2+
import type { Linter } from "eslint";
3+
import { generateParserOptions } from "../../../src/parser/test-utils";
4+
import { rules } from "@typescript-eslint/eslint-plugin";
5+
export function setupLinter(linter: Linter) {
6+
linter.defineRule(
7+
"@typescript-eslint/no-unsafe-argument",
8+
rules["no-unsafe-argument"] as never,
9+
);
10+
linter.defineRule(
11+
"@typescript-eslint/no-unsafe-assignment",
12+
rules["no-unsafe-assignment"] as never,
13+
);
14+
linter.defineRule(
15+
"@typescript-eslint/no-unsafe-call",
16+
rules["no-unsafe-call"] as never,
17+
);
18+
linter.defineRule(
19+
"@typescript-eslint/no-unsafe-member-access",
20+
rules["no-unsafe-member-access"] as never,
21+
);
22+
linter.defineRule(
23+
"@typescript-eslint/no-unsafe-return",
24+
rules["no-unsafe-return"] as never,
25+
);
26+
}
27+
28+
export function getConfig() {
29+
return {
30+
parser: "svelte-eslint-parser",
31+
parserOptions: {
32+
...generateParserOptions(),
33+
svelteFeatures: { runes: true },
34+
},
35+
rules: {
36+
"@typescript-eslint/no-unsafe-argument": "error",
37+
"@typescript-eslint/no-unsafe-assignment": "error",
38+
"@typescript-eslint/no-unsafe-call": "error",
39+
"@typescript-eslint/no-unsafe-member-access": "error",
40+
"@typescript-eslint/no-unsafe-return": "error",
41+
},
42+
env: {
43+
browser: true,
44+
es2021: true,
45+
},
46+
};
47+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script lang="ts">
2+
type Info = { foo: number };
3+
let i: Info | null = null;
4+
export const d = $derived(i?.foo ? fn(i.foo) : null);
5+
6+
setTimeout(() => {
7+
i = { foo: 42 };
8+
}, 10);
9+
10+
function fn(a: number): number {
11+
return a;
12+
}
13+
</script>
14+
15+
{d}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[
2+
{
3+
"ruleId": "@typescript-eslint/no-unsafe-argument",
4+
"code": "i.foo",
5+
"line": 4,
6+
"column": 41,
7+
"message": "Unsafe argument of type `any` assigned to a parameter of type `number`."
8+
}
9+
]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint eslint-comments/require-description: 0, @typescript-eslint/explicit-module-boundary-types: 0 */
2+
import type { Linter } from "eslint";
3+
import { generateParserOptions } from "../../../src/parser/test-utils";
4+
import { rules } from "@typescript-eslint/eslint-plugin";
5+
export function setupLinter(linter: Linter) {
6+
linter.defineRule(
7+
"@typescript-eslint/no-unsafe-argument",
8+
rules["no-unsafe-argument"] as never,
9+
);
10+
linter.defineRule(
11+
"@typescript-eslint/no-unsafe-assignment",
12+
rules["no-unsafe-assignment"] as never,
13+
);
14+
linter.defineRule(
15+
"@typescript-eslint/no-unsafe-call",
16+
rules["no-unsafe-call"] as never,
17+
);
18+
linter.defineRule(
19+
"@typescript-eslint/no-unsafe-member-access",
20+
rules["no-unsafe-member-access"] as never,
21+
);
22+
linter.defineRule(
23+
"@typescript-eslint/no-unsafe-return",
24+
rules["no-unsafe-return"] as never,
25+
);
26+
}
27+
28+
export function getConfig() {
29+
return {
30+
parser: "svelte-eslint-parser",
31+
parserOptions: {
32+
...generateParserOptions(),
33+
svelteFeatures: { runes: true },
34+
},
35+
rules: {
36+
"@typescript-eslint/no-unsafe-argument": "error",
37+
"@typescript-eslint/no-unsafe-assignment": "error",
38+
"@typescript-eslint/no-unsafe-call": "error",
39+
"@typescript-eslint/no-unsafe-member-access": "error",
40+
"@typescript-eslint/no-unsafe-return": "error",
41+
},
42+
env: {
43+
browser: true,
44+
es2021: true,
45+
},
46+
};
47+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export type Info = { n: number };
2+
export function foo() {
3+
let a: Info | null = $state(null);
4+
a = null; // *
5+
const d = $derived(a?.n ? fn(a.n) : null);
6+
return {
7+
get d() {
8+
return d;
9+
},
10+
set(b: Info | null) {
11+
a = b;
12+
},
13+
};
14+
15+
function fn(n: number) {
16+
return n * 2;
17+
}
18+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[
2+
{
3+
"ruleId": "@typescript-eslint/no-unsafe-argument",
4+
"code": "a.n",
5+
"line": 5,
6+
"column": 32,
7+
"message": "Unsafe argument of type `any` assigned to a parameter of type `number`."
8+
}
9+
]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint eslint-comments/require-description: 0, @typescript-eslint/explicit-module-boundary-types: 0 */
2+
import type { Linter } from "eslint";
3+
import { generateParserOptions } from "../../../src/parser/test-utils";
4+
import { rules } from "@typescript-eslint/eslint-plugin";
5+
export function setupLinter(linter: Linter) {
6+
linter.defineRule(
7+
"@typescript-eslint/no-unsafe-argument",
8+
rules["no-unsafe-argument"] as never
9+
);
10+
linter.defineRule(
11+
"@typescript-eslint/no-unsafe-assignment",
12+
rules["no-unsafe-assignment"] as never
13+
);
14+
linter.defineRule(
15+
"@typescript-eslint/no-unsafe-call",
16+
rules["no-unsafe-call"] as never
17+
);
18+
linter.defineRule(
19+
"@typescript-eslint/no-unsafe-member-access",
20+
rules["no-unsafe-member-access"] as never
21+
);
22+
linter.defineRule(
23+
"@typescript-eslint/no-unsafe-return",
24+
rules["no-unsafe-return"] as never
25+
);
26+
}
27+
28+
export function getConfig() {
29+
return {
30+
parser: "svelte-eslint-parser",
31+
parserOptions: {
32+
...generateParserOptions(),
33+
svelteFeatures: { runes: true },
34+
},
35+
rules: {
36+
"@typescript-eslint/no-unsafe-argument": "error",
37+
"@typescript-eslint/no-unsafe-assignment": "error",
38+
"@typescript-eslint/no-unsafe-call": "error",
39+
"@typescript-eslint/no-unsafe-member-access": "error",
40+
"@typescript-eslint/no-unsafe-return": "error",
41+
},
42+
env: {
43+
browser: true,
44+
es2021: true,
45+
},
46+
};
47+
}

tests/src/integrations.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
listupFixtures,
1010
} from "./parser/test-utils";
1111
import path from "path";
12+
import * as tsESLintParser from "@typescript-eslint/parser";
1213

1314
const FIXTURE_ROOT = path.resolve(__dirname, "../fixtures/integrations");
1415

@@ -26,7 +27,7 @@ describe("Integration tests.", () => {
2627
)) {
2728
it(inputFileName, () => {
2829
const setupFileName = inputFileName.replace(
29-
/input\.svelte$/u,
30+
/input\.svelte(?:\.[jt]s)?$/u,
3031
"setup.ts",
3132
);
3233
const setup = fs.existsSync(setupFileName)
@@ -58,11 +59,19 @@ describe("Integration tests.", () => {
5859
2,
5960
);
6061

61-
if (fs.existsSync(outputFileName)) {
62-
const output = fs.readFileSync(outputFileName, "utf8");
63-
assert.strictEqual(messagesJson, output);
64-
} else {
65-
fs.writeFileSync(outputFileName, messagesJson, "utf8");
62+
try {
63+
if (fs.existsSync(outputFileName)) {
64+
const output = fs.readFileSync(outputFileName, "utf8");
65+
assert.strictEqual(messagesJson, output);
66+
} else {
67+
fs.writeFileSync(outputFileName, messagesJson, "utf8");
68+
}
69+
} finally {
70+
// Clear type info cache
71+
tsESLintParser.parseForESLint(
72+
"",
73+
generateParserOptions({ filePath: inputFileName }, config),
74+
);
6675
}
6776
});
6877
}

0 commit comments

Comments
 (0)