From b14e0a54727352a6939c7a0ff13dffe2deaa67d2 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 26 Oct 2021 19:43:21 +0200 Subject: [PATCH] fix(@angular-devkit/build-angular): improve sourcemaps fidelity when code coverage is enabled With this change we replace `@jsdevtools/coverage-istanbul-loader` webpack loader with [`babel-plugin-istanbul`](https://github.com/istanbuljs/babel-plugin-istanbul) which is an official Babel plugin by the istanbuljs team. Previously, when code coverage was enabled we had multiple Babel runs on the same file. This is because istanbuljs' `instrumentSync` and `instrument` APIs which are used by the Webpack plugin invokes Babel directly https://github.com/istanbuljs/istanbuljs/blob/66bc39b3c7b301a4b4456101a9996f90b1638dc0/packages/istanbul-lib-instrument/src/instrumenter.js#L98 By using the babel plugin directly, we avoid this which also improves the sourcemaps correctness and test performance. Closes #22010 (cherry picked from commit cf77b7364adf10219fba852bc29f14064fbdb2ae) --- package.json | 2 +- .../angular_devkit/build_angular/BUILD.bazel | 2 +- .../angular_devkit/build_angular/package.json | 2 +- .../src/babel/presets/application.ts | 33 +++++++++ .../build_angular/src/babel/webpack-loader.ts | 74 +++++++++---------- .../karma/tests/options/code-coverage_spec.ts | 1 - .../src/webpack/configs/common.ts | 27 +++++-- .../build_angular/src/webpack/configs/test.ts | 29 +------- .../src/webpack/utils/helpers.ts | 16 ++++ yarn.lock | 70 ++++++++++++------ 10 files changed, 155 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index 87beefb8ba75..69c62533ae0c 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,6 @@ "@bazel/jasmine": "4.4.0", "@bazel/typescript": "4.4.0", "@discoveryjs/json-ext": "0.5.5", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@types/babel__core": "7.1.16", "@types/babel__template": "7.4.1", "@types/cacache": "^15.0.0", @@ -128,6 +127,7 @@ "ajv-formats": "2.1.1", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", "bootstrap": "^4.0.0", "browserslist": "^4.9.1", "cacache": "15.3.0", diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index 8162eb81ca63..e59ca41818bf 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -112,7 +112,6 @@ ts_library( "@npm//@babel/runtime", "@npm//@babel/template", "@npm//@discoveryjs/json-ext", - "@npm//@jsdevtools/coverage-istanbul-loader", "@npm//@types/babel__core", "@npm//@types/babel__template", "@npm//@types/browserslist", @@ -134,6 +133,7 @@ ts_library( "@npm//ajv", "@npm//ansi-colors", "@npm//babel-loader", + "@npm//babel-plugin-istanbul", "@npm//browserslist", "@npm//cacache", "@npm//caniuse-lite", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 58b1263a46d9..1f2e2b8e49f8 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -20,10 +20,10 @@ "@babel/runtime": "7.15.4", "@babel/template": "7.15.4", "@discoveryjs/json-ext": "0.5.5", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@ngtools/webpack": "0.0.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", "cacache": "15.3.0", "caniuse-lite": "^1.0.30001032", diff --git a/packages/angular_devkit/build_angular/src/babel/presets/application.ts b/packages/angular_devkit/build_angular/src/babel/presets/application.ts index 9abfdb506333..8b5467cd6622 100644 --- a/packages/angular_devkit/build_angular/src/babel/presets/application.ts +++ b/packages/angular_devkit/build_angular/src/babel/presets/application.ts @@ -47,6 +47,14 @@ export interface ApplicationPresetOptions { forceES5?: boolean; forceAsyncTransformation?: boolean; + instrumentCode?: { + includedBasePath: string; + }; + optimize?: { + looseEnums: boolean; + pureTopLevel: boolean; + wrapDecorators: boolean; + }; diagnosticReporter?: DiagnosticReporter; } @@ -220,6 +228,31 @@ export default function (api: unknown, options: ApplicationPresetOptions) { needRuntimeTransform = true; } + if (options.optimize) { + if (options.optimize.pureTopLevel) { + plugins.push(require('../plugins/pure-toplevel-functions').default); + } + + plugins.push( + require('../plugins/elide-angular-metadata').default, + [ + require('../plugins/adjust-typescript-enums').default, + { loose: options.optimize.looseEnums }, + ], + [ + require('../plugins/adjust-static-class-members').default, + { wrapDecorators: options.optimize.wrapDecorators }, + ], + ); + } + + if (options.instrumentCode) { + plugins.push([ + require('babel-plugin-istanbul').default, + { inputSourceMap: false, cwd: options.instrumentCode.includedBasePath }, + ]); + } + if (needRuntimeTransform) { // Babel equivalent to TypeScript's `importHelpers` option plugins.push([ diff --git a/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts b/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts index 558454565cd1..e3a6d49df695 100644 --- a/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts +++ b/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts @@ -12,16 +12,16 @@ import { ScriptTarget } from 'typescript'; import { loadEsmModule } from '../utils/load-esm'; import { ApplicationPresetOptions, I18nPluginCreators } from './presets/application'; -interface AngularCustomOptions extends Pick { - forceAsyncTransformation: boolean; - forceES5: boolean; - optimize?: { - looseEnums: boolean; - pureTopLevel: boolean; - wrapDecorators: boolean; +interface AngularCustomOptions extends Omit { + instrumentCode?: { + /** node_modules and test files are always excluded. */ + excludedPaths: Set; + includedBasePath: string; }; } +export type AngularBabelLoaderOptions = AngularCustomOptions & Record; + // Extract Sourcemap input type from the remapping function since it is not currently exported type SourceMapInput = Exclude[0], unknown[]>; @@ -62,7 +62,7 @@ async function requiresLinking(path: string, source: string): Promise { return needsLinking(path, source); } -export default custom(() => { +export default custom(() => { const baseOptions = Object.freeze({ babelrc: false, configFile: false, @@ -73,15 +73,19 @@ export default custom(() => { }); return { - async customOptions({ i18n, scriptTarget, aot, optimize, ...rawOptions }, { source }) { + async customOptions(options, { source }) { + const { i18n, scriptTarget, aot, optimize, instrumentCode, ...rawOptions } = + options as AngularBabelLoaderOptions; + // Must process file if plugins are added let shouldProcess = Array.isArray(rawOptions.plugins) && rawOptions.plugins.length > 0; - const customOptions: AngularCustomOptions = { + const customOptions: ApplicationPresetOptions = { forceAsyncTransformation: false, forceES5: false, angularLinker: undefined, i18n: undefined, + instrumentCode: undefined, }; // Analyze file for linking @@ -117,7 +121,7 @@ export default custom(() => { customOptions.forceAsyncTransformation = !/[\\/][_f]?esm2015[\\/]/.test(this.resourcePath) && source.includes('async'); } - shouldProcess ||= customOptions.forceAsyncTransformation || customOptions.forceES5; + shouldProcess ||= customOptions.forceAsyncTransformation || customOptions.forceES5 || false; } // Analyze for i18n inlining @@ -163,6 +167,20 @@ export default custom(() => { shouldProcess = true; } + if ( + instrumentCode && + !instrumentCode.excludedPaths.has(this.resourcePath) && + !/\.(e2e|spec)\.tsx?$|[\\/]node_modules[\\/]/.test(this.resourcePath) && + this.resourcePath.startsWith(instrumentCode.includedBasePath) + ) { + // `babel-plugin-istanbul` has it's own includes but we do the below so that we avoid running the the loader. + customOptions.instrumentCode = { + includedBasePath: instrumentCode.includedBasePath, + }; + + shouldProcess = true; + } + // Add provided loader options to default base options const loaderOptions: Record = { ...baseOptions, @@ -184,32 +202,12 @@ export default custom(() => { return { custom: customOptions, loader: loaderOptions }; }, config(configuration, { customOptions }) { - const plugins = configuration.options.plugins ?? []; - if (customOptions.optimize) { - if (customOptions.optimize.pureTopLevel) { - plugins.push(require('./plugins/pure-toplevel-functions').default); - } - - plugins.push( - require('./plugins/elide-angular-metadata').default, - [ - require('./plugins/adjust-typescript-enums').default, - { loose: customOptions.optimize.looseEnums }, - ], - [ - require('./plugins/adjust-static-class-members').default, - { wrapDecorators: customOptions.optimize.wrapDecorators }, - ], - ); - } - return { ...configuration.options, // Using `false` disables babel from attempting to locate sourcemaps or process any inline maps. // The babel types do not include the false option even though it is valid // eslint-disable-next-line @typescript-eslint/no-explicit-any inputSourceMap: false as any, - plugins, presets: [ ...(configuration.options.presets || []), [ @@ -240,16 +238,10 @@ export default custom(() => { // `@ampproject/remapping` source map objects but both are compatible with Webpack. // This method for merging is used because it provides more accurate output // and is faster while using less memory. - result.map = { - // Convert the SourceMap back to simple plain object. - // This is needed because otherwise code-coverage will fail with `don't know how to turn this value into a node` - // Which is throw by Babel when it is invoked again from `istanbul-lib-instrument`. - // https://github.com/babel/babel/blob/780aa48d2a34dc55f556843074b6aed45e7eabeb/packages/babel-types/src/converters/valueToNode.ts#L115-L130 - ...(remapping( - [result.map as SourceMapInput, inputSourceMap as SourceMapInput], - () => null, - ) as typeof result.map), - }; + result.map = remapping( + [result.map as SourceMapInput, inputSourceMap as SourceMapInput], + () => null, + ) as typeof result.map; } return result; diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts index 7fd1abdb0ac9..22af81094679 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import { last, tap } from 'rxjs/operators'; import { promisify } from 'util'; import { execute } from '../../index'; import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeBuilder } from '../setup'; diff --git a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts index 1cf19340f56a..fccfa085c5e4 100644 --- a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts +++ b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts @@ -14,28 +14,37 @@ import { ScriptTarget } from 'typescript'; import { Compiler, Configuration, - ContextReplacementPlugin, ProgressPlugin, RuleSetRule, WebpackOptionsNormalized, debug, } from 'webpack'; +import { AngularBabelLoaderOptions } from '../../babel/webpack-loader'; import { AssetPatternClass } from '../../builders/browser/schema'; import { BuildBrowserFeatures } from '../../utils'; -import { WebpackConfigOptions } from '../../utils/build-options'; +import { WebpackConfigOptions, WebpackTestOptions } from '../../utils/build-options'; import { allowMangle, profilingEnabled } from '../../utils/environment-options'; import { loadEsmModule } from '../../utils/load-esm'; import { Spinner } from '../../utils/spinner'; import { addError } from '../../utils/webpack-diagnostics'; import { DedupeModuleResolvePlugin, ScriptsWebpackPlugin } from '../plugins'; import { JavaScriptOptimizerPlugin } from '../plugins/javascript-optimizer-plugin'; -import { getOutputHashFormat, getWatchOptions, normalizeExtraEntryPoints } from '../utils/helpers'; +import { + getInstrumentationExcludedPaths, + getOutputHashFormat, + getWatchOptions, + normalizeExtraEntryPoints, +} from '../utils/helpers'; // eslint-disable-next-line max-lines-per-function -export async function getCommonConfig(wco: WebpackConfigOptions): Promise { - const { root, projectRoot, buildOptions, tsConfig, projectName } = wco; +export async function getCommonConfig( + wco: WebpackConfigOptions, +): Promise { + const { root, projectRoot, buildOptions, tsConfig, projectName, sourceRoot } = wco; const { cache, + codeCoverage, + codeCoverageExclude = [], platform = 'browser', sourceMap: { styles: stylesSourceMap, scripts: scriptsSourceMap, vendor: vendorSourceMap }, optimization: { styles: stylesOptimization, scripts: scriptsOptimization }, @@ -380,7 +389,13 @@ export async function getCommonConfig(wco: WebpackConfigOptions): Promise, ): webpack.Configuration { const { - buildOptions: { codeCoverage, codeCoverageExclude, main, sourceMap, webWorkerTsConfig }, + buildOptions: { main, sourceMap, webWorkerTsConfig }, root, - sourceRoot, } = wco; - const extraRules: webpack.RuleSetRule[] = []; - const extraPlugins: { apply(compiler: webpack.Compiler): void }[] = []; - - if (codeCoverage) { - const exclude: (string | RegExp)[] = [/\.(e2e|spec)\.tsx?$/, /node_modules/]; - - if (codeCoverageExclude) { - for (const excludeGlob of codeCoverageExclude) { - glob - .sync(path.join(root, excludeGlob), { nodir: true }) - .forEach((file) => exclude.push(path.normalize(file))); - } - } - - extraRules.push({ - test: /\.[cm]?[tj]sx?$/, - loader: require.resolve('@jsdevtools/coverage-istanbul-loader'), - options: { esModules: true }, - enforce: 'post', - exclude, - include: sourceRoot, - }); - } + const extraPlugins: webpack.Configuration['plugins'] = []; if (sourceMap.scripts || sourceMap.styles) { extraPlugins.push(getSourceMapDevTool(sourceMap.scripts, sourceMap.styles, false, true)); @@ -62,7 +38,6 @@ export function getTestConfig( main: path.resolve(root, main), }, module: { - rules: extraRules, parser: webWorkerTsConfig === undefined ? { diff --git a/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts b/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts index 4c1f9c1529cf..fdd2b66de90f 100644 --- a/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts +++ b/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import glob from 'glob'; import * as path from 'path'; import { Configuration, SourceMapDevToolPlugin } from 'webpack'; import { ExtraEntryPoint, ExtraEntryPointClass } from '../../builders/browser/schema'; @@ -131,3 +132,18 @@ export function assetNameTemplateFactory(hashFormat: HashFormat): (resourcePath: return '[path][name].[ext]'; }; } + +export function getInstrumentationExcludedPaths( + sourceRoot: string, + excludedPaths: string[], +): Set { + const excluded = new Set(); + + for (const excludeGlob of excludedPaths) { + glob + .sync(path.join(sourceRoot, excludeGlob), { nodir: true }) + .forEach((p) => excluded.add(path.normalize(p))); + } + + return excluded; +} diff --git a/yarn.lock b/yarn.lock index 6597dba89c78..8299fbc81345 100644 --- a/yarn.lock +++ b/yarn.lock @@ -247,7 +247,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/core@7.15.8", "@babel/core@^7.7.5", "@babel/core@^7.8.6": +"@babel/core@7.15.8", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.6": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== @@ -505,7 +505,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.8.6": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.8.6": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== @@ -1251,6 +1251,17 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + "@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" @@ -1261,17 +1272,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz#3fdf5798f0b49e90155896f6291df186eac06c83" integrity sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA== -"@jsdevtools/coverage-istanbul-loader@3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" - integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== - dependencies: - convert-source-map "^1.7.0" - istanbul-lib-instrument "^4.0.3" - loader-utils "^2.0.0" - merge-source-map "^1.1.0" - schema-utils "^2.7.0" - "@mark.probst/unicode-properties@~1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@mark.probst/unicode-properties/-/unicode-properties-1.1.0.tgz#5caafeab4737df93163d6d288007df33f9939b80" @@ -2943,6 +2943,17 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" +babel-plugin-istanbul@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + babel-plugin-polyfill-corejs2@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" @@ -5224,6 +5235,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -6145,7 +6161,7 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.1, istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -6155,6 +6171,17 @@ istanbul-lib-instrument@^4.0.1, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.0.4.tgz#e976f2aa66ebc6737f236d3ab05b76e36f885c80" + integrity sha512-W6jJF9rLGEISGoCyXRqa/JCGQGmmxPO10TMu7izaUTynxvBvTjqzAIIGCK9USBmIbQAaSWD6XJPrM9Pv5INknw== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -6943,13 +6970,6 @@ merge-source-map@1.0.4: dependencies: source-map "^0.5.6" -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -8927,6 +8947,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url-loader@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" @@ -9111,7 +9136,6 @@ sass@^1.32.8: "sauce-connect-proxy@https://saucelabs.com/downloads/sc-4.6.4-linux.tar.gz": version "0.0.0" - uid "992e2cb0d91e54b27a4f5bbd2049f3b774718115" resolved "https://saucelabs.com/downloads/sc-4.6.4-linux.tar.gz#992e2cb0d91e54b27a4f5bbd2049f3b774718115" saucelabs@^1.5.0: @@ -9133,7 +9157,7 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==