blob: f3cb5e1f8ea08886808e4aea20d4652167c9c161 [file] [log] [blame]
{"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"]}