diff --git a/src/testRunner/unittests/tsbuild/moduleResolution.ts b/src/testRunner/unittests/tsbuild/moduleResolution.ts index 11403bdc18fdd..487f83196c36e 100644 --- a/src/testRunner/unittests/tsbuild/moduleResolution.ts +++ b/src/testRunner/unittests/tsbuild/moduleResolution.ts @@ -65,5 +65,25 @@ namespace ts.tscWatch { commandLineArgs: ["-b", "packages/pkg1", "--verbose", "--traceResolution"], changes: emptyArray }); + + verifyTsc({ + scenario: "moduleResolution", + subScenario: `type reference resolution uses correct options for different resolution options referenced project`, + fs: () => loadProjectFromFiles({ + "/src/packages/pkg1_index.ts": `export const theNum: TheNum = "type1";`, + "/src/packages/pkg1.tsconfig.json": JSON.stringify({ + compilerOptions: { composite: true, typeRoots: ["./typeroot1"] }, + files: ["./pkg1_index.ts"] + }), + "/src/packages/typeroot1/sometype/index.d.ts": Utils.dedent`declare type TheNum = "type1";`, + "/src/packages/pkg2_index.ts": `export const theNum: TheNum2 = "type2";`, + "/src/packages/pkg2.tsconfig.json": JSON.stringify({ + compilerOptions: { composite: true, typeRoots: ["./typeroot2"] }, + files: ["./pkg2_index.ts"] + }), + "/src/packages/typeroot2/sometype/index.d.ts": Utils.dedent`declare type TheNum2 = "type2";`, + }), + commandLineArgs: ["-b", "/src/packages/pkg1.tsconfig.json", "/src/packages/pkg2.tsconfig.json", "--verbose", "--traceResolution"], + }); }); } diff --git a/tests/baselines/reference/tsbuild/moduleResolution/initial-build/type-reference-resolution-uses-correct-options-for-different-resolution-options-referenced-project.js b/tests/baselines/reference/tsbuild/moduleResolution/initial-build/type-reference-resolution-uses-correct-options-for-different-resolution-options-referenced-project.js new file mode 100644 index 0000000000000..d45fadacea080 --- /dev/null +++ b/tests/baselines/reference/tsbuild/moduleResolution/initial-build/type-reference-resolution-uses-correct-options-for-different-resolution-options-referenced-project.js @@ -0,0 +1,173 @@ +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; }; + +//// [/src/packages/pkg1.tsconfig.json] +{"compilerOptions":{"composite":true,"typeRoots":["./typeroot1"]},"files":["./pkg1_index.ts"]} + +//// [/src/packages/pkg1_index.ts] +export const theNum: TheNum = "type1"; + +//// [/src/packages/pkg2.tsconfig.json] +{"compilerOptions":{"composite":true,"typeRoots":["./typeroot2"]},"files":["./pkg2_index.ts"]} + +//// [/src/packages/pkg2_index.ts] +export const theNum: TheNum2 = "type2"; + +//// [/src/packages/typeroot1/sometype/index.d.ts] +declare type TheNum = "type1"; + +//// [/src/packages/typeroot2/sometype/index.d.ts] +declare type TheNum2 = "type2"; + + + +Output:: +/lib/tsc -b /src/packages/pkg1.tsconfig.json /src/packages/pkg2.tsconfig.json --verbose --traceResolution +[12:00:00 AM] Projects in this build: + * src/packages/pkg1.tsconfig.json + * src/packages/pkg2.tsconfig.json + +[12:00:00 AM] Project 'src/packages/pkg1.tsconfig.json' is out of date because output file 'src/packages/pkg1_index.js' does not exist + +[12:00:00 AM] Building project '/src/packages/pkg1.tsconfig.json'... + +======== Resolving type reference directive 'sometype', containing file '/src/packages/__inferred type names__.ts', root directory '/src/packages/typeroot1'. ======== +Resolving with primary search path '/src/packages/typeroot1'. +File '/src/packages/typeroot1/sometype/package.json' does not exist. +File '/src/packages/typeroot1/sometype/index.d.ts' exist - use it as a name resolution result. +Resolving real path for '/src/packages/typeroot1/sometype/index.d.ts', result '/src/packages/typeroot1/sometype/index.d.ts'. +======== Type reference directive 'sometype' was successfully resolved to '/src/packages/typeroot1/sometype/index.d.ts', primary: true. ======== +[12:00:00 AM] Project 'src/packages/pkg2.tsconfig.json' is out of date because output file 'src/packages/pkg2_index.js' does not exist + +[12:00:00 AM] Building project '/src/packages/pkg2.tsconfig.json'... + +======== Resolving type reference directive 'sometype', containing file '/src/packages/__inferred type names__.ts', root directory '/src/packages/typeroot2'. ======== +Resolving with primary search path '/src/packages/typeroot2'. +File '/src/packages/typeroot2/sometype/package.json' does not exist. +File '/src/packages/typeroot2/sometype/index.d.ts' exist - use it as a name resolution result. +Resolving real path for '/src/packages/typeroot2/sometype/index.d.ts', result '/src/packages/typeroot2/sometype/index.d.ts'. +======== Type reference directive 'sometype' was successfully resolved to '/src/packages/typeroot2/sometype/index.d.ts', primary: true. ======== +exitCode:: ExitStatus.Success + + +//// [/src/packages/pkg1.tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../lib/lib.d.ts","./pkg1_index.ts","./typeroot1/sometype/index.d.ts"],"fileInfos":[{"version":"3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"-9601687719-export const theNum: TheNum = \"type1\";",{"version":"-4557394441-declare type TheNum = \"type1\";","affectsGlobalScope":true}],"options":{"composite":true},"referencedMap":[],"exportedModulesMap":[],"semanticDiagnosticsPerFile":[1,2,3]},"version":"FakeTSVersion"} + +//// [/src/packages/pkg1.tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../lib/lib.d.ts", + "./pkg1_index.ts", + "./typeroot1/sometype/index.d.ts" + ], + "fileInfos": { + "../../lib/lib.d.ts": { + "version": "3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./pkg1_index.ts": { + "version": "-9601687719-export const theNum: TheNum = \"type1\";", + "signature": "-9601687719-export const theNum: TheNum = \"type1\";" + }, + "./typeroot1/sometype/index.d.ts": { + "version": "-4557394441-declare type TheNum = \"type1\";", + "signature": "-4557394441-declare type TheNum = \"type1\";", + "affectsGlobalScope": true + } + }, + "options": { + "composite": true + }, + "referencedMap": {}, + "exportedModulesMap": {}, + "semanticDiagnosticsPerFile": [ + "../../lib/lib.d.ts", + "./pkg1_index.ts", + "./typeroot1/sometype/index.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 868 +} + +//// [/src/packages/pkg1_index.d.ts] +/// +export declare const theNum: TheNum; + + +//// [/src/packages/pkg1_index.js] +"use strict"; +exports.__esModule = true; +exports.theNum = void 0; +exports.theNum = "type1"; + + +//// [/src/packages/pkg2.tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../lib/lib.d.ts","./pkg2_index.ts","./typeroot2/sometype/index.d.ts"],"fileInfos":[{"version":"3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"-12823281204-export const theNum: TheNum2 = \"type2\";",{"version":"-980425686-declare type TheNum2 = \"type2\";","affectsGlobalScope":true}],"options":{"composite":true},"referencedMap":[],"exportedModulesMap":[],"semanticDiagnosticsPerFile":[1,2,3]},"version":"FakeTSVersion"} + +//// [/src/packages/pkg2.tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../lib/lib.d.ts", + "./pkg2_index.ts", + "./typeroot2/sometype/index.d.ts" + ], + "fileInfos": { + "../../lib/lib.d.ts": { + "version": "3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./pkg2_index.ts": { + "version": "-12823281204-export const theNum: TheNum2 = \"type2\";", + "signature": "-12823281204-export const theNum: TheNum2 = \"type2\";" + }, + "./typeroot2/sometype/index.d.ts": { + "version": "-980425686-declare type TheNum2 = \"type2\";", + "signature": "-980425686-declare type TheNum2 = \"type2\";", + "affectsGlobalScope": true + } + }, + "options": { + "composite": true + }, + "referencedMap": {}, + "exportedModulesMap": {}, + "semanticDiagnosticsPerFile": [ + "../../lib/lib.d.ts", + "./pkg2_index.ts", + "./typeroot2/sometype/index.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 870 +} + +//// [/src/packages/pkg2_index.d.ts] +/// +export declare const theNum: TheNum2; + + +//// [/src/packages/pkg2_index.js] +"use strict"; +exports.__esModule = true; +exports.theNum = void 0; +exports.theNum = "type2"; + +