diff options
| author | Oskar <oskar@mullvad.net> | 2024-10-31 16:21:17 +0100 |
|---|---|---|
| committer | Oskar <oskar@mullvad.net> | 2024-11-14 16:43:36 +0100 |
| commit | 85df440959e66c3ee6c26cf58661fac68d50585a (patch) | |
| tree | b0a56b09873bb6feba968f5a4e7cddc3569c8946 | |
| parent | b6de2642835ead605dc15c92656430427d3abdd5 (diff) | |
| download | mullvadvpn-85df440959e66c3ee6c26cf58661fac68d50585a.tar.xz mullvadvpn-85df440959e66c3ee6c26cf58661fac68d50585a.zip | |
Move common linting to workspace root
| -rw-r--r-- | desktop/eslint.config.mjs | 119 | ||||
| -rw-r--r-- | desktop/package-lock.json | 26 | ||||
| -rw-r--r-- | desktop/package.json | 15 | ||||
| -rw-r--r-- | desktop/packages/mullvad-vpn/eslint.config.mjs | 149 | ||||
| -rw-r--r-- | desktop/packages/mullvad-vpn/package.json | 11 | ||||
| -rw-r--r-- | desktop/packages/mullvad-vpn/tsconfig.json | 3 | ||||
| -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 |
