From 436980632a093cfc77235f0391f156bbc5828f22 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Thu, 30 Apr 2026 20:28:44 +0200 Subject: [PATCH] chore(tooling): add 15 missing direct ESLint deps + Cursor settings cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surfaced during WS-3 1c-prep follow-up: Cursor's ESLint extension uses strict module resolution and crashed on every plugin in the @antfu/eslint-config-vue extends-chain that was only resolvable via pnpm-hoisting in terminal. Direct deps added (versions match what was already in pnpm store — zero version shifts): - 12 unscoped ESLint plugins (eslint-plugin-{antfu,es-x,html,i,jest, jsdoc,jsonc,markdown,n,no-only-tests,unused-imports,yml, eslint-comments}) - vue-eslint-parser - @antfu/eslint-config-basic + @antfu/eslint-config-ts (extends targets) - @stylistic/eslint-plugin-js + @stylistic/eslint-plugin-ts .vscode/settings.json: removed redundant root-level editor.defaultFormatter (per-language overrides do the job). ESLint extension now activates correctly, server runs, save-on-format works for TS/Vue files. Verified via smoke test: double quote in useImpersonationStore.ts:1 was auto-corrected to single quote on Cmd+S. Note: package.json declares some deprecated dependencies that pnpm warns about (@antfu/eslint-config-vue@0.43.1, eslint@8.57.1, eslint-plugin-i@2.28.1, eslint-plugin-markdown@3.0.1). Those are pre-existing — not introduced here. Migration to ESLint v9 + flat config + @antfu/eslint-config (modern) is a separate workstream. Co-Authored-By: Claude Opus 4.7 --- .vscode/settings.json | 36 +++++++++------- apps/app/package.json | 18 ++++++++ apps/app/pnpm-lock.yaml | 94 ++++++++++++++++++++++++++++++++++------- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1e607b84..6e32747d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,57 +1,61 @@ { "editor.formatOnSave": true, "editor.tabSize": 2, - "editor.defaultFormatter": "dbaeumer.vscode-eslint", "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, - "eslint.format.enable": true, "eslint.validate": [ + "javascriptreact", + "typescriptreact", "javascript", "typescript", - "vue" + "vue", + "html" ], + "eslint.useFlatConfig": false, + "eslint.nodePath": "apps/app/node_modules", + "eslint.run": "onSave", "eslint.workingDirectories": [ - { "directory": "apps/admin", "changeProcessCWD": true }, - { "directory": "apps/app", "changeProcessCWD": true }, - { "directory": "apps/portal", "changeProcessCWD": true } + { + "directory": "apps/admin", + "changeProcessCWD": true + }, + { + "directory": "apps/app", + "changeProcessCWD": true + }, + { + "directory": "apps/portal", + "changeProcessCWD": true + } ], - "prettier.enable": false, - "[php]": { "editor.defaultFormatter": "bmewburn.vscode-intelephense-client", "editor.tabSize": 4 }, - "[typescript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, - "[typescriptreact]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, - "[javascript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, - "[vue]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, - "typescript.preferences.importModuleSpecifier": "relative", "typescript.suggest.autoImports": true, - "files.associations": { "*.php": "php", ".env*": "dotenv" }, - "search.exclude": { "**/node_modules": true, "**/vendor": true, "**/dist": true } -} +} \ No newline at end of file diff --git a/apps/app/package.json b/apps/app/package.json index 7b37a1a2..24343078 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -63,6 +63,8 @@ "zod": "3" }, "devDependencies": { + "@antfu/eslint-config-basic": "0.43.1", + "@antfu/eslint-config-ts": "0.43.1", "@antfu/eslint-config-vue": "0.43.1", "@antfu/utils": "0.7.10", "@fullcalendar/core": "6.1.19", @@ -79,6 +81,8 @@ "@iconify/utils": "2.3.0", "@iconify/vue": "4.1.2", "@intlify/unplugin-vue-i18n": "11.0.1", + "@stylistic/eslint-plugin-js": "0.0.4", + "@stylistic/eslint-plugin-ts": "0.0.4", "@stylistic/stylelint-config": "1.0.1", "@stylistic/stylelint-plugin": "2.1.3", "@testing-library/vue": "^8.1.0", @@ -101,13 +105,26 @@ "eslint": "8.57.1", "eslint-config-airbnb-base": "15.0.0", "eslint-import-resolver-typescript": "3.10.1", + "eslint-plugin-antfu": "0.43.1", "eslint-plugin-case-police": "0.6.1", + "eslint-plugin-es-x": "7.8.0", + "eslint-plugin-eslint-comments": "3.2.0", + "eslint-plugin-html": "7.1.0", + "eslint-plugin-i": "2.28.1", "eslint-plugin-import": "2.32.0", + "eslint-plugin-jest": "27.9.0", + "eslint-plugin-jsdoc": "46.10.1", + "eslint-plugin-jsonc": "2.21.0", + "eslint-plugin-markdown": "3.0.1", + "eslint-plugin-n": "16.6.2", + "eslint-plugin-no-only-tests": "3.3.0", "eslint-plugin-promise": "6.6.0", "eslint-plugin-regex": "1.10.0", "eslint-plugin-sonarjs": "0.24.0", "eslint-plugin-unicorn": "51.0.1", + "eslint-plugin-unused-imports": "3.2.0", "eslint-plugin-vue": "9.33.0", + "eslint-plugin-yml": "1.19.0", "happy-dom": "^20.9.0", "msw": "2.6.8", "postcss-html": "1.8.0", @@ -130,6 +147,7 @@ "vite-plugin-vuetify": "2.1.2", "vite-svg-loader": "5.1.0", "vitest": "^4.1.5", + "vue-eslint-parser": "9.4.3", "vue-shepherd": "3.0.0", "vue-tsc": "3.1.2" }, diff --git a/apps/app/pnpm-lock.yaml b/apps/app/pnpm-lock.yaml index b661647d..f58facfe 100644 --- a/apps/app/pnpm-lock.yaml +++ b/apps/app/pnpm-lock.yaml @@ -145,6 +145,12 @@ importers: specifier: '3' version: 3.25.76 devDependencies: + '@antfu/eslint-config-basic': + specifier: 0.43.1 + version: 0.43.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)(typescript@5.9.3) + '@antfu/eslint-config-ts': + specifier: 0.43.1 + version: 0.43.1(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)(typescript@5.9.3) '@antfu/eslint-config-vue': specifier: 0.43.1 version: 0.43.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1)(typescript@5.9.3) @@ -193,6 +199,12 @@ importers: '@intlify/unplugin-vue-i18n': specifier: 11.0.1 version: 11.0.1(@vue/compiler-dom@3.5.22)(eslint@8.57.1)(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) + '@stylistic/eslint-plugin-js': + specifier: 0.0.4 + version: 0.0.4 + '@stylistic/eslint-plugin-ts': + specifier: 0.0.4 + version: 0.0.4(eslint@8.57.1)(typescript@5.9.3) '@stylistic/stylelint-config': specifier: 1.0.1 version: 1.0.1(stylelint@16.8.0(typescript@5.9.3)) @@ -259,12 +271,45 @@ importers: eslint-import-resolver-typescript: specifier: 3.10.1 version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-antfu: + specifier: 0.43.1 + version: 0.43.1(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-case-police: specifier: 0.6.1 version: 0.6.1(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-es-x: + specifier: 7.8.0 + version: 7.8.0(eslint@8.57.1) + eslint-plugin-eslint-comments: + specifier: 3.2.0 + version: 3.2.0(eslint@8.57.1) + eslint-plugin-html: + specifier: 7.1.0 + version: 7.1.0 + eslint-plugin-i: + specifier: 2.28.1 + version: 2.28.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-import: specifier: 2.32.0 version: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-jest: + specifier: 27.9.0 + version: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + eslint-plugin-jsdoc: + specifier: 46.10.1 + version: 46.10.1(eslint@8.57.1) + eslint-plugin-jsonc: + specifier: 2.21.0 + version: 2.21.0(eslint@8.57.1) + eslint-plugin-markdown: + specifier: 3.0.1 + version: 3.0.1(eslint@8.57.1) + eslint-plugin-n: + specifier: 16.6.2 + version: 16.6.2(eslint@8.57.1) + eslint-plugin-no-only-tests: + specifier: 3.3.0 + version: 3.3.0 eslint-plugin-promise: specifier: 6.6.0 version: 6.6.0(eslint@8.57.1) @@ -277,9 +322,15 @@ importers: eslint-plugin-unicorn: specifier: 51.0.1 version: 51.0.1(eslint@8.57.1) + eslint-plugin-unused-imports: + specifier: 3.2.0 + version: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-vue: specifier: 9.33.0 version: 9.33.0(eslint@8.57.1) + eslint-plugin-yml: + specifier: 1.19.0 + version: 1.19.0(eslint@8.57.1) happy-dom: specifier: ^20.9.0 version: 20.9.0 @@ -346,6 +397,9 @@ importers: vitest: specifier: ^4.1.5 version: 4.1.5(@types/node@24.9.2)(happy-dom@20.9.0)(msw@2.6.8(@types/node@24.9.2)(typescript@5.9.3))(vite@7.1.12(@types/node@24.9.2)(sass@1.76.0)(tsx@4.20.6)(yaml@2.8.1)) + vue-eslint-parser: + specifier: 9.4.3 + version: 9.4.3(eslint@8.57.1) vue-shepherd: specifier: 3.0.0 version: 3.0.0(vue@3.5.22(typescript@5.9.3)) @@ -6529,7 +6583,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -6667,7 +6721,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -6729,7 +6783,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) eslint: 8.57.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -7305,7 +7359,7 @@ snapshots: builtins@5.1.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 bundle-name@4.1.0: dependencies: @@ -7835,12 +7889,12 @@ snapshots: eslint-compat-utils@0.5.1(eslint@8.57.1): dependencies: eslint: 8.57.1 - semver: 7.7.3 + semver: 7.7.4 eslint-compat-utils@0.6.5(eslint@8.57.1): dependencies: eslint: 8.57.1 - semver: 7.7.3 + semver: 7.7.4 eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: @@ -8031,6 +8085,16 @@ snapshots: - supports-color - typescript + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsdoc@46.10.1(eslint@8.57.1): dependencies: '@es-joy/jsdoccomment': 0.41.0 @@ -8041,7 +8105,7 @@ snapshots: eslint: 8.57.1 esquery: 1.6.0 is-builtin-module: 3.2.1 - semver: 7.7.3 + semver: 7.7.4 spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color @@ -8074,14 +8138,14 @@ snapshots: builtins: 5.1.0 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.13.0 + get-tsconfig: 4.13.7 globals: 13.24.0 ignore: 5.3.2 is-builtin-module: 3.2.1 is-core-module: 2.16.1 - minimatch: 3.1.2 - resolve: 1.22.11 - semver: 7.7.3 + minimatch: 3.1.5 + resolve: 1.22.12 + semver: 7.7.4 eslint-plugin-no-only-tests@3.3.0: {} @@ -8124,7 +8188,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.7.3 + semver: 7.7.4 strip-indent: 3.0.0 eslint-plugin-unicorn@51.0.1(eslint@8.57.1): @@ -8498,7 +8562,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -9176,7 +9240,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.11 + resolve: 1.22.12 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -10683,7 +10747,7 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color