-
Notifications
You must be signed in to change notification settings - Fork 615
Expand file tree
/
Copy patheslint.config.mjs
More file actions
198 lines (188 loc) · 6.05 KB
/
Copy patheslint.config.mjs
File metadata and controls
198 lines (188 loc) · 6.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// @ts-check
import tseslint from "typescript-eslint";
/**
* ESLint flat config — targeted rules for console toolbox conventions.
*
* This config does NOT enable a broad rule-set. It only enforces
* project-specific constraints inside components/toolbox/.
*
* IMPORTANT: no-restricted-imports can only be defined ONCE per file scope
* in flat config (later blocks override earlier ones). All import restrictions
* for the same file scope must be consolidated into a single block.
*/
export default tseslint.config(
// ---------------------------------------------------------------
// Base: register @typescript-eslint plugin so inline disable
// comments (e.g. @typescript-eslint/no-explicit-any) don't trigger
// "Definition for rule … was not found" errors. No rules enabled.
// ---------------------------------------------------------------
{
files: ["components/toolbox/**/*.ts", "components/toolbox/**/*.tsx"],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
languageOptions: {
parser: tseslint.parser,
},
},
// ---------------------------------------------------------------
// Toolbox-wide: unused imports/vars + no console.log + wagmi guard
// ---------------------------------------------------------------
{
files: ["components/toolbox/**/*.ts", "components/toolbox/**/*.tsx"],
ignores: [
"components/toolbox/hooks/**",
"components/toolbox/contexts/**",
],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
languageOptions: {
parser: tseslint.parser,
},
rules: {
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"no-console": ["error", { allow: ["warn", "error"] }],
"no-restricted-imports": [
"error",
{
patterns: [
{
group: ["wagmi"],
importNames: ["useWalletClient"],
message:
"Use useResolvedWalletClient instead. wagmi's useWalletClient returns undefined on custom L1 chains.",
},
],
},
],
},
},
// Hooks and contexts ARE allowed to use wagmi directly — only
// need unused-vars and no-console for those.
{
files: [
"components/toolbox/hooks/**/*.ts",
"components/toolbox/hooks/**/*.tsx",
"components/toolbox/contexts/**/*.ts",
"components/toolbox/contexts/**/*.tsx",
],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
languageOptions: {
parser: tseslint.parser,
},
rules: {
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"no-console": ["error", { allow: ["warn", "error"] }],
},
},
// ---------------------------------------------------------------
// Console components: all import restrictions in ONE block.
// (deep relative imports, readContract, wagmi — consolidated)
// ---------------------------------------------------------------
{
files: [
"components/toolbox/console/**/*.ts",
"components/toolbox/console/**/*.tsx",
],
languageOptions: {
parser: tseslint.parser,
},
rules: {
"no-restricted-imports": [
"error",
{
patterns: [
{
group: ["../../../**"],
message:
"Use @/ path aliases instead of deep relative imports (e.g. @/components/toolbox/components/...).",
},
{
group: ["wagmi"],
importNames: ["useWalletClient"],
message:
"Use useResolvedWalletClient instead.",
},
{
group: ["viem/actions"],
importNames: ["readContract"],
message:
"Use the contract hooks (useValidatorManager, etc.) instead of direct readContract calls.",
},
],
},
],
},
},
// ---------------------------------------------------------------
// Standalone validator flows: additional restriction on
// createChainStore (leaks stale subnet IDs from creation wizard).
// Must re-include all console patterns since this overrides the
// block above for these specific paths.
// ---------------------------------------------------------------
{
files: [
"components/toolbox/console/permissioned-l1s/add-validator/**",
"components/toolbox/console/permissioned-l1s/remove-validator/**",
"components/toolbox/console/permissioned-l1s/change-weight/**",
"components/toolbox/console/permissionless-l1s/stake/**",
"components/toolbox/console/permissionless-l1s/delegate/**",
"components/toolbox/console/permissionless-l1s/withdraw/**",
],
languageOptions: {
parser: tseslint.parser,
},
rules: {
"no-restricted-imports": [
"error",
{
paths: [
{
name: "@/components/toolbox/stores/createChainStore",
message:
"Standalone validator flows must not read from createChainStore — it persists stale state from the L1 creation wizard. Use the flow's own store instead.",
},
],
patterns: [
{
group: ["../../../**"],
message:
"Use @/ path aliases instead of deep relative imports.",
},
{
group: ["wagmi"],
importNames: ["useWalletClient"],
message:
"Use useResolvedWalletClient instead.",
},
{
group: ["viem/actions"],
importNames: ["readContract"],
message:
"Use the contract hooks instead of direct readContract calls.",
},
],
},
],
},
},
);