From f25c3674feecacc8c73df66452d82781c2612a49 Mon Sep 17 00:00:00 2001 From: somni Date: Mon, 10 Jun 2024 17:06:32 +0900 Subject: [PATCH] all: WIP migrate ESLint legacy configs to flat config Need keep testing that it's working VSCode ESLint extension should be updated to latest insider version I guess, and the extension seems stop working sometimes... Don't restart ESLint server in VSCode, or it will stop working after that until restart VSCode..? --- .eslintrc.js | 73 --- .vscode/extensions.json | 4 +- MyBoothManager.code-workspace | 13 + README.md | 4 + package.json | 5 +- packages/Common/.eslintrc.cjs | 32 -- packages/Common/eslint.config.mjs | 5 + packages/Common/jest.config.cjs | 2 - packages/Common/package.json | 9 +- .../src/interfaces/goods-combination.ts | 2 - packages/Common/src/interfaces/goods.ts | 2 - packages/Common/src/utils/functions.ts | 2 - packages/Common/tsconfig.build.cjs.json | 2 +- packages/Common/tsconfig.build.esm.json | 2 +- packages/CommonUI/.eslintrc.cjs | 12 - packages/CommonUI/eslint.config.mjs | 5 + packages/CommonUI/package.json | 6 +- .../components/global/GlobalSnackbarStack.vue | 2 +- .../src/components/goods/GoodsListView.vue | 2 +- .../src/entities/ui-context/snackbar.ts | 8 +- packages/DevShared/eslint.config.mjs | 5 + packages/DevShared/eslint/additional.mjs | 13 + packages/DevShared/eslint/import.mjs | 37 ++ packages/DevShared/eslint/index.mjs | 42 ++ packages/DevShared/eslint/stylistic.mjs | 43 ++ packages/DevShared/eslint/typescript-vue.mjs | 48 ++ packages/DevShared/eslint/typescript.mjs | 10 + packages/DevShared/index.mjs | 1 + packages/DevShared/package.json | 28 + pnpm-lock.yaml | 541 +++++++++++------- projects/Admin/.eslintrc.cjs | 11 - projects/Admin/eslint.config.mjs | 5 + projects/Admin/package.json | 7 +- projects/Backend/.eslintrc.cjs | 36 -- projects/Backend/eslint.config.mjs | 5 + projects/Backend/package.json | 7 +- projects/Public/eslint.config.mjs | 5 + projects/Public/package.json | 6 +- 38 files changed, 628 insertions(+), 414 deletions(-) delete mode 100644 .eslintrc.js delete mode 100644 packages/Common/.eslintrc.cjs create mode 100644 packages/Common/eslint.config.mjs delete mode 100644 packages/CommonUI/.eslintrc.cjs create mode 100644 packages/CommonUI/eslint.config.mjs create mode 100644 packages/DevShared/eslint.config.mjs create mode 100644 packages/DevShared/eslint/additional.mjs create mode 100644 packages/DevShared/eslint/import.mjs create mode 100644 packages/DevShared/eslint/index.mjs create mode 100644 packages/DevShared/eslint/stylistic.mjs create mode 100644 packages/DevShared/eslint/typescript-vue.mjs create mode 100644 packages/DevShared/eslint/typescript.mjs create mode 100644 packages/DevShared/index.mjs create mode 100644 packages/DevShared/package.json delete mode 100644 projects/Admin/.eslintrc.cjs create mode 100644 projects/Admin/eslint.config.mjs delete mode 100644 projects/Backend/.eslintrc.cjs create mode 100644 projects/Backend/eslint.config.mjs create mode 100644 projects/Public/eslint.config.mjs diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index febecad1..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,73 +0,0 @@ -/** @type {import("eslint").ESLint.ConfigData} */ -module.exports = { - root: false, - env: { - es2021: true, - node: true, - }, - extends: [ - "eslint:recommended", - "plugin:import/typescript", - "plugin:import/recommended", - ], - settings: { - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"], - }, - "import/resolver": { - typescript: true, - }, - }, - parserOptions: { - ecmaVersion: "latest", - }, - rules: { - "indent": [ "error", 2, { - SwitchCase: 1, - VariableDeclarator: "first", - FunctionDeclaration: { parameters: "first" }, - FunctionExpression: { parameters: "first" }, - CallExpression: { arguments: "first" }, - ArrayExpression: 1, - ObjectExpression: 1, - ignoredNodes: [ - "FunctionExpression > .params[decorators.length > 0]", - "FunctionExpression > .params > :matches(Decorator, :not(:first-child))", - "ClassBody.body > PropertyDefinition[decorators.length > 0] > .key", - ], - }], - "quotes": [ "error", "double" ], - "semi": [ "error", "always" ], - "semi-spacing": [ "error", { - before: false, - after: true, - }], - "arrow-body-style": [ "error", "as-needed" ], - "brace-style": [ "error", "1tbs", { allowSingleLine: true } ], - "block-spacing": [ "error", "always" ], - "space-before-blocks": [ "error", "always" ], - "space-infix-ops": "error", - "keyword-spacing": [ "error", { - before: true, - after: true, - overrides: { - if: { after: false }, - for: { after: false }, - while: { after: false }, - switch: { after: false }, - with: { after: false }, - catch: { after: false }, - }, - }], - "quote-props": [ "error", "consistent-as-needed" ], - "comma-dangle": [ "error", "always-multiline" ], - "linebreak-style": [ "error", "unix" ], - "eqeqeq": [ "error", "always", { null: "ignore" } ], - "import/order": [ "error", { - groups: ["type", "builtin", "external", "internal", "parent", "sibling", "index", "object"], - }], - "import/first": "error", - "import/newline-after-import": "error", - "import/exports-last": "error", - }, -}; diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ff356eeb..fa2990c1 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,9 @@ { "recommendations": [ "dbaeumer.vscode-eslint", - "Vue.vscode-typescript-vue-plugin" + "Vue.volar", + "EditorConfig.EditorConfig", + "Orta.vscode-jest" ], "unwantedRecommendations": [ "svelte.svelte-vscode" diff --git a/MyBoothManager.code-workspace b/MyBoothManager.code-workspace index 513de3b2..677d57ae 100644 --- a/MyBoothManager.code-workspace +++ b/MyBoothManager.code-workspace @@ -12,6 +12,10 @@ "name": "[packages] Common UI", "path": "packages/CommonUI" }, + { + "name": "[packages] Dev Shared", + "path": "packages/DevShared" + }, { "name": "[packages] I18n", "path": "packages/I18n" @@ -34,6 +38,15 @@ { "pattern": "./packages/*/" }, { "pattern": "./projects/*/" } ], + "eslint.useFlatConfig": true, + "eslint.validate": [ + "javascript", + "typescript", + "vue", + "html" + ], + "eslint.lintTask.enable": true, + "eslint.run": "onType", "typescript.tsdk": "node_modules/typescript/lib" } } diff --git a/README.md b/README.md index 006281b5..b70efe0f 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,10 @@ This is an in-development project for **managing booths and goods**, recording o $ pnpm all:version minor # or major, patch ``` +### Misc +* In [root `package.json`](package.json), [`@myboothmanager/dev-shared`](packages/DevShared/) is registered as dev dependency.
+ This is intended, and is mandatory to make VSCode ESLint plugin work properly in sub-projects which extends the shared ESLint config. + ## Copyright & License Copyright © 2023- **[somni](https://github.com/somnisomni)**, All rights reserved. diff --git a/package.json b/package.json index 901623cf..c227eb26 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,9 @@ "test:cov": "pnpm jest --coverage" }, "devDependencies": { + "@myboothmanager/dev-shared": "workspace:^", "@types/node": "^20.14.2", - "@typescript-eslint/parser": "^7.12.0", "concurrently": "^8.2.2", - "eslint": "^8", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", "jest": "^29.7.0", "ts-jest": "^29.1.4", "typescript": "^5.4.5" diff --git a/packages/Common/.eslintrc.cjs b/packages/Common/.eslintrc.cjs deleted file mode 100644 index 6cd7bf53..00000000 --- a/packages/Common/.eslintrc.cjs +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-env node */ -require("@rushstack/eslint-patch/modern-module-resolution"); - -module.exports = { - extends: [ - "../../.eslintrc.js", - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - ], - overrides: [ - { - env: { - node: true, - }, - files: [ - ".eslintrc.{js,cjs}", - ], - parserOptions: { - sourceType: "script", - }, - }, - ], - ignorePatterns: ["dist/**/*"], - parser: "@typescript-eslint/parser", - parserOptions: { - ecmaVersion: "latest", - sourceType: "module", - }, - plugins: [ - "@typescript-eslint", - ], -}; diff --git a/packages/Common/eslint.config.mjs b/packages/Common/eslint.config.mjs new file mode 100644 index 00000000..05a7259f --- /dev/null +++ b/packages/Common/eslint.config.mjs @@ -0,0 +1,5 @@ +import { eslintConfigs } from "@myboothmanager/dev-shared"; + +export default [ + ...eslintConfigs.typescript, +]; diff --git a/packages/Common/jest.config.cjs b/packages/Common/jest.config.cjs index 96985d85..22053fe5 100644 --- a/packages/Common/jest.config.cjs +++ b/packages/Common/jest.config.cjs @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/no-var-requires */ const { JestConfigWithTsJest, pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig.json"); diff --git a/packages/Common/package.json b/packages/Common/package.json index 27c67563..ede61718 100644 --- a/packages/Common/package.json +++ b/packages/Common/package.json @@ -12,22 +12,19 @@ "build:esm": "tsc -p tsconfig.build.esm.json && tsc-alias -p tsconfig.build.esm.json", "build:cjs": "tsc -p tsconfig.build.cjs.json && tsc-alias -p tsconfig.build.cjs.json", "clean": "rimraf ./dist", - "lint": "eslint", + "lint": "eslint .", "test": "jest" }, "files": [ "./dist" ], "devDependencies": { + "@myboothmanager/dev-shared": "workspace:^", "@rushstack/eslint-patch": "^1.10.3", "@tsconfig/node20": "^20.1.4", "@types/jest": "^29.5.12", "@types/node": "^20.14.2", - "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.12.0", - "eslint": "^8", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", + "eslint": "^9.4.0", "execa": "^9.2.0", "jest": "^29.7.0", "rimraf": "^5.0.7", diff --git a/packages/Common/src/interfaces/goods-combination.ts b/packages/Common/src/interfaces/goods-combination.ts index ac47b822..759171e7 100644 --- a/packages/Common/src/interfaces/goods-combination.ts +++ b/packages/Common/src/interfaces/goods-combination.ts @@ -1,5 +1,3 @@ -/* eslint-disable import/exports-last */ - import { GoodsStockVisibility, IGoodsCommon, IGoodsFrontendCommon, IGoodsStock } from "./goods"; /* === Common === */ diff --git a/packages/Common/src/interfaces/goods.ts b/packages/Common/src/interfaces/goods.ts index b063f7fe..ba0483ed 100644 --- a/packages/Common/src/interfaces/goods.ts +++ b/packages/Common/src/interfaces/goods.ts @@ -1,5 +1,3 @@ -/* eslint-disable import/exports-last */ - import { IImageUploadInfo } from "./base"; /* === Common === */ diff --git a/packages/Common/src/utils/functions.ts b/packages/Common/src/utils/functions.ts index 905a0f42..88acccf8 100644 --- a/packages/Common/src/utils/functions.ts +++ b/packages/Common/src/utils/functions.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - export function emptyObject(target: Record): void { Object.keys(target).forEach((key) => delete target[key]); } diff --git a/packages/Common/tsconfig.build.cjs.json b/packages/Common/tsconfig.build.cjs.json index a951d67c..37cb5c25 100644 --- a/packages/Common/tsconfig.build.cjs.json +++ b/packages/Common/tsconfig.build.cjs.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", - "exclude": ["./dist", "node_modules", "**/__tests__/**"], + "exclude": ["./dist", "./node_modules", "**/__tests__/**"], "compilerOptions": { "outDir": "./dist/cjs", "module": "CommonJS", diff --git a/packages/Common/tsconfig.build.esm.json b/packages/Common/tsconfig.build.esm.json index f0bb2eb2..9d6126d5 100644 --- a/packages/Common/tsconfig.build.esm.json +++ b/packages/Common/tsconfig.build.esm.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", - "exclude": ["./dist", "node_modules", "**/__tests__/**"], + "exclude": ["./dist", "./node_modules", "**/__tests__/**"], "compilerOptions": { "outDir": "./dist/esm", "module": "ESNext", diff --git a/packages/CommonUI/.eslintrc.cjs b/packages/CommonUI/.eslintrc.cjs deleted file mode 100644 index 5498c79f..00000000 --- a/packages/CommonUI/.eslintrc.cjs +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-env node */ -require("@rushstack/eslint-patch/modern-module-resolution"); - -module.exports = { - root: true, - extends: [ - "../../.eslintrc.js", - "plugin:vue/vue3-essential", - "eslint:recommended", - "@vue/eslint-config-typescript", - ], -}; diff --git a/packages/CommonUI/eslint.config.mjs b/packages/CommonUI/eslint.config.mjs new file mode 100644 index 00000000..127119df --- /dev/null +++ b/packages/CommonUI/eslint.config.mjs @@ -0,0 +1,5 @@ +import { eslintConfigs } from "@myboothmanager/dev-shared"; + +export default [ + ...eslintConfigs.vue, +]; diff --git a/packages/CommonUI/package.json b/packages/CommonUI/package.json index 16d040a1..6ae4ac60 100644 --- a/packages/CommonUI/package.json +++ b/packages/CommonUI/package.json @@ -10,7 +10,7 @@ "clean": "rimraf ./dist", "build-only": "vite build && vue-tsc -p tsconfig.app.json --emitDeclarationOnly", "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" + "lint": "eslint ." }, "files": [ "./dist" @@ -20,15 +20,15 @@ "module": "./dist/common-ui.js", "devDependencies": { "@mdi/font": "^7.4.47", + "@myboothmanager/dev-shared": "workspace:^", "@myboothmanager/common": "workspace:^", "@rushstack/eslint-patch": "^1.10.3", "@tsconfig/node20": "^20.1.4", "@types/clone-deep": "^4.0.4", "@types/node": "^20.14.2", "@vitejs/plugin-vue": "^5.0.5", - "@vue/eslint-config-typescript": "^13.0.0", "@vue/tsconfig": "^0.5.1", - "eslint": "^8", + "eslint": "^9.4.0", "eslint-plugin-vue": "^9.26.0", "npm-run-all2": "^6.2.0", "rimraf": "^5.0.7", diff --git a/packages/CommonUI/src/components/global/GlobalSnackbarStack.vue b/packages/CommonUI/src/components/global/GlobalSnackbarStack.vue index 631d122a..a592ec7a 100644 --- a/packages/CommonUI/src/components/global/GlobalSnackbarStack.vue +++ b/packages/CommonUI/src/components/global/GlobalSnackbarStack.vue @@ -27,8 +27,8 @@