diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 74abd84b43665..b6011e83185f5 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -171,7 +171,7 @@ namespace ts { const readFileCache = new Map(); const fileExistsCache = new Map(); const directoryExistsCache = new Map(); - const sourceFileCache = new Map(); + const sourceFileCache = new Map>(); const readFileWithCache = (fileName: string): string | undefined => { const key = toPath(fileName); @@ -196,14 +196,16 @@ namespace ts { return setReadFileCache(key, fileName); }; - const getSourceFileWithCache: CompilerHost["getSourceFile"] | undefined = getSourceFile ? (fileName, languageVersion, onError, shouldCreateNewSourceFile) => { + const getSourceFileWithCache: CompilerHost["getSourceFile"] | undefined = getSourceFile ? (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => { const key = toPath(fileName); - const value = sourceFileCache.get(key); + const impliedNodeFormat: SourceFile["impliedNodeFormat"] = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions.impliedNodeFormat : undefined; + const forPath = sourceFileCache.get(key); + const value = forPath?.get(impliedNodeFormat); if (value) return value; - const sourceFile = getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile); + const sourceFile = getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile); if (sourceFile && (isDeclarationFileName(fileName) || fileExtensionIs(fileName, Extension.Json))) { - sourceFileCache.set(key, sourceFile); + sourceFileCache.set(key, (forPath || new Map()).set(impliedNodeFormat, sourceFile)); } return sourceFile; } : undefined; @@ -228,7 +230,8 @@ namespace ts { sourceFileCache.delete(key); } else if (getSourceFileWithCache) { - const sourceFile = sourceFileCache.get(key); + const sourceFileMap = sourceFileCache.get(key); + const sourceFile = sourceFileMap && firstDefinedIterator(sourceFileMap.values(), identity); if (sourceFile && sourceFile.text !== data) { sourceFileCache.delete(key); } diff --git a/tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js b/tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js index 9d5759a45f983..a2c1eb5d054eb 100644 --- a/tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js +++ b/tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js @@ -108,29 +108,27 @@ Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', resul ======== Type reference directive 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts', primary: true. ======== File '/lib/package.json' does not exist. File '/package.json' does not exist. -src/projects/b/src/index.ts:1:8 - error TS1192: Module '"/src/projects/node_modules/@types/pg/index"' has no default export. - -1 import pg from "pg"; -   ~~ - lib/lib.es2022.full.d.ts Default library for target 'es2022' src/projects/node_modules/@types/pg/index.d.ts Imported via "pg" from file 'src/projects/b/src/index.ts' Entry point for implicit type library 'pg' + File is CommonJS module because 'src/projects/node_modules/@types/pg/package.json' does not have field "type" src/projects/b/src/index.ts Matched by default include pattern '**/*' File is ECMAScript module because 'src/projects/b/package.json' has field "type" with value "module" - -Found 1 error. - -exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated +exitCode:: ExitStatus.Success //// [/src/projects/a/src/index.js] "use strict"; +//// [/src/projects/b/src/index.js] +import pg from "pg"; +pg.foo(); + + Change:: no-change-run @@ -139,58 +137,14 @@ Input:: Output:: /lib/tsc -b /src/projects/a /src/projects/b --verbose --traceResolution --explainFiles -[12:00:28 AM] Projects in this build: +[12:00:29 AM] Projects in this build: * src/projects/a/tsconfig.json * src/projects/b/tsconfig.json -[12:00:29 AM] Project 'src/projects/a/tsconfig.json' is up to date because newest input 'src/projects/a/src/index.ts' is older than output 'src/projects/a/src/index.js' +[12:00:30 AM] Project 'src/projects/a/tsconfig.json' is up to date because newest input 'src/projects/a/src/index.ts' is older than output 'src/projects/a/src/index.js' -[12:00:30 AM] Project 'src/projects/b/tsconfig.json' is out of date because output file 'src/projects/b/src/index.js' does not exist +[12:00:31 AM] Project 'src/projects/b/tsconfig.json' is up to date because newest input 'src/projects/b/src/index.ts' is older than output 'src/projects/b/src/index.js' -[12:00:31 AM] Building project '/src/projects/b/tsconfig.json'... - -File '/src/projects/b/src/package.json' does not exist. -Found 'package.json' at '/src/projects/b/package.json'. -'package.json' does not have a 'typesVersions' field. -======== Resolving module 'pg' from '/src/projects/b/src/index.ts'. ======== -Module resolution kind is not specified, using 'Node16'. -File '/src/projects/b/src/package.json' does not exist according to earlier cached lookups. -File '/src/projects/b/package.json' exists according to earlier cached lookups. -Loading module 'pg' from 'node_modules' folder, target file type 'TypeScript'. -Directory '/src/projects/b/src/node_modules' does not exist, skipping all lookups in it. -Directory '/src/projects/b/node_modules' does not exist, skipping all lookups in it. -Found 'package.json' at '/src/projects/node_modules/@types/pg/package.json'. -'package.json' does not have a 'typesVersions' field. -'package.json' does not have a 'typings' field. -'package.json' has 'types' field 'index.d.ts' that references '/src/projects/node_modules/@types/pg/index.d.ts'. -File '/src/projects/node_modules/@types/pg/index.d.ts' exist - use it as a name resolution result. -Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', result '/src/projects/node_modules/@types/pg/index.d.ts'. -======== Module name 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts'. ======== -File '/src/projects/node_modules/@types/pg/package.json' exists according to earlier cached lookups. -======== Resolving type reference directive 'pg', containing file '/src/projects/b/__inferred type names__.ts', root directory '/src/projects/node_modules/@types'. ======== -Resolving with primary search path '/src/projects/node_modules/@types'. -File '/src/projects/node_modules/@types/pg/package.json' exists according to earlier cached lookups. -'package.json' does not have a 'typings' field. -'package.json' has 'types' field 'index.d.ts' that references '/src/projects/node_modules/@types/pg/index.d.ts'. -File '/src/projects/node_modules/@types/pg/index.d.ts' exist - use it as a name resolution result. -Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', result '/src/projects/node_modules/@types/pg/index.d.ts'. -======== Type reference directive 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts', primary: true. ======== -File '/lib/package.json' does not exist. -File '/package.json' does not exist. -lib/lib.es2022.full.d.ts - Default library for target 'es2022' -src/projects/node_modules/@types/pg/index.d.ts - Imported via "pg" from file 'src/projects/b/src/index.ts' - Entry point for implicit type library 'pg' - File is CommonJS module because 'src/projects/node_modules/@types/pg/package.json' does not have field "type" -src/projects/b/src/index.ts - Matched by default include pattern '**/*' - File is ECMAScript module because 'src/projects/b/package.json' has field "type" with value "module" exitCode:: ExitStatus.Success -//// [/src/projects/b/src/index.js] -import pg from "pg"; -pg.foo(); - -