diff --git a/package.json b/package.json index 81e8c3135162..f6fad5684dc6 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "isbinaryfile": "^3.0.0", "istanbul-instrumenter-loader": "^2.0.0", "json-loader": "^0.5.4", + "karma-source-map-support": "^1.2.0", "less": "^2.7.2", "less-loader": "^4.0.5", "license-webpack-plugin": "^0.4.3", diff --git a/packages/@angular/cli/package.json b/packages/@angular/cli/package.json index b21e4189fd4c..7c402bf8ab79 100644 --- a/packages/@angular/cli/package.json +++ b/packages/@angular/cli/package.json @@ -53,6 +53,7 @@ "inquirer": "^3.0.0", "isbinaryfile": "^3.0.0", "json-loader": "^0.5.4", + "karma-source-map-support": "^1.2.0", "less": "^2.7.2", "less-loader": "^4.0.5", "license-webpack-plugin": "^0.4.2", diff --git a/packages/@angular/cli/plugins/karma.ts b/packages/@angular/cli/plugins/karma.ts index 8025af5f23f8..2183bd0f257e 100644 --- a/packages/@angular/cli/plugins/karma.ts +++ b/packages/@angular/cli/plugins/karma.ts @@ -8,6 +8,14 @@ import { Pattern } from './glob-copy-webpack-plugin'; import { WebpackTestConfig, WebpackTestOptions } from '../models/webpack-test-config'; import { KarmaWebpackThrowError } from './karma-webpack-throw-error'; +/** + * Enumerate needed (but not require/imported) dependencies from this file + * to let the dependency validator know they are used. + * + * require('karma-source-map-support') + */ + + const getAppFromConfig = require('../utilities/app-utils').getAppFromConfig; let blocked: any[] = []; @@ -54,6 +62,22 @@ const init: any = (config: any, emitter: any, customFileHandlers: any) => { progress: true, }, config.angularCli); + if (testConfig.sourcemaps) { + // Add a reporter that fixes sourcemap urls. + config.reporters.unshift('@angular/cli'); + + // Code taken from https://github.com/tschaub/karma-source-map-support. + // We can't use it directly because we need to add it conditionally in this file, and karma + // frameworks cannot be added dynamically. + const smsPath = path.dirname(require.resolve('source-map-support')); + const ksmsPath = path.dirname(require.resolve('karma-source-map-support')); + + addKarmaFiles(config.files, [ + { pattern: path.join(smsPath, 'browser-source-map-support.js'), watched: false }, + { pattern: path.join(ksmsPath, 'client.js'), watched: false } + ], true); + } + // Add assets. This logic is mimics the one present in GlobCopyWebpackPlugin. if (appConfig.assets) { config.proxies = config.proxies || {}; @@ -227,9 +251,25 @@ function requestBlocker() { }; } -// Also export karma-webpack and karma-sourcemap-loader. +// Strip the server address and webpack scheme (webpack://) from error log. +const initSourcemapReporter: any = function (baseReporterDecorator: any) { + baseReporterDecorator(this); + const urlRegexp = /\(http:\/\/localhost:\d+\/_karma_webpack_\/webpack:\//gi; + + this.onSpecComplete = function (_browser: any, result: any) { + if (!result.success && result.log.length > 0) { + result.log.forEach((log: string, idx: number) => { + result.log[idx] = log.replace(urlRegexp, ''); + }); + } + }; +}; + +initSourcemapReporter.$inject = ['baseReporterDecorator']; + module.exports = Object.assign({ 'framework:@angular/cli': ['factory', init], 'preprocessor:@angular/cli': ['factory', preprocessor], + 'reporter:@angular/cli': ['type', initSourcemapReporter], 'middleware:angularCliBlocker': ['factory', requestBlocker] }); diff --git a/yarn.lock b/yarn.lock index cd0000f1554b..fb6f2663c014 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2950,6 +2950,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" +karma-source-map-support@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz#1bf81e7bb4b089627ab352ec4179e117c406a540" + dependencies: + source-map-support "^0.4.1" + kind-of@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" @@ -4758,7 +4764,7 @@ source-map-loader@^0.2.0: loader-utils "~0.2.2" source-map "~0.1.33" -source-map-support@^0.4.0, source-map-support@^0.4.2: +source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@^0.4.2: version "0.4.15" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: