summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar <oskar@mullvad.net>2024-10-31 16:21:17 +0100
committerOskar <oskar@mullvad.net>2024-11-14 16:43:36 +0100
commit85df440959e66c3ee6c26cf58661fac68d50585a (patch)
treeb0a56b09873bb6feba968f5a4e7cddc3569c8946
parentb6de2642835ead605dc15c92656430427d3abdd5 (diff)
downloadmullvadvpn-85df440959e66c3ee6c26cf58661fac68d50585a.tar.xz
mullvadvpn-85df440959e66c3ee6c26cf58661fac68d50585a.zip
Move common linting to workspace root
-rw-r--r--desktop/eslint.config.mjs119
-rw-r--r--desktop/package-lock.json26
-rw-r--r--desktop/package.json15
-rw-r--r--desktop/packages/mullvad-vpn/eslint.config.mjs149
-rw-r--r--desktop/packages/mullvad-vpn/package.json11
-rw-r--r--desktop/packages/mullvad-vpn/tsconfig.json3
-rw-r--r--desktop/prettier.config.mjs (renamed from desktop/packages/mullvad-vpn/prettier.config.mjs)0
7 files changed, 161 insertions, 162 deletions
diff --git a/desktop/eslint.config.mjs b/desktop/eslint.config.mjs
new file mode 100644
index 0000000000..956904baf9
--- /dev/null
+++ b/desktop/eslint.config.mjs
@@ -0,0 +1,119 @@
+import eslint from '@eslint/js';
+import prettier from 'eslint-plugin-prettier/recommended';
+import simpleImportSort from 'eslint-plugin-simple-import-sort';
+import tseslint from 'typescript-eslint';
+
+const namingConvention = [
+ {
+ selector: 'default',
+ format: ['camelCase'],
+ },
+ {
+ selector: 'variable',
+ modifiers: ['const'],
+ format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
+ leadingUnderscore: 'allow',
+ },
+ {
+ selector: 'variableLike',
+ format: ['camelCase'],
+ leadingUnderscore: 'allow',
+ },
+ {
+ selector: 'import',
+ format: ['camelCase', 'PascalCase', 'snake_case'],
+ },
+ {
+ selector: 'parameter',
+ format: ['camelCase', 'PascalCase'],
+ leadingUnderscore: 'allow',
+ },
+ {
+ selector: 'function',
+ format: ['camelCase', 'PascalCase'],
+ },
+ {
+ selector: 'memberLike',
+ format: ['camelCase'],
+ },
+ {
+ selector: 'typeProperty',
+ format: ['camelCase'],
+ filter: {
+ regex: '^(data-testid|aria-labelledby|aria-describedby)$',
+ match: false,
+ },
+ },
+ {
+ selector: 'typeLike',
+ format: ['PascalCase'],
+ },
+ {
+ selector: 'property',
+ format: null,
+ },
+];
+
+const memberOrdering = {
+ default: [
+ 'public-field',
+ 'protected-field',
+ 'private-field',
+
+ 'public-constructor',
+ 'protected-constructor',
+ 'private-constructor',
+
+ 'public-method',
+ 'protected-method',
+ 'private-method',
+ ],
+};
+
+export default tseslint.config(
+ eslint.configs.recommended,
+ ...tseslint.configs.recommended,
+ prettier,
+ {
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ project: './tsconfig.json',
+ ecmaVersion: '2018',
+ sourceType: 'module',
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ },
+ rules: {
+ '@typescript-eslint/require-await': 'error',
+ '@typescript-eslint/no-floating-promises': 'error',
+
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ },
+ },
+ {
+ files: ['**/*.{js,mjs,ts,tsx}'],
+ plugins: {
+ 'simple-import-sort': simpleImportSort,
+ },
+ rules: {
+ quotes: ['error', 'single', { avoidEscape: true }],
+ 'prettier/prettier': 'error',
+ '@typescript-eslint/no-unused-vars': [
+ 'error',
+ { argsIgnorePattern: '^_', ignoreRestSiblings: true },
+ ],
+ '@typescript-eslint/no-unused-expressions': 'error',
+ '@typescript-eslint/member-ordering': ['error', memberOrdering],
+ 'no-return-await': 'error',
+ '@typescript-eslint/naming-convention': ['error', ...namingConvention],
+ '@typescript-eslint/ban-ts-comment': 'error',
+ 'simple-import-sort/imports': 'error',
+ },
+ },
+);
diff --git a/desktop/package-lock.json b/desktop/package-lock.json
index 7955d3515c..be2f2c483d 100644
--- a/desktop/package-lock.json
+++ b/desktop/package-lock.json
@@ -12,9 +12,17 @@
"packages/*"
],
"devDependencies": {
+ "@eslint/js": "^9.10.0",
+ "@types/eslint__js": "^8.42.3",
"@types/node": "^20.12.11",
+ "eslint": "^9.10.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.2.1",
+ "eslint-plugin-simple-import-sort": "^12.1.1",
+ "prettier": "^3.3.3",
"ts-node": "^10.9.2",
- "typescript": "^5.4.5"
+ "typescript": "^5.4.5",
+ "typescript-eslint": "^8.6.0"
},
"engines": {
"node": ">=16",
@@ -14616,12 +14624,10 @@
"styled-components": "^6.1.0"
},
"devDependencies": {
- "@eslint/js": "^9.10.0",
"@playwright/test": "^1.41.1",
"@types/chai": "^4.3.3",
"@types/chai-as-promised": "^7.1.5",
"@types/chai-spies": "^1.0.3",
- "@types/eslint__js": "^8.42.3",
"@types/gettext-parser": "^4.0.1",
"@types/google-protobuf": "^3.15.6",
"@types/history": "^4.7.11",
@@ -14641,13 +14647,9 @@
"electron": "30.0.4",
"electron-builder": "^24.13.3",
"electron-devtools-installer": "^3.2.0",
- "eslint": "^9.10.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-compiler": "^0.0.0-experimental-42acc6a-20241001",
"eslint-plugin-react-hooks": "^0.0.0-experimental-2d16326d-20240930",
- "eslint-plugin-simple-import-sort": "^12.1.1",
"gettext-extractor": "^3.5.4",
"globals": "^15.9.0",
"grpc_tools_node_protoc_ts": "^5.3.2",
@@ -14658,10 +14660,8 @@
"mocha": "^10.2.0",
"playwright": "^1.41.1",
"postject": "^1.0.0-alpha.6",
- "prettier": "^3.3.3",
"sinon": "^14.0.1",
"tsc-watch": "^5.0.3",
- "typescript-eslint": "^8.6.0",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"xvfb-maybe": "^0.2.1"
@@ -22475,13 +22475,11 @@
"mullvad-vpn": {
"version": "file:packages/mullvad-vpn",
"requires": {
- "@eslint/js": "^9.10.0",
"@grpc/grpc-js": "^1.9.6",
"@playwright/test": "^1.41.1",
"@types/chai": "^4.3.3",
"@types/chai-as-promised": "^7.1.5",
"@types/chai-spies": "^1.0.3",
- "@types/eslint__js": "^8.42.3",
"@types/gettext-parser": "^4.0.1",
"@types/google-protobuf": "^3.15.6",
"@types/history": "^4.7.11",
@@ -22502,13 +22500,9 @@
"electron": "30.0.4",
"electron-builder": "^24.13.3",
"electron-devtools-installer": "^3.2.0",
- "eslint": "^9.10.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-compiler": "^0.0.0-experimental-42acc6a-20241001",
"eslint-plugin-react-hooks": "^0.0.0-experimental-2d16326d-20240930",
- "eslint-plugin-simple-import-sort": "^12.1.1",
"gettext-extractor": "^3.5.4",
"gettext-parser": "^6.0.0",
"gl-matrix": "^3.4.3",
@@ -22525,7 +22519,6 @@
"nseventmonitor": "^1.0.5",
"playwright": "^1.41.1",
"postject": "^1.0.0-alpha.6",
- "prettier": "^3.3.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "^7.2.9",
@@ -22536,7 +22529,6 @@
"sprintf-js": "^1.1.2",
"styled-components": "^6.1.0",
"tsc-watch": "^5.0.3",
- "typescript-eslint": "^8.6.0",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"xvfb-maybe": "^0.2.1"
diff --git a/desktop/package.json b/desktop/package.json
index eac6cf0f52..7e4284696e 100644
--- a/desktop/package.json
+++ b/desktop/package.json
@@ -11,10 +11,23 @@
},
"repository": "https://github.com/mullvad/mullvadvpn-app",
"license": "GPL-3.0",
+ "scripts": {
+ "lint": "eslint --ignore-pattern packages/ . && npm run lint --workspaces --if-present",
+ "lint-fix": "eslint --fix --ignore-pattern packages/ . && npm run lint-fix --workspaces --if-present",
+ "test": "npm run test --workspaces --if-present"
+ },
"devDependencies": {
+ "@eslint/js": "^9.10.0",
+ "@types/eslint__js": "^8.42.3",
"@types/node": "^20.12.11",
+ "eslint": "^9.10.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.2.1",
+ "eslint-plugin-simple-import-sort": "^12.1.1",
+ "prettier": "^3.3.3",
"ts-node": "^10.9.2",
- "typescript": "^5.4.5"
+ "typescript": "^5.4.5",
+ "typescript-eslint": "^8.6.0"
},
"engines": {
"node": ">=16",
diff --git a/desktop/packages/mullvad-vpn/eslint.config.mjs b/desktop/packages/mullvad-vpn/eslint.config.mjs
index 5aafcb4041..9a7eafc339 100644
--- a/desktop/packages/mullvad-vpn/eslint.config.mjs
+++ b/desktop/packages/mullvad-vpn/eslint.config.mjs
@@ -1,85 +1,27 @@
-import eslint from '@eslint/js';
-import prettier from 'eslint-plugin-prettier/recommended';
import react from 'eslint-plugin-react';
import reactcompiler from 'eslint-plugin-react-compiler';
import reactHooks from 'eslint-plugin-react-hooks';
-import simpleImportSort from 'eslint-plugin-simple-import-sort';
import globals from 'globals';
-import tseslint from 'typescript-eslint';
-const namingConvention = [
- {
- selector: 'default',
- format: ['camelCase'],
- },
- {
- selector: 'variable',
- modifiers: ['const'],
- format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
- leadingUnderscore: 'allow',
- },
- {
- selector: 'variableLike',
- format: ['camelCase'],
- leadingUnderscore: 'allow',
- },
- {
- selector: 'import',
- format: ['camelCase', 'PascalCase', 'snake_case'],
- },
- {
- selector: 'parameter',
- format: ['camelCase', 'PascalCase'],
- leadingUnderscore: 'allow',
- },
- {
- selector: 'function',
- format: ['camelCase', 'PascalCase'],
- },
- {
- selector: 'memberLike',
- format: ['camelCase'],
- },
+import workspaceConfig from '../../eslint.config.mjs';
+
+export default [
+ ...workspaceConfig,
+ react.configs.flat.recommended,
+ { ignores: ['build/'] },
{
- selector: 'typeProperty',
- format: ['camelCase'],
- filter: {
- regex: '^(data-testid|aria-labelledby|aria-describedby)$',
- match: false,
- },
+ files: ['**/*'],
+ ignores: ['src/renderer/'],
+ languageOptions: { globals: globals.node },
},
{
- selector: 'typeLike',
- format: ['PascalCase'],
+ files: ['src/renderer/'],
+ languageOptions: { globals: globals.browser },
},
{
- selector: 'property',
- format: null,
+ files: ['test/'],
+ languageOptions: { globals: globals.mocha },
},
-];
-
-const memberOrdering = {
- default: [
- 'public-field',
- 'protected-field',
- 'private-field',
-
- 'public-constructor',
- 'protected-constructor',
- 'private-constructor',
-
- 'public-method',
- 'protected-method',
- 'private-method',
- ],
-};
-
-export default tseslint.config(
- eslint.configs.recommended,
- ...tseslint.configs.recommended,
- react.configs.flat.recommended,
- prettier,
- { ignores: ['build/*'] },
{
settings: {
react: {
@@ -90,85 +32,26 @@ export default tseslint.config(
},
},
{
- files: ['**/*'],
- ignores: ['src/renderer/**/*'],
- languageOptions: {
- globals: globals.node,
- },
- },
- {
- files: ['src/renderer/**/*'],
- languageOptions: {
- globals: globals.browser,
- },
- },
- {
- files: ['test/**/*'],
- languageOptions: {
- globals: globals.mocha,
- },
- },
- {
- files: ['src/**/*.{js,mjs,ts,tsx}'],
- languageOptions: {
- parserOptions: {
- parser: '@typescript-eslint/parser',
- project: './tsconfig.json',
- ecmaVersion: '2018',
- sourceType: 'module',
- ecmaFeatures: {
- jsx: true,
- },
- },
- },
- rules: {
- '@typescript-eslint/require-await': 'error',
- '@typescript-eslint/no-floating-promises': 'error',
- },
- },
- {
files: ['**/*.{js,mjs,ts,tsx}'],
plugins: {
- 'simple-import-sort': simpleImportSort,
'react-hooks': reactHooks,
'react-compiler': reactcompiler,
},
rules: {
- quotes: ['error', 'single', { avoidEscape: true }],
- // 'prettier/prettier': 'error',
- '@typescript-eslint/no-unused-vars': [
- 'error',
- { argsIgnorePattern: '^_', ignoreRestSiblings: true },
- ],
- '@typescript-eslint/no-unused-expressions': 'error',
- '@typescript-eslint/member-ordering': ['error', memberOrdering],
- 'no-return-await': 'error',
'react/jsx-no-bind': 'error',
- '@typescript-eslint/naming-convention': ['error', ...namingConvention],
- '@typescript-eslint/ban-ts-comment': 'error',
- 'simple-import-sort/imports': 'error',
-
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error',
'react-compiler/react-compiler': 'error',
-
- '@typescript-eslint/no-use-before-define': 'off',
- '@typescript-eslint/explicit-module-boundary-types': 'off',
- '@typescript-eslint/no-non-null-assertion': 'off',
'react/prop-types': 'off',
'react/react-in-jsx-scope': 'off',
},
},
{
files: ['test/**/*.spec.ts'],
- rules: {
- '@typescript-eslint/no-unused-expressions': 'off',
- },
+ rules: { '@typescript-eslint/no-unused-expressions': 'off' },
},
{
files: ['tasks/*', 'scripts/*', 'gulpfile.js', 'init.js'],
- rules: {
- '@typescript-eslint/no-require-imports': 'off',
- },
+ rules: { '@typescript-eslint/no-require-imports': 'off' },
},
-);
+];
diff --git a/desktop/packages/mullvad-vpn/package.json b/desktop/packages/mullvad-vpn/package.json
index 948186464e..104291e824 100644
--- a/desktop/packages/mullvad-vpn/package.json
+++ b/desktop/packages/mullvad-vpn/package.json
@@ -32,12 +32,10 @@
"nseventmonitor": "^1.0.5"
},
"devDependencies": {
- "@eslint/js": "^9.10.0",
"@playwright/test": "^1.41.1",
"@types/chai": "^4.3.3",
"@types/chai-as-promised": "^7.1.5",
"@types/chai-spies": "^1.0.3",
- "@types/eslint__js": "^8.42.3",
"@types/gettext-parser": "^4.0.1",
"@types/google-protobuf": "^3.15.6",
"@types/history": "^4.7.11",
@@ -57,13 +55,9 @@
"electron": "30.0.4",
"electron-builder": "^24.13.3",
"electron-devtools-installer": "^3.2.0",
- "eslint": "^9.10.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-compiler": "^0.0.0-experimental-42acc6a-20241001",
"eslint-plugin-react-hooks": "^0.0.0-experimental-2d16326d-20240930",
- "eslint-plugin-simple-import-sort": "^12.1.1",
"gettext-extractor": "^3.5.4",
"globals": "^15.9.0",
"grpc_tools_node_protoc_ts": "^5.3.2",
@@ -74,10 +68,8 @@
"mocha": "^10.2.0",
"playwright": "^1.41.1",
"postject": "^1.0.0-alpha.6",
- "prettier": "^3.3.3",
"sinon": "^14.0.1",
"tsc-watch": "^5.0.3",
- "typescript-eslint": "^8.6.0",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"xvfb-maybe": "^0.2.1"
@@ -90,8 +82,7 @@
"pack-test-executable": "./scripts/build-test-executable.sh",
"build-test-executable": "npm run build && npm run pack-test-executable",
"lint": "eslint .",
- "format": "prettier \"**/*.{js,css,ts,tsx}\" --write",
- "tsc": "tsc -p . --noEmit",
+ "lint-fix": "eslint --fix .",
"e2e": "npm run build && npm run e2e:no-build",
"e2e:no-build": "xvfb-maybe -- playwright test mocked",
"e2e:sequential": "npm run build && npm run e2e:sequential:no-build",
diff --git a/desktop/packages/mullvad-vpn/tsconfig.json b/desktop/packages/mullvad-vpn/tsconfig.json
index 3f553cf263..f76c628554 100644
--- a/desktop/packages/mullvad-vpn/tsconfig.json
+++ b/desktop/packages/mullvad-vpn/tsconfig.json
@@ -17,7 +17,8 @@
],
"typeRoots": [
"./types",
- "node_modules/@types"
+ "node_modules/@types",
+ "../../node_modules/@types"
]
},
"exclude": [
diff --git a/desktop/packages/mullvad-vpn/prettier.config.mjs b/desktop/prettier.config.mjs
index 150678b825..150678b825 100644
--- a/desktop/packages/mullvad-vpn/prettier.config.mjs
+++ b/desktop/prettier.config.mjs