| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  | var ts = require('typescript'); | 
					
						
							| 
									
										
										
										
											2015-05-16 19:07:32 +01:00
										 |  |  | var path = require('canonical-path'); | 
					
						
							| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports = function tsParser(createCompilerHost, log) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 12:53:37 +01:00
										 |  |  |     // These are the extension that we should consider when trying to load a module
 | 
					
						
							|  |  |  |     // During migration from Traceur, there is a mix of `.ts`, `.es6` and `.js` (atScript)
 | 
					
						
							|  |  |  |     // files in the project and the TypeScript compiler only looks for `.ts` files when trying
 | 
					
						
							|  |  |  |     // to load imports.
 | 
					
						
							|  |  |  |     extensions: ['.ts', '.js', '.es6'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // The options for the TS compiler
 | 
					
						
							| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  |     options: { | 
					
						
							| 
									
										
										
										
											2015-05-19 12:53:37 +01:00
										 |  |  |       allowNonTsExtensions: true, | 
					
						
							|  |  |  |       charset: 'utf8' | 
					
						
							| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parse: function(fileNames, baseDir) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // "Compile" a program from the given module filenames, to get hold of a
 | 
					
						
							|  |  |  |       // typeChecker that can be used to interrogate the modules, exports and so on.
 | 
					
						
							| 
									
										
										
										
											2015-05-19 12:53:37 +01:00
										 |  |  |       var host = createCompilerHost(this.options, baseDir, this.extensions); | 
					
						
							| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  |       var program = ts.createProgram(fileNames, this.options, host); | 
					
						
							|  |  |  |       var typeChecker = program.getTypeChecker(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Create an array of module symbols for each file we were given
 | 
					
						
							|  |  |  |       var moduleSymbols = []; | 
					
						
							|  |  |  |       fileNames.forEach(function(fileName) { | 
					
						
							|  |  |  |         var sourceFile = program.getSourceFile(fileName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!sourceFile) { | 
					
						
							|  |  |  |           throw new Error('Invalid source file: ' + fileName); | 
					
						
							|  |  |  |         } else if (!sourceFile.symbol) { | 
					
						
							|  |  |  |           // Some files contain only a comment and no actual module code
 | 
					
						
							|  |  |  |           log.warn('No module code found in ' + fileName); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           moduleSymbols.push(sourceFile.symbol); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       moduleSymbols.forEach(function(tsModule) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // The type checker has a nice helper function that returns an array of Symbols
 | 
					
						
							|  |  |  |         // representing the exports for a given module
 | 
					
						
							|  |  |  |         tsModule.exportArray = typeChecker.getExportsOfModule(tsModule); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Although 'star' imports (e.g. `export * from 'some/module';) get resolved automatically
 | 
					
						
							|  |  |  |         // by the compiler/binder, it seems that explicit imports (e.g. `export {SomeClass} from 'some/module'`)
 | 
					
						
							|  |  |  |         // do not so we have to do a little work.
 | 
					
						
							|  |  |  |         tsModule.exportArray.forEach(function(moduleExport) { | 
					
						
							| 
									
										
										
										
											2015-05-17 22:13:06 +01:00
										 |  |  |           if (moduleExport.flags & ts.SymbolFlags.Alias) { | 
					
						
							| 
									
										
										
										
											2015-05-15 13:57:38 +01:00
										 |  |  |             // To maintain the alias information (particularly the alias name)
 | 
					
						
							|  |  |  |             // we just attach the original "resolved" symbol to the alias symbol
 | 
					
						
							|  |  |  |             moduleExport.resolvedSymbol = typeChecker.getAliasedSymbol(moduleExport); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       moduleSymbols.typeChecker = typeChecker; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         moduleSymbols: moduleSymbols, | 
					
						
							|  |  |  |         typeChecker: typeChecker, | 
					
						
							|  |  |  |         program: program, | 
					
						
							|  |  |  |         host: host | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; |