Open testgitdl opened 1 year ago
Hello @testgitdl, if I'm understanding correctly, the tests are actually running in a headless browser? If this is the case, c8 will not work as it needs the tests to be running in a Node.js process.
You could look at using something like this: https://pptr.dev/api/puppeteer.coverage/
To output coverage from the browser. You can then use c8
to make pretty reports:
@bcoe Thank you very much for helping out. Unfortunately also with this puppeteer-to-istanbul library as v8-to-istanbul I am having problems using it as we have an Angular 14 with ESM project and when I'm trying to make use of them I get errors. Cannot require and have to use import.
Could not find a declaration file for module 'puppeteer-to-istanbul'. 'c:/_AutomationProjects/proj/test/myproj/node_modules/puppeteer-to-istanbul/index.js' implicitly has an 'any' type. Try `npm i --save-dev @types/puppeteer-to-istanbul` if it exists or add a new declaration (.d.ts) file containing `declare module 'puppeteer-to-istanbul';`ts(7016)
Do you know to to import them in an ESM project? I tried to use it as such:
1) import PuppeteerToIstanbul from 'puppeteer-to-istanbul';
while having added to my angular.json in the scripts section "allowedCommonJsDependencies": [ "puppeteer-to-istanbul" ]
2) Also tried to add a declaration file puppeteer-to-istanbul.d.ts bu then when running my tests ("test-bdd-chrome": "SET NODE_OPTIONS=--loader ts-node/esm --loader ./loader.js --no-warnings --experimental-specifier-resolution=node && node ./node_modules/@cucumber/cucumber/bin/cucumber.js --tags \"@xxx\"") I also get an error:
TypeError: Unable to require file: e2e\support\puppeteer-to-istanbul.d.ts This is usually the result of a faulty configuration or import. Make sure there is a `.js`, `.json` or other executable extension with loader attached before `ts-node` available.
@bcoe got it to work..a bit..now I am able to import the puppeteer-to-istanbul library but it seems I don't get coverage information as I get the following error when writing the coverage info in the AfterAll: "The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received undefined" Any idea would really help. Thank you very much!!! `` BeforeAll(async function () { browser = await chromium.launch(configChrome); context = await browser.newContext(); page = await context.newPage(); await Promise.all([ page.coverage.startJSCoverage(), page.coverage.startCSSCoverage() ]); });
AfterAll(async function () { const [jsCoverage, cssCoverage] = await Promise.all([ page.coverage.stopJSCoverage(), page.coverage.stopCSSCoverage(), ]);
await PuppeteerToIstanbul.write([...jsCoverage, ...cssCoverage], { includeHostname: true, storagePath: './.nyc_output' }); await Promise.all([ await page?.close(), await context?.close() ]) await browser?.close(); }); ``
@testgitdl if you console.log
jsCoverage
, what is it equal to?
@bcoe Thank you very much for helping out! I've also created a sample project here.. https://github.com/testgitdl/playwright-coverage
The out for jsCoerage is:
[{ url: 'http://localhost:4200/runtime.js', scriptId: '122', source: '/******/ (() => { // webpackBootstrap\n' + '/******/ \t"use strict";\n' + '/******/ \tvar __webpack_modules__ = ({});\n' + '/************************************************************************/\n' + '/******/ \t// The module cache\n' + '/******/ \tvar __webpack_module_cache__ = {};\n' + '/******/ \t\n' + '/******/ \t// The require function\n' + '/******/ \tfunction __webpack_require__(moduleId) {\n' + '/******/ \t\t// Check if module is in cache\n' + '/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n' + '/******/ \t\tif (cachedModule !== undefined) {\n' + '/******/ \t\t\treturn cachedModule.exports;\n' + '/******/ \t\t}\n' + '/******/ \t\t// Create a new module (and put it into the cache)\n' + '/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n' + '/******/ \t\t\t// no module.id needed\n' + '/******/ \t\t\t// no module.loaded needed\n' + '/******/ \t\t\texports: {}\n' + '/******/ \t\t};\n' + '/******/ \t\n' + '/******/ \t\t// Execute the module function\n' + '/******/ \t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n' + '/******/ \t\n' + '/******/ \t\t// Return the exports of the module\n' + '/******/ \t\treturn module.exports;\n' + '/******/ \t}\n' + '/******/ \t\n' + '/******/ \t// expose the modules object (__webpack_modules__)\n' + '/******/ \t__webpack_require__.m = __webpack_modules__;\n' + '/******/ \t\n' + '/************************************************************************/\n' + '/******/ \t/* webpack/runtime/chunk loaded */\n' + '/******/ \t(() => {\n' + '/******/ \t\tvar deferred = [];\n' + '/******/ \t\t__webpack_require__.O = (result, chunkIds, fn, priority) => {\n' + '/******/ \t\t\tif(chunkIds) {\n' + '/******/ \t\t\t\tpriority = priority || 0;\n' + '/******/ \t\t\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n' + '/******/ \t\t\t\tdeferred[i] = [chunkIds, fn, priority];\n' + '/******/ \t\t\t\treturn;\n' + '/******/ \t\t\t}\n' + '/******/ \t\t\tvar notFulfilled = Infinity;\n' + '/******/ \t\t\tfor (var i = 0; i < deferred.length; i++) {\n' + '/******/ \t\t\t\tvar [chunkIds, fn, priority] = deferred[i];\n' + '/******/ \t\t\t\tvar fulfilled = true;\n' + '/******/ \t\t\t\tfor (var j = 0; j < chunkIds.length; j++) {\n' + '/******/ \t\t\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n' + '/******/ \t\t\t\t\t\tchunkIds.splice(j--, 1);\n' + '/******/ \t\t\t\t\t} else {\n' + '/******/ \t\t\t\t\t\tfulfilled = false;\n' + '/******/ \t\t\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n' + '/******/ \t\t\t\t\t}\n' + '/******/ \t\t\t\t}\n' + '/******/ \t\t\t\tif(fulfilled) {\n' + '/******/ \t\t\t\t\tdeferred.splice(i--, 1)\n' + '/******/ \t\t\t\t\tvar r = fn();\n' + '/******/ \t\t\t\t\tif (r !== undefined) result = r;\n' + '/******/ \t\t\t\t}\n' + '/******/ \t\t\t}\n' + '/******/ \t\t\treturn result;\n' + '/******/ \t\t};\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/compat get default export */\n' + '/******/ \t(() => {\n' + '/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n' + '/******/ \t\t__webpack_require__.n = (module) => {\n' + '/******/ \t\t\tvar getter = module && module.__esModule ?\n' + "/******/ \t\t\t\t() => (module['default']) :\n" + '/******/ \t\t\t\t() => (module);\n' + '/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n' + '/******/ \t\t\treturn getter;\n' + '/******/ \t\t};\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/define property getters */\n' + '/******/ \t(() => {\n' + '/******/ \t\t// define getter functions for harmony exports\n' + '/******/ \t\t__webpack_require__.d = (exports, definition) => {\n' + '/******/ \t\t\tfor(var key in definition) {\n' + '/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n' + '/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n' + '/******/ \t\t\t\t}\n' + '/******/ \t\t\t}\n' + '/******/ \t\t};\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/getFullHash */\n' + '/******/ \t(() => {\n' + '/******/ \t\t__webpack_require__.h = () => ("888039a2858c7560")\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n' + '/******/ \t(() => {\n' + '/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/make namespace object */\n' + '/******/ \t(() => {\n' + '/******/ \t\t// define __esModule on exports\n' + '/******/ \t\t__webpack_require__.r = (exports) => {\n' + "/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n" + "/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n" + '/******/ \t\t\t}\n' + "/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n" + '/******/ \t\t};\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/******/ \t/* webpack/runtime/jsonp chunk loading */\n' + '/******/ \t(() => {\n' + '/******/ \t\t// no baseURI\n' + '/******/ \t\t\n' + '/******/ \t\t// object to store loaded and loading chunks\n' + '/******/ \t\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n' + '/******/ \t\t// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n' + '/******/ \t\tvar installedChunks = {\n' + '/******/ \t\t\t"runtime": 0\n' + '/******/ \t\t};\n' + '/******/ \t\t\n' + '/******/ \t\t// no chunk on demand loading\n' + '/******/ \t\t\n' + '/******/ \t\t// no prefetching\n' + '/******/ \t\t\n' + '/******/ \t\t// no preloaded\n' + '/******/ \t\t\n' + '/******/ \t\t// no HMR\n' + '/******/ \t\t\n' + '/******/ \t\t// no HMR manifest\n' + '/******/ \t\t\n' + '/******/ \t\t__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n' + '/******/ \t\t\n' + '/******/ \t\t// install a JSONP callback for chunk loading\n' + '/******/ \t\tvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n' + '/******/ \t\t\tvar [chunkIds, moreModules, runtime] = data;\n' + '/******/ \t\t\t// add "moreModules" to the modules object,\n' + '/******/ \t\t\t// then flag all "chunkIds" as loaded and fire callback\n' + '/******/ \t\t\tvar moduleId, chunkId, i = 0;\n' + '/******/ \t\t\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n' + '/******/ \t\t\t\tfor(moduleId in moreModules) {\n' + '/******/ \t\t\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n' + '/******/ \t\t\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n' + '/******/ \t\t\t\t\t}\n' + '/******/ \t\t\t\t}\n' + '/******/ \t\t\t\tif(runtime) var result = runtime(__webpack_require__);\n' + '/******/ \t\t\t}\n' + '/******/ \t\t\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n' + '/******/ \t\t\tfor(;i < chunkIds.length; i++) {\n' + '/******/ \t\t\t\tchunkId = chunkIds[i];\n' + '/******/ \t\t\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n' + '/******/ \t\t\t\t\tinstalledChunks[chunkId][0]();\n' + '/******/ \t\t\t\t}\n' + '/******/ \t\t\t\tinstalledChunks[chunkId] = 0;\n' + '/******/ \t\t\t}\n' + '/******/ \t\t\treturn __webpack_require__.O(result);\n' + '/******/ \t\t}\n' + '/******/ \t\t\n' + '/******/ \t\tvar chunkLoadingGlobal = self["webpackChunkplaywright_coverage"] = self["webpackChunkplaywright_coverage"] || [];\n' + '/******/ \t\tchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\n' + '/******/ \t\tchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n' + '/******/ \t})();\n' + '/******/ \t\n' + '/************************************************************************/\n' + '/******/ \t\n' + '/******/ \t\n' + '/******/ })()\n' + ';\n' + '//# sourceMappingURL=runtime.js.map', functions: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] }, { url: 'http://localhost:4200/polyfills.js', scriptId: '123', source: '(self["webpackChunkplaywright_coverage"] = self["webpackChunkplaywright_coverage"] || []).push([["polyfills"],{\n' + '\n' + '/***/ 7435:\n' + '/*!**************************!*\\\n' + ' !*** ./src/polyfills.ts ***!\n' + ' \\**************************/\n' + '/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n' + '\n' + '"use strict";\n' + '__webpack_require__.r(__webpack_exports__);\n' + '/* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zone.js */ 4946);\n' + '/* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(zone_js__WEBPACK_IMPORTED_MODULE_0__);\n' + '/**\r\n' + ' * This file includes polyfills needed by Angular and is loaded before the app.\r\n' + ' * You can add your own extra polyfills to this file.\r\n' + ' *\r\n' + ' * This file is divided into 2 sections:\r\n' + ' * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.\r\n' + ' * 2. Application imports. Files imported after ZoneJS that should be loaded before your main\r\n' + ' * file.\r\n' + ' *\r\n' + ' * The current setup is for so-called "evergreen" browsers; the last versions of browsers that\r\n' + ' * automatically update themselves. This includes recent versions of Safari, Chrome (including\r\n' + ' * Opera), Edge on the desktop, and iOS and Chrome on mobile.\r\n' + ' *\r\n' + ' * Learn more in https://angular.io/guide/browser-support\r\n' + ' */\r\n' + '/***************************************************************************************************\r\n' + ' * BROWSER POLYFILLS\r\n' + ' */\r\n' + '/**\r\n' + ' * By default, zone.js will patch all possible macroTask and DomEvents\r\n' + ' * user can disable parts of macroTask/DomEvents patch by setting following flags\r\n' + ' * because those flags need to be set before `zone.js` being loaded, and webpack\r\n' + ' * will put import in the top of bundle, so user need to create a separate file\r\n' + ' * in this directory (for example: zone-flags.ts), and put the following flags\r\n' + ' * into that file, and then add the following code before importing zone.js.\r\n' + " * import './zone-flags';\r\n" + ' *\r\n' + ' * The flags allowed in zone-flags.ts are listed here.\r\n' + ' *\r\n' + ' * The following flags will work for all browsers.\r\n' + ' *\r\n' + ' * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame\r\n' + ' * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick\r\n' + " * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames\r\n" + ' *\r\n' + ' * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js\r\n' + ' * with the following flag, it will bypass `zone.js` patch for IE/Edge\r\n' + ' *\r\n' + ' * (window as any).__Zone_enable_cross_context_check = true;\r\n' + ' *\r\n' + ' */\r\n' + '/***************************************************************************************************\r\n' + ' * Zone JS is required by default for Angular itself.\r\n' + ' */\r\n' + ' // Included with Angular CLI.\r\n' + '/***************************************************************************************************\r\n' + ' * APPLICATION IMPORTS\r\n' + ' */\r\n' + '\n' + '\n' + '/***/ }),\n' + '\n' + '/***/ 7716:\n' + '/*!***************************************************!*\\\n' + ' !*** ./node_modules/ansi-html-community/index.js ***!\n' + ' \\***************************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '\n' + '\n' + 'module.exports = ansiHTML; // Reference to https://github.com/sindresorhus/ansi-regex\n' + '\n' + 'var _regANSI = /(?:(?:\\u001b\\[)|\\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\\u001b[A-M]/;\n' + 'var _defColors = {\n' + " reset: ['fff', '000'],\n" + ' // [FOREGROUD_COLOR, BACKGROUND_COLOR]\n' + " black: '000',\n" + " red: 'ff0000',\n" + " green: '209805',\n" + " yellow: 'e8bf03',\n" + " blue: '0000ff',\n" + " magenta: 'ff00ff',\n" + " cyan: '00ffee',\n" + " lightgrey: 'f0f0f0',\n" + " darkgrey: '888'\n" + '};\n' + 'var _styles = {\n' + " 30: 'black',\n" + " 31: 'red',\n" + " 32: 'green',\n" + " 33: 'yellow',\n" + " 34: 'blue',\n" + " 35: 'magenta',\n" + " 36: 'cyan',\n" + " 37: 'lightgrey'\n" + '};\n' + 'var _openTags = {\n' + " '1': 'font-weight:bold',\n" + ' // bold\n' + " '2': 'opacity:0.5',\n" + ' // dim\n' + " '3': '<i>',\n" + ' // italic\n' + " '4': '<u>',\n" + ' // underscore\n' + " '8': 'display:none',\n" + ' // hidden\n' + " '9': '<del>' // delete\n" + '\n' + '};\n' + 'var _closeTags = {\n' + " '23': '</i>',\n" + ' // reset italic\n' + " '24': '</u>',\n" + ' // reset underscore\n' + " '29': '</del>' // reset delete\n" + '\n' + '};\n' + '[0, 21, 22, 27, 28, 39, 49].forEach(function (n) {\n' + " _closeTags[n] = '</span>';\n" + '});\n' + '/**\n' + ' * Converts text with ANSI color codes to HTML markup.\n' + ' * @param {String} text\n' + ' * @returns {*}\n' + ' */\n' + '\n' + 'function ansiHTML(text) {\n' + ' // Returns the text if the string has no ANSI escape code.\n' + ' if (!_regANSI.test(text)) {\n' + ' return text;\n' + ' } // Cache opened sequence.\n' + '\n' + '\n' + ' var ansiCodes = []; // Replace with markup.\n' + '\n' + ' var ret = text.replace(/\\033\\[(\\d+)m/g, function (match, seq) {\n' + ' var ot = _openTags[seq];\n' + '\n' + ' if (ot) {\n' + ' // If current sequence has been opened, close it.\n' + ' if (!!~ansiCodes.indexOf(seq)) {\n' + ' // eslint-disable-line no-extra-boolean-cast\n' + ' ansiCodes.pop();\n' + " return '</span>';\n" + ' } // Open tag.\n' + '\n' + '\n' + ' ansiCodes.push(seq);\n' + ` return ot[0] === '<' ? ot : '<span style="' + ot + ';">';\n` + ' }\n' + '\n' + ' var ct = _closeTags[seq];\n' + '\n' + ' if (ct) {\n' + ' // Pop sequence\n' + ' ansiCodes.pop();\n' + ' return ct;\n' + ' }\n' + '\n' + " return '';\n" + ' }); // Make sure tags are closed.\n' + '\n' + ' var l = ansiCodes.length;\n' + " l > 0 && (ret += Array(l + 1).join('</span>'));\n" + ' return ret;\n' + '}\n' + '/**\n' + ' * Customize colors.\n' + ' * @param {Object} colors reference to _defColors\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.setColors = function (colors) {\n' + " if (typeof colors !== 'object') {\n" + " throw new Error('`colors` parameter must be an Object.');\n" + ' }\n' + '\n' + ' var _finalColors = {};\n' + '\n' + ' for (var key in _defColors) {\n' + ' var hex = colors.hasOwnProperty(key) ? colors[key] : null;\n' + '\n' + ' if (!hex) {\n' + ' _finalColors[key] = _defColors[key];\n' + ' continue;\n' + ' }\n' + '\n' + " if ('reset' === key) {\n" + " if (typeof hex === 'string') {\n" + ' hex = [hex];\n' + ' }\n' + '\n' + ' if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) {\n' + " return typeof h !== 'string';\n" + ' })) {\n' + " throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' var defHexColor = _defColors[key];\n' + '\n' + ' if (!hex[0]) {\n' + ' hex[0] = defHexColor[0];\n' + ' }\n' + '\n' + ' if (hex.length === 1 || !hex[1]) {\n' + ' hex = [hex[0]];\n' + ' hex.push(defHexColor[1]);\n' + ' }\n' + '\n' + ' hex = hex.slice(0, 2);\n' + " } else if (typeof hex !== 'string') {\n" + " throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' _finalColors[key] = hex;\n' + ' }\n' + '\n' + ' _setTags(_finalColors);\n' + '};\n' + '/**\n' + ' * Reset colors.\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.reset = function () {\n' + ' _setTags(_defColors);\n' + '};\n' + '/**\n' + ' * Expose tags, including open and close.\n' + ' * @type {Object}\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.tags = {};\n' + '\n' + 'if (Object.defineProperty) {\n' + " Object.defineProperty(ansiHTML.tags, 'open', {\n" + ' get: function () {\n' + ' return _openTags;\n' + ' }\n' + ' });\n' + " Object.defineProperty(ansiHTML.tags, 'close', {\n" + ' get: function () {\n' + ' return _closeTags;\n' + ' }\n' + ' });\n' + '} else {\n' + ' ansiHTML.tags.open = _openTags;\n' + ' ansiHTML.tags.close = _closeTags;\n' + '}\n' + '\n' + 'function _setTags(colors) {\n' + ' // reset all\n' + " _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1]; // inverse\n" + '\n' + " _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0]; // dark grey\n" + '\n' + " _openTags['90'] = 'color:#' + colors.darkgrey;\n" + '\n' + ' for (var code in _styles) {\n' + ' var color = _styles[code];\n' + " var oriColor = colors[color] || '000';\n" + " _openTags[code] = 'color:#' + oriColor;\n" + ' code = parseInt(code);\n' + " _openTags[(code + 10).toString()] = 'background:#' + oriColor;\n" + ' }\n' + '}\n' + '\n' + 'ansiHTML.reset();\n' + '\n' + '/***/ }),\n' + '\n' + '/***/ 3358:\n' + '/*!***************************************!*\\\n' + ' !*** ./node_modules/events/events.js ***!\n' + ' \\***************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '// Copyright Joyent, Inc. and other Node contributors.\n' + '//\n' + '// Permission is hereby granted, free of charge, to any person obtaining a\n' + '// copy of this software and associated documentation files (the\n' + '// "Software"), to deal in the Software without restriction, including\n' + '// without limitation the rights to use, copy, modify, merge, publish,\n' + '// distribute, sublicense, and/or sell copies of the Software, and to permit\n' + '// persons to whom the Software is furnished to do so, subject to the\n' + '// following conditions:\n' + '//\n' + '// The above copyright notice and this permission notice shall be included\n' + '// in all copies or substantial portions of the Software.\n' + '//\n' + '// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n' + '// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n' + '// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n' + '// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n' + '// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n' + '// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n' + '// USE OR OTHER DEALINGS IN THE SOFTWARE.\n' + '\n' + '\n' + "var R = typeof Reflect === 'object' ? Reflect : null;\n" + "var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {\n" + ' return Function.prototype.apply.call(target, receiver, args);\n' + '};\n' + 'var ReflectOwnKeys;\n' + '\n' + "if (R && typeof R.ownKeys === 'function') {\n" + ' ReflectOwnKeys = R.ownKeys;\n' + '} else if (Object.getOwnPropertySymbols) {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n' + ' };\n' + '} else {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target);\n' + ' };\n' + '}\n' + '\n' + 'function ProcessEmitWarning(warning) {\n' + ' if (console && console.warn) console.warn(warning);\n' + '}\n' + '\n' + 'var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n' + ' return value !== value;\n' + '};\n' + '\n' + 'function EventEmitter() {\n' + ' EventEmitter.init.call(this);\n' + '}\n' + '\n' + 'module.exports = EventEmitter;\n' + 'module.exports.once = once; // Backwards-compat with node 0.10.x\n' + '\n' + 'EventEmitter.EventEmitter = EventEmitter;\n' + 'EventEmitter.prototype._events = undefined;\n' + 'EventEmitter.prototype._eventsCount = 0;\n' + 'E'... 308304 more characters, functions: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], ... 341 more items ] }, { url: 'http://localhost:4200/vendor.js', scriptId: '124', source: '(self["webpackChunkplaywright_coverage"] = self["webpackChunkplaywright_coverage"] || []).push([["vendor"],{\n' + '\n' + '/***/ 7716:\n' + '/*!***************************************************!*\\\n' + ' !*** ./node_modules/ansi-html-community/index.js ***!\n' + ' \\***************************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '\n' + '\n' + 'module.exports = ansiHTML; // Reference to https://github.com/sindresorhus/ansi-regex\n' + '\n' + 'var _regANSI = /(?:(?:\\u001b\\[)|\\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\\u001b[A-M]/;\n' + 'var _defColors = {\n' + " reset: ['fff', '000'],\n" + ' // [FOREGROUD_COLOR, BACKGROUND_COLOR]\n' + " black: '000',\n" + " red: 'ff0000',\n" + " green: '209805',\n" + " yellow: 'e8bf03',\n" + " blue: '0000ff',\n" + " magenta: 'ff00ff',\n" + " cyan: '00ffee',\n" + " lightgrey: 'f0f0f0',\n" + " darkgrey: '888'\n" + '};\n' + 'var _styles = {\n' + " 30: 'black',\n" + " 31: 'red',\n" + " 32: 'green',\n" + " 33: 'yellow',\n" + " 34: 'blue',\n" + " 35: 'magenta',\n" + " 36: 'cyan',\n" + " 37: 'lightgrey'\n" + '};\n' + 'var _openTags = {\n' + " '1': 'font-weight:bold',\n" + ' // bold\n' + " '2': 'opacity:0.5',\n" + ' // dim\n' + " '3': '<i>',\n" + ' // italic\n' + " '4': '<u>',\n" + ' // underscore\n' + " '8': 'display:none',\n" + ' // hidden\n' + " '9': '<del>' // delete\n" + '\n' + '};\n' + 'var _closeTags = {\n' + " '23': '</i>',\n" + ' // reset italic\n' + " '24': '</u>',\n" + ' // reset underscore\n' + " '29': '</del>' // reset delete\n" + '\n' + '};\n' + '[0, 21, 22, 27, 28, 39, 49].forEach(function (n) {\n' + " _closeTags[n] = '</span>';\n" + '});\n' + '/**\n' + ' * Converts text with ANSI color codes to HTML markup.\n' + ' * @param {String} text\n' + ' * @returns {*}\n' + ' */\n' + '\n' + 'function ansiHTML(text) {\n' + ' // Returns the text if the string has no ANSI escape code.\n' + ' if (!_regANSI.test(text)) {\n' + ' return text;\n' + ' } // Cache opened sequence.\n' + '\n' + '\n' + ' var ansiCodes = []; // Replace with markup.\n' + '\n' + ' var ret = text.replace(/\\033\\[(\\d+)m/g, function (match, seq) {\n' + ' var ot = _openTags[seq];\n' + '\n' + ' if (ot) {\n' + ' // If current sequence has been opened, close it.\n' + ' if (!!~ansiCodes.indexOf(seq)) {\n' + ' // eslint-disable-line no-extra-boolean-cast\n' + ' ansiCodes.pop();\n' + " return '</span>';\n" + ' } // Open tag.\n' + '\n' + '\n' + ' ansiCodes.push(seq);\n' + ` return ot[0] === '<' ? ot : '<span style="' + ot + ';">';\n` + ' }\n' + '\n' + ' var ct = _closeTags[seq];\n' + '\n' + ' if (ct) {\n' + ' // Pop sequence\n' + ' ansiCodes.pop();\n' + ' return ct;\n' + ' }\n' + '\n' + " return '';\n" + ' }); // Make sure tags are closed.\n' + '\n' + ' var l = ansiCodes.length;\n' + " l > 0 && (ret += Array(l + 1).join('</span>'));\n" + ' return ret;\n' + '}\n' + '/**\n' + ' * Customize colors.\n' + ' * @param {Object} colors reference to _defColors\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.setColors = function (colors) {\n' + " if (typeof colors !== 'object') {\n" + " throw new Error('`colors` parameter must be an Object.');\n" + ' }\n' + '\n' + ' var _finalColors = {};\n' + '\n' + ' for (var key in _defColors) {\n' + ' var hex = colors.hasOwnProperty(key) ? colors[key] : null;\n' + '\n' + ' if (!hex) {\n' + ' _finalColors[key] = _defColors[key];\n' + ' continue;\n' + ' }\n' + '\n' + " if ('reset' === key) {\n" + " if (typeof hex === 'string') {\n" + ' hex = [hex];\n' + ' }\n' + '\n' + ' if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) {\n' + " return typeof h !== 'string';\n" + ' })) {\n' + " throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' var defHexColor = _defColors[key];\n' + '\n' + ' if (!hex[0]) {\n' + ' hex[0] = defHexColor[0];\n' + ' }\n' + '\n' + ' if (hex.length === 1 || !hex[1]) {\n' + ' hex = [hex[0]];\n' + ' hex.push(defHexColor[1]);\n' + ' }\n' + '\n' + ' hex = hex.slice(0, 2);\n' + " } else if (typeof hex !== 'string') {\n" + " throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' _finalColors[key] = hex;\n' + ' }\n' + '\n' + ' _setTags(_finalColors);\n' + '};\n' + '/**\n' + ' * Reset colors.\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.reset = function () {\n' + ' _setTags(_defColors);\n' + '};\n' + '/**\n' + ' * Expose tags, including open and close.\n' + ' * @type {Object}\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.tags = {};\n' + '\n' + 'if (Object.defineProperty) {\n' + " Object.defineProperty(ansiHTML.tags, 'open', {\n" + ' get: function () {\n' + ' return _openTags;\n' + ' }\n' + ' });\n' + " Object.defineProperty(ansiHTML.tags, 'close', {\n" + ' get: function () {\n' + ' return _closeTags;\n' + ' }\n' + ' });\n' + '} else {\n' + ' ansiHTML.tags.open = _openTags;\n' + ' ansiHTML.tags.close = _closeTags;\n' + '}\n' + '\n' + 'function _setTags(colors) {\n' + ' // reset all\n' + " _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1]; // inverse\n" + '\n' + " _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0]; // dark grey\n" + '\n' + " _openTags['90'] = 'color:#' + colors.darkgrey;\n" + '\n' + ' for (var code in _styles) {\n' + ' var color = _styles[code];\n' + " var oriColor = colors[color] || '000';\n" + " _openTags[code] = 'color:#' + oriColor;\n" + ' code = parseInt(code);\n' + " _openTags[(code + 10).toString()] = 'background:#' + oriColor;\n" + ' }\n' + '}\n' + '\n' + 'ansiHTML.reset();\n' + '\n' + '/***/ }),\n' + '\n' + '/***/ 3358:\n' + '/*!***************************************!*\\\n' + ' !*** ./node_modules/events/events.js ***!\n' + ' \\***************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '// Copyright Joyent, Inc. and other Node contributors.\n' + '//\n' + '// Permission is hereby granted, free of charge, to any person obtaining a\n' + '// copy of this software and associated documentation files (the\n' + '// "Software"), to deal in the Software without restriction, including\n' + '// without limitation the rights to use, copy, modify, merge, publish,\n' + '// distribute, sublicense, and/or sell copies of the Software, and to permit\n' + '// persons to whom the Software is furnished to do so, subject to the\n' + '// following conditions:\n' + '//\n' + '// The above copyright notice and this permission notice shall be included\n' + '// in all copies or substantial portions of the Software.\n' + '//\n' + '// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n' + '// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n' + '// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n' + '// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n' + '// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n' + '// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n' + '// USE OR OTHER DEALINGS IN THE SOFTWARE.\n' + '\n' + '\n' + "var R = typeof Reflect === 'object' ? Reflect : null;\n" + "var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {\n" + ' return Function.prototype.apply.call(target, receiver, args);\n' + '};\n' + 'var ReflectOwnKeys;\n' + '\n' + "if (R && typeof R.ownKeys === 'function') {\n" + ' ReflectOwnKeys = R.ownKeys;\n' + '} else if (Object.getOwnPropertySymbols) {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n' + ' };\n' + '} else {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target);\n' + ' };\n' + '}\n' + '\n' + 'function ProcessEmitWarning(warning) {\n' + ' if (console && console.warn) console.warn(warning);\n' + '}\n' + '\n' + 'var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n' + ' return value !== value;\n' + '};\n' + '\n' + 'function EventEmitter() {\n' + ' EventEmitter.init.call(this);\n' + '}\n' + '\n' + 'module.exports = EventEmitter;\n' + 'module.exports.once = once; // Backwards-compat with node 0.10.x\n' + '\n' + 'EventEmitter.EventEmitter = EventEmitter;\n' + 'EventEmitter.prototype._events = undefined;\n' + 'EventEmitter.prototype._eventsCount = 0;\n' + 'EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are\n' + '// added to it. This is a useful default which helps finding memory leaks.\n' + '\n' + 'var defaultMaxListeners = 10;\n' + '\n' + 'function checkListener(listener) {\n' + " if (typeof listener !== 'function') {\n" + ` throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);\n` + ' }\n' + '}\n' + '\n' + "Object.defineProperty(EventEmitter, 'defaultMaxListeners', {\n" + ' enumerable: true,\n' + ' get: function () {\n' + ' return defaultMaxListeners;\n' + ' },\n' + ' set: function (arg) {\n' + " if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n" + ` throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');\n` + ' }\n' + '\n' + ' defaultMaxListeners = arg;\n' + ' }\n' + '});\n' + '\n' + 'EventEmitter.init = function () {\n' + ' if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {\n' + ' this._events = Object.create(null);\n' + ' this._eventsCount = 0;\n' + ' }\n' + '\n' + ' this._maxListeners = this._maxListeners || undefined;\n' + '}; // Obviously not all Emitters should be limited to 10. This function allows\n' + '// that to be increased. Set to zero for unlimited.\n' + '\n' + '\n' + 'EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n' + " if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n" + ` throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');\n` + ' }\n' + '\n' + ' this._maxListeners = n;\n' + ' return this;\n' + '};\n' + '\n' + 'function _getMaxListeners(that) {\n' + ' if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners;\n' + ' return that._maxListeners;\n' + '}\n' + '\n' + 'EventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n' + ' return _getMaxListeners(this);\n' + '};\n' + '\n' + 'EventEmitter.prototype.emit = function emit(type) {\n' + ' var args = [];\n' + '\n' + ' for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n' + '\n' + " var doError = type === 'error';\n" + ' var events = this._events;\n' + " if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false; // If there is no 'error' event listener then throw.\n" + '\n' + ' if (doError) {\n' + ' var er;\n' + ' if (args.length > 0) er = args[0];\n' + '\n' + ' if (er instanceof Error) {\n' + ' // Note: The comments on the `throw` lines are intentional, they show\n' + " // up in Node's output if this results in an unhandled exception.\n" + " throw er; // Unhandled 'error' event\n" + ' } // At least give some kind of context to the user\n' + '\n' + '\n' + " var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n" + ' err.context = er;\n' + " throw err; // Unhandled 'error' event\n" + ' }\n' + '\n' + ' var handler = events[type];\n' + ' if (handler === undefined) return false;\n' + '\n' + " if (typeof handler === 'function') {\n" + ' ReflectApply(handler, this, args);\n' + ' } else {\n' + ' var len = handler.length;\n' + ' var listeners = arrayClone(handl'... 1838501 more characters, functions: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], ... 2954 more items ] }, { url: 'http://localhost:4200/main.js', scriptId: '126', source: '"use strict";\n' + '(self["webpackChunkplaywright_coverage"] = self["webpackChunkplaywright_coverage"] || []).push([["main"],{\n' + '\n' + '/***/ 5041:\n' + '/*!**********************************!*\\\n' + ' !*** ./src/app/app.component.ts ***!\n' + ' \\**********************************/\n' + '/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n' + '\n' + '__webpack_require__.r(__webpack_exports__);\n' + '/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n' + '/* harmony export */ "AppComponent": () => (/* binding */ AppComponent)\n' + '/* harmony export */ });\n' + '/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ 2560);\n' + '/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common */ 4666);\n' + '\r\n' + '\r\n' + 'function AppComponent_pre_116_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng generate component xyz");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'function AppComponent_pre_117_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng add @angular/material");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'function AppComponent_pre_118_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng add @angular/pwa");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'function AppComponent_pre_119_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng add _____");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'function AppComponent_pre_120_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng test");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'function AppComponent_pre_121_Template(rf, ctx) { if (rf & 1) {\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "pre");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "ng build");\r\n' + ' _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();\r\n' + '} }\r\n' + 'class AppComponent {\r\n' + ' constructor() {\r\n' + " this.title = 'playwright-coverage';\r\n" + ' }\r\n' + '}\r\n' + 'AppComponent.ɵfac = function AppComponent_Factory(t) { return new (t || AppComponent)(); };\r\n' + 'AppComponent.ɵcmp = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: AppComponent, selectors: [["app-root"]], decls: 151, vars: 7, consts: [["role", "banner", 1, "toolbar"], ["width", "40", "alt", "Angular Logo", "src", "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg=="], [1, "spacer"], ["aria-label", "Angular on twitter", "target", "_blank", "rel", "noopener", "href", "https://twitter.com/angular", "title", "Twitter"], ["id", "twitter-logo", "height", "24", "data-name", "Logo", "xmlns", "http://www.w3.org/2000/svg", "viewBox", "0 0 400 400"], ["width", "400", "height", "400", "fill", "none"], ["d", "M153.62,301.59c94.34,0,145.94-78.16,145.94-145.94,0-2.22,0-4.43-.15-6.63A104.36,104.36,0,0,0,325,122.47a102.38,102.38,0,0,1-29.46,8.07,51.47,51.47,0,0,0,22.55-28.37,102.79,102.79,0,0,1-32.57,12.45,51.34,51.34,0,0,0-87.41,46.78A145.62,145.62,0,0,1,92.4,107.81a51.33,51.33,0,0,0,15.88,68.47A50.91,50.91,0,0,1,85,169.86c0,.21,0,.43,0,.65a51.31,51.31,0,0,0,41.15,50.28,51.21,51.21,0,0,1-23.16.88,51.35,51.35,0,0,0,47.92,35.62,102.92,102.92,0,0,1-63.7,22A104.41,104.41,0,0,1,75,278.55a145.21,145.21,0,0,0,78.62,23", "fill", "#fff"], ["aria-label", "Angular on YouTube", "target", "_blank", "rel", "noopener", "href", "https://youtube.com/angular", "title", "YouTube"], ["id", "youtube-logo", "height", "24", "width", "24", "data-name", "Logo", "xmlns", "http://www.w3.org/2000/svg", "viewBox", "0 0 24 24", "fill", "#fff"], ["d", "M0 0h24v24H0V0z", "fill", "none"], ["d", "M21.58 7.19c-.23-.86-.91-1.54-1.77-1.77C18.25 5 12 5 12 5s-6.25 0-7.81.42c-.86.23-1.54.91-1.77 1.77C2 8.75 2 12 2 12s0 3.25.42 4.81c.23.86.91 1.54 1.77 1.77C5.75 19 12 19 12 19s6.25 0 7.81-.42c.86-.23 1.54-.91 1.77-1.77C22 15.25 22 12 22 12s0-3.25-.42-4.81zM10 15V9l5.2 3-5.2 3z"], ["role", "main", 1, "content"], [1, "card", "highlight-card", "card-small"], ["id", "rocket", "xmlns", "http://www.w3.org/2000/svg", "width", "101.678", "height", "101.678", "viewBox", "0 0 101.678 101.678"], ["id", "Group_83", "data-name", "Group 83", "transform", "translate(-141 -696)"], ["id", "Ellipse_8", "data-name", "Ellipse 8", "cx", "50.839", "cy", "50.839", "r", "50.839", "transform", "translate(141 696)", "fill", "#dd0031"], ["id", "Group_47", "data-name", "Group 47", "transform", "translate(165.185 720.185)"], ["id", "Path_33", "data-name", "Path 33", "d", "M3.4,42.615a3.084,3.084,0,0,0,3.553,3.553,21.419,21.419,0,0,0,12.215-6.107L9.511,30.4A21.419,21.419,0,0,0,3.4,42.615Z", "transform", "translate(0.371 3.363)", "fill", "#fff"], ["id", "Path_34", "data-name", "Path 34", "d", "M53.3,3.221A3.09,3.09,0,0,0,50.081,0,48.227,48.227,0,0,0,18.322,13.437c-6-1.666-14.991-1.221-18.322,7.218A33.892,33.892,0,0,1,9.439,25.1l-.333.666a3.013,3.013,0,0,0,.555,3.553L23.985,43.641a2.9,2.9,0,0,0,3.553.555l.666-.333A33.892,33.892,0,0,1,32.647,53.3c8.55-3.664,8.884-12.326,7.218-18.322A48.227,48.227,0,0,0,53.3,3.221ZM34.424,9.772a6.439,6.439,0,1,1,9.106,9.106,6.368,6.368,0,0,1-9.106,0A6.467,6.467,0,0,1,34.424,9.772Z", "transform", "translate(0 0.005)", "fill", "#fff"], ["id", "rocket-smoke", "xmlns", "http://www.w3.org/2000/svg", "width", "516.119", "height", "1083.632", "viewBox", "0 0 516.119 1083.632"], ["id", "Path_40", "data-name", "Path 40", "d", "M644.6,141S143.02,215.537,147.049,870.207s342.774,201.755,342.774,201.755S404.659,847.213,388.815,762.2c-27.116-145.51-11.551-384.124,271.9-609.1C671.15,139.365,644.6,141,644.6,141Z", "transform", "translate(-147.025 -140.939)", "fill", "#f5f5f5"], [1, "card-container"], ["target", "_blank", "rel", "noopener", "href", "https://angular.io/tutorial", 1, "card"], ["xmlns", "http://www.w3.org/2000/svg", "width", "24", "height", "24", "viewBox", "0 0 24 24", 1, "material-icons"], ["d", "M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82zM12 3L1 9l11 6 9-4.91V17h2V9L12 3z"], ["d", "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"], ["target", "_blank", "rel", "noopener", "href", "https://angular.io/cli", 1, "card"], ["d", "M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"], ["target", "_blank", "rel", "noopener", "href", "https://material.angular.io", 1, "card"], ["xmlns", "http://www.w3.org/2000/svg", "width", "21.813", "height", "23.453", "viewBox", "0 0 179.2 192.7", 2, "margin-right", "8px"], ["fill", "#ffa726", "d", "M89.4 0 0 32l13.5 118.4 75.9 42.3 76-42.3L179.2 32 89.4 0z"], ["fill", "#fb8c00", "d", "M89.4 0v192.7l76-42.3L179.2 32 89.4 0z"], ["fill", "#ffe0b2", "d", "m102.9 146.3-63.3-30.5 36.3-22.4 63.7 30.6-36.7 22.3z"], ["fill", "#fff3e0", "d", "M102.9 122.8 39.6 92.2l36.3-22.3 63.7 30.6-36.7 22.3z"], ["fill", "#fff", "d", "M102.9 99.3 39.6 68.7l36.3-22.4 63.7 30.6-36.7 22.4z"], ["target", "_blank", "rel", "noopener", "href", "https://blog.angular.io/", 1, "card"], ["d", "M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67zM11.71 19c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z"], ["target", "_blank", "rel", "noopener", "href", "https://angular.io/devtools/", 1, "card"], ["xmlns", "http://www.w3.org/2000/svg", "enable-background", "new 0 0 24 24", "height", "24px", "viewBox", "0 0 24 24", "width", "24px", "fill", "#000000", 1, "material-icons"], ["fill", "none", "height", "24", "width", "24"], ["d", "M14.73,13.31C15.52,12.24,16,10.93,16,9.5C16,5.91,13.09,3,9.5,3S3,5.91,3,9.5C3,13.09,5.91,16,9.5,16 c1.43,0,2.74-0.48,3.81-1.27L19.59,21L21,19.59L14.73,13.31z M9.5,14C7.01,14,5,11.99,5,9.5S7.01,5,9.5,5S14,7.01,14,9.5 S11.99,14,9.5,14z"], ["points", "10.29,8.44 9.5,6 8.71,8.44 6.25,8.44 8.26,10.03 7.49,12.5 9.5,10.97 11.51,12.5 10.74,10.03 12.75,8.44"], ["type", "hidden"], ["selection", ""], ["tabindex", "0", 1, "card", "card-small", 3, "click"], ["d", "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"], [1, "terminal", 3, "ngSwitch"], [4, "ngSwitchDefault"], [4, "ngSwitchCase"], ["title", "Find a Local Meetup", "href", "https://www.meetup.com/find/?keywords=angular", "target", "_blank", "rel", "noopener", 1, "circle-link"], ["xmlns", "http://www.w3.org/2000/svg", "width", "24.607", "height", "23.447", "viewBox", "0 0 24.607 23.447"], ["id", "logo--mSwarm", "d", "M21.221,14.95A4.393,4.393,0,0,1,17.6,19.281a4.452,4.452,0,0,1-.8.069c-.09,0-.125.035-.154.117a2.939,2.939,0,0,1-2.506,2.091,2.868,2.868,0,0,1-2.248-.624.168.168,0,0,0-.245-.005,3.926,3.926,0,0,1-2.589.741,4.015,4.015,0,0,1-3.7-3.347,2.7,2.7,0,0,1-.043-.38c0-.106-.042-.146-.143-.166a3.524,3.524,0,0,1-1.516-.69A3.623,3.623,0,0,1,2.23,14.557a3.66,3.66,0,0,1,1.077-3.085.138.138,0,0,0,.026-.2,3.348,3.348,0,0,1-.451-1.821,3.46,3.46,0,0,1,2.749-3.28.44.44,0,0,0,.355-.281,5.072,5.072,0'... 38646 more characters, functions: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] }, { url: 'http://localhost:4200/styles.js', scriptId: '127', source: '(self["webpackChunkplaywright_coverage"] = self["webpackChunkplaywright_coverage"] || []).push([["styles"],{\n' + '\n' + '/***/ 7716:\n' + '/*!***************************************************!*\\\n' + ' !*** ./node_modules/ansi-html-community/index.js ***!\n' + ' \\***************************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '\n' + '\n' + 'module.exports = ansiHTML; // Reference to https://github.com/sindresorhus/ansi-regex\n' + '\n' + 'var _regANSI = /(?:(?:\\u001b\\[)|\\u009b)(?:(?:[0-9]{1,3})?(?:(?:;[0-9]{0,3})*)?[A-M|f-m])|\\u001b[A-M]/;\n' + 'var _defColors = {\n' + " reset: ['fff', '000'],\n" + ' // [FOREGROUD_COLOR, BACKGROUND_COLOR]\n' + " black: '000',\n" + " red: 'ff0000',\n" + " green: '209805',\n" + " yellow: 'e8bf03',\n" + " blue: '0000ff',\n" + " magenta: 'ff00ff',\n" + " cyan: '00ffee',\n" + " lightgrey: 'f0f0f0',\n" + " darkgrey: '888'\n" + '};\n' + 'var _styles = {\n' + " 30: 'black',\n" + " 31: 'red',\n" + " 32: 'green',\n" + " 33: 'yellow',\n" + " 34: 'blue',\n" + " 35: 'magenta',\n" + " 36: 'cyan',\n" + " 37: 'lightgrey'\n" + '};\n' + 'var _openTags = {\n' + " '1': 'font-weight:bold',\n" + ' // bold\n' + " '2': 'opacity:0.5',\n" + ' // dim\n' + " '3': '<i>',\n" + ' // italic\n' + " '4': '<u>',\n" + ' // underscore\n' + " '8': 'display:none',\n" + ' // hidden\n' + " '9': '<del>' // delete\n" + '\n' + '};\n' + 'var _closeTags = {\n' + " '23': '</i>',\n" + ' // reset italic\n' + " '24': '</u>',\n" + ' // reset underscore\n' + " '29': '</del>' // reset delete\n" + '\n' + '};\n' + '[0, 21, 22, 27, 28, 39, 49].forEach(function (n) {\n' + " _closeTags[n] = '</span>';\n" + '});\n' + '/**\n' + ' * Converts text with ANSI color codes to HTML markup.\n' + ' * @param {String} text\n' + ' * @returns {*}\n' + ' */\n' + '\n' + 'function ansiHTML(text) {\n' + ' // Returns the text if the string has no ANSI escape code.\n' + ' if (!_regANSI.test(text)) {\n' + ' return text;\n' + ' } // Cache opened sequence.\n' + '\n' + '\n' + ' var ansiCodes = []; // Replace with markup.\n' + '\n' + ' var ret = text.replace(/\\033\\[(\\d+)m/g, function (match, seq) {\n' + ' var ot = _openTags[seq];\n' + '\n' + ' if (ot) {\n' + ' // If current sequence has been opened, close it.\n' + ' if (!!~ansiCodes.indexOf(seq)) {\n' + ' // eslint-disable-line no-extra-boolean-cast\n' + ' ansiCodes.pop();\n' + " return '</span>';\n" + ' } // Open tag.\n' + '\n' + '\n' + ' ansiCodes.push(seq);\n' + ` return ot[0] === '<' ? ot : '<span style="' + ot + ';">';\n` + ' }\n' + '\n' + ' var ct = _closeTags[seq];\n' + '\n' + ' if (ct) {\n' + ' // Pop sequence\n' + ' ansiCodes.pop();\n' + ' return ct;\n' + ' }\n' + '\n' + " return '';\n" + ' }); // Make sure tags are closed.\n' + '\n' + ' var l = ansiCodes.length;\n' + " l > 0 && (ret += Array(l + 1).join('</span>'));\n" + ' return ret;\n' + '}\n' + '/**\n' + ' * Customize colors.\n' + ' * @param {Object} colors reference to _defColors\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.setColors = function (colors) {\n' + " if (typeof colors !== 'object') {\n" + " throw new Error('`colors` parameter must be an Object.');\n" + ' }\n' + '\n' + ' var _finalColors = {};\n' + '\n' + ' for (var key in _defColors) {\n' + ' var hex = colors.hasOwnProperty(key) ? colors[key] : null;\n' + '\n' + ' if (!hex) {\n' + ' _finalColors[key] = _defColors[key];\n' + ' continue;\n' + ' }\n' + '\n' + " if ('reset' === key) {\n" + " if (typeof hex === 'string') {\n" + ' hex = [hex];\n' + ' }\n' + '\n' + ' if (!Array.isArray(hex) || hex.length === 0 || hex.some(function (h) {\n' + " return typeof h !== 'string';\n" + ' })) {\n' + " throw new Error('The value of `' + key + '` property must be an Array and each item could only be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' var defHexColor = _defColors[key];\n' + '\n' + ' if (!hex[0]) {\n' + ' hex[0] = defHexColor[0];\n' + ' }\n' + '\n' + ' if (hex.length === 1 || !hex[1]) {\n' + ' hex = [hex[0]];\n' + ' hex.push(defHexColor[1]);\n' + ' }\n' + '\n' + ' hex = hex.slice(0, 2);\n' + " } else if (typeof hex !== 'string') {\n" + " throw new Error('The value of `' + key + '` property must be a hex string, e.g.: FF0000');\n" + ' }\n' + '\n' + ' _finalColors[key] = hex;\n' + ' }\n' + '\n' + ' _setTags(_finalColors);\n' + '};\n' + '/**\n' + ' * Reset colors.\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.reset = function () {\n' + ' _setTags(_defColors);\n' + '};\n' + '/**\n' + ' * Expose tags, including open and close.\n' + ' * @type {Object}\n' + ' */\n' + '\n' + '\n' + 'ansiHTML.tags = {};\n' + '\n' + 'if (Object.defineProperty) {\n' + " Object.defineProperty(ansiHTML.tags, 'open', {\n" + ' get: function () {\n' + ' return _openTags;\n' + ' }\n' + ' });\n' + " Object.defineProperty(ansiHTML.tags, 'close', {\n" + ' get: function () {\n' + ' return _closeTags;\n' + ' }\n' + ' });\n' + '} else {\n' + ' ansiHTML.tags.open = _openTags;\n' + ' ansiHTML.tags.close = _closeTags;\n' + '}\n' + '\n' + 'function _setTags(colors) {\n' + ' // reset all\n' + " _openTags['0'] = 'font-weight:normal;opacity:1;color:#' + colors.reset[0] + ';background:#' + colors.reset[1]; // inverse\n" + '\n' + " _openTags['7'] = 'color:#' + colors.reset[1] + ';background:#' + colors.reset[0]; // dark grey\n" + '\n' + " _openTags['90'] = 'color:#' + colors.darkgrey;\n" + '\n' + ' for (var code in _styles) {\n' + ' var color = _styles[code];\n' + " var oriColor = colors[color] || '000';\n" + " _openTags[code] = 'color:#' + oriColor;\n" + ' code = parseInt(code);\n' + " _openTags[(code + 10).toString()] = 'background:#' + oriColor;\n" + ' }\n' + '}\n' + '\n' + 'ansiHTML.reset();\n' + '\n' + '/***/ }),\n' + '\n' + '/***/ 3358:\n' + '/*!***************************************!*\\\n' + ' !*** ./node_modules/events/events.js ***!\n' + ' \\***************************************/\n' + '/***/ ((module) => {\n' + '\n' + '"use strict";\n' + '// Copyright Joyent, Inc. and other Node contributors.\n' + '//\n' + '// Permission is hereby granted, free of charge, to any person obtaining a\n' + '// copy of this software and associated documentation files (the\n' + '// "Software"), to deal in the Software without restriction, including\n' + '// without limitation the rights to use, copy, modify, merge, publish,\n' + '// distribute, sublicense, and/or sell copies of the Software, and to permit\n' + '// persons to whom the Software is furnished to do so, subject to the\n' + '// following conditions:\n' + '//\n' + '// The above copyright notice and this permission notice shall be included\n' + '// in all copies or substantial portions of the Software.\n' + '//\n' + '// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n' + '// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n' + '// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n' + '// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n' + '// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n' + '// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n' + '// USE OR OTHER DEALINGS IN THE SOFTWARE.\n' + '\n' + '\n' + "var R = typeof Reflect === 'object' ? Reflect : null;\n" + "var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {\n" + ' return Function.prototype.apply.call(target, receiver, args);\n' + '};\n' + 'var ReflectOwnKeys;\n' + '\n' + "if (R && typeof R.ownKeys === 'function') {\n" + ' ReflectOwnKeys = R.ownKeys;\n' + '} else if (Object.getOwnPropertySymbols) {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n' + ' };\n' + '} else {\n' + ' ReflectOwnKeys = function ReflectOwnKeys(target) {\n' + ' return Object.getOwnPropertyNames(target);\n' + ' };\n' + '}\n' + '\n' + 'function ProcessEmitWarning(warning) {\n' + ' if (console && console.warn) console.warn(warning);\n' + '}\n' + '\n' + 'var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n' + ' return value !== value;\n' + '};\n' + '\n' + 'function EventEmitter() {\n' + ' EventEmitter.init.call(this);\n' + '}\n' + '\n' + 'module.exports = EventEmitter;\n' + 'module.exports.once = once; // Backwards-compat with node 0.10.x\n' + '\n' + 'EventEmitter.EventEmitter = EventEmitter;\n' + 'EventEmitter.prototype._events = undefined;\n' + 'EventEmitter.prototype._eventsCount = 0;\n' + 'EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are\n' + '// added to it. This is a useful default which helps finding memory leaks.\n' + '\n' + 'var defaultMaxListeners = 10;\n' + '\n' + 'function checkListener(listener) {\n' + " if (typeof listener !== 'function') {\n" + ` throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);\n` + ' }\n' + '}\n' + '\n' + "Object.defineProperty(EventEmitter, 'defaultMaxListeners', {\n" + ' enumerable: true,\n' + ' get: function () {\n' + ' return defaultMaxListeners;\n' + ' },\n' + ' set: function (arg) {\n' + " if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n" + ` throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');\n` + ' }\n' + '\n' + ' defaultMaxListeners = arg;\n' + ' }\n' + '});\n' + '\n' + 'EventEmitter.init = function () {\n' + ' if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {\n' + ' this._events = Object.create(null);\n' + ' this._eventsCount = 0;\n' + ' }\n' + '\n' + ' this._maxListeners = this._maxListeners || undefined;\n' + '}; // Obviously not all Emitters should be limited to 10. This function allows\n' + '// that to be increased. Set to zero for unlimited.\n' + '\n' + '\n' + 'EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n' + " if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n" + ` throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');\n` + ' }\n' + '\n' + ' this._maxListeners = n;\n' + ' return this;\n' + '};\n' + '\n' + 'function _getMaxListeners(that) {\n' + ' if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners;\n' + ' return that._maxListeners;\n' + '}\n' + '\n' + 'EventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n' + ' return _getMaxListeners(this);\n' + '};\n' + '\n' + 'EventEmitter.prototype.emit = function emit(type) {\n' + ' var args = [];\n' + '\n' + ' for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n' + '\n' + " var doError = type === 'error';\n" + ' var events = this._events;\n' + " if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false; // If there is no 'error' event listener then throw.\n" + '\n' + ' if (doError) {\n' + ' var er;\n' + ' if (args.length > 0) er = args[0];\n' + '\n' + ' if (er instanceof Error) {\n' + ' // Note: The comments on the `throw` lines are intentional, they show\n' + " // up in Node's output if this results in an unhandled exception.\n" + " throw er; // Unhandled 'error' event\n" + ' } // At least give some kind of context to the user\n' + '\n' + '\n' + " var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n" + ' err.context = er;\n' + " throw err; // Unhandled 'error' event\n" + ' }\n' + '\n' + ' var handler = events[type];\n' + ' if (handler === undefined) return false;\n' + '\n' + " if (typeof handler === 'function') {\n" + ' ReflectApply(handler, this, args);\n' + ' } else {\n' + ' var len = handler.length;\n' + ' var listeners = arrayClone(handl'... 197008 more characters, functions: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] } ]
@testgitdl thank you for the minimal reproduction.
Unfortunately, I don't know when I'll have time to dig into this, I've added the help wanted
label (hopefully someone can get to it before me).
@testgitdl this might be worth looking at:
https://github.com/bcoe/c8/issues/339#issuecomment-1354115645
I have an Angular app for which I'm running BDD tests with cucumberjs + Playwright and what I need is to know how much of the app code I have covered with my tests. For this, I've build my app, I've started it via "ng serve -c dev" and I start c8 when running my tests. The problem is that the coverage report is always the same - it does not take into account the tests I've executed.
Here are the scripts:
"serve": "ng serve -c dev", "playwright-chrome": "start-server-and-test serve http://localhost:4200 test-bdd-chrome", "test-bdd-chrome": "SET NODE_OPTIONS=--loader ts-node/esm --loader ./loader.js --no-warnings --experimental-specifier-resolution=node && node ./node_modules/@cucumber/cucumber/bin/cucumber.js --tags \"@xxx\"", "playwright-coverage": "c8 npm run playwright-chrome"
What am I doing wrong? Thanks!