{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import * as lodash from \"lodash\";\nimport * as ts from \"typescript\";\n\nimport { Logger } from \"log4js\";\n\nimport { Benchmark } from \"../shared/benchmark\";\nimport { Configuration } from \"../shared/configuration\";\nimport { File } from \"../shared/file\";\nimport { EventType, Project } from \"../shared/project\";\nimport { CompileCallback } from \"./compile-callback\";\n\ninterface CompiledFiles { [key: string]: string; }\n\ninterface Queued {\n    file: File;\n    callback: CompileCallback;\n}\n\nexport class Compiler {\n\n    private cachedProgram: ts.Program;\n    private compiledFiles: CompiledFiles = {};\n    private compilerHost: ts.CompilerHost;\n    private emitQueue: Queued[] = [];\n    private errors: string[] = [];\n    private hostGetSourceFile: (filename: string, languageVersion: ts.ScriptTarget,\n                                onError?: (message: string) => void) => ts.SourceFile;\n    private program: ts.Program;\n\n    private compileDeferred: () => void;\n\n    constructor(private config: Configuration, private log: Logger, private project: Project) {\n        config.whenReady(() => {\n            this.log.debug(\"Setting up deferred project compilation\");\n            this.compileDeferred = lodash.debounce(() => {\n                this.compileProject();\n            }, this.config.compilerDelay);\n        });\n    }\n\n    public compile(file: File, callback: CompileCallback): void {\n\n        this.emitQueue.push({\n            callback,\n            file\n        });\n\n        this.compileDeferred();\n    }\n\n    private compileProject(): void {\n\n        this.log.info(\"Compiling project using Typescript %s\", ts.version);\n\n        if (this.project.handleFileEvent() === EventType.FileSystemChanged) {\n            this.setupRecompile();\n        }\n\n        const benchmark = new Benchmark();\n        const tsconfig = this.project.getTsconfig();\n\n        this.outputDiagnostics(tsconfig.errors);\n\n        if (+ts.version[0] >= 3) {\n            this.program = ts.createProgram({\n                host: this.compilerHost,\n                options: tsconfig.options,\n                projectReferences: tsconfig.projectReferences,\n                rootNames: tsconfig.fileNames\n            });\n        }\n        else {\n            this.program = ts.createProgram(tsconfig.fileNames, tsconfig.options, this.compilerHost);\n        }\n\n        this.cachedProgram = this.program;\n\n        this.runDiagnostics(this.program, this.compilerHost);\n        this.program.emit();\n        this.log.info(\"Compiled %s files in %s ms.\", tsconfig.fileNames.length, benchmark.elapsed());\n        this.onProgramCompiled();\n    }\n\n    private setupRecompile(): void {\n        this.cachedProgram = undefined;\n        this.compilerHost = ts.createCompilerHost(this.project.getTsconfig().options);\n        this.hostGetSourceFile = this.compilerHost.getSourceFile;\n        this.compilerHost.getSourceFile = this.getSourceFile;\n        this.compilerHost.writeFile = (filename, text) => {\n            this.compiledFiles[filename] = text;\n        };\n    }\n\n    private onProgramCompiled(): void {\n\n        this.emitQueue.forEach((queued) => {\n\n            const sourceFile = this.program.getSourceFile(queued.file.originalPath);\n\n            if (!sourceFile) {\n                throw new Error(\"No source found for \" + queued.file.originalPath + \"!\\n\" +\n                                \"Is there a mismatch between the Typescript compiler options and the Karma config?\");\n            }\n\n            const ambientModuleNames = (sourceFile as any).ambientModuleNames;\n\n            queued.callback({\n                ambientModuleNames,\n                hasError: this.errors.indexOf(queued.file.originalPath) !== -1,\n                isAmbientModule: ambientModuleNames && ambientModuleNames.length > 0,\n                isDeclarationFile: this.fileExtensionIs(sourceFile.fileName, \".d.ts\"),\n                outputText: this.compiledFiles[queued.file.path],\n                sourceFile,\n                sourceMapText: this.compiledFiles[queued.file.path + \".map\"]\n            });\n        });\n\n        this.emitQueue.length = 0;\n    }\n\n    private getSourceFile = (\n        filename: string,\n        languageVersion: ts.ScriptTarget,\n        onError?: (message: string) => void): ts.SourceFile => {\n\n        if (this.cachedProgram && !this.isQueued(filename)) {\n            const sourceFile = this.cachedProgram.getSourceFile(filename);\n            if (sourceFile) {\n                return sourceFile;\n            }\n        }\n\n        return this.hostGetSourceFile(filename, languageVersion, onError);\n    }\n\n    private isQueued(filename: string): boolean {\n        for (const queued of this.emitQueue) {\n            if (queued.file.originalPath === filename) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private runDiagnostics(program: ts.Program, host: ts.CompilerHost): void {\n        this.errors = [];\n        const diagnostics = ts.getPreEmitDiagnostics(program);\n        this.outputDiagnostics(diagnostics, host);\n    }\n\n    private outputDiagnostics(diagnostics: ReadonlyArray<ts.Diagnostic>, host?: ts.FormatDiagnosticsHost): void {\n\n        if (!diagnostics || diagnostics.length === 0) {\n            return;\n        }\n\n        diagnostics.forEach((diagnostic) => {\n\n            if (diagnostic.file) {\n                this.errors.push(diagnostic.file.fileName);\n            }\n\n            if (ts.formatDiagnostics && host) { // v1.8+\n                this.log.error(ts.formatDiagnostics([diagnostic], host));\n            }\n            else { // v1.6, v1.7\n\n                let output = \"\";\n\n                if (diagnostic.file) {\n                    const loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);\n                    output += diagnostic.file.fileName.replace(process.cwd(), \"\") +\n                                  \"(\" + (loc.line + 1) + \",\" + (loc.character + 1) + \"): \";\n                }\n\n                const category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();\n                output += category + \" TS\" + diagnostic.code + \": \" +\n                              ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine;\n\n                this.log.error(output);\n            }\n        });\n\n        if (this.project.getTsconfig().options.noEmitOnError) {\n            ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);\n        }\n    }\n\n    private fileExtensionIs(path: string, extension: string) {\n        return path.length > extension.length && this.endsWith(path, extension);\n    }\n\n    private endsWith(str: string, suffix: string) {\n        const expectedPos = str.length - suffix.length;\n        return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos;\n    }\n}\n"]}