@@ -9,7 +9,7 @@ import * as childProcess from 'child_process';
9
9
import * as colors from 'colors' ;
10
10
11
11
import { ICompilerOptions , TypeScriptCompilationError , State , ICompilerInfo } from './host' ;
12
- import { IResolver , ResolutionError } from './deps' ;
12
+ import { IResolver , ResolutionError , findCompiledModule } from './deps' ;
13
13
import * as helpers from './helpers' ;
14
14
import { loadLib } from './helpers' ;
15
15
@@ -39,6 +39,7 @@ interface IWebPack {
39
39
interface ICompilerInstance {
40
40
tsFlow : Promise < any > ;
41
41
tsState : State ;
42
+ babelImpl ?: any ;
42
43
compiledFiles : { [ key :string ] : boolean } ;
43
44
options : ICompilerOptions ;
44
45
externalsInvoked : boolean ;
@@ -106,6 +107,10 @@ const COMPILER_ERROR = colors.red(`\n\nTypescript compiler cannot be found, plea
106
107
npm install --save-dev typescript
107
108
` ) ;
108
109
110
+ const BABEL_ERROR = colors . red ( `\n\nBabel compiler cannot be found, please add it to your package.json file:
111
+ npm install --save-dev babel
112
+ ` ) ;
113
+
109
114
/**
110
115
* Creates compiler instance
111
116
*/
@@ -223,6 +228,16 @@ function ensureInstance(webpack: IWebPack, options: ICompilerOptions, instanceNa
223
228
options . target = helpers . parseOptionTarget ( < any > options . target , tsImpl ) ;
224
229
}
225
230
231
+ let babelImpl : any ;
232
+ if ( options . useBabel ) {
233
+ try {
234
+ babelImpl = require ( path . join ( process . cwd ( ) , 'node_modules' , 'babel' ) ) ;
235
+ } catch ( e ) {
236
+ console . error ( BABEL_ERROR ) ;
237
+ process . exit ( 1 ) ;
238
+ }
239
+ }
240
+
226
241
let tsState = new State ( options , webpack . _compiler . inputFileSystem , compilerInfo ) ;
227
242
let compiler = ( < any > webpack . _compiler ) ;
228
243
@@ -301,6 +316,7 @@ function ensureInstance(webpack: IWebPack, options: ICompilerOptions, instanceNa
301
316
return getInstanceStore ( webpack . _compiler ) [ instanceName ] = {
302
317
tsFlow,
303
318
tsState,
319
+ babelImpl,
304
320
compiledFiles : { } ,
305
321
options,
306
322
externalsInvoked : false ,
@@ -330,6 +346,7 @@ function compiler(webpack: IWebPack, text: string): void {
330
346
let fileName = webpack . resourcePath ;
331
347
332
348
let resolver = createResolver ( webpack . _compiler , webpack . resolve ) ;
349
+ let isDepsApplied = false ;
333
350
334
351
let depsInjector = {
335
352
add : ( depFileName ) => { webpack . addDependency ( depFileName ) } ,
@@ -339,6 +356,7 @@ function compiler(webpack: IWebPack, text: string): void {
339
356
let applyDeps = _ . once ( ( ) => {
340
357
depsInjector . clear ( ) ;
341
358
depsInjector . add ( fileName ) ;
359
+ state . fileAnalyzer . dependencies . applyCompiledFiles ( fileName , depsInjector ) ;
342
360
if ( state . options . reEmitDependentFiles ) {
343
361
state . fileAnalyzer . dependencies . applyChain ( fileName , depsInjector ) ;
344
362
}
@@ -370,31 +388,59 @@ function compiler(webpack: IWebPack, text: string): void {
370
388
} ) ;
371
389
} )
372
390
. then ( ( ) => {
373
- return state . emit ( fileName )
374
- } )
375
- . then ( output => {
376
- let result = helpers . findResultFor ( output , fileName ) ;
391
+ let resultText ;
392
+ let resultSourceMap ;
393
+
394
+ let compiledModule = findCompiledModule ( fileName ) ;
395
+ if ( compiledModule ) {
396
+ state . fileAnalyzer . dependencies . addCompiledModule ( fileName , compiledModule . fileName ) ;
397
+ resultText = compiledModule . text ;
398
+ resultSourceMap = JSON . parse ( compiledModule . map ) ;
399
+ } else {
400
+ let output = state . emit ( fileName ) ;
401
+ let result = helpers . findResultFor ( output , fileName ) ;
377
402
378
- if ( result . text === undefined ) {
379
- throw new Error ( 'no output found for ' + fileName ) ;
403
+ if ( result . text === undefined ) {
404
+ throw new Error ( 'No output found for ' + fileName ) ;
405
+ }
406
+
407
+ resultText = result . text ;
408
+ resultSourceMap = JSON . parse ( result . sourceMap ) ;
409
+ resultSourceMap . sources = [ fileName ] ;
410
+ resultSourceMap . file = fileName ;
411
+ resultSourceMap . sourcesContent = [ text ] ;
412
+
413
+ if ( instance . options . useBabel ) {
414
+ let defaultOptions = {
415
+ inputSourceMap : resultSourceMap ,
416
+ filename : fileName ,
417
+ sourceMap : true
418
+ }
419
+
420
+ let babelResult = instance . babelImpl . transform ( resultText , defaultOptions ) ;
421
+ resultText = babelResult . code ;
422
+ resultSourceMap = babelResult . map ;
423
+ }
380
424
}
381
425
382
- let sourceMap = JSON . parse ( result . sourceMap ) ;
383
- sourceMap . sources = [ fileName ] ;
384
- sourceMap . file = fileName ;
385
- sourceMap . sourcesContent = [ text ] ;
426
+ resultSourceMap . sources = [ fileName ] ;
427
+ resultSourceMap . file = fileName ;
428
+ resultSourceMap . sourcesContent = [ text ] ;
386
429
387
430
applyDeps ( ) ;
431
+ isDepsApplied = true ;
388
432
389
433
try {
390
- callback ( null , result . text , sourceMap ) ;
434
+ callback ( null , resultText , resultSourceMap )
391
435
} catch ( e ) {
392
436
console . error ( 'Error in bail mode:' , e ) ;
393
437
process . exit ( 1 ) ;
394
438
}
395
439
} )
396
440
. finally ( ( ) => {
397
- applyDeps ( ) ;
441
+ if ( ! isDepsApplied ) {
442
+ applyDeps ( ) ;
443
+ }
398
444
} )
399
445
. catch ( ResolutionError , err => {
400
446
callback ( err , helpers . codegenErrorReport ( [ err ] ) ) ;
0 commit comments