Skip to content
This repository was archived by the owner on Dec 1, 2019. It is now read-only.

Commit 0169df5

Browse files
committed
feat(*): impl declaration option basic support
1 parent 12c708c commit 0169df5

File tree

7 files changed

+75
-1
lines changed

7 files changed

+75
-1
lines changed

src/helpers.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@ function isSourceMapEmit(fileName, outputFileName, sourceFileName) {
1818
&& (outputFileName.substr(-7) === '.js.map' || outputFileName.substr(-8) === '.jsx.map');
1919
}
2020

21+
function isDeclarationEmit(fileName, outputFileName, sourceFileName) {
22+
return sourceFileName === fileName
23+
&& (outputFileName.substr(-5) === '.d.ts');
24+
}
25+
2126
export function findResultFor(output: host.IEmitOutput, fileName: string) {
2227
let text;
2328
let sourceMap;
29+
let declaration: host.IOutputFile;
2430
fileName = withoutExt(path.normalize(fileName));
2531

2632
for (let i = 0; i < output.outputFiles.length; i++) {
@@ -33,10 +39,14 @@ export function findResultFor(output: host.IEmitOutput, fileName: string) {
3339
if (isSourceMapEmit(fileName, outputFileName, sourceFileName)) {
3440
sourceMap = o.text;
3541
}
42+
if (isDeclarationEmit(fileName, outputFileName, sourceFileName)) {
43+
declaration = o;
44+
}
3645
}
3746
return {
3847
text: text,
39-
sourceMap: sourceMap
48+
sourceMap: sourceMap,
49+
declaration
4050
};
4151
}
4252

src/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ async function compiler(webpack: IWebPack, text: string): Promise<void> {
119119
throw new Error('No output found for ' + fileName);
120120
}
121121

122+
if (result.declaration) {
123+
webpack.emitFile(
124+
path.relative(process.cwd(), result.declaration.sourceName),
125+
result.declaration.text
126+
);
127+
}
128+
122129
resultText = result.text;
123130

124131
let sourceFileName = fileName.replace(process.cwd() + '/', '');

src/instance.ts

+16
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export interface IWebPack {
5757
resolve: () => void;
5858
addDependency: (dep: string) => void;
5959
clearDependencies: () => void;
60+
emitFile: (fileName: string, text: string) => void;
6061
options: {
6162
atl?: {
6263
plugins: LoaderPluginDef[]
@@ -358,6 +359,21 @@ function setupAfterCompile(compiler, instanceName, forkChecker = false) {
358359
}
359360
});
360361

362+
if (instance.options.declaration) {
363+
phantomImports.forEach(imp => {
364+
let output = instance.tsState.services.getEmitOutput(imp);
365+
let declarationFile = output.outputFiles.filter(filePath =>
366+
!!filePath.name.match(/\.d.ts$/))[0];
367+
if (declarationFile) {
368+
let assetPath = path.relative(process.cwd(), declarationFile.name);
369+
compilation.assets[assetPath] = {
370+
source: () => declarationFile.text,
371+
size: () => declarationFile.text.length
372+
};
373+
}
374+
});
375+
}
376+
361377
instance.compiledFiles = {};
362378
compilation.fileDependencies.push.apply(compilation.fileDependencies, phantomImports);
363379
compilation.fileDependencies = _.uniq(compilation.fileDependencies);

src/test/declaration.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import {
2+
cleanAndCompile, expect, readOutputFile,
3+
fixturePath, readFixture, expectSource, createConfig
4+
} from './utils';
5+
6+
describe('main test', function() {
7+
8+
it('should emit declaration files', async function() {
9+
// babel need some time to init
10+
this.timeout(10000);
11+
12+
let config = {
13+
entry: fixturePath(['declaration', 'basic.ts'])
14+
};
15+
16+
let loaderQuery = {
17+
declaration: true
18+
};
19+
20+
let stats = await cleanAndCompile(createConfig(config, { loaderQuery }));
21+
expect(stats.compilation.errors.length).eq(0);
22+
let assets = Object.keys(stats.compilation.assets);
23+
24+
expect(assets).to.include('src/test/fixtures/declaration/basic.d.ts');
25+
26+
// elided import
27+
expect(assets).to.include('src/test/fixtures/declaration/iface.d.ts');
28+
});
29+
});
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Iface } from './iface';
2+
3+
export function foo(iface: Iface): Iface { return iface; }
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
export interface Iface {
3+
name: string;
4+
}

src/tsconfig.json

+5
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,17 @@
2727
"./resolver.ts",
2828
"./test/babel.ts",
2929
"./test/checker.ts",
30+
"./test/declaration.ts",
3031
"./test/fixtures/babel/babel.ts",
3132
"./test/fixtures/basic/basic.ts",
3233
"./test/fixtures/checker/to-check.ts",
34+
"./test/fixtures/declaration/basic.ts",
35+
"./test/fixtures/declaration/iface.ts",
3336
"./test/fixtures/errors/with-type-errors.ts",
3437
"./test/fixtures/salsa/index.ts",
3538
"./test/index.ts",
39+
"./test/output/src/test/fixtures/declaration/basic.d.ts",
40+
"./test/output/src/test/fixtures/declaration/iface.d.ts",
3641
"./test/salsa.ts",
3742
"./test/utils.ts",
3843
"./tsconfig-utils.ts"

0 commit comments

Comments
 (0)