Skip to content

Commit d0a57ab

Browse files
committed
Handle emitDeclarationOnly in --build scenario
1 parent 1b6b39c commit d0a57ab

12 files changed

+560
-1
lines changed

src/compiler/emitter.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ namespace ts {
155155
}
156156

157157
function getOutputJSFileName(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean) {
158+
if (configFile.options.emitDeclarationOnly) return undefined;
158159
const isJsonFile = fileExtensionIs(inputFileName, Extension.Json);
159160
const outputFileName = changeExtension(
160161
getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir),
@@ -187,7 +188,7 @@ namespace ts {
187188
const js = getOutputJSFileName(inputFileName, configFile, ignoreCase);
188189
addOutput(js);
189190
if (fileExtensionIs(inputFileName, Extension.Json)) continue;
190-
if (configFile.options.sourceMap) {
191+
if (js && configFile.options.sourceMap) {
191192
addOutput(`${js}.map`);
192193
}
193194
if (getEmitDeclarations(configFile.options) && hasTSFileExtension(inputFileName)) {
@@ -214,6 +215,10 @@ namespace ts {
214215
if (fileExtensionIs(inputFileName, Extension.Dts)) continue;
215216
const jsFilePath = getOutputJSFileName(inputFileName, configFile, ignoreCase);
216217
if (jsFilePath) return jsFilePath;
218+
if (fileExtensionIs(inputFileName, Extension.Json)) continue;
219+
if (getEmitDeclarations(configFile.options) && hasTSFileExtension(inputFileName)) {
220+
return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase);
221+
}
217222
}
218223
const buildInfoPath = getOutputPathForBuildInfo(configFile.options);
219224
if (buildInfoPath) return buildInfoPath;

src/testRunner/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"unittests/tsbuild/amdModulesWithOut.ts",
9595
"unittests/tsbuild/containerOnlyReferenced.ts",
9696
"unittests/tsbuild/demo.ts",
97+
"unittests/tsbuild/emitDeclarationOnly.ts",
9798
"unittests/tsbuild/emptyFiles.ts",
9899
"unittests/tsbuild/graphOrdering.ts",
99100
"unittests/tsbuild/inferredTypeFromTransitiveModule.ts",
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
namespace ts {
2+
describe("unittests:: tsbuild:: on project with emitDeclarationOnly set to true", () => {
3+
let projFs: vfs.FileSystem;
4+
const { time, tick } = getTime();
5+
before(() => {
6+
projFs = loadProjectFromDisk("tests/projects/emitDeclarationOnly", time);
7+
});
8+
after(() => {
9+
projFs = undefined!;
10+
});
11+
12+
function verifyEmitDeclarationOnly(disableMap?: true) {
13+
verifyTsbuildOutput({
14+
scenario: `only dts output in circular import project with emitDeclarationOnly${disableMap ? "" : " and declarationMap"}`,
15+
projFs: () => projFs,
16+
time,
17+
tick,
18+
proj: "emitDeclarationOnly",
19+
rootNames: ["/src"],
20+
lastProjectOutput: `/src/lib/index.d.ts`,
21+
outputFiles: [
22+
"/src/lib/a.d.ts",
23+
"/src/lib/b.d.ts",
24+
"/src/lib/c.d.ts",
25+
"/src/lib/index.d.ts",
26+
"/src/tsconfig.tsbuildinfo",
27+
...(disableMap ? emptyArray : [
28+
"/src/lib/a.d.ts.map",
29+
"/src/lib/b.d.ts.map",
30+
"/src/lib/c.d.ts.map",
31+
"/src/lib/index.d.ts.map"
32+
])
33+
],
34+
initialBuild: {
35+
modifyFs: disableMap ?
36+
(fs => replaceText(fs, "/src/tsconfig.json", `"declarationMap": true,`, "")) :
37+
noop,
38+
expectedDiagnostics: [
39+
getExpectedDiagnosticForProjectsInBuild("src/tsconfig.json"),
40+
[Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, "src/tsconfig.json", "src/lib/a.d.ts"],
41+
[Diagnostics.Building_project_0, "/src/tsconfig.json"]
42+
]
43+
},
44+
incrementalDtsChangedBuild: {
45+
modifyFs: fs => replaceText(fs, "/src/src/a.ts", "b: B;", "b: B; foo: any;"),
46+
expectedDiagnostics: [
47+
getExpectedDiagnosticForProjectsInBuild("src/tsconfig.json"),
48+
[Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, "src/tsconfig.json", "src/lib/a.d.ts", "src/src/a.ts"],
49+
[Diagnostics.Building_project_0, "/src/tsconfig.json"]
50+
]
51+
},
52+
baselineOnly: true,
53+
verifyDiagnostics: true
54+
});
55+
}
56+
verifyEmitDeclarationOnly();
57+
verifyEmitDeclarationOnly(/*disableMap*/ true);
58+
});
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//// [/src/lib/a.d.ts]
2+
import { B } from "./b";
3+
export interface A {
4+
b: B;
5+
foo: any;
6+
}
7+
//# sourceMappingURL=a.d.ts.map
8+
9+
//// [/src/lib/a.d.ts.map]
10+
{"version":3,"file":"a.d.ts","sourceRoot":"","sources":["../src/a.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,CAAC;IAChB,CAAC,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;CAChB"}
11+
12+
//// [/src/src/a.ts]
13+
import { B } from "./b";
14+
15+
export interface A {
16+
b: B; foo: any;
17+
}
18+
19+
20+
//// [/src/tsconfig.tsbuildinfo]
21+
{
22+
"program": {
23+
"fileInfos": {
24+
"../lib/lib.d.ts": {
25+
"version": "3858781397",
26+
"signature": "3858781397"
27+
},
28+
"./src/c.ts": {
29+
"version": "429593025",
30+
"signature": "16358263348"
31+
},
32+
"./src/b.ts": {
33+
"version": "-2273488249",
34+
"signature": "-10341094830"
35+
},
36+
"./src/a.ts": {
37+
"version": "-14761736732",
38+
"signature": "26895474425"
39+
},
40+
"./src/index.ts": {
41+
"version": "1286756397",
42+
"signature": "3258829224"
43+
}
44+
},
45+
"options": {
46+
"incremental": true,
47+
"target": 1,
48+
"module": 1,
49+
"declaration": true,
50+
"declarationMap": true,
51+
"sourceMap": true,
52+
"outDir": "./lib",
53+
"composite": true,
54+
"strict": true,
55+
"esModuleInterop": true,
56+
"alwaysStrict": true,
57+
"rootDir": "./src",
58+
"emitDeclarationOnly": true,
59+
"configFilePath": "./tsconfig.json"
60+
},
61+
"referencedMap": {
62+
"./src/a.ts": [
63+
"./src/b.ts"
64+
],
65+
"./src/b.ts": [
66+
"./src/c.ts"
67+
],
68+
"./src/c.ts": [
69+
"./src/a.ts"
70+
],
71+
"./src/index.ts": [
72+
"./src/a.ts",
73+
"./src/b.ts",
74+
"./src/c.ts"
75+
]
76+
},
77+
"exportedModulesMap": {
78+
"./src/a.ts": [
79+
"./src/b.ts"
80+
],
81+
"./src/b.ts": [
82+
"./src/c.ts"
83+
],
84+
"./src/c.ts": [
85+
"./src/a.ts"
86+
],
87+
"./src/index.ts": [
88+
"./src/a.ts",
89+
"./src/b.ts",
90+
"./src/c.ts"
91+
]
92+
},
93+
"semanticDiagnosticsPerFile": [
94+
"../lib/lib.d.ts",
95+
"./src/a.ts",
96+
"./src/b.ts",
97+
"./src/c.ts",
98+
"./src/index.ts"
99+
]
100+
},
101+
"version": "FakeTSVersion"
102+
}
103+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//// [/src/lib/a.d.ts]
2+
import { B } from "./b";
3+
export interface A {
4+
b: B;
5+
foo: any;
6+
}
7+
8+
9+
//// [/src/src/a.ts]
10+
import { B } from "./b";
11+
12+
export interface A {
13+
b: B; foo: any;
14+
}
15+
16+
17+
//// [/src/tsconfig.tsbuildinfo]
18+
{
19+
"program": {
20+
"fileInfos": {
21+
"../lib/lib.d.ts": {
22+
"version": "3858781397",
23+
"signature": "3858781397"
24+
},
25+
"./src/c.ts": {
26+
"version": "429593025",
27+
"signature": "-2697851509"
28+
},
29+
"./src/b.ts": {
30+
"version": "-2273488249",
31+
"signature": "20298635505"
32+
},
33+
"./src/a.ts": {
34+
"version": "-14761736732",
35+
"signature": "-7639584379"
36+
},
37+
"./src/index.ts": {
38+
"version": "1286756397",
39+
"signature": "-6009477228"
40+
}
41+
},
42+
"options": {
43+
"incremental": true,
44+
"target": 1,
45+
"module": 1,
46+
"declaration": true,
47+
"sourceMap": true,
48+
"outDir": "./lib",
49+
"composite": true,
50+
"strict": true,
51+
"esModuleInterop": true,
52+
"alwaysStrict": true,
53+
"rootDir": "./src",
54+
"emitDeclarationOnly": true,
55+
"configFilePath": "./tsconfig.json"
56+
},
57+
"referencedMap": {
58+
"./src/a.ts": [
59+
"./src/b.ts"
60+
],
61+
"./src/b.ts": [
62+
"./src/c.ts"
63+
],
64+
"./src/c.ts": [
65+
"./src/a.ts"
66+
],
67+
"./src/index.ts": [
68+
"./src/a.ts",
69+
"./src/b.ts",
70+
"./src/c.ts"
71+
]
72+
},
73+
"exportedModulesMap": {
74+
"./src/a.ts": [
75+
"./src/b.ts"
76+
],
77+
"./src/b.ts": [
78+
"./src/c.ts"
79+
],
80+
"./src/c.ts": [
81+
"./src/a.ts"
82+
],
83+
"./src/index.ts": [
84+
"./src/a.ts",
85+
"./src/b.ts",
86+
"./src/c.ts"
87+
]
88+
},
89+
"semanticDiagnosticsPerFile": [
90+
"../lib/lib.d.ts",
91+
"./src/a.ts",
92+
"./src/b.ts",
93+
"./src/c.ts",
94+
"./src/index.ts"
95+
]
96+
},
97+
"version": "FakeTSVersion"
98+
}
99+

0 commit comments

Comments
 (0)