Skip to content

Commit f654f18

Browse files
authored
fix: ensure ts source file with no-default-lib that augments the global scope gets emitted with incremental program (#48412)
* fix: do not classify non-declaration files as default library source files * Add test.
1 parent 370d34c commit f654f18

File tree

3 files changed

+128
-0
lines changed

3 files changed

+128
-0
lines changed

src/compiler/program.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,6 +1958,10 @@ namespace ts {
19581958
}
19591959

19601960
function isSourceFileDefaultLibrary(file: SourceFile): boolean {
1961+
if (!file.isDeclarationFile) {
1962+
return false;
1963+
}
1964+
19611965
if (file.hasNoDefaultLib) {
19621966
return true;
19631967
}

src/testRunner/unittests/tsc/incremental.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,5 +449,36 @@ declare global {
449449
}, `\ninterface ReadonlyArray<T> { readonly length: number }`),
450450
incrementalScenarios: noChangeOnlyRuns,
451451
});
452+
453+
verifyTsc({
454+
scenario: "incremental",
455+
subScenario: "ts file with no-default-lib that augments the global scope",
456+
fs: () => loadProjectFromFiles({
457+
"/src/project/src/main.ts": Utils.dedent`
458+
/// <reference no-default-lib="true"/>
459+
/// <reference lib="esnext" />
460+
461+
declare global {
462+
interface Test {
463+
}
464+
}
465+
466+
export {};
467+
`,
468+
"/src/project/tsconfig.json": Utils.dedent`
469+
{
470+
"compilerOptions": {
471+
"target": "ESNext",
472+
"module": "ESNext",
473+
"incremental": true,
474+
"outDir": "dist",
475+
},
476+
}`,
477+
}),
478+
commandLineArgs: ["--p", "src/project", "--rootDir", "src/project/src"],
479+
modifyFs: (fs) => {
480+
fs.writeFileSync("/lib/lib.esnext.d.ts", libContent);
481+
}
482+
});
452483
});
453484
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
Input::
2+
//// [/lib/lib.d.ts]
3+
4+
5+
//// [/lib/lib.esnext.d.ts]
6+
/// <reference no-default-lib="true"/>
7+
interface Boolean {}
8+
interface Function {}
9+
interface CallableFunction {}
10+
interface NewableFunction {}
11+
interface IArguments {}
12+
interface Number { toExponential: any; }
13+
interface Object {}
14+
interface RegExp {}
15+
interface String { charAt: any; }
16+
interface Array<T> { length: number; [n: number]: T; }
17+
interface ReadonlyArray<T> {}
18+
declare const console: { log(msg: any): void; };
19+
20+
//// [/src/project/src/main.ts]
21+
/// <reference no-default-lib="true"/>
22+
/// <reference lib="esnext" />
23+
24+
declare global {
25+
interface Test {
26+
}
27+
}
28+
29+
export {};
30+
31+
32+
//// [/src/project/tsconfig.json]
33+
{
34+
"compilerOptions": {
35+
"target": "ESNext",
36+
"module": "ESNext",
37+
"incremental": true,
38+
"outDir": "dist",
39+
},
40+
}
41+
42+
43+
44+
Output::
45+
/lib/tsc --p src/project --rootDir src/project/src
46+
exitCode:: ExitStatus.Success
47+
48+
49+
//// [/src/project/dist/main.js]
50+
/// <reference no-default-lib="true"/>
51+
/// <reference lib="esnext" />
52+
export {};
53+
54+
55+
//// [/src/project/tsconfig.tsbuildinfo]
56+
{"program":{"fileNames":["../../lib/lib.esnext.d.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-2443389309-/// <reference no-default-lib=\"true\"/>\n/// <reference lib=\"esnext\" />\n\ndeclare global {\n interface Test {\n }\n}\n\nexport {};\n","affectsGlobalScope":true}],"options":{"module":99,"outDir":"./dist","rootDir":"./src","target":99},"referencedMap":[],"exportedModulesMap":[],"semanticDiagnosticsPerFile":[1,2]},"version":"FakeTSVersion"}
57+
58+
//// [/src/project/tsconfig.tsbuildinfo.readable.baseline.txt]
59+
{
60+
"program": {
61+
"fileNames": [
62+
"../../lib/lib.esnext.d.ts",
63+
"./src/main.ts"
64+
],
65+
"fileInfos": {
66+
"../../lib/lib.esnext.d.ts": {
67+
"version": "3858781397-/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };",
68+
"signature": "3858781397-/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };",
69+
"affectsGlobalScope": true
70+
},
71+
"./src/main.ts": {
72+
"version": "-2443389309-/// <reference no-default-lib=\"true\"/>\n/// <reference lib=\"esnext\" />\n\ndeclare global {\n interface Test {\n }\n}\n\nexport {};\n",
73+
"signature": "-2443389309-/// <reference no-default-lib=\"true\"/>\n/// <reference lib=\"esnext\" />\n\ndeclare global {\n interface Test {\n }\n}\n\nexport {};\n",
74+
"affectsGlobalScope": true
75+
}
76+
},
77+
"options": {
78+
"module": 99,
79+
"outDir": "./dist",
80+
"rootDir": "./src",
81+
"target": 99
82+
},
83+
"referencedMap": {},
84+
"exportedModulesMap": {},
85+
"semanticDiagnosticsPerFile": [
86+
"../../lib/lib.esnext.d.ts",
87+
"./src/main.ts"
88+
]
89+
},
90+
"version": "FakeTSVersion",
91+
"size": 935
92+
}
93+

0 commit comments

Comments
 (0)