From 6697e04dcebea6aa36cb90eb35e5c80d08a1f1a5 Mon Sep 17 00:00:00 2001 From: leey0818 Date: Tue, 28 Oct 2025 17:41:42 +0900 Subject: [PATCH 1/2] fix: check tsconfig matching before using resolver --- src/index.ts | 12 +++++++----- tests/e2e/__snapshots__/e2e.spec.ts.snap | 8 ++++++++ .../multipleTsconfigsWithReferences/.eslintrc.cjs | 8 ++++++++ .../multipleTsconfigsWithReferences/backend/index.ts | 10 ++++++++++ .../multipleTsconfigsWithReferences/backend/utils.ts | 3 +++ .../frontend/component.tsx | 1 + .../frontend/index.tsx | 10 ++++++++++ .../shared-utils/helper.ts | 3 +++ .../multipleTsconfigsWithReferences/tsconfig.json | 7 +++++++ .../tsconfig.node.json | 11 +++++++++++ .../tsconfig.web.json | 12 ++++++++++++ 11 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 tests/e2e/multipleTsconfigsWithReferences/.eslintrc.cjs create mode 100644 tests/e2e/multipleTsconfigsWithReferences/backend/index.ts create mode 100644 tests/e2e/multipleTsconfigsWithReferences/backend/utils.ts create mode 100644 tests/e2e/multipleTsconfigsWithReferences/frontend/component.tsx create mode 100644 tests/e2e/multipleTsconfigsWithReferences/frontend/index.tsx create mode 100644 tests/e2e/multipleTsconfigsWithReferences/shared-utils/helper.ts create mode 100644 tests/e2e/multipleTsconfigsWithReferences/tsconfig.json create mode 100644 tests/e2e/multipleTsconfigsWithReferences/tsconfig.node.json create mode 100644 tests/e2e/multipleTsconfigsWithReferences/tsconfig.web.json diff --git a/src/index.ts b/src/index.ts index 486bc8f0..81e6f49f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -98,11 +98,6 @@ export const resolve = ( // must be an array with 2+ items here already ensured by `normalizeOptions` const projects = sortProjectsByAffinity(options.project as string[], file) for (const tsconfigPath of projects) { - const resolverCached = resolverCache.get(tsconfigPath) - if (resolverCached) { - resolver = resolverCached - break createResolver - } let tsconfigCached = tsconfigCache.get(tsconfigPath) if (!tsconfigCached) { tsconfigCache.set( @@ -126,6 +121,13 @@ export const resolve = ( continue } log('matched tsconfig at:', tsconfigPath, 'for', file) + + const resolverCached = resolverCache.get(tsconfigPath) + if (resolverCached) { + resolver = resolverCached + break createResolver + } + options = { ...options, tsconfig: { diff --git a/tests/e2e/__snapshots__/e2e.spec.ts.snap b/tests/e2e/__snapshots__/e2e.spec.ts.snap index b48beee6..5d9526fe 100644 --- a/tests/e2e/__snapshots__/e2e.spec.ts.snap +++ b/tests/e2e/__snapshots__/e2e.spec.ts.snap @@ -64,6 +64,14 @@ exports[`e2e cases > should exec eslint successfully > multipleTsconfigs 1`] = ` } `; +exports[`e2e cases > should exec eslint successfully > multipleTsconfigsWithReferences 1`] = ` +{ + "exitCode": 0, + "stderr": "", + "stdout": "", +} +`; + exports[`e2e cases > should exec eslint successfully > nearestTsconfig 1`] = ` { "exitCode": 0, diff --git a/tests/e2e/multipleTsconfigsWithReferences/.eslintrc.cjs b/tests/e2e/multipleTsconfigsWithReferences/.eslintrc.cjs new file mode 100644 index 00000000..49247ccd --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/.eslintrc.cjs @@ -0,0 +1,8 @@ +const path = require('node:path') + +const project = [ + path.resolve(__dirname, 'tsconfig.node.json'), + path.resolve(__dirname, 'tsconfig.web.json'), +] + +module.exports = require('../base.eslintrc.cjs')(project) diff --git a/tests/e2e/multipleTsconfigsWithReferences/backend/index.ts b/tests/e2e/multipleTsconfigsWithReferences/backend/index.ts new file mode 100644 index 00000000..174f8c66 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/backend/index.ts @@ -0,0 +1,10 @@ +// import relative +import './utils' + +// import using tsconfig path mapping +import '@backend/utils' +import '@shared/helper' + +// import from node_module +import 'typescript' +import 'dummy.js' diff --git a/tests/e2e/multipleTsconfigsWithReferences/backend/utils.ts b/tests/e2e/multipleTsconfigsWithReferences/backend/utils.ts new file mode 100644 index 00000000..8d1db709 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/backend/utils.ts @@ -0,0 +1,3 @@ +export const utilA = () => { + return 'backend utility' +} diff --git a/tests/e2e/multipleTsconfigsWithReferences/frontend/component.tsx b/tests/e2e/multipleTsconfigsWithReferences/frontend/component.tsx new file mode 100644 index 00000000..e500b41b --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/frontend/component.tsx @@ -0,0 +1 @@ +export default 'React Component' diff --git a/tests/e2e/multipleTsconfigsWithReferences/frontend/index.tsx b/tests/e2e/multipleTsconfigsWithReferences/frontend/index.tsx new file mode 100644 index 00000000..c3cbd772 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/frontend/index.tsx @@ -0,0 +1,10 @@ +// import relative +import './component' + +// import using tsconfig path mapping +import '@frontend/component' +import '@shared/helper' + +// import from node_module +import 'typescript' +import 'dummy.js' diff --git a/tests/e2e/multipleTsconfigsWithReferences/shared-utils/helper.ts b/tests/e2e/multipleTsconfigsWithReferences/shared-utils/helper.ts new file mode 100644 index 00000000..0d3e66e1 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/shared-utils/helper.ts @@ -0,0 +1,3 @@ +export const helperB = () => { + return 'shared helper' +} diff --git a/tests/e2e/multipleTsconfigsWithReferences/tsconfig.json b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.json new file mode 100644 index 00000000..155ebaa6 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.web.json" } + ] +} diff --git a/tests/e2e/multipleTsconfigsWithReferences/tsconfig.node.json b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.node.json new file mode 100644 index 00000000..3a51d992 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@backend/*": ["backend/*"], + "@shared/*": ["shared-utils/*"] + } + }, + "include": ["backend/**/*", "shared-utils/**/*"] +} diff --git a/tests/e2e/multipleTsconfigsWithReferences/tsconfig.web.json b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.web.json new file mode 100644 index 00000000..9a0257e6 --- /dev/null +++ b/tests/e2e/multipleTsconfigsWithReferences/tsconfig.web.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "jsx": "react", + "baseUrl": ".", + "paths": { + "@frontend/*": ["frontend/*"], + "@shared/*": ["shared-utils/*"] + } + }, + "include": ["frontend/**/*", "shared-utils/**/*"] +} From 2be84aed5c7d4ca85456c706c5d8de8085ecc778 Mon Sep 17 00:00:00 2001 From: leey0818 Date: Tue, 28 Oct 2025 18:01:19 +0900 Subject: [PATCH 2/2] chore: add changeset --- .changeset/large-insects-kiss.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/large-insects-kiss.md diff --git a/.changeset/large-insects-kiss.md b/.changeset/large-insects-kiss.md new file mode 100644 index 00000000..efaff828 --- /dev/null +++ b/.changeset/large-insects-kiss.md @@ -0,0 +1,5 @@ +--- +"eslint-import-resolver-typescript": patch +--- + +fix: check tsconfig matching before using resolver