// import all the stuff we need import * as plugins from './tsbuild.plugins'; import { CompilerOptions } from 'typescript'; export { CompilerOptions, ScriptTarget, ModuleKind } from 'typescript'; /** * the default typescript compilerOptions */ export const compilerOptionsDefault: CompilerOptions = { declaration: true, emitDecoratorMetadata: true, experimentalDecorators: true, inlineSourceMap: true, noEmitOnError: true, outDir: 'dist/', module: plugins.typescript.ModuleKind.CommonJS, lib: ['lib.es2016.d.ts', 'lib.es2017.d.ts'], noImplicitAny: false, target: plugins.typescript.ScriptTarget.ES2015 }; /** * merges compilerOptions with the default compiler options */ export const mergeCompilerOptions = function(customTsOptions: CompilerOptions): CompilerOptions { // create merged options let mergedOptions: CompilerOptions = { ...compilerOptionsDefault, ...customTsOptions }; return mergedOptions; }; /** * the internal main compiler function that compiles the files */ export const compiler = ( fileNames: string[], options: plugins.typescript.CompilerOptions ): Promise => { console.log(`Compiling ${fileNames.length} files...`); let done = plugins.smartpromise.defer(); let program = plugins.typescript.createProgram(fileNames, options); let emitResult = program.emit(); // implement check only /*let emitResult = program.emit(undefined,(args) => { console.log(args) });*/ let allDiagnostics = plugins.typescript .getPreEmitDiagnostics(program) .concat(emitResult.diagnostics); allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { let { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!); let message = plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`); } else { console.log( `${plugins.typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}` ); } }); let exitCode = emitResult.emitSkipped ? 1 : 0; if (exitCode === 0) { console.log('TypeScript emit succeeded!'); done.resolve(emitResult.emittedFiles); } else { console.error('TypeScript emit failed. Please investigate!'); process.exit(exitCode); } return done.promise; };