From 05d739be7e1345eb77cc5a2c6dcbc178b21d79bc Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 26 Sep 2022 15:35:18 -0700 Subject: [PATCH] Add test that fails --- src/harness/fakesHosts.ts | 1 + src/harness/virtualFileSystemWithWatch.ts | 1 + .../unittests/tsbuild/moduleResolution.ts | 34 ++- ...iffers-between-projects-for-shared-file.js | 196 ++++++++++++++++++ 4 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js diff --git a/src/harness/fakesHosts.ts b/src/harness/fakesHosts.ts index 1868561a34c..17fbc398339 100644 --- a/src/harness/fakesHosts.ts +++ b/src/harness/fakesHosts.ts @@ -41,6 +41,7 @@ namespace fakes { } public write(message: string) { + if (ts.Debug.isDebugging) console.log(message); this.output.push(message); } diff --git a/src/harness/virtualFileSystemWithWatch.ts b/src/harness/virtualFileSystemWithWatch.ts index 3006a3f1ffd..d8a30e66580 100644 --- a/src/harness/virtualFileSystemWithWatch.ts +++ b/src/harness/virtualFileSystemWithWatch.ts @@ -987,6 +987,7 @@ interface Array { length: number; [n: number]: T; }` } write(message: string) { + if (Debug.isDebugging) console.log(message); this.output.push(message); } diff --git a/src/testRunner/unittests/tsbuild/moduleResolution.ts b/src/testRunner/unittests/tsbuild/moduleResolution.ts index 487f83196c3..772a30262a0 100644 --- a/src/testRunner/unittests/tsbuild/moduleResolution.ts +++ b/src/testRunner/unittests/tsbuild/moduleResolution.ts @@ -86,4 +86,36 @@ namespace ts.tscWatch { commandLineArgs: ["-b", "/src/packages/pkg1.tsconfig.json", "/src/packages/pkg2.tsconfig.json", "--verbose", "--traceResolution"], }); }); -} + + describe("unittests:: tsbuild:: moduleResolution:: impliedNodeFormat differs between projects for shared file", () => { + verifyTscWithEdits({ + scenario: "moduleResolution", + subScenario: "impliedNodeFormat differs between projects for shared file", + fs: () => loadProjectFromFiles({ + "/src/projects/a/src/index.ts": "", + "/src/projects/a/tsconfig.json": JSON.stringify({ + compilerOptions: { strict: true } + }), + "/src/projects/b/src/index.ts": Utils.dedent` + import pg from "pg"; + pg.foo(); + `, + "/src/projects/b/tsconfig.json": JSON.stringify({ + compilerOptions: { strict: true, module: "node16" } + }), + "/src/projects/b/package.json": JSON.stringify({ + name: "b", + type: "module" + }), + "/src/projects/node_modules/@types/pg/index.d.ts": "export function foo(): void;", + "/src/projects/node_modules/@types/pg/package.json": JSON.stringify({ + name: "@types/pg", + types: "index.d.ts", + }), + }), + modifyFs: fs => fs.writeFileSync("/lib/lib.es2022.full.d.ts", libFile.content), + commandLineArgs: ["-b", "/src/projects/a", "/src/projects/b", "--verbose", "--traceResolution", "--explainFiles"], + edits: noChangeOnlyRuns + }); + }); +} \ No newline at end of file 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 new file mode 100644 index 00000000000..9d5759a45f9 --- /dev/null +++ b/tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js @@ -0,0 +1,196 @@ +Input:: +//// [/lib/lib.d.ts] +/// +interface Boolean {} +interface Function {} +interface CallableFunction {} +interface NewableFunction {} +interface IArguments {} +interface Number { toExponential: any; } +interface Object {} +interface RegExp {} +interface String { charAt: any; } +interface Array { length: number; [n: number]: T; } +interface ReadonlyArray {} +declare const console: { log(msg: any): void; }; + +//// [/lib/lib.es2022.full.d.ts] +/// +interface Boolean {} +interface Function {} +interface CallableFunction {} +interface NewableFunction {} +interface IArguments {} +interface Number { toExponential: any; } +interface Object {} +interface RegExp {} +interface String { charAt: any; } +interface Array { length: number; [n: number]: T; } + +//// [/src/projects/a/src/index.ts] + + +//// [/src/projects/a/tsconfig.json] +{"compilerOptions":{"strict":true}} + +//// [/src/projects/b/package.json] +{"name":"b","type":"module"} + +//// [/src/projects/b/src/index.ts] +import pg from "pg"; +pg.foo(); + + +//// [/src/projects/b/tsconfig.json] +{"compilerOptions":{"strict":true,"module":"node16"}} + +//// [/src/projects/node_modules/@types/pg/index.d.ts] +export function foo(): void; + +//// [/src/projects/node_modules/@types/pg/package.json] +{"name":"@types/pg","types":"index.d.ts"} + + + +Output:: +/lib/tsc -b /src/projects/a /src/projects/b --verbose --traceResolution --explainFiles +[12:00:22 AM] Projects in this build: + * src/projects/a/tsconfig.json + * src/projects/b/tsconfig.json + +[12:00:23 AM] Project 'src/projects/a/tsconfig.json' is out of date because output file 'src/projects/a/src/index.js' does not exist + +[12:00:24 AM] Building project '/src/projects/a/tsconfig.json'... + +======== Resolving type reference directive 'pg', containing file '/src/projects/a/__inferred type names__.ts', root directory '/src/projects/node_modules/@types'. ======== +Resolving with primary search path '/src/projects/node_modules/@types'. +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'. +======== Type reference directive 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts', primary: true. ======== +lib/lib.d.ts + Default library for target 'es3' +src/projects/a/src/index.ts + Matched by default include pattern '**/*' +src/projects/node_modules/@types/pg/index.d.ts + Entry point for implicit type library 'pg' +[12:00:26 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:27 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. +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'. +======== 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. +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' +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 + + +//// [/src/projects/a/src/index.js] +"use strict"; + + + + +Change:: no-change-run +Input:: + + +Output:: +/lib/tsc -b /src/projects/a /src/projects/b --verbose --traceResolution --explainFiles +[12:00:28 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/b/tsconfig.json' is out of date because output file 'src/projects/b/src/index.js' does not exist + +[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(); + +