New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@playwright/test

Package Overview
Dependencies
Maintainers
6
Versions
2476
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@playwright/test - npm Package Compare versions

Comparing version 1.13.0-next-1626331329000 to 1.13.0-next-1626468517000

bin/reinstall_msedge_dev_linux.sh

8

browsers.json

@@ -6,3 +6,3 @@ {

"name": "chromium",
"revision": "891964",
"revision": "901522",
"installByDefault": true

@@ -12,3 +12,3 @@ },

"name": "chromium-with-symbols",
"revision": "891964",
"revision": "901522",
"installByDefault": false

@@ -18,3 +18,3 @@ },

"name": "firefox",
"revision": "1274",
"revision": "1278",
"installByDefault": true

@@ -29,3 +29,3 @@ },

"name": "webkit",
"revision": "1515",
"revision": "1516",
"installByDefault": true,

@@ -32,0 +32,0 @@ "revisionOverrides": {

@@ -302,3 +302,4 @@ #!/usr/bin/env node

if (options.loadStorage) contextOptions.storageState = options.loadStorage; // Close app when the last window closes.
if (options.loadStorage) contextOptions.storageState = options.loadStorage;
if (options.ignoreHttpsErrors) contextOptions.ignoreHTTPSErrors = true; // Close app when the last window closes.

@@ -516,4 +517,4 @@ const context = await browser.newContext(contextOptions);

return result.option('-b, --browser <browserType>', 'browser to use, one of cr, chromium, ff, firefox, wk, webkit', 'chromium').option('--channel <channel>', 'Chromium distribution channel, "chrome", "chrome-beta", "msedge-dev", etc').option('--color-scheme <scheme>', 'emulate preferred color scheme, "light" or "dark"').option('--device <deviceName>', 'emulate device, for example "iPhone 11"').option('--geolocation <coordinates>', 'specify geolocation coordinates, for example "37.819722,-122.478611"').option('--load-storage <filename>', 'load context storage state from the file, previously saved with --save-storage').option('--lang <language>', 'specify language / locale, for example "en-GB"').option('--proxy-server <proxy>', 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"').option('--save-storage <filename>', 'save context storage state at the end, for later use with --load-storage').option('--timezone <time zone>', 'time zone to emulate, for example "Europe/Rome"').option('--timeout <timeout>', 'timeout for Playwright actions in milliseconds', '10000').option('--user-agent <ua string>', 'specify user agent string').option('--viewport-size <size>', 'specify browser viewport size in pixels, for example "1280, 720"');
return result.option('-b, --browser <browserType>', 'browser to use, one of cr, chromium, ff, firefox, wk, webkit', 'chromium').option('--channel <channel>', 'Chromium distribution channel, "chrome", "chrome-beta", "msedge-dev", etc').option('--color-scheme <scheme>', 'emulate preferred color scheme, "light" or "dark"').option('--device <deviceName>', 'emulate device, for example "iPhone 11"').option('--geolocation <coordinates>', 'specify geolocation coordinates, for example "37.819722,-122.478611"').option('--ignore-https-errors', 'ignore https errors').option('--load-storage <filename>', 'load context storage state from the file, previously saved with --save-storage').option('--lang <language>', 'specify language / locale, for example "en-GB"').option('--proxy-server <proxy>', 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"').option('--save-storage <filename>', 'save context storage state at the end, for later use with --load-storage').option('--timezone <time zone>', 'time zone to emulate, for example "Europe/Rome"').option('--timeout <timeout>', 'timeout for Playwright actions in milliseconds', '10000').option('--user-agent <ua string>', 'specify user agent string').option('--viewport-size <size>', 'specify browser viewport size in pixels, for example "1280, 720"');
}
//# sourceMappingURL=cli.js.map
{
"Blackberry PlayBook": {
"userAgent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
"userAgent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/14.2 Safari/536.2+",
"viewport": {

@@ -14,3 +14,3 @@ "width": 600,

"Blackberry PlayBook landscape": {
"userAgent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
"userAgent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/14.2 Safari/536.2+",
"viewport": {

@@ -26,3 +26,3 @@ "width": 1024,

"BlackBerry Z30": {
"userAgent": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+",
"userAgent": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/14.2 Mobile Safari/537.10+",
"viewport": {

@@ -38,3 +38,3 @@ "width": 360,

"BlackBerry Z30 landscape": {
"userAgent": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+",
"userAgent": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/14.2 Mobile Safari/537.10+",
"viewport": {

@@ -50,3 +50,3 @@ "width": 640,

"Galaxy Note 3": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -62,3 +62,3 @@ "width": 360,

"Galaxy Note 3 landscape": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -74,3 +74,3 @@ "width": 640,

"Galaxy Note II": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -86,3 +86,3 @@ "width": 360,

"Galaxy Note II landscape": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -98,3 +98,3 @@ "width": 640,

"Galaxy S III": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -110,3 +110,3 @@ "width": 360,

"Galaxy S III landscape": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/14.2 Mobile Safari/534.30",
"viewport": {

@@ -122,3 +122,3 @@ "width": 640,

"Galaxy S5": {
"userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -134,3 +134,3 @@ "width": 360,

"Galaxy S5 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -146,3 +146,3 @@ "width": 640,

"Galaxy S8": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -158,3 +158,3 @@ "width": 360,

"Galaxy S8 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -170,3 +170,3 @@ "width": 740,

"Galaxy S9+": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -182,3 +182,3 @@ "width": 320,

"Galaxy S9+ landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -194,3 +194,3 @@ "width": 658,

"Galaxy Tab S4": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -206,3 +206,3 @@ "width": 712,

"Galaxy Tab S4 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -218,3 +218,3 @@ "width": 1138,

"iPad (gen 6)": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -230,3 +230,3 @@ "width": 768,

"iPad (gen 6) landscape": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -242,3 +242,3 @@ "width": 1024,

"iPad (gen 7)": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -254,3 +254,3 @@ "width": 810,

"iPad (gen 7) landscape": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -266,3 +266,3 @@ "width": 1080,

"iPad Mini": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -278,3 +278,3 @@ "width": 768,

"iPad Mini landscape": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -290,3 +290,3 @@ "width": 1024,

"iPad Pro 11": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -302,3 +302,3 @@ "width": 834,

"iPad Pro 11 landscape": {
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -314,3 +314,3 @@ "width": 1194,

"iPhone 6": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -326,3 +326,3 @@ "width": 375,

"iPhone 6 landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -338,3 +338,3 @@ "width": 667,

"iPhone 6 Plus": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -350,3 +350,3 @@ "width": 414,

"iPhone 6 Plus landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -362,3 +362,3 @@ "width": 736,

"iPhone 7": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -374,3 +374,3 @@ "width": 375,

"iPhone 7 landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -386,3 +386,3 @@ "width": 667,

"iPhone 7 Plus": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -398,3 +398,3 @@ "width": 414,

"iPhone 7 Plus landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -410,3 +410,3 @@ "width": 736,

"iPhone 8": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -422,3 +422,3 @@ "width": 375,

"iPhone 8 landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -434,3 +434,3 @@ "width": 667,

"iPhone 8 Plus": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -446,3 +446,3 @@ "width": 414,

"iPhone 8 Plus landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -458,3 +458,3 @@ "width": 736,

"iPhone SE": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/14.2 Mobile/14E304 Safari/602.1",
"viewport": {

@@ -470,3 +470,3 @@ "width": 320,

"iPhone SE landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/14.2 Mobile/14E304 Safari/602.1",
"viewport": {

@@ -482,3 +482,3 @@ "width": 568,

"iPhone X": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -494,3 +494,3 @@ "width": 375,

"iPhone X landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/14.2 Mobile/15A372 Safari/604.1",
"viewport": {

@@ -506,3 +506,3 @@ "width": 812,

"iPhone XR": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -518,3 +518,3 @@ "width": 414,

"iPhone XR landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"viewport": {

@@ -530,3 +530,3 @@ "width": 896,

"iPhone 11": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -546,3 +546,3 @@ "width": 414,

"iPhone 11 landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -562,3 +562,3 @@ "width": 414,

"iPhone 11 Pro": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -578,3 +578,3 @@ "width": 375,

"iPhone 11 Pro landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -594,3 +594,3 @@ "width": 375,

"iPhone 11 Pro Max": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -610,3 +610,3 @@ "width": 414,

"iPhone 11 Pro Max landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -626,3 +626,3 @@ "width": 414,

"iPhone 12": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -642,3 +642,3 @@ "width": 390,

"iPhone 12 landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -658,3 +658,3 @@ "width": 390,

"iPhone 12 Pro": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -674,3 +674,3 @@ "width": 390,

"iPhone 12 Pro landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -690,3 +690,3 @@ "width": 390,

"iPhone 12 Pro Max": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -706,3 +706,3 @@ "width": 428,

"iPhone 12 Pro Max landscape": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Mobile/15E148 Safari/604.1",
"screen": {

@@ -722,3 +722,3 @@ "width": 428,

"JioPhone 2": {
"userAgent": "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5",
"userAgent": "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:89.0 Gecko/48.0 Firefox/90.0 KAIOS/2.5",
"viewport": {

@@ -734,3 +734,3 @@ "width": 240,

"JioPhone 2 landscape": {
"userAgent": "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5",
"userAgent": "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:89.0 Gecko/48.0 Firefox/90.0 KAIOS/2.5",
"viewport": {

@@ -768,3 +768,3 @@ "width": 320,

"LG Optimus L70": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -780,3 +780,3 @@ "width": 384,

"LG Optimus L70 landscape": {
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -792,3 +792,3 @@ "width": 640,

"Microsoft Lumia 550": {
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36 Edge/14.14263",
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36 Edge/14.14263",
"viewport": {

@@ -804,3 +804,3 @@ "width": 640,

"Microsoft Lumia 550 landscape": {
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36 Edge/14.14263",
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36 Edge/14.14263",
"viewport": {

@@ -816,3 +816,3 @@ "width": 360,

"Microsoft Lumia 950": {
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36 Edge/14.14263",
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36 Edge/14.14263",
"viewport": {

@@ -828,3 +828,3 @@ "width": 360,

"Microsoft Lumia 950 landscape": {
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36 Edge/14.14263",
"userAgent": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36 Edge/14.14263",
"viewport": {

@@ -840,3 +840,3 @@ "width": 640,

"Nexus 10": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -852,3 +852,3 @@ "width": 800,

"Nexus 10 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -864,3 +864,3 @@ "width": 1280,

"Nexus 4": {
"userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -876,3 +876,3 @@ "width": 384,

"Nexus 4 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -888,3 +888,3 @@ "width": 640,

"Nexus 5": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -900,3 +900,3 @@ "width": 360,

"Nexus 5 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -912,3 +912,3 @@ "width": 640,

"Nexus 5X": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -924,3 +924,3 @@ "width": 412,

"Nexus 5X landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -936,3 +936,3 @@ "width": 732,

"Nexus 6": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -948,3 +948,3 @@ "width": 412,

"Nexus 6 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -960,3 +960,3 @@ "width": 732,

"Nexus 6P": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -972,3 +972,3 @@ "width": 412,

"Nexus 6P landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -984,3 +984,3 @@ "width": 732,

"Nexus 7": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -996,3 +996,3 @@ "width": 600,

"Nexus 7 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"viewport": {

@@ -1052,3 +1052,3 @@ "width": 960,

"Pixel 2": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1064,3 +1064,3 @@ "width": 411,

"Pixel 2 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1076,3 +1076,3 @@ "width": 731,

"Pixel 2 XL": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1088,3 +1088,3 @@ "width": 411,

"Pixel 2 XL landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1100,3 +1100,3 @@ "width": 823,

"Pixel 3": {
"userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1112,3 +1112,3 @@ "width": 393,

"Pixel 3 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1124,3 +1124,3 @@ "width": 786,

"Pixel 4": {
"userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1136,3 +1136,3 @@ "width": 353,

"Pixel 4 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1148,3 +1148,3 @@ "width": 745,

"Pixel 4a (5G)": {
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"screen": {

@@ -1164,3 +1164,3 @@ "width": 412,

"Pixel 4a (5G) landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"screen": {

@@ -1180,3 +1180,3 @@ "height": 892,

"Pixel 5": {
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"screen": {

@@ -1196,3 +1196,3 @@ "width": 393,

"Pixel 5 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"screen": {

@@ -1212,3 +1212,3 @@ "width": 851,

"Moto G4": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1224,3 +1224,3 @@ "width": 360,

"Moto G4 landscape": {
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4543.0 Mobile Safari/537.36",
"userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Mobile Safari/537.36",
"viewport": {

@@ -1234,3 +1234,108 @@ "width": 640,

"defaultBrowserType": "chromium"
},
"Desktop Chrome HiDPI": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"screen": {
"width": 1792,
"height": 1120
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 2,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "chromium"
},
"Desktop Edge HiDPI": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36 Edg/93.0.4576.0",
"screen": {
"width": 1792,
"height": 1120
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 2,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "chromium"
},
"Desktop Firefox HiDPI": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0 Gecko/20100101 Firefox/90.0",
"screen": {
"width": 1792,
"height": 1120
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 2,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "firefox"
},
"Desktop Safari": {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.2 Safari/605.1.15",
"screen": {
"width": 1792,
"height": 1120
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 2,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "webkit"
},
"Desktop Chrome": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36",
"screen": {
"width": 1920,
"height": 1080
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 1,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "chromium"
},
"Dekstop Edge": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4576.0 Safari/537.36 Edg/93.0.4576.0",
"screen": {
"width": 1920,
"height": 1080
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 1,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "chromium"
},
"Desktop Firefox": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0 Gecko/20100101 Firefox/90.0",
"screen": {
"width": 1920,
"height": 1080
},
"viewport": {
"width": 1280,
"height": 720
},
"deviceScaleFactor": 1,
"isMobile": false,
"hasTouch": false,
"defaultBrowserType": "firefox"
}
}

@@ -1007,3 +1007,4 @@ "use strict";

return injected.pollRaf((progress, continuePolling) => {
const element = injected.querySelector(parsed, root || document);
const elements = injected.querySelectorAll(parsed, root || document);
const element = elements[0];
const visible = element ? injected.isVisible(element) : false;

@@ -1013,3 +1014,9 @@

lastElement = element;
if (!element) progress.log(` selector did not resolve to any element`);else progress.log(` selector resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`);
if (!element) {
progress.log(` selector did not resolve to any element`);
} else {
if (elements.length > 1) progress.log(` selector resolved to ${elements.length} elements. Proceeding with the first one.`);
progress.log(` selector resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`);
}
}

@@ -1016,0 +1023,0 @@

@@ -44,2 +44,10 @@ "use strict";

function toButtonsMask(buttons) {
let mask = 0;
if (buttons.has('left')) mask |= 1;
if (buttons.has('middle')) mask |= 2;
if (buttons.has('right')) mask |= 4;
return mask;
}
class RawKeyboardImpl {

@@ -112,2 +120,3 @@ constructor(session) {

button,
buttons: toButtonsMask(buttons),
x,

@@ -123,2 +132,3 @@ y,

button,
buttons: toButtonsMask(buttons),
x,

@@ -135,2 +145,3 @@ y,

button,
buttons: toButtonsMask(buttons),
x,

@@ -137,0 +148,0 @@ y,

@@ -52,8 +52,6 @@ "use strict";

for (const suite of this._suite.suites) {
for (const spec of suite._allSpecs()) {
for (const test of spec.tests) this._testById.set(test._id, {
test,
result: test._appendTestResult()
});
}
for (const test of suite.allTests()) this._testById.set(test._id, {
test,
result: test._appendTestResult()
});
}

@@ -66,3 +64,3 @@

if (shard) {
let total = this._suite.totalTestCount();
let total = this._suite.allTests().length;

@@ -95,31 +93,29 @@ const shardSize = Math.ceil(total / shard.total);

for (const spec of fileSuite._allSpecs()) {
for (const test of spec.tests) {
let entriesByFile = entriesByWorkerHashAndFile.get(test._workerHash);
for (const test of fileSuite.allTests()) {
let entriesByFile = entriesByWorkerHashAndFile.get(test._workerHash);
if (!entriesByFile) {
entriesByFile = new Map();
entriesByWorkerHashAndFile.set(test._workerHash, entriesByFile);
}
if (!entriesByFile) {
entriesByFile = new Map();
entriesByWorkerHashAndFile.set(test._workerHash, entriesByFile);
}
let entry = entriesByFile.get(file);
let entry = entriesByFile.get(file);
if (!entry) {
entry = {
runPayload: {
entries: [],
file
},
repeatEachIndex: test._repeatEachIndex,
projectIndex: test._projectIndex,
hash: test._workerHash
};
entriesByFile.set(file, entry);
}
if (!entry) {
entry = {
runPayload: {
entries: [],
file
},
repeatEachIndex: fileSuite._repeatEachIndex,
projectIndex: fileSuite._projectIndex,
hash: test._workerHash
};
entriesByFile.set(file, entry);
}
entry.runPayload.entries.push({
retry: this._testById.get(test._id).result.retry,
testId: test._id
});
}
entry.runPayload.entries.push({
retry: this._testById.get(test._id).result.retry,
testId: test._id
});
}

@@ -325,7 +321,11 @@ }

result.error = params.error;
result.data = params.data;
result.attachments = params.attachments.map(a => ({
name: a.name,
path: a.path,
contentType: a.contentType,
body: a.body ? Buffer.from(a.body, 'base64') : undefined
}));
test.expectedStatus = params.expectedStatus;
test.annotations = params.annotations;
test.timeout = params.timeout;
if (params.expectedStatus === 'skipped' && params.status === 'skipped') test.skipped = true;

@@ -335,14 +335,16 @@ this._reportTestEnd(test, result, params.status);

worker.on('stdOut', params => {
var _this$_reporter$onStd, _this$_reporter;
const chunk = chunkFromParams(params);
const pair = params.testId ? this._testById.get(params.testId) : undefined;
if (pair) pair.result.stdout.push(chunk);
this._reporter.onStdOut(chunk, pair ? pair.test : undefined);
(_this$_reporter$onStd = (_this$_reporter = this._reporter).onStdOut) === null || _this$_reporter$onStd === void 0 ? void 0 : _this$_reporter$onStd.call(_this$_reporter, chunk, pair ? pair.test : undefined);
});
worker.on('stdErr', params => {
var _this$_reporter$onStd2, _this$_reporter2;
const chunk = chunkFromParams(params);
const pair = params.testId ? this._testById.get(params.testId) : undefined;
if (pair) pair.result.stderr.push(chunk);
this._reporter.onStdErr(chunk, pair ? pair.test : undefined);
(_this$_reporter$onStd2 = (_this$_reporter2 = this._reporter).onStdErr) === null || _this$_reporter$onStd2 === void 0 ? void 0 : _this$_reporter$onStd2.call(_this$_reporter2, chunk, pair ? pair.test : undefined);
});

@@ -352,5 +354,6 @@ worker.on('teardownError', ({

}) => {
var _this$_reporter$onErr, _this$_reporter3;
this._hasWorkerErrors = true;
this._reporter.onError(error);
(_this$_reporter$onErr = (_this$_reporter3 = this._reporter).onError) === null || _this$_reporter$onErr === void 0 ? void 0 : _this$_reporter$onErr.call(_this$_reporter3, error);
});

@@ -383,2 +386,4 @@ worker.on('exit', () => {

_reportTestBegin(test) {
var _this$_reporter$onTes, _this$_reporter4;
if (this._isStopped) return;

@@ -388,6 +393,8 @@

if (!maxFailures || this._failureCount < maxFailures) this._reporter.onTestBegin(test);
if (!maxFailures || this._failureCount < maxFailures) (_this$_reporter$onTes = (_this$_reporter4 = this._reporter).onTestBegin) === null || _this$_reporter$onTes === void 0 ? void 0 : _this$_reporter$onTes.call(_this$_reporter4, test);
}
_reportTestEnd(test, result, status) {
var _this$_reporter$onTes2, _this$_reporter5;
if (this._isStopped) return;

@@ -399,3 +406,3 @@ result.status = status;

if (!maxFailures || this._failureCount <= maxFailures) this._reporter.onTestEnd(test, result);
if (!maxFailures || this._failureCount <= maxFailures) (_this$_reporter$onTes2 = (_this$_reporter5 = this._reporter).onTestEnd) === null || _this$_reporter$onTes2 === void 0 ? void 0 : _this$_reporter$onTes2.call(_this$_reporter5, test, result);
if (maxFailures && this._failureCount === maxFailures) this.stop().catch(e => {});

@@ -402,0 +409,0 @@ }

@@ -51,4 +51,24 @@ "use strict";

pass,
message
message,
expectedPath,
actualPath,
diffPath,
mimeType
} = (0, _golden.compare)(received, options.name, testInfo.snapshotPath, testInfo.outputPath, testInfo.config.updateSnapshots, withNegateComparison, options);
const contentType = mimeType || 'application/octet-stream';
if (expectedPath) testInfo.attachments.push({
name: 'expected',
contentType,
path: expectedPath
});
if (actualPath) testInfo.attachments.push({
name: 'actual',
contentType,
path: actualPath
});
if (diffPath) testInfo.attachments.push({
name: 'diff',
contentType,
path: diffPath
});
return {

@@ -55,0 +75,0 @@ pass,

@@ -223,3 +223,7 @@ "use strict";

pass: false,
message: output.join('\n')
message: output.join('\n'),
expectedPath,
actualPath,
diffPath,
mimeType
};

@@ -226,0 +230,0 @@ }

@@ -209,6 +209,10 @@ "use strict";

const tracePath = testInfo.outputPath(`trace.zip`);
testInfo.data.playwrightTrace = tracePath;
await context.tracing.stop({
path: tracePath
});
testInfo.attachments.push({
name: 'trace',
path: tracePath,
contentType: 'application/zip'
});
} else if (captureTrace) {

@@ -221,8 +225,16 @@ await context.tracing.stop();

if (captureScreenshots) {
await Promise.all(allPages.map((page, index) => {
await Promise.all(allPages.map(async (page, index) => {
const screenshotPath = testInfo.outputPath(`test-${testFailed ? 'failed' : 'finished'}-${++index}.png`);
return page.screenshot({
timeout: 5000,
path: screenshotPath
}).catch(e => {});
try {
await page.screenshot({
timeout: 5000,
path: screenshotPath
});
testInfo.attachments.push({
name: 'screenshot',
path: screenshotPath,
contentType: 'image/png'
});
} catch {}
}));

@@ -229,0 +241,0 @@ }

@@ -120,3 +120,3 @@ "use strict";

suite._requireFile = file;
suite.file = file;
suite.location.file = file;
(0, _globals.setCurrentlyLoadingFileSuite)(suite);

@@ -123,0 +123,0 @@ await this._requireOrImport(file);

@@ -35,3 +35,3 @@ "use strict";

this.testTypePools = new Map();
this.specPools = new Map();
this.testPools = new Map();
this.config = project;

@@ -64,20 +64,16 @@ this.index = index;

return this.testTypePools.get(testType);
}
} // TODO: we can optimize this function by building the pool inline in cloneSuite
buildPool(spec) {
if (!this.specPools.has(spec)) {
let pool = this.buildTestTypePool(spec._testType);
const overrides = spec.parent._buildFixtureOverrides();
buildPool(test) {
if (!this.testPools.has(test)) {
let pool = this.buildTestTypePool(test._testType);
const overrides = test.parent._buildFixtureOverrides();
if (Object.entries(overrides).length) {
const overridesWithLocation = {
fixtures: overrides,
location: {
file: spec.file,
line: 1,
// TODO: capture location
column: 1 // TODO: capture location
}
// TODO: pass location from test.use() callsite.
location: test.location
};

@@ -87,6 +83,6 @@ pool = new _fixtures.FixturePool([overridesWithLocation], pool);

this.specPools.set(spec, pool);
pool.validateFunction(spec.fn, 'Test', true, spec);
this.testPools.set(test, pool);
pool.validateFunction(test.fn, 'Test', true, test.location);
for (let parent = spec.parent; parent; parent = parent.parent) {
for (let parent = test.parent; parent; parent = parent.parent) {
for (const hook of parent._hooks) pool.validateFunction(hook.fn, hook.type + ' hook', hook.type === 'beforeEach' || hook.type === 'afterEach', hook.location);

@@ -98,24 +94,35 @@

return this.specPools.get(spec);
return this.testPools.get(test);
}
generateTests(spec, repeatEachIndex) {
const digest = this.buildPool(spec).digest;
const min = repeatEachIndex === undefined ? 0 : repeatEachIndex;
const max = repeatEachIndex === undefined ? this.config.repeatEach - 1 : repeatEachIndex;
const tests = [];
cloneSuite(suite, repeatEachIndex, filter) {
const result = suite._clone();
for (let i = min; i <= max; i++) {
const test = new _test.Test(spec);
test.projectName = this.config.name;
test.retries = this.config.retries;
test._repeatEachIndex = i;
test._projectIndex = this.index;
test._workerHash = `run${this.index}-${digest}-repeat${i}`;
test._id = `${spec._ordinalInFile}@${spec._requireFile}#run${this.index}-repeat${i}`;
spec.tests.push(test);
tests.push(test);
result._repeatEachIndex = repeatEachIndex;
result._projectIndex = this.index;
for (const entry of suite._entries) {
if (entry instanceof _test.Suite) {
const cloned = this.cloneSuite(entry, repeatEachIndex, filter);
if (cloned) result._addSuite(cloned);
} else {
const pool = this.buildPool(entry);
const test = entry._clone();
test.projectName = this.config.name;
test.retries = this.config.retries;
test._workerHash = `run${this.index}-${pool.digest}-repeat${repeatEachIndex}`;
test._id = `${entry._ordinalInFile}@${entry._requireFile}#run${this.index}-repeat${repeatEachIndex}`;
test._pool = pool;
test._buildTitlePath(suite._titlePath);
if (!filter(test)) continue;
result._addTest(test);
}
}
return tests;
if (result._entries.length) return result;
}

@@ -122,0 +129,0 @@

@@ -59,4 +59,2 @@ "use strict";

onTestBegin(test) {}
onStdOut(chunk) {

@@ -71,3 +69,3 @@ if (!this.config.quiet) process.stdout.write(chunk);

onTestEnd(test, result) {
const relativePath = relativeSpecPath(this.config, test.spec);
const relativePath = relativeTestPath(this.config, test);
const fileAndProject = relativePath + (test.projectName ? ` [${test.projectName}]` : '');

@@ -105,3 +103,3 @@ const duration = this.fileDurations.get(fileAndProject) || 0;

const flaky = [];
this.suite.findTest(test => {
this.suite.allTests().forEach(test => {
switch (test.status()) {

@@ -190,11 +188,11 @@ case 'skipped':

function relativeSpecPath(config, spec) {
return _path.default.relative(config.rootDir, spec.file) || _path.default.basename(spec.file);
function relativeTestPath(config, test) {
return _path.default.relative(config.rootDir, test.location.file) || _path.default.basename(test.location.file);
}
function formatTestTitle(config, test) {
const spec = test.spec;
let relativePath = relativeSpecPath(config, spec);
relativePath += ':' + spec.line + ':' + spec.column;
return `${relativePath} › ${test.fullTitle()}`;
let relativePath = relativeTestPath(config, test);
relativePath += ':' + test.location.line + ':' + test.location.column;
const title = (test.projectName ? `[${test.projectName}] ` : '') + test.fullTitle();
return `${relativePath} › ${title}`;
}

@@ -216,5 +214,5 @@

tokens.push(indent(_safe.default.red(`Timeout of ${test.timeout}ms exceeded.`), ' '));
if (result.error !== undefined) tokens.push(indent(formatError(result.error, test.spec.file), ' '));
if (result.error !== undefined) tokens.push(indent(formatError(result.error, test.location.file), ' '));
} else {
tokens.push(indent(formatError(result.error, test.spec.file), ' '));
tokens.push(indent(formatError(result.error, test.location.file), ' '));
}

@@ -221,0 +219,0 @@

@@ -23,21 +23,6 @@ "use strict";

*/
class EmptyReporter {
onBegin(config, suite) {}
class EmptyReporter {}
onTestBegin(test) {}
onStdOut(chunk, test) {}
onStdErr(chunk, test) {}
onTestEnd(test, result) {}
onError(error) {}
async onEnd(result) {}
}
var _default = EmptyReporter;
exports.default = _default;
//# sourceMappingURL=empty.js.map

@@ -12,4 +12,2 @@ "use strict";

var _empty = _interopRequireDefault(require("./empty"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

@@ -36,5 +34,4 @@

class JSONReporter extends _empty.default {
class JSONReporter {
constructor(options = {}) {
super();
this.config = void 0;

@@ -78,3 +75,3 @@ this.suite = void 0;

},
suites: this.suite.suites.map(suite => this._serializeSuite(suite)).filter(s => s),
suites: this._mergeSuites(this.suite.suites),
errors: this._errors

@@ -84,11 +81,66 @@ };

_mergeSuites(suites) {
debugger;
const fileSuites = new Map();
const result = [];
for (const suite of suites) {
if (!fileSuites.has(suite.location.file)) {
const serialized = this._serializeSuite(suite);
if (serialized) {
fileSuites.set(suite.location.file, serialized);
result.push(serialized);
}
} else {
this._mergeTestsFromSuite(fileSuites.get(suite.location.file), suite);
}
}
return result;
}
_relativeLocation(location) {
return {
file: toPosixPath(_path.default.relative(this.config.rootDir, location.file)),
line: location.line,
column: location.column
};
}
_locationMatches(s, location) {
const relative = this._relativeLocation(location);
return s.file === relative.file && s.line === relative.line && s.column === relative.column;
}
_mergeTestsFromSuite(to, from) {
for (const fromSuite of from.suites) {
const toSuite = (to.suites || []).find(s => s.title === fromSuite.title && this._locationMatches(s, from.location));
if (toSuite) {
this._mergeTestsFromSuite(toSuite, fromSuite);
} else {
const serialized = this._serializeSuite(fromSuite);
if (serialized) {
if (!to.suites) to.suites = [];
to.suites.push(serialized);
}
}
}
for (const test of from.tests) {
const toSpec = to.specs.find(s => s.title === test.title && s.file === toPosixPath(_path.default.relative(this.config.rootDir, test.location.file)) && s.line === test.location.line && s.column === test.location.column);
if (toSpec) toSpec.tests.push(this._serializeTest(test));else to.specs.push(this._serializeTestSpec(test));
}
}
_serializeSuite(suite) {
if (!suite.findSpec(test => true)) return null;
if (!suite.allTests().length) return null;
const suites = suite.suites.map(suite => this._serializeSuite(suite)).filter(s => s);
return {
title: suite.title,
file: toPosixPath(_path.default.relative(this.config.rootDir, suite.file)),
line: suite.line,
column: suite.column,
specs: suite.specs.map(test => this._serializeTestSpec(test)),
...this._relativeLocation(suite.location),
specs: suite.tests.map(test => this._serializeTestSpec(test)),
suites: suites.length ? suites : undefined

@@ -98,10 +150,8 @@ };

_serializeTestSpec(spec) {
_serializeTestSpec(test) {
return {
title: spec.title,
ok: spec.ok(),
tests: spec.tests.map(r => this._serializeTest(r)),
file: toPosixPath(_path.default.relative(this.config.rootDir, spec.file)),
line: spec.line,
column: spec.column
title: test.title,
ok: test.ok(),
tests: [this._serializeTest(test)],
...this._relativeLocation(test.location)
};

@@ -130,3 +180,12 @@ }

retry: result.retry,
data: result.data
attachments: result.attachments.map(a => {
var _a$body;
return {
name: a.name,
contentType: a.contentType,
path: a.path,
body: (_a$body = a.body) === null || _a$body === void 0 ? void 0 : _a$body.toString('base64')
};
})
};

@@ -133,0 +192,0 @@ }

@@ -12,4 +12,2 @@ "use strict";

var _empty = _interopRequireDefault(require("./empty"));
var _util = require("../util");

@@ -36,5 +34,4 @@

*/
class JUnitReporter extends _empty.default {
class JUnitReporter {
constructor(options = {}) {
super();
this.config = void 0;

@@ -102,3 +99,3 @@ this.suite = void 0;

const children = [];
suite.findTest(test => {
suite.allTests().forEach(test => {
++tests;

@@ -118,3 +115,3 @@ if (test.status() === 'skipped') ++skipped;

attributes: {
name: _path.default.relative(this.config.rootDir, suite.file),
name: _path.default.relative(this.config.rootDir, suite.location.file),
timestamp: this.timestamp,

@@ -137,3 +134,3 @@ hostname: '',

attributes: {
name: test.spec.fullTitle(),
name: test.fullTitle(),
classname: (0, _base.formatTestTitle)(this.config, test),

@@ -157,3 +154,3 @@ time: test.results.reduce((acc, value) => acc + value.duration, 0) / 1000

attributes: {
message: `${_path.default.basename(test.spec.file)}:${test.spec.line}:${test.spec.column} ${test.spec.title}`,
message: `${_path.default.basename(test.location.file)}:${test.location.line}:${test.location.column} ${test.title}`,
type: 'FAILURE'

@@ -160,0 +157,0 @@ },

@@ -40,3 +40,3 @@ "use strict";

super.onBegin(config, suite);
this._total = suite.totalTestCount();
this._total = suite.allTests().length;
console.log();

@@ -43,0 +43,0 @@ }

@@ -54,4 +54,2 @@ "use strict";

onTestBegin(test) {
super.onTestBegin(test);
if (process.stdout.isTTY) {

@@ -58,0 +56,0 @@ if (this._needNewLine) {

@@ -30,27 +30,55 @@ "use strict";

onBegin(config, suite) {
for (const reporter of this._reporters) reporter.onBegin(config, suite);
for (const reporter of this._reporters) {
var _reporter$onBegin;
(_reporter$onBegin = reporter.onBegin) === null || _reporter$onBegin === void 0 ? void 0 : _reporter$onBegin.call(reporter, config, suite);
}
}
onTestBegin(test) {
for (const reporter of this._reporters) reporter.onTestBegin(test);
for (const reporter of this._reporters) {
var _reporter$onTestBegin;
(_reporter$onTestBegin = reporter.onTestBegin) === null || _reporter$onTestBegin === void 0 ? void 0 : _reporter$onTestBegin.call(reporter, test);
}
}
onStdOut(chunk, test) {
for (const reporter of this._reporters) reporter.onStdOut(chunk, test);
for (const reporter of this._reporters) {
var _reporter$onStdOut;
(_reporter$onStdOut = reporter.onStdOut) === null || _reporter$onStdOut === void 0 ? void 0 : _reporter$onStdOut.call(reporter, chunk, test);
}
}
onStdErr(chunk, test) {
for (const reporter of this._reporters) reporter.onStdErr(chunk, test);
for (const reporter of this._reporters) {
var _reporter$onStdErr;
(_reporter$onStdErr = reporter.onStdErr) === null || _reporter$onStdErr === void 0 ? void 0 : _reporter$onStdErr.call(reporter, chunk, test);
}
}
onTestEnd(test, result) {
for (const reporter of this._reporters) reporter.onTestEnd(test, result);
for (const reporter of this._reporters) {
var _reporter$onTestEnd;
(_reporter$onTestEnd = reporter.onTestEnd) === null || _reporter$onTestEnd === void 0 ? void 0 : _reporter$onTestEnd.call(reporter, test, result);
}
}
async onEnd(result) {
for (const reporter of this._reporters) await reporter.onEnd(result);
for (const reporter of this._reporters) {
var _reporter$onEnd;
await ((_reporter$onEnd = reporter.onEnd) === null || _reporter$onEnd === void 0 ? void 0 : _reporter$onEnd.call(reporter, result));
}
}
onError(error) {
for (const reporter of this._reporters) reporter.onError(error);
for (const reporter of this._reporters) {
var _reporter$onError;
(_reporter$onError = reporter.onError) === null || _reporter$onError === void 0 ? void 0 : _reporter$onError.call(reporter, error);
}
}

@@ -57,0 +85,0 @@

@@ -123,6 +123,8 @@ "use strict";

if (timedOut) {
if (!this._didBegin) this._reporter.onBegin(config, new _test.Suite(''));
await this._reporter.onEnd({
var _this$_reporter$onBeg, _this$_reporter, _this$_reporter$onEnd, _this$_reporter2;
if (!this._didBegin) (_this$_reporter$onBeg = (_this$_reporter = this._reporter).onBegin) === null || _this$_reporter$onBeg === void 0 ? void 0 : _this$_reporter$onBeg.call(_this$_reporter, config, new _test.Suite(''));
await ((_this$_reporter$onEnd = (_this$_reporter2 = this._reporter).onEnd) === null || _this$_reporter$onEnd === void 0 ? void 0 : _this$_reporter$onEnd.call(_this$_reporter2, {
status: 'timedout'
});
}));
await this._flushOutput();

@@ -143,10 +145,10 @@ return 'failed';

console.error('=================');
} else if ((result === null || result === void 0 ? void 0 : result.status) === 'clashing-spec-titles') {
} else if ((result === null || result === void 0 ? void 0 : result.status) === 'clashing-test-titles') {
console.error('=================');
console.error(' duplicate test titles are not allowed.');
for (const [title, specs] of result === null || result === void 0 ? void 0 : result.clashingSpecs.entries()) {
for (const [title, tests] of result === null || result === void 0 ? void 0 : result.clashingTests.entries()) {
console.error(` - title: ${title}`);
for (const spec of specs) console.error(` - ${buildItemLocation(config.rootDir, spec)}`);
for (const test of tests) console.error(` - ${buildItemLocation(config.rootDir, test)}`);

@@ -208,27 +210,29 @@ console.error('=================');

try {
var _this$_reporter$onBeg2, _this$_reporter3, _this$_reporter$onEnd3, _this$_reporter5;
for (const file of allTestFiles) await this._loader.loadTestFile(file);
const rootSuite = new _test.Suite('');
const preprocessRoot = new _test.Suite('');
for (const fileSuite of this._loader.fileSuites().values()) rootSuite._addSuite(fileSuite);
for (const fileSuite of this._loader.fileSuites().values()) preprocessRoot._addSuite(fileSuite);
if (config.forbidOnly) {
const onlySpecAndSuites = rootSuite._getOnlyItems();
const onlyTestsAndSuites = preprocessRoot._getOnlyItems();
if (onlySpecAndSuites.length > 0) return {
if (onlyTestsAndSuites.length > 0) return {
status: 'forbid-only',
locations: onlySpecAndSuites.map(specOrSuite => `${buildItemLocation(config.rootDir, specOrSuite)} > ${specOrSuite.fullTitle()}`)
locations: onlyTestsAndSuites.map(testOrSuite => `${buildItemLocation(config.rootDir, testOrSuite)} > ${testOrSuite.fullTitle()}`)
};
}
const uniqueSpecs = getUniqueSpecsPerSuite(rootSuite);
if (uniqueSpecs.size > 0) return {
status: 'clashing-spec-titles',
clashingSpecs: uniqueSpecs
const clashingTests = getClashingTestsPerSuite(preprocessRoot);
if (clashingTests.size > 0) return {
status: 'clashing-test-titles',
clashingTests: clashingTests
};
filterOnly(rootSuite);
filterByFocusedLine(rootSuite, testFileReFilters);
filterOnly(preprocessRoot);
filterByFocusedLine(preprocessRoot, testFileReFilters);
const fileSuites = new Map();
for (const fileSuite of rootSuite.suites) fileSuites.set(fileSuite._requireFile, fileSuite);
for (const fileSuite of preprocessRoot.suites) fileSuites.set(fileSuite._requireFile, fileSuite);

@@ -238,2 +242,3 @@ const outputDirs = new Set();

const grepInvertMatcher = config.grepInvert ? (0, _util2.createMatcher)(config.grepInvert) : null;
const rootSuite = new _test.Suite('');

@@ -245,7 +250,10 @@ for (const project of projects) {

for (const spec of fileSuite._allSpecs()) {
const fullTitle = spec._testFullTitle(project.config.name);
if (grepInvertMatcher !== null && grepInvertMatcher !== void 0 && grepInvertMatcher(fullTitle)) continue;
if (grepMatcher(fullTitle)) project.generateTests(spec);
for (let repeatEachIndex = 0; repeatEachIndex < project.config.repeatEach; repeatEachIndex++) {
const cloned = project.cloneSuite(fileSuite, repeatEachIndex, test => {
const fullTitle = test.fullTitle();
const titleWithProject = (test.projectName ? `[${test.projectName}] ` : '') + fullTitle;
if (grepInvertMatcher !== null && grepInvertMatcher !== void 0 && grepInvertMatcher(titleWithProject)) return false;
return grepMatcher(titleWithProject);
});
if (cloned) rootSuite._addSuite(cloned);
}

@@ -257,3 +265,3 @@ }

const total = rootSuite.totalTestCount();
const total = rootSuite.allTests().length;
if (!total) return {

@@ -281,4 +289,4 @@ status: 'no-tests'

const workers = new Set();
rootSuite.findTest(test => {
workers.add(test.spec._requireFile + test._workerHash);
rootSuite.allTests().forEach(test => {
workers.add(test._requireFile + test._workerHash);
});

@@ -292,4 +300,3 @@ console.log();

this._reporter.onBegin(config, rootSuite);
(_this$_reporter$onBeg2 = (_this$_reporter3 = this._reporter).onBegin) === null || _this$_reporter$onBeg2 === void 0 ? void 0 : _this$_reporter$onBeg2.call(_this$_reporter3, config, rootSuite);
this._didBegin = true;

@@ -306,5 +313,7 @@ let hasWorkerErrors = false;

if (sigint) {
await this._reporter.onEnd({
var _this$_reporter$onEnd2, _this$_reporter4;
await ((_this$_reporter$onEnd2 = (_this$_reporter4 = this._reporter).onEnd) === null || _this$_reporter$onEnd2 === void 0 ? void 0 : _this$_reporter$onEnd2.call(_this$_reporter4, {
status: 'interrupted'
});
}));
return {

@@ -315,6 +324,6 @@ status: 'sigint'

const failed = hasWorkerErrors || rootSuite.findSpec(spec => !spec.ok());
await this._reporter.onEnd({
const failed = hasWorkerErrors || rootSuite.allTests().some(test => !test.ok());
await ((_this$_reporter$onEnd3 = (_this$_reporter5 = this._reporter).onEnd) === null || _this$_reporter$onEnd3 === void 0 ? void 0 : _this$_reporter$onEnd3.call(_this$_reporter5, {
status: failed ? 'failed' : 'passed'
});
}));
return {

@@ -337,9 +346,9 @@ status: failed ? 'failed' : 'passed'

const specFilter = spec => spec._only;
const testFilter = test => test._only;
return filterSuite(suite, suiteFilter, specFilter);
return filterSuite(suite, suiteFilter, testFilter);
}
function filterByFocusedLine(suite, focusedTestFileLines) {
const testFileLineMatches = (specFileName, specLine) => focusedTestFileLines.some(({
const testFileLineMatches = (testFileName, testLine) => focusedTestFileLines.some(({
re,

@@ -349,15 +358,15 @@ line

re.lastIndex = 0;
return re.test(specFileName) && (line === specLine || line === null);
return re.test(testFileName) && (line === testLine || line === null);
});
const suiteFilter = suite => testFileLineMatches(suite.file, suite.line);
const suiteFilter = suite => testFileLineMatches(suite.location.file, suite.location.line);
const specFilter = spec => testFileLineMatches(spec.file, spec.line);
const testFilter = test => testFileLineMatches(test.location.file, test.location.line);
return filterSuite(suite, suiteFilter, specFilter);
return filterSuite(suite, suiteFilter, testFilter);
}
function filterSuite(suite, suiteFilter, specFilter) {
const onlySuites = suite.suites.filter(child => filterSuite(child, suiteFilter, specFilter) || suiteFilter(child));
const onlyTests = suite.specs.filter(specFilter);
function filterSuite(suite, suiteFilter, testFilter) {
const onlySuites = suite.suites.filter(child => filterSuite(child, suiteFilter, testFilter) || suiteFilter(child));
const onlyTests = suite.tests.filter(testFilter);
const onlyEntries = new Set([...onlySuites, ...onlyTests]);

@@ -367,3 +376,3 @@

suite.suites = onlySuites;
suite.specs = onlyTests;
suite.tests = onlyTests;
suite._entries = suite._entries.filter(e => onlyEntries.has(e)); // Preserve the order.

@@ -441,10 +450,10 @@

function getUniqueSpecsPerSuite(rootSuite) {
function visit(suite, clashingSpecs) {
for (const childSuite of suite.suites) visit(childSuite, clashingSpecs);
function getClashingTestsPerSuite(rootSuite) {
function visit(suite, clashingTests) {
for (const childSuite of suite.suites) visit(childSuite, clashingTests);
for (const spec of suite.specs) {
const fullTitle = spec.fullTitle();
if (!clashingSpecs.has(fullTitle)) clashingSpecs.set(fullTitle, []);
clashingSpecs.set(fullTitle, clashingSpecs.get(fullTitle).concat(spec));
for (const test of suite.tests) {
const fullTitle = test.fullTitle();
if (!clashingTests.has(fullTitle)) clashingTests.set(fullTitle, []);
clashingTests.set(fullTitle, clashingTests.get(fullTitle).concat(test));
}

@@ -456,7 +465,7 @@ }

for (const fileSuite of rootSuite.suites) {
const clashingSpecs = new Map();
visit(fileSuite, clashingSpecs);
const clashingTests = new Map();
visit(fileSuite, clashingTests);
for (const [title, specs] of clashingSpecs.entries()) {
if (specs.length > 1) out.set(title, specs);
for (const [title, tests] of clashingTests.entries()) {
if (tests.length > 1) out.set(title, tests);
}

@@ -468,5 +477,5 @@ }

function buildItemLocation(rootDir, specOrSuite) {
return `${path.relative(rootDir, specOrSuite.file)}:${specOrSuite.line}`;
function buildItemLocation(rootDir, testOrSuite) {
return `${path.relative(rootDir, testOrSuite.location.file)}:${testOrSuite.location.line}`;
}
//# sourceMappingURL=runner.js.map

@@ -6,3 +6,3 @@ "use strict";

});
exports.Test = exports.Suite = exports.Spec = void 0;
exports.Test = exports.Suite = void 0;

@@ -27,6 +27,9 @@ /**

this.title = void 0;
this.file = '';
this.line = 0;
this.column = 0;
this.location = {
file: '',
line: 0,
column: 0
};
this.parent = void 0;
this._titlePath = [];
this._only = false;

@@ -37,10 +40,13 @@ this._requireFile = '';

_buildTitlePath(parentTitlePath) {
this._titlePath = [...parentTitlePath];
if (this.title) this._titlePath.push(this.title);
}
titlePath() {
if (!this.parent) return [];
if (!this.title) return this.parent.titlePath();
return [...this.parent.titlePath(), this.title];
return this._titlePath;
}
fullTitle() {
return this.titlePath().join(' ');
return this._titlePath.join(' ');
}

@@ -50,27 +56,2 @@

class Spec extends Base {
constructor(title, fn, ordinalInFile, testType) {
super(title);
this.suite = void 0;
this.fn = void 0;
this.tests = [];
this._ordinalInFile = void 0;
this._testType = void 0;
this.fn = fn;
this._ordinalInFile = ordinalInFile;
this._testType = testType;
}
ok() {
return !this.tests.find(r => !r.ok());
}
_testFullTitle(projectName) {
return (projectName ? `[${projectName}] ` : '') + this.fullTitle();
}
}
exports.Spec = Spec;
class Suite extends Base {

@@ -80,3 +61,3 @@ constructor(...args) {

this.suites = [];
this.specs = [];
this.tests = [];
this._fixtureOverrides = {};

@@ -88,10 +69,11 @@ this._entries = [];

this._modifiers = [];
this._repeatEachIndex = 0;
this._projectIndex = 0;
}
_addSpec(spec) {
spec.parent = this;
spec.suite = this;
this.specs.push(spec);
_addTest(test) {
test.parent = this;
this.tests.push(test);
this._entries.push(spec);
this._entries.push(test);
}

@@ -106,53 +88,12 @@

findTest(fn) {
for (const entry of this._entries) {
if (entry instanceof Suite) {
if (entry.findTest(fn)) return true;
} else {
for (const test of entry.tests) {
if (fn(test)) return true;
}
}
}
allTests() {
const result = [];
return false;
}
findSpec(fn) {
for (const entry of this._entries) {
if (entry instanceof Suite) {
if (entry.findSpec(fn)) return true;
} else {
if (fn(entry)) return true;
const visit = suite => {
for (const entry of suite._entries) {
if (entry instanceof Suite) visit(entry);else result.push(entry);
}
}
};
return false;
}
findSuite(fn) {
if (fn(this)) return true;
for (const suite of this.suites) {
if (suite.findSuite(fn)) return true;
}
return false;
}
totalTestCount() {
let total = 0;
for (const suite of this.suites) total += suite.totalTestCount();
for (const spec of this.specs) total += spec.tests.length;
return total;
}
_allSpecs() {
const result = [];
this.findSpec(test => {
result.push(test);
});
visit(this);
return result;

@@ -167,3 +108,3 @@ }

items.push(...this.specs.filter(spec => spec._only));
items.push(...this.tests.filter(test => test._only));
return items;

@@ -178,2 +119,15 @@ }

_clone() {
const suite = new Suite(this.title);
suite._only = this._only;
suite.location = this.location;
suite._requireFile = this._requireFile;
suite._fixtureOverrides = this._fixtureOverrides;
suite._hooks = this._hooks.slice();
suite._timeout = this._timeout;
suite._annotations = this._annotations.slice();
suite._modifiers = this._modifiers.slice();
return suite;
}
}

@@ -183,7 +137,7 @@

class Test {
constructor(spec) {
this.spec = void 0;
class Test extends Base {
constructor(title, fn, ordinalInFile, testType) {
super(title);
this.fn = void 0;
this.results = [];
this.skipped = false;
this.expectedStatus = 'passed';

@@ -194,17 +148,20 @@ this.timeout = 0;

this.retries = 0;
this._ordinalInFile = void 0;
this._testType = void 0;
this._id = '';
this._repeatEachIndex = 0;
this._projectIndex = 0;
this._workerHash = '';
this.spec = spec;
this._pool = void 0;
this.fn = fn;
this._ordinalInFile = ordinalInFile;
this._testType = testType;
}
status() {
if (this.skipped) return 'skipped'; // List mode bail out.
// List mode bail out.
if (!this.results.length) return 'skipped';
if (this.results.length === 1 && this.expectedStatus === this.results[0].status) return 'expected';
if (this.results.length === 1 && this.expectedStatus === this.results[0].status) return this.expectedStatus === 'skipped' ? 'skipped' : 'expected';
let hasPassedResults = false;
for (const result of this.results) {
// TODO: we should not report tests that do not belong to the shard.
// Missing status is Ok when running in shards mode.

@@ -224,4 +181,8 @@ if (!result.status) return 'skipped';

fullTitle() {
return this.spec._testFullTitle(this.projectName);
_clone() {
const test = new Test(this.title, this.fn, this._ordinalInFile, this._testType);
test._only = this._only;
test.location = this.location;
test._requireFile = this._requireFile;
return test;
}

@@ -236,3 +197,3 @@

stderr: [],
data: {}
attachments: []
};

@@ -239,0 +200,0 @@ this.results.push(result);

@@ -48,5 +48,5 @@ "use strict";

this.fixtures = fixtures;
const test = (0, _transform.wrapFunctionWithLocation)(this._spec.bind(this, 'default'));
const test = (0, _transform.wrapFunctionWithLocation)(this._createTest.bind(this, 'default'));
test.expect = _expect.expect;
test.only = (0, _transform.wrapFunctionWithLocation)(this._spec.bind(this, 'only'));
test.only = (0, _transform.wrapFunctionWithLocation)(this._createTest.bind(this, 'only'));
test.describe = (0, _transform.wrapFunctionWithLocation)(this._describe.bind(this, 'default'));

@@ -69,3 +69,3 @@ test.describe.only = (0, _transform.wrapFunctionWithLocation)(this._describe.bind(this, 'only'));

_spec(type, location, title, fn) {
_createTest(type, location, title, fn) {
const suite = (0, _globals.currentlyLoadingFileSuite)();

@@ -75,11 +75,11 @@ if (!suite) throw new Error(`test() can only be called in a test file`);

countByFile.set(suite._requireFile, ordinalInFile + 1);
const spec = new _test.Spec(title, fn, ordinalInFile, this);
spec._requireFile = suite._requireFile;
spec.file = location.file;
spec.line = location.line;
spec.column = location.column;
const test = new _test.Test(title, fn, ordinalInFile, this);
test._requireFile = suite._requireFile;
test.location = location;
suite._addSpec(spec);
suite._addTest(test);
if (type === 'only') spec._only = true;
test._buildTitlePath(suite._titlePath);
if (type === 'only') test._only = true;
}

@@ -92,8 +92,8 @@

child._requireFile = suite._requireFile;
child.file = location.file;
child.line = location.line;
child.column = location.column;
child.location = location;
suite._addSuite(child);
child._buildTitlePath(suite._titlePath);
if (type === 'only') child._only = true;

@@ -100,0 +100,0 @@ (0, _globals.setCurrentlyLoadingFileSuite)(child);

@@ -6,2 +6,11 @@ "use strict";

});
var _exportNames = {
Location: true
};
Object.defineProperty(exports, "Location", {
enumerable: true,
get: function () {
return _reporter.Location;
}
});

@@ -12,2 +21,3 @@ var _test = require("../../types/test");

if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _test[key]) return;

@@ -21,2 +31,4 @@ Object.defineProperty(exports, key, {

});
var _reporter = require("./reporter");
//# sourceMappingURL=types.js.map

@@ -125,10 +125,11 @@ "use strict";

const fileSuite = await this._loader.loadTestFile(runPayload.file);
let anySpec;
fileSuite.findSpec(spec => {
const test = this._project.generateTests(spec, this._params.repeatEachIndex)[0];
let anyPool;
if (this._entries.has(test._id)) anySpec = spec;
const suite = this._project.cloneSuite(fileSuite, this._params.repeatEachIndex, test => {
if (!this._entries.has(test._id)) return false;
anyPool = test._pool;
return true;
});
if (!anySpec) {
if (!suite || !anyPool) {
this._reportDone();

@@ -139,5 +140,5 @@

this._fixtureRunner.setPool(this._project.buildPool(anySpec));
this._fixtureRunner.setPool(anyPool);
await this._runSuite(fileSuite, []);
await this._runSuite(suite, []);
if (this._isStopped) return;

@@ -170,3 +171,3 @@

const skipHooks = !this._hasTestsToRun(suite) || annotations.some(a => a.type === 'fixme' || a.type === 'skip');
const skipHooks = annotations.some(a => a.type === 'fixme' || a.type === 'skip');

@@ -187,3 +188,3 @@ for (const hook of suite._hooks) {

for (const entry of suite._entries) {
if (entry instanceof _test.Suite) await this._runSuite(entry, annotations);else await this._runSpec(entry, annotations);
if (entry instanceof _test.Suite) await this._runSuite(entry, annotations);else await this._runTest(entry, annotations);
}

@@ -205,5 +206,4 @@

async _runSpec(spec, annotations) {
async _runTest(test, annotations) {
if (this._isStopped) return;
const test = spec.tests[0];

@@ -218,6 +218,6 @@ const entry = this._entries.get(test._id);

const baseOutputDir = (() => {
const relativeTestFilePath = _path.default.relative(this._project.config.testDir, spec._requireFile.replace(/\.(spec|test)\.(js|ts|mjs)$/, ''));
const relativeTestFilePath = _path.default.relative(this._project.config.testDir, test._requireFile.replace(/\.(spec|test)\.(js|ts|mjs)$/, ''));
const sanitizedRelativePath = relativeTestFilePath.replace(process.platform === 'win32' ? new RegExp('\\\\', 'g') : new RegExp('/', 'g'), '-');
let testOutputDir = sanitizedRelativePath + '-' + sanitizeForFilePath(spec.title);
let testOutputDir = sanitizedRelativePath + '-' + sanitizeForFilePath(test.title);
if (this._uniqueProjectNamePathSegment) testOutputDir += '-' + this._uniqueProjectNamePathSegment;

@@ -230,7 +230,7 @@ if (entry.retry) testOutputDir += '-retry' + entry.retry;

const testInfo = { ...this._workerInfo,
title: spec.title,
file: spec.file,
line: spec.line,
column: spec.column,
fn: spec.fn,
title: test.title,
file: test.location.file,
line: test.location.line,
column: test.location.column,
fn: test.fn,
repeatEachIndex: this._params.repeatEachIndex,

@@ -240,3 +240,3 @@ retry: entry.retry,

annotations: [],
data: {},
attachments: [],
duration: 0,

@@ -264,3 +264,3 @@ status: 'passed',

if (ext) snapshotName = sanitizeForFilePath(snapshotName.substring(0, snapshotName.length - ext.length)) + suffix + ext;else snapshotName = sanitizeForFilePath(snapshotName) + suffix;
return _path.default.join(spec._requireFile + '-snapshots', snapshotName);
return _path.default.join(test._requireFile + '-snapshots', snapshotName);
},

@@ -277,3 +277,3 @@ skip: (...args) => modifier(testInfo, 'skip', args),

for (let suite = spec.parent; suite; suite = suite.parent) {
for (let suite = test.parent; suite; suite = suite.parent) {
if (suite._timeout !== undefined) {

@@ -323,3 +323,3 @@ testInfo.setTimeout(suite._timeout);

this._fixtureRunner.setPool(this._project.buildPool(spec));
this._fixtureRunner.setPool(test._pool);

@@ -371,3 +371,3 @@ deadlineRunner = new _util2.DeadlineRunner(this._runTestWithBeforeHooks(test, testInfo), deadline());

for (let s = test.spec.parent; s; s = s.parent) {
for (let s = test.parent; s; s = s.parent) {
const modifiers = s._modifiers.filter(modifier => !this._fixtureRunner.dependsOnWorkerFixturesOnly(modifier.fn, modifier.location));

@@ -386,3 +386,3 @@

await this._runHooks(test.spec.parent, 'beforeEach', testInfo);
await this._runHooks(test.parent, 'beforeEach', testInfo);
} catch (error) {

@@ -402,3 +402,3 @@ if (error instanceof SkipError) {

try {
await this._fixtureRunner.resolveParametersAndRunHookOrTest(test.spec.fn, 'test', testInfo);
await this._fixtureRunner.resolveParametersAndRunHookOrTest(test.fn, 'test', testInfo);
} catch (error) {

@@ -419,3 +419,3 @@ if (error instanceof SkipError) {

try {
await this._runHooks(test.spec.parent, 'afterEach', testInfo);
await this._runHooks(test.parent, 'afterEach', testInfo);
} catch (error) {

@@ -479,10 +479,2 @@ if (!(error instanceof SkipError)) {

_hasTestsToRun(suite) {
return suite.findSpec(spec => {
const entry = this._entries.get(spec.tests[0]._id);
return !!entry;
});
}
}

@@ -508,3 +500,12 @@

timeout: testInfo.timeout,
data: testInfo.data
attachments: testInfo.attachments.map(a => {
var _a$body;
return {
name: a.name,
contentType: a.contentType,
path: a.path,
body: (_a$body = a.body) === null || _a$body === void 0 ? void 0 : _a$body.toString('base64')
};
})
};

@@ -511,0 +512,0 @@ }

@@ -7,3 +7,3 @@ "use strict";

exports.installDefaultBrowsersForNpmInstall = installDefaultBrowsersForNpmInstall;
exports.registry = exports.Registry = void 0;
exports.registry = exports.Registry = exports.registryDirectory = void 0;

@@ -195,2 +195,4 @@ var os = _interopRequireWildcard(require("os"));

exports.registryDirectory = registryDirectory;
function isBrowserDirectory(browserDirectory) {

@@ -337,3 +339,7 @@ const baseName = _path.default.basename(browserDirectory);

'win32': `\\Microsoft\\Edge Dev\\Application\\msedge.exe`
}));
}, () => this._installMSEdgeChannel('msedge-dev', {
'darwin': 'reinstall_msedge_dev_mac.sh',
'linux': 'reinstall_msedge_dev_linux.sh',
'win32': 'reinstall_msedge_dev_win.ps1'
})));

@@ -554,3 +560,7 @@ this._executables.push(this._createChromiumChannel('msedge-canary', {

const products = JSON.parse(await (0, _utils.fetchData)('https://edgeupdates.microsoft.com/api/products'));
const productName = channel === 'msedge' ? 'Stable' : 'Beta';
const productName = {
'msedge': 'Stable',
'msedge-beta': 'Beta',
'msedge-dev': 'Dev'
}[channel];
const product = products.find(product => product.Product === productName);

@@ -557,0 +567,0 @@ const searchConfig = {

{
"name": "@playwright/test",
"version": "1.13.0-next-1626331329000",
"version": "1.13.0-next-1626468517000",
"description": "Playwright Test",

@@ -5,0 +5,0 @@ "repository": "github:Microsoft/playwright",

@@ -402,5 +402,5 @@ /**

/**
* Arbitrary data that test fixtures can provide for the test report.
* File attachments for this test.
*/
data: { [key: string]: any };
attachments: { name: string, path?: string, body?: Buffer, contentType: string }[];

@@ -407,0 +407,0 @@ /**

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc