{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/shared/project.ts"],"names":[],"mappings":"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","sourcesContent":["import * as glob from \"glob\";\nimport * as lodash from \"lodash\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\n\nimport { FilePattern } from \"karma\";\nimport { Logger } from \"log4js\";\n\nimport PathTool = require(\"./path-tool\");\n\nimport { CompilerOptions } from \"../api\";\nimport { Configuration } from \"./configuration\";\nimport { Extender } from \"./extender\";\n\ninterface ConfigFileJson {\n    config?: any;\n    error?: ts.Diagnostic;\n}\n\nexport enum EventType {\n    FileSystemChanged,\n    FileContentChanged\n}\n\nexport class Project {\n\n    private karmaFiles: string[] = [];\n    private tsconfig: ts.ParsedCommandLine;\n\n    constructor(private config: Configuration, private log: Logger) {}\n\n    public getKarmaFiles(): string[] {\n        return this.karmaFiles;\n    }\n\n    public getTsconfig(): ts.ParsedCommandLine {\n        return this.tsconfig;\n    }\n\n    public hasCompatibleModuleKind(): boolean {\n        return this.tsconfig.options.module === ts.ModuleKind.CommonJS;\n    }\n\n    public getModuleKind(): string {\n        return ts.ModuleKind[this.tsconfig.options.module];\n    }\n\n    public handleFileEvent(): EventType {\n\n        const oldKarmaFiles = lodash.cloneDeep(this.karmaFiles || []);\n        this.expandKarmaFilePatterns();\n\n        if (!lodash.isEqual(oldKarmaFiles, this.karmaFiles)) {\n\n            this.log.debug(\"File system changed, resolving tsconfig\");\n            this.resolveTsConfig();\n            return EventType.FileSystemChanged;\n        }\n\n        return EventType.FileContentChanged;\n    }\n\n    private expandKarmaFilePatterns() {\n\n        const files = (this.config.karma.files as FilePattern[]);\n        this.karmaFiles.length = 0;\n\n        files.forEach((file) => {\n\n            const g = new glob.Glob(path.normalize(file.pattern), {\n                cwd: \"/\",\n                follow: true,\n                nodir: true,\n                sync: true\n            });\n\n            Array.prototype.push.apply(this.karmaFiles, g.found);\n        });\n    }\n\n    private resolveTsConfig() {\n        const configFileName = this.getTsconfigFilename();\n        const configFileJson = this.getConfigFileJson(configFileName);\n        const existingOptions = this.getExistingOptions();\n        this.tsconfig = this.parseConfigFileJson(configFileName, configFileJson, existingOptions);\n    }\n\n    private getTsconfigFilename(): string {\n\n        let configFileName = \"\";\n\n        if (this.config.tsconfig) {\n\n            configFileName = path.join(this.config.karma.basePath, this.config.tsconfig);\n\n            if (!ts.sys.fileExists(configFileName)) {\n                this.log.warn(\"Tsconfig '%s' configured in karmaTypescriptConfig.tsconfig does not exist\",\n                    configFileName);\n                configFileName = \"\";\n            }\n        }\n\n        return PathTool.fixWindowsPath(configFileName);\n    }\n\n    private getExistingOptions(): CompilerOptions {\n        const compilerOptions = lodash.cloneDeep(this.config.compilerOptions);\n        this.convertOptions(compilerOptions);\n        return compilerOptions;\n    }\n\n    private getConfigFileJson(configFileName: string): ConfigFileJson {\n\n        let configFileJson: ConfigFileJson;\n\n        if (ts.sys.fileExists(configFileName)) {\n\n            this.log.debug(\"Using %s\", configFileName);\n\n            if ((ts as any).parseConfigFile) { // v1.6\n                configFileJson = (ts as any).readConfigFile(configFileName);\n            }\n            else if (ts.parseConfigFileTextToJson) { // v1.7+\n                const configFileText = ts.sys.readFile(configFileName);\n                configFileJson = ts.parseConfigFileTextToJson(configFileName, configFileText);\n            }\n            else {\n                this.log.error(\"karma-typescript doesn't know how to use Typescript %s :(\", ts.version);\n                process.exit(1);\n            }\n        }\n        else {\n            configFileJson = {\n                config: lodash.cloneDeep(this.config.defaultTsconfig)\n            };\n            this.log.debug(\"Fallback to default compiler options\");\n        }\n\n        this.log.debug(\"Resolved configFileJson:\\n\", JSON.stringify(configFileJson, null, 3));\n        return configFileJson;\n    }\n\n    private parseConfigFileJson(configFileName: string,\n                                configFileJson: ConfigFileJson,\n                                existingOptions: CompilerOptions): ts.ParsedCommandLine {\n\n        let tsconfig: ts.ParsedCommandLine;\n        const basePath = this.resolveBasepath(configFileName);\n\n        if (existingOptions && existingOptions.baseUrl === \".\") {\n            existingOptions.baseUrl = basePath;\n        }\n\n        Extender.extend(\"include\", configFileJson.config, this.config);\n        Extender.extend(\"exclude\", configFileJson.config, this.config);\n\n        if ((ts as any).parseConfigFile) {\n            tsconfig = (ts as any).parseConfigFile(configFileJson.config, ts.sys, basePath);\n            tsconfig.options = (ts as any).extend(existingOptions, tsconfig.options);\n        }\n        else if (ts.parseJsonConfigFileContent) {\n            tsconfig = ts.parseJsonConfigFileContent(configFileJson.config, ts.sys,\n                basePath, (existingOptions as any), configFileName);\n        }\n\n        if (!tsconfig) {\n            this.log.error(\"karma-typescript doesn't know how to use Typescript %s :(\", ts.version);\n            process.exit(1);\n        }\n\n        delete tsconfig.options.outDir;\n        delete tsconfig.options.outFile;\n        (tsconfig.options as any).suppressOutputPathCheck = true;\n\n        this.assertModuleKind(tsconfig);\n\n        this.log.debug(\"Resolved tsconfig:\\n\", JSON.stringify(tsconfig, null, 3));\n\n        return tsconfig;\n    }\n\n    private assertModuleKind(tsconfig: ts.ParsedCommandLine): void {\n\n        if (typeof tsconfig.options.module !== \"number\" &&\n            tsconfig.options.target === ts.ScriptTarget.ES5) {\n            tsconfig.options.module = ts.ModuleKind.CommonJS;\n        }\n    }\n\n    private resolveBasepath(configFileName: string): string {\n\n        if (!configFileName) {\n            return this.config.karma.basePath;\n        }\n\n        const relativePath = path.relative(this.config.karma.basePath, configFileName);\n        const absolutePath = path.join(this.config.karma.basePath, relativePath);\n        return path.dirname(absolutePath);\n    }\n\n    private convertOptions(options: any): void {\n\n        const names = [\"jsx\", \"lib\", \"module\", \"moduleResolution\", \"target\"];\n\n        if (options) {\n            (ts as any).optionDeclarations.forEach((declaration: any) => {\n                if (names.indexOf(declaration.name) !== -1) {\n                    this.setOptions(options, declaration);\n                }\n            });\n        }\n    }\n\n    private setOptions(options: any, declaration: any) {\n        const name = declaration.name;\n        if (options[name]) {\n            if (Array.isArray(options[name])) {\n                options[name].forEach((option: string, index: number) => {\n                    const key = option.toLowerCase();\n                    options[name][index] = lodash.isMap(declaration.element.type) ?\n                        declaration.element.type.get(key) : declaration.type[key];\n                });\n            }\n            else {\n                const key = options[name].toLowerCase();\n                options[name] = lodash.isMap(declaration.type) ?\n                    declaration.type.get(key) : declaration.type[key];\n            }\n        }\n    }\n}\n"]}