Skip to content

Commit 37d1de7

Browse files
committed
fix: use ReferenceTracker
1 parent 715d04a commit 37d1de7

File tree

7 files changed

+94
-46
lines changed

7 files changed

+94
-46
lines changed

src/rules/no-store-async.ts

+17-19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createRule } from "../utils"
2-
import type * as ESTree from "estree"
2+
import { extractStoreReferences } from "./reference-helpers/svelte-store"
33

44
export default createRule("no-store-async", {
55
meta: {
@@ -18,26 +18,24 @@ export default createRule("no-store-async", {
1818
},
1919
create(context) {
2020
return {
21-
CallExpression(node: ESTree.CallExpression) {
22-
if (node.callee.type !== "Identifier") return
23-
const { name } = node.callee
24-
if (name !== "writable" && name !== "readable" && name !== "derived")
25-
return
26-
const [, fn] = node.arguments
27-
if (fn.type !== "ArrowFunctionExpression" || !fn.async) return
21+
Program() {
22+
for (const { node } of extractStoreReferences(context)) {
23+
const [, fn] = node.arguments
24+
if (fn.type !== "ArrowFunctionExpression" || !fn.async) continue
2825

29-
const start = fn.loc?.start ?? { line: 1, column: 0 }
30-
context.report({
31-
node: fn,
32-
loc: {
33-
start,
34-
end: {
35-
line: start.line,
36-
column: start.column + 5,
26+
const start = fn.loc?.start ?? { line: 1, column: 0 }
27+
context.report({
28+
node: fn,
29+
loc: {
30+
start,
31+
end: {
32+
line: start.line,
33+
column: start.column + 5,
34+
},
3735
},
38-
},
39-
messageId: "unexpected",
40-
})
36+
messageId: "unexpected",
37+
})
38+
}
4139
},
4240
}
4341
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type * as ESTree from "estree"
2+
import { ReferenceTracker } from "eslint-utils"
3+
import type { RuleContext } from "../../types"
4+
5+
/** Extract 'svelte/store' references */
6+
export function* extractStoreReferences(
7+
context: RuleContext,
8+
): Generator<{ node: ESTree.CallExpression; name: string }, void> {
9+
const referenceTracker = new ReferenceTracker(context.getScope())
10+
for (const { node, path } of referenceTracker.iterateEsmReferences({
11+
"svelte/store": {
12+
[ReferenceTracker.ESM]: true,
13+
writable: {
14+
[ReferenceTracker.CALL]: true,
15+
},
16+
readable: {
17+
[ReferenceTracker.CALL]: true,
18+
},
19+
derived: {
20+
[ReferenceTracker.CALL]: true,
21+
},
22+
},
23+
})) {
24+
yield {
25+
node: node as ESTree.CallExpression,
26+
name: path[path.length - 1],
27+
}
28+
}
29+
}

src/rules/require-stores-init.ts

+2-27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { createRule } from "../utils"
2-
import type * as ESTree from "estree"
3-
import { ReferenceTracker } from "eslint-utils"
2+
import { extractStoreReferences } from "./reference-helpers/svelte-store"
43

54
export default createRule("require-stores-init", {
65
meta: {
@@ -16,33 +15,9 @@ export default createRule("require-stores-init", {
1615
type: "suggestion",
1716
},
1817
create(context) {
19-
/** Extract 'svelte/store' references */
20-
function* extractStoreReferences() {
21-
const referenceTracker = new ReferenceTracker(context.getScope())
22-
for (const { node, path } of referenceTracker.iterateEsmReferences({
23-
"svelte/store": {
24-
[ReferenceTracker.ESM]: true,
25-
writable: {
26-
[ReferenceTracker.CALL]: true,
27-
},
28-
readable: {
29-
[ReferenceTracker.CALL]: true,
30-
},
31-
derived: {
32-
[ReferenceTracker.CALL]: true,
33-
},
34-
},
35-
})) {
36-
yield {
37-
node: node as ESTree.CallExpression,
38-
name: path[path.length - 1],
39-
}
40-
}
41-
}
42-
4318
return {
4419
Program() {
45-
for (const { node, name } of extractStoreReferences()) {
20+
for (const { node, name } of extractStoreReferences(context)) {
4621
const minArgs =
4722
name === "writable" || name === "readable"
4823
? 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
- message: Do not pass async functions to svelte stores.
2+
line: 3
3+
column: 35
4+
suggestions: null
5+
- message: Do not pass async functions to svelte stores.
6+
line: 6
7+
column: 35
8+
suggestions: null
9+
- message: Do not pass async functions to svelte stores.
10+
line: 9
11+
column: 31
12+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import * as stores from "svelte/store"
2+
3+
const w2 = stores.writable(false, async () => {
4+
/** do nothing */
5+
})
6+
const r2 = stores.readable(false, async () => {
7+
/** do nothing */
8+
})
9+
const d2 = stores.derived(a1, async ($a1) => {
10+
/** do nothing */
11+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
- message: Do not pass async functions to svelte stores.
2+
line: 3
3+
column: 21
4+
suggestions: null
5+
- message: Do not pass async functions to svelte stores.
6+
line: 6
7+
column: 21
8+
suggestions: null
9+
- message: Do not pass async functions to svelte stores.
10+
line: 9
11+
column: 18
12+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { writable as A, readable as B, derived as C } from "svelte/store"
2+
3+
const w2 = A(false, async () => {
4+
/** do nothing */
5+
})
6+
const r2 = B(false, async () => {
7+
/** do nothing */
8+
})
9+
const d2 = C(a1, async ($a1) => {
10+
/** do nothing */
11+
})

0 commit comments

Comments
 (0)