Skip to content

Commit 8655476

Browse files
authored
feat(eslint): remove usage of airbnb deprecated rules (#2320)
Signed-off-by: Alexandre Philibeaux <[email protected]>
1 parent 5843a3f commit 8655476

File tree

20 files changed

+640
-182
lines changed

20 files changed

+640
-182
lines changed

.changeset/large-moose-drop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@scaleway/eslint-config-react": major
3+
---
4+
5+
remove usage of eslint-config-airbnb-typescript as it's not maintain anymore, migrate to stylistic package

eslint.config.mjs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ export default [
1515
],
1616
},
1717
{
18+
settings: {
19+
react: {
20+
pragma: 'React', // Pragma to use, default to "React"
21+
fragment: 'Fragment', // Fragment to use (may be a property of <pragma>), default to "Fragment"
22+
version: 'detect', // React version. "detect" automatically picks the version you have installed.
23+
// You can also use `16.0`, `16.3`, etc, if you want to override the detected value.
24+
// Defaults to the "defaultVersion" setting and warns if missing, and to "detect" in the future
25+
defaultVersion: '18', // Default React version to use when the version you have installed cannot be detected.
26+
// If not provided, defaults to the latest React version.
27+
},
28+
},
1829
languageOptions: {
1930
globals: {
2031
...globals.browser,
@@ -65,23 +76,6 @@ export default [
6576
project: ['tsconfig.json'],
6677
},
6778
},
68-
})),
69-
...scwTypescript.map(config => ({
70-
...config,
71-
files: [
72-
'packages/changesets-renovate/**/*.ts{x,}',
73-
'packages/validate-icu-locales/**/*.ts{x,}',
74-
'**/__tests__/**/*.ts{x,}',
75-
],
76-
77-
languageOptions: {
78-
ecmaVersion: 5,
79-
sourceType: 'script',
80-
81-
parserOptions: {
82-
project: ['tsconfig.json'],
83-
},
84-
},
8579

8680
rules: {
8781
...config.rules,
@@ -93,7 +87,6 @@ export default [
9387

9488
{
9589
files: [
96-
'packages/jest-helpers/**/*.ts{x,}',
9790
'**/__tests__/**/*.ts{x,}',
9891
'**/vitest.setup.ts',
9992
'**/*.config.ts',

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
"builtin-modules": "4.0.0",
3636
"cross-env": "7.0.3",
3737
"esbuild-plugin-browserslist": "0.15.0",
38-
"eslint": "9.13.0",
39-
"globals": "15.12.0",
38+
"eslint": "9.16.0",
39+
"globals": "15.13.0",
4040
"happy-dom": "15.11.7",
4141
"husky": "9.1.7",
4242
"lint-staged": "15.2.10",

packages/cookie-consent/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"cookie": "1.0.1"
4545
},
4646
"devDependencies": {
47-
"@types/cookie": "0.6.0",
4847
"react": "18.3.1",
4948
"@scaleway/use-segment": "workspace:*"
5049
},

packages/cookie-consent/src/CookieConsentProvider/__tests__/index.test.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ const integrations: Integrations = [
4444
},
4545
]
4646

47-
const mockUseSegmentIntegrations = vi.fn<
48-
() => ReturnType<typeof useSegmentIntegrations>
49-
>(() => ({
47+
type MockSegmentIntegrations = () => ReturnType<typeof useSegmentIntegrations>
48+
49+
const mockUseSegmentIntegrations = vi.fn<MockSegmentIntegrations>(() => ({
5050
integrations,
5151
isLoaded: true,
5252
}))

packages/cookie-consent/src/CookieConsentProvider/types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import type { CategoryKind } from './helpers'
33
export type { CategoryKind }
44
export type Consent = { [K in CategoryKind]: boolean }
55

6-
type Integration = { category: CategoryKind; name: string }
6+
type Integration = {
7+
category: CategoryKind
8+
name: string
9+
}
710

811
export type Integrations = Integration[]
912

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
import { fixupConfigRules, fixupPluginRules } from '@eslint/compat'
2+
import { FlatCompat } from '@eslint/eslintrc'
3+
import path from 'node:path'
4+
import { fileURLToPath } from 'node:url'
5+
6+
const filename = fileURLToPath(import.meta.url)
7+
const dirname = path.dirname(filename)
8+
9+
const compat = new FlatCompat({
10+
baseDirectory: dirname,
11+
})
12+
13+
const config = compat.extends('airbnb-base')
14+
15+
const defaultAirBnbRules = [...fixupPluginRules(config)].reduce(
16+
(acc, currentConfig) => ({
17+
...acc,
18+
...currentConfig.rules,
19+
}),
20+
{},
21+
)
22+
23+
export default [
24+
...fixupConfigRules(compat.extends('airbnb-base')),
25+
{
26+
rules: {
27+
// Replace Airbnb 'camelcase' rule with '@typescript-eslint/naming-convention'
28+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/naming-convention.md
29+
camelcase: 'off',
30+
// The `@typescript-eslint/naming-convention` rule allows `leadingUnderscore` and `trailingUnderscore` settings. However, the existing `no-underscore-dangle` rule already takes care of this.
31+
'@typescript-eslint/naming-convention': [
32+
'error',
33+
// Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables (23.10)
34+
{
35+
selector: 'variable',
36+
format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
37+
},
38+
// Allow camelCase functions (23.2), and PascalCase functions (23.8)
39+
{
40+
selector: 'function',
41+
format: ['camelCase', 'PascalCase'],
42+
},
43+
// Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make TypeScript recommendations, we are assuming this rule would similarly apply to anything "type like", including interfaces, type aliases, and enums
44+
{
45+
selector: 'typeLike',
46+
format: ['PascalCase'],
47+
},
48+
],
49+
50+
// Replace Airbnb 'default-param-last' rule with '@typescript-eslint' version
51+
// https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/default-param-last.md
52+
'default-param-last': 'off',
53+
'@typescript-eslint/default-param-last':
54+
defaultAirBnbRules['default-param-last'],
55+
56+
// Replace Airbnb 'dot-notation' rule with '@typescript-eslint' version
57+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/dot-notation.md
58+
'dot-notation': 'off',
59+
'@typescript-eslint/dot-notation': defaultAirBnbRules['dot-notation'],
60+
61+
// Replace Airbnb 'no-array-constructor' rule with '@typescript-eslint' version
62+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-array-constructor.md
63+
'no-array-constructor': 'off',
64+
'@typescript-eslint/no-array-constructor':
65+
defaultAirBnbRules['no-array-constructor'],
66+
67+
// Replace Airbnb 'no-dupe-class-members' rule with '@typescript-eslint' version
68+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-dupe-class-members.md
69+
'no-dupe-class-members': 'off',
70+
'@typescript-eslint/no-dupe-class-members':
71+
defaultAirBnbRules['no-dupe-class-members'],
72+
73+
// Replace Airbnb 'no-empty-function' rule with '@typescript-eslint' version
74+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-empty-function.md
75+
'no-empty-function': 'off',
76+
'@typescript-eslint/no-empty-function':
77+
defaultAirBnbRules['no-empty-function'],
78+
79+
// Replace Airbnb 'no-extra-parens' rule with '@typescript-eslint' version
80+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-extra-parens.md
81+
'no-extra-parens': 'off',
82+
'@typescript-eslint/no-extra-parens':
83+
defaultAirBnbRules['no-extra-parens'],
84+
85+
// Replace Airbnb 'no-implied-eval' and 'no-new-func' rules with '@typescript-eslint' version
86+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-implied-eval.md
87+
'no-implied-eval': 'off',
88+
'no-new-func': 'off',
89+
'@typescript-eslint/no-implied-eval':
90+
defaultAirBnbRules['no-implied-eval'],
91+
92+
// Replace Airbnb 'no-loss-of-precision' rule with '@typescript-eslint' version
93+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-loss-of-precision.md
94+
'no-loss-of-precision': 'off',
95+
'@typescript-eslint/no-loss-of-precision':
96+
defaultAirBnbRules['no-loss-of-precision'],
97+
98+
// Replace Airbnb 'no-loop-func' rule with '@typescript-eslint' version
99+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-loop-func.md
100+
'no-loop-func': 'off',
101+
'@typescript-eslint/no-loop-func': defaultAirBnbRules['no-loop-func'],
102+
103+
// Replace Airbnb 'no-magic-numbers' rule with '@typescript-eslint' version
104+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-magic-numbers.md
105+
'no-magic-numbers': 'off',
106+
'@typescript-eslint/no-magic-numbers':
107+
defaultAirBnbRules['no-magic-numbers'],
108+
109+
// Replace Airbnb 'no-redeclare' rule with '@typescript-eslint' version
110+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-redeclare.md
111+
'no-redeclare': 'off',
112+
'@typescript-eslint/no-redeclare': defaultAirBnbRules['no-redeclare'],
113+
114+
// Replace Airbnb 'no-shadow' rule with '@typescript-eslint' version
115+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-shadow.md
116+
'no-shadow': 'off',
117+
'@typescript-eslint/no-shadow': defaultAirBnbRules['no-shadow'],
118+
119+
// Replace Airbnb 'no-unused-expressions' rule with '@typescript-eslint' version
120+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-expressions.md
121+
'no-unused-expressions': 'off',
122+
'@typescript-eslint/no-unused-expressions':
123+
defaultAirBnbRules['no-unused-expressions'],
124+
125+
// Replace Airbnb 'no-unused-vars' rule with '@typescript-eslint' version
126+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md
127+
'no-unused-vars': 'off',
128+
'@typescript-eslint/no-unused-vars': defaultAirBnbRules['no-unused-vars'],
129+
130+
// Replace Airbnb 'no-use-before-define' rule with '@typescript-eslint' version
131+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-use-before-define.md
132+
'no-use-before-define': 'off',
133+
'@typescript-eslint/no-use-before-define':
134+
defaultAirBnbRules['no-use-before-define'],
135+
136+
// Replace Airbnb 'no-useless-constructor' rule with '@typescript-eslint' version
137+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-useless-constructor.md
138+
'no-useless-constructor': 'off',
139+
'@typescript-eslint/no-useless-constructor':
140+
defaultAirBnbRules['no-useless-constructor'],
141+
142+
// Replace Airbnb 'quotes' rule with '@typescript-eslint' version
143+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/quotes.md
144+
quotes: 'off',
145+
// '@typescript-eslint/quotes': defaultAirBnbRules.quotes,
146+
147+
// Replace Airbnb 'require-await' rule with '@typescript-eslint' version
148+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/require-await.md
149+
'require-await': 'off',
150+
'@typescript-eslint/require-await': defaultAirBnbRules['require-await'],
151+
152+
// Replace Airbnb 'no-return-await' rule with '@typescript-eslint' version
153+
// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/return-await.md
154+
'no-return-await': 'off',
155+
'@typescript-eslint/return-await': [
156+
defaultAirBnbRules['no-return-await'],
157+
'in-try-catch',
158+
],
159+
160+
// Append 'ts' and 'tsx' to Airbnb 'import/extensions' rule
161+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md
162+
'import/extensions': [
163+
defaultAirBnbRules['import/extensions'][0],
164+
defaultAirBnbRules['import/extensions'][1],
165+
{
166+
...defaultAirBnbRules['import/extensions'][2],
167+
ts: 'never',
168+
tsx: 'never',
169+
},
170+
],
171+
172+
// Append 'ts' and 'tsx' extensions to Airbnb 'import/no-extraneous-dependencies' rule
173+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md
174+
'import/no-extraneous-dependencies': [
175+
defaultAirBnbRules['import/no-extraneous-dependencies'][0],
176+
{
177+
...defaultAirBnbRules['import/no-extraneous-dependencies'][1],
178+
devDependencies: defaultAirBnbRules[
179+
'import/no-extraneous-dependencies'
180+
][1].devDependencies.reduce((result, devDep) => {
181+
const toAppend = [devDep]
182+
const devDepWithTs = devDep.replace(/\bjs(x?)\b/g, 'ts$1')
183+
if (devDepWithTs !== devDep) {
184+
toAppend.push(devDepWithTs)
185+
}
186+
return [...result, ...toAppend]
187+
}, []),
188+
},
189+
],
190+
},
191+
},
192+
]
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import emotion from './emotion.mjs'
22
import javascript from './javascript.mjs'
33
import typescript from './typescript.mjs'
4+
import stylistic from './stylistic.mjs'
45

5-
export { emotion, javascript, typescript }
6+
export { emotion, javascript, stylistic, typescript }

packages/eslint-config-react/package.json

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,27 @@
2020
"./javascript": "./javascript.mjs",
2121
"./typescript": "./typescript.mjs",
2222
"./emotion": "./emotion.mjs",
23-
"./shared": "./shared.mjs"
23+
"./shared": "./shared.mjs",
24+
"./stylistic": "./stylistic.mjs"
2425
},
2526
"files": [
27+
"airbnb/*",
28+
"emotion.mjs",
2629
"index.mjs",
2730
"javascript.mjs",
28-
"typescript.mjs",
2931
"shared.mjs",
30-
"emotion.mjs"
32+
"stylistic.mjs",
33+
"typescript.mjs"
3134
],
3235
"license": "MIT",
3336
"dependencies": {
3437
"@emotion/eslint-plugin": "11.12.0",
3538
"@eslint/compat": "1.2.3",
3639
"@eslint/eslintrc": "3.2.0",
37-
"@typescript-eslint/eslint-plugin": "7.18.0",
38-
"@typescript-eslint/parser": "7.18.0",
40+
"@stylistic/eslint-plugin": "2.11.0",
41+
"@typescript-eslint/eslint-plugin": "8.16.0",
42+
"@typescript-eslint/parser": "8.16.0",
3943
"eslint-config-airbnb": "19.0.4",
40-
"eslint-config-airbnb-typescript": "18.0.0",
4144
"eslint-config-prettier": "9.1.0",
4245
"eslint-plugin-deprecation": "3.0.0",
4346
"eslint-plugin-eslint-comments": "3.2.0",
@@ -47,7 +50,7 @@
4750
"eslint-plugin-react-hooks": "5.0.0"
4851
},
4952
"peerDependencies": {
50-
"eslint": ">= 9.7"
53+
"eslint": ">= 9.13"
5154
},
5255
"devDependencies": {
5356
"eslint": "9.13.0",

packages/eslint-config-react/shared.mjs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { fixupConfigRules } from '@eslint/compat'
22
import { FlatCompat } from '@eslint/eslintrc'
33
import path from 'node:path'
44
import { fileURLToPath } from 'node:url'
5+
import stylisticJs from './stylistic.mjs'
56

67
const filename = fileURLToPath(import.meta.url)
78
const dirname = path.dirname(filename)
@@ -19,9 +20,13 @@ export default [
1920
'plugin:react/jsx-runtime',
2021
),
2122
),
23+
...stylisticJs,
2224
{
2325
rules: {
2426
curly: 'error',
27+
'no-use-before-define': 'off',
28+
'import/extensions': 'off',
29+
'dot-notation': 'off',
2530

2631
'import/order': [
2732
'error',

0 commit comments

Comments
 (0)