A minimalistic opinionated Bluesky web client
1{
2 "$schema": "./node_modules/oxlint/configuration_schema.json",
3 "env": {
4 "browser": true,
5 "builtin": true,
6 "es2022": true,
7 "node": true,
8 "serviceworker": true
9 },
10 "plugins": [
11 "eslint",
12 "typescript",
13 "unicorn",
14 "oxc",
15 "import",
16 "jsx-a11y",
17 "react",
18 "react-perf",
19 "promise",
20 "node"
21 ],
22 "categories": {
23 "correctness": "error",
24 "suspicious": "error",
25 "perf": "warn",
26 "pedantic": "off",
27 "style": "off",
28 "restriction": "off",
29 "nursery": "off"
30 },
31 "globals": {
32 "__BENCHMARK": "readonly",
33 "__BUILD_TIME__": "readonly",
34 "__COMMIT_HASH__": "readonly",
35 "__COMMIT_TIME__": "readonly",
36 "__FAKE_COMMIT_HASH__": "readonly"
37 },
38 "ignorePatterns": [
39 "dist/**",
40 "node_modules/**",
41 "src/locales/**",
42 "rollbar.js"
43 ],
44 "options": {
45 "typeAware": true,
46 "typeCheck": true,
47 "reportUnusedDisableDirectives": "error"
48 },
49 "rules": {
50 "eslint/func-style": "off",
51 "eslint/id-length": "off",
52 "eslint/no-magic-numbers": "off",
53 "eslint/no-alert": "off",
54 "eslint/no-console": "off",
55 "eslint/no-undefined": "off",
56 "import/no-default-export": "off",
57 "import/no-unassigned-import": "off",
58 "oxc/no-rest-spread-properties": "off",
59 "oxc/no-optional-chaining": "off",
60 "promise/prefer-await-to-then": "warn",
61 "react/jsx-filename-extension": "off",
62 "react/jsx-max-depth": "off",
63 "react/no-unknown-property": "off",
64 "react/react-in-jsx-scope": "off",
65 "unicorn/prefer-ternary": "off",
66
67 "typescript/no-deprecated": "warn",
68 "typescript/no-misused-promises": "error",
69 "typescript/switch-exhaustiveness-check": "error",
70 "typescript/restrict-plus-operands": "error",
71 "typescript/only-throw-error": "error",
72 "typescript/prefer-promise-reject-errors": "error",
73 "typescript/ban-ts-comment": "error",
74 "react/rules-of-hooks": "error",
75 "react/jsx-no-target-blank": "error",
76 "eslint/no-promise-executor-return": "error",
77 "eslint/array-callback-return": "error",
78 "eslint/no-prototype-builtins": "error",
79 "eslint/no-redeclare": "error",
80
81 "typescript/no-explicit-any": "error",
82 "typescript/no-invalid-void-type": "error",
83 "typescript/no-non-null-asserted-nullish-coalescing": "error",
84 "promise/catch-or-return": "error",
85
86 "import/no-cycle": "warn",
87 "promise/no-multiple-resolved": "warn",
88 "react/iframe-missing-sandbox": "warn",
89 "typescript/no-unnecessary-type-parameters": "warn",
90 "unicorn/require-post-message-target-origin": "warn",
91
92 "jsx-a11y/click-events-have-key-events": "warn",
93 "jsx-a11y/label-has-associated-control": "warn",
94 "jsx-a11y/media-has-caption": "warn",
95 "jsx-a11y/no-noninteractive-tabindex": "warn",
96 "jsx-a11y/no-static-element-interactions": "warn",
97 "jsx-a11y/prefer-tag-over-role": "warn",
98
99 "typescript/no-unsafe-type-assertion": "warn",
100 "typescript/no-unsafe-assignment": "warn",
101 "typescript/no-unsafe-member-access": "warn",
102 "typescript/no-unsafe-call": "warn",
103 "typescript/no-unsafe-return": "warn",
104 "typescript/no-unsafe-argument": "warn",
105
106 "typescript/strict-void-return": "warn",
107 "typescript/no-confusing-void-expression": "warn",
108 "typescript/no-non-null-assertion": "warn",
109
110 "eslint/no-underscore-dangle": ["error", {
111 "allow": [
112 "_",
113 "_accounts",
114 "_atproto",
115 "_create",
116 "_deleted",
117 "_differentAuthor",
118 "_errors",
119 "__errors",
120 "_filtered",
121 "_followedTags",
122 "_grouped",
123 "_groupKeys",
124 "_id",
125 "_ids",
126 "_instance",
127 "_localeMatch",
128 "_memoize",
129 "_notificationsCount",
130 "_pagination",
131 "_pinned",
132 "_sampleAccountsCount",
133 "_showToast",
134 "_statuses",
135 "_thread",
136 "_translatedText",
137 "_types",
138 "__ACCOUNT_APIS__",
139 "__API__",
140 "__BENCH_RESULTS",
141 "__BENCHMARK",
142 "__BLUEPY_OAUTH_ARGS__",
143 "__BLUEPY_OAUTH_TEST_CLIENT__",
144 "__BOOSTERS",
145 "__BUILD_TIME__",
146 "__CLOAK__",
147 "__COMMIT_HASH__",
148 "__COMMIT_TIME__",
149 "__COMPOSE__",
150 "__dirname",
151 "__FAKE_COMMIT_HASH__",
152 "__filename",
153 "__FILTER",
154 "__generateCodeChallenge",
155 "__HIDDEN",
156 "__IDLE__",
157 "__IGNORE_GET_ACCOUNT_ERROR__",
158 "__nativeAlert",
159 "__replies",
160 "__SHARED_DATA__",
161 "__STATES__",
162 "__STATES_STATS__",
163 "__WB_DISABLE_DEV_LOGS"
164 ],
165 "allowFunctionParams": true,
166 "allowInArrayDestructuring": true,
167 "allowInObjectDestructuring": true
168 }]
169 },
170 "overrides": [
171 {
172 "files": ["**/*.tsx"],
173 "rules": {
174 "typescript/prefer-readonly-parameter-types": "off"
175 }
176 }
177 ]
178}